viewdefs is now boolean
[citadel.git] / webcit / roomviews.c
1 /*
2  * Lots of different room-related operations.
3  */
4
5 #include "webcit.h"
6 #include "webserver.h"
7
8 char *viewdefs[VIEW_MAX];                       /* the different kinds of available views */
9
10 ROOM_VIEWS exchangeable_views[VIEW_MAX][VIEW_MAX] = {
11         { 1, 1, 0, 0, 0, 0, 0, 0, 0, 1 },       /* bulletin board */
12         { 1, 1, 0, 0, 0, 0, 0, 0, 0, 1 },       /* mailbox summary */
13         { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },       /* address book */
14         { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },       /* calendar */
15         { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },       /* tasks */
16         { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },       /* notes */
17         { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 },       /* wiki */
18         { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },       /* brief calendar */
19         { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },       /* journal */
20         { 1, 1, 0, 0, 0, 0, 0, 0, 0, 1 }        /* blog */
21 };
22
23 ROOM_VIEWS allowed_default_views[VIEW_MAX] = {
24         1, /* VIEW_BBS          Bulletin board view */
25         1, /* VIEW_MAILBOX      Mailbox summary */
26         1, /* VIEW_ADDRESSBOOK  Address book view */
27         1, /* VIEW_CALENDAR     Calendar view */
28         1, /* VIEW_TASKS        Tasks view */
29         1, /* VIEW_NOTES        Notes view */
30         1, /* VIEW_WIKI         Wiki view */
31         0, /* VIEW_CALBRIEF     Brief Calendar view */
32         0, /* VIEW_JOURNAL      Journal view */
33         0  /* VIEW_BLOG         Blog view (not yet implemented) */
34 };
35
36 /*
37  * Initialize the viewdefs with localized strings
38  */
39 void initialize_viewdefs(void) {
40         viewdefs[VIEW_BBS] = _("Bulletin Board");
41         viewdefs[VIEW_MAILBOX] = _("Mail Folder");
42         viewdefs[VIEW_ADDRESSBOOK] = _("Address Book");
43         viewdefs[VIEW_CALENDAR] = _("Calendar");
44         viewdefs[VIEW_TASKS] = _("Task List");
45         viewdefs[VIEW_NOTES] = _("Notes List");
46         viewdefs[VIEW_WIKI] = _("Wiki");
47         viewdefs[VIEW_CALBRIEF] = _("Calendar List");
48         viewdefs[VIEW_JOURNAL] = _("Journal");
49         viewdefs[VIEW_BLOG] = _("Blog");
50 }
51
52
53
54 void tmplput_ROOM_COLLECTIONTYPE(StrBuf *Target, WCTemplputParams *TP) 
55 {
56         folder *Folder = (folder *)CTX;
57         
58         switch(Folder->view) {
59         case VIEW_CALENDAR:
60                 StrBufAppendBufPlain(Target, HKEY("vevent"), 0);
61                 break;
62         case VIEW_TASKS:
63                 StrBufAppendBufPlain(Target, HKEY("vtodo"), 0);
64                 break;
65         case VIEW_ADDRESSBOOK:
66                 StrBufAppendBufPlain(Target, HKEY("vcard"), 0);
67                 break;
68         case VIEW_NOTES:
69                 StrBufAppendBufPlain(Target, HKEY("vnotes"), 0);
70                 break;
71         case VIEW_JOURNAL:
72                 StrBufAppendBufPlain(Target, HKEY("vjournal"), 0);
73                 break;
74         case VIEW_WIKI:
75                 StrBufAppendBufPlain(Target, HKEY("wiki"), 0);
76                 break;
77         }
78 }
79
80
81
82 int ConditionalRoomHasGroupdavContent(StrBuf *Target, WCTemplputParams *TP)
83 {
84         folder *Folder = (folder *)CTX;
85
86         lprintf(0, "-> %s: %ld\n", ChrPtr(Folder->name), Folder->view);
87
88         return ((Folder->view == VIEW_CALENDAR) || 
89                 (Folder->view == VIEW_TASKS) || 
90                 (Folder->view == VIEW_ADDRESSBOOK) ||
91                 (Folder->view == VIEW_NOTES) ||
92                 (Folder->view == VIEW_JOURNAL) );
93 }
94
95
96
97
98 int ConditionalIsRoomtype(StrBuf *Target, WCTemplputParams *TP)
99 {
100         wcsession *WCC = WC;
101
102         if ((WCC == NULL) ||
103             (TP->Tokens->nParameters < 3))
104         {
105                 return ((WCC->CurRoom.view < VIEW_BBS) || 
106                         (WCC->CurRoom.view > VIEW_MAX));
107         }
108
109         return WCC->CurRoom.view == GetTemplateTokenNumber(Target, TP, 2, VIEW_BBS);
110 }
111
112
113 void tmplput_CurrentRoomViewString(StrBuf *Target, WCTemplputParams *TP) 
114 {
115         wcsession *WCC = WC;
116         StrBuf *Buf;
117
118         if ((WCC == NULL) ||
119             (WCC->CurRoom.defview >= VIEW_MAX) || 
120             (WCC->CurRoom.defview < VIEW_BBS))
121         {
122                 LogTemplateError(Target, "Token", ERR_PARM2, TP,
123                                  "Roomview [%ld] not valid\n", 
124                                  (WCC != NULL)? 
125                                  WCC->CurRoom.defview : -1);
126                 return;
127         }
128
129         Buf = NewStrBufPlain(_(viewdefs[WCC->CurRoom.defview]), -1);
130         StrBufAppendTemplate(Target, TP, Buf, 0);
131         FreeStrBuf(&Buf);
132 }
133
134 void tmplput_RoomViewString(StrBuf *Target, WCTemplputParams *TP) 
135 {
136         long CheckThis;
137         StrBuf *Buf;
138
139         CheckThis = GetTemplateTokenNumber(Target, TP, 0, 0);
140         if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS))
141         {
142                 LogTemplateError(Target, "Token", ERR_PARM2, TP,
143                                  "Roomview [%ld] not valid\n", 
144                                  CheckThis);
145                 return;
146         }
147
148         Buf = NewStrBufPlain(_(viewdefs[CheckThis]), -1);
149         StrBufAppendTemplate(Target, TP, Buf, 0);
150         FreeStrBuf(&Buf);
151 }
152
153
154
155 int ConditionalIsAllowedDefaultView(StrBuf *Target, WCTemplputParams *TP)
156 {
157         wcsession *WCC = WC;
158         long CheckThis;
159         
160         if (WCC == NULL)
161                 return 0;
162
163         CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
164         if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS))
165         {
166                 LogTemplateError(Target, "Conditional", ERR_PARM2, TP,
167                                  "Roomview [%ld] not valid\n", 
168                                  CheckThis);
169                 return 0;
170         }
171
172         return allowed_default_views[CheckThis] != 0;
173 }
174
175 int ConditionalThisRoomDefView(StrBuf *Target, WCTemplputParams *TP)
176 {
177         wcsession *WCC = WC;
178         long CheckThis;
179
180         if (WCC == NULL)
181                 return 0;
182
183         CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
184         return CheckThis == WCC->CurRoom.defview;
185 }
186
187 int ConditionalThisRoomCurrView(StrBuf *Target, WCTemplputParams *TP)
188 {
189         wcsession *WCC = WC;
190         long CheckThis;
191
192         if (WCC == NULL)
193                 return 0;
194
195         CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
196         return CheckThis == WCC->CurRoom.view;
197 }
198
199 int ConditionalThisRoomHaveView(StrBuf *Target, WCTemplputParams *TP)
200 {
201         wcsession *WCC = WC;
202         long CheckThis;
203         
204         if (WCC == NULL)
205                 return 0;
206
207         CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
208         if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS))
209         {
210                 LogTemplateError(Target, "Conditional", ERR_PARM2, TP,
211                                  "Roomview [%ld] not valid\n", 
212                                  CheckThis);
213                 return 0;
214         }
215
216         return exchangeable_views [WCC->CurRoom.defview][CheckThis] ;
217 }
218
219 void tmplput_ROOM_VIEW(StrBuf *Target, WCTemplputParams *TP) 
220 {
221         folder *Folder = (folder *)CTX;
222         StrBufAppendPrintf(Target, "%d", Folder->view);
223 }
224 void tmplput_ROOM_DEFVIEW(StrBuf *Target, WCTemplputParams *TP) 
225 {
226         folder *Folder = (folder *)CTX;
227         StrBufAppendPrintf(Target, "%d", Folder->defview);
228 }
229
230
231 void tmplput_CurrentRoomDefView(StrBuf *Target, WCTemplputParams *TP) 
232 {
233         wcsession *WCC = WC;
234
235         StrBufAppendPrintf(Target, "%d", WCC->CurRoom.defview);
236 }
237
238 void 
239 InitModule_ROOMVIEWS
240 (void)
241 {
242         initialize_viewdefs();
243
244         RegisterNamespace("THISROOM:VIEW_STRING", 0, 1, tmplput_CurrentRoomViewString, NULL, CTX_NONE);
245         RegisterNamespace("ROOM:VIEW_STRING", 1, 2, tmplput_RoomViewString, NULL, CTX_NONE);
246
247         RegisterConditional(HKEY("COND:ALLOWED_DEFAULT_VIEW"), 0, ConditionalIsAllowedDefaultView, CTX_NONE);
248         RegisterConditional(HKEY("COND:THISROOM:DEFAULT_VIEW"), 0, ConditionalThisRoomDefView, CTX_NONE);
249         RegisterNamespace("THISROOM:DEFAULT_VIEW", 0, 0, tmplput_CurrentRoomDefView, NULL, CTX_NONE);
250         RegisterNamespace("ROOM:INFO:DEFVIEW", 0, 1, tmplput_ROOM_DEFVIEW, NULL, CTX_ROOMS);
251
252         RegisterConditional(HKEY("COND:ROOM:TYPE_IS"), 0, ConditionalIsRoomtype, CTX_NONE);
253
254         RegisterConditional(HKEY("COND:THISROOM:HAVE_VIEW"), 0, ConditionalThisRoomHaveView, CTX_NONE);
255         RegisterConditional(HKEY("COND:ROOM:GROUPDAV_CONTENT"), 0, ConditionalRoomHasGroupdavContent, CTX_ROOMS);
256
257         RegisterConditional(HKEY("COND:THISROOM:CURR_VIEW"), 0, ConditionalThisRoomCurrView, CTX_NONE);
258         RegisterNamespace("ROOM:INFO:VIEW", 0, 1, tmplput_ROOM_VIEW, NULL, CTX_ROOMS);
259
260         RegisterNamespace("ROOM:INFO:COLLECTIONTYPE", 0, 1, tmplput_ROOM_COLLECTIONTYPE, NULL, CTX_ROOMS);
261
262
263
264 }