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