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