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