indent -kr -i8 -brf -bbb -fnc -l132 -nce on all of webcit-classic
[citadel.git] / webcit / roomviews.c
1
2 /*
3  * Lots of different room-related operations.
4  */
5
6 #include "webcit.h"
7 #include "webserver.h"
8
9 char *viewdefs[VIEW_MAX];
10
11 /*
12  * This table defines which views may be selected as the
13  * default view for a room at the time of its creation.
14  */
15 int allowed_default_views[VIEW_MAX] = {
16         1,                      /* VIEW_BBS          Bulletin board */
17         1,                      /* VIEW_MAILBOX      Mailbox summary */
18         1,                      /* VIEW_ADDRESSBOOK  Address book */
19         1,                      /* VIEW_CALENDAR     Calendar */
20         1,                      /* VIEW_TASKS        Tasks */
21         1,                      /* VIEW_NOTES        Notes */
22         1,                      /* VIEW_WIKI         Wiki */
23         0,                      /* VIEW_CALBRIEF     Brief Calendar */
24         0,                      /* VIEW_JOURNAL      Journal */
25         0,                      /* VIEW_DRAFTS       Drafts */
26         1,                      /* VIEW_BLOG         Blog */
27         0                       /* VIEW_QUEUE        Mail Queue */
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 };
47
48 /*
49  * Initialize the viewdefs with localized strings
50  */
51 void initialize_viewdefs(void) {
52         viewdefs[VIEW_BBS] = _("Bulletin Board");
53         viewdefs[VIEW_MAILBOX] = _("Mail Folder");
54         viewdefs[VIEW_ADDRESSBOOK] = _("Address Book");
55         viewdefs[VIEW_CALENDAR] = _("Calendar");
56         viewdefs[VIEW_TASKS] = _("Task List");
57         viewdefs[VIEW_NOTES] = _("Notes List");
58         viewdefs[VIEW_WIKI] = _("Wiki");
59         viewdefs[VIEW_CALBRIEF] = _("Calendar List");
60         viewdefs[VIEW_JOURNAL] = _("Journal");
61         viewdefs[VIEW_DRAFTS] = _("Drafts");
62         viewdefs[VIEW_BLOG] = _("Blog");
63 }
64
65
66 void tmplput_ROOM_COLLECTIONTYPE(StrBuf * Target, WCTemplputParams * TP) {
67         folder *Folder = (folder *) CTX(CTX_ROOMS);
68
69         switch (Folder->view) {
70         case VIEW_CALENDAR:
71                 StrBufAppendBufPlain(Target, HKEY("vevent"), 0);
72                 break;
73         case VIEW_TASKS:
74                 StrBufAppendBufPlain(Target, HKEY("vtodo"), 0);
75                 break;
76         case VIEW_ADDRESSBOOK:
77                 StrBufAppendBufPlain(Target, HKEY("vcard"), 0);
78                 break;
79         case VIEW_NOTES:
80                 StrBufAppendBufPlain(Target, HKEY("vnotes"), 0);
81                 break;
82         case VIEW_JOURNAL:
83                 StrBufAppendBufPlain(Target, HKEY("vjournal"), 0);
84                 break;
85         case VIEW_WIKI:
86                 StrBufAppendBufPlain(Target, HKEY("wiki"), 0);
87                 break;
88         }
89 }
90
91
92
93 int ConditionalRoomHasGroupdavContent(StrBuf * Target, WCTemplputParams * TP) {
94         folder *Folder = (folder *) CTX(CTX_ROOMS);
95
96         syslog(LOG_DEBUG, "-> %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) || (Folder->view == VIEW_NOTES) || (Folder->view == VIEW_JOURNAL));
101 }
102
103
104
105
106 int ConditionalIsRoomtype(StrBuf * Target, WCTemplputParams * TP) {
107         wcsession *WCC = WC;
108
109         if ((WCC == NULL) || (TP->Tokens->nParameters < 3)) {
110                 return ((WCC->CurRoom.view < VIEW_BBS) || (WCC->CurRoom.view > VIEW_MAX));
111         }
112
113         return WCC->CurRoom.view == GetTemplateTokenNumber(Target, TP, 2, VIEW_BBS);
114 }
115
116
117 void tmplput_CurrentRoomViewString(StrBuf * Target, WCTemplputParams * TP) {
118         wcsession *WCC = WC;
119         StrBuf *Buf;
120
121         if ((WCC == NULL) || (WCC->CurRoom.defview >= VIEW_MAX) || (WCC->CurRoom.defview < VIEW_BBS)) {
122                 LogTemplateError(Target, "Token", ERR_PARM2, TP,
123                                  "Roomview [%ld] not valid\n", (WCC != NULL) ? WCC->CurRoom.defview : -1);
124                 return;
125         }
126
127         Buf = NewStrBufPlain(_(viewdefs[WCC->CurRoom.defview]), -1);
128         StrBufAppendTemplate(Target, TP, Buf, 0);
129         FreeStrBuf(&Buf);
130 }
131
132 void tmplput_RoomViewString(StrBuf * Target, WCTemplputParams * TP) {
133         long CheckThis;
134         StrBuf *Buf;
135
136         CheckThis = GetTemplateTokenNumber(Target, TP, 0, 0);
137         if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS)) {
138                 LogTemplateError(Target, "Token", ERR_PARM2, TP, "Roomview [%ld] not valid\n", CheckThis);
139                 return;
140         }
141
142         Buf = NewStrBufPlain(_(viewdefs[CheckThis]), -1);
143         StrBufAppendTemplate(Target, TP, Buf, 0);
144         FreeStrBuf(&Buf);
145 }
146
147
148
149 int ConditionalIsAllowedDefaultView(StrBuf * Target, WCTemplputParams * TP) {
150         wcsession *WCC = WC;
151         long CheckThis;
152
153         if (WCC == NULL)
154                 return 0;
155
156         CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
157         if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS)) {
158                 LogTemplateError(Target, "Conditional", ERR_PARM2, TP, "Roomview [%ld] not valid\n", CheckThis);
159                 return 0;
160         }
161
162         return allowed_default_views[CheckThis] != 0;
163 }
164
165 int ConditionalThisRoomDefView(StrBuf * Target, WCTemplputParams * TP) {
166         wcsession *WCC = WC;
167         long CheckThis;
168
169         if (WCC == NULL)
170                 return 0;
171
172         CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
173         return CheckThis == WCC->CurRoom.defview;
174 }
175
176 int ConditionalThisRoomCurrView(StrBuf * Target, WCTemplputParams * TP) {
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.view;
185 }
186
187 int ConditionalThisRoomHaveView(StrBuf * Target, WCTemplputParams * TP) {
188         wcsession *WCC = WC;
189         long CheckThis;
190
191         if (WCC == NULL)
192                 return 0;
193
194         CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
195         if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS)) {
196                 LogTemplateError(Target, "Conditional", ERR_PARM2, TP, "Roomview [%ld] not valid\n", CheckThis);
197                 return 0;
198         }
199
200         return exchangeable_views[WCC->CurRoom.defview][CheckThis];
201 }
202
203 void tmplput_ROOM_VIEW(StrBuf * Target, WCTemplputParams * TP) {
204         folder *Folder = (folder *) CTX(CTX_ROOMS);
205         StrBufAppendPrintf(Target, "%d", Folder->view);
206 }
207 void tmplput_ROOM_DEFVIEW(StrBuf * Target, WCTemplputParams * TP) {
208         folder *Folder = (folder *) CTX(CTX_ROOMS);
209         StrBufAppendPrintf(Target, "%d", Folder->defview);
210 }
211
212
213 void tmplput_CurrentRoomDefView(StrBuf * Target, WCTemplputParams * TP) {
214         wcsession *WCC = WC;
215
216         StrBufAppendPrintf(Target, "%d", WCC->CurRoom.defview);
217 }
218
219 void InitModule_ROOMVIEWS(void) {
220         /* we duplicate this, just to be shure its already done. */
221         RegisterCTX(CTX_ROOMS);
222         RegisterCTX(CTX_FLOORS);
223
224         initialize_viewdefs();
225
226         RegisterNamespace("THISROOM:VIEW_STRING", 0, 1, tmplput_CurrentRoomViewString, NULL, CTX_NONE);
227         RegisterNamespace("ROOM:VIEW_STRING", 1, 2, tmplput_RoomViewString, NULL, CTX_NONE);
228
229         RegisterConditional("COND:ALLOWED_DEFAULT_VIEW", 0, ConditionalIsAllowedDefaultView, CTX_NONE);
230         RegisterConditional("COND:THISROOM:DEFAULT_VIEW", 0, ConditionalThisRoomDefView, CTX_NONE);
231         RegisterNamespace("THISROOM:DEFAULT_VIEW", 0, 0, tmplput_CurrentRoomDefView, NULL, CTX_NONE);
232         RegisterNamespace("ROOM:INFO:DEFVIEW", 0, 1, tmplput_ROOM_DEFVIEW, NULL, CTX_ROOMS);
233
234         RegisterConditional("COND:ROOM:TYPE_IS", 0, ConditionalIsRoomtype, CTX_NONE);
235
236         RegisterConditional("COND:THISROOM:HAVE_VIEW", 0, ConditionalThisRoomHaveView, CTX_NONE);
237         RegisterConditional("COND:ROOM:DAV_CONTENT", 0, ConditionalRoomHasGroupdavContent, CTX_ROOMS);
238
239         RegisterConditional("COND:THISROOM:CURR_VIEW", 0, ConditionalThisRoomCurrView, CTX_NONE);
240         RegisterNamespace("ROOM:INFO:VIEW", 0, 1, tmplput_ROOM_VIEW, NULL, CTX_ROOMS);
241
242         RegisterNamespace("ROOM:INFO:COLLECTIONTYPE", 0, 1, tmplput_ROOM_COLLECTIONTYPE, NULL, CTX_ROOMS);
243
244
245
246 }