No more robots.txt, we now welcome spiders
[citadel.git] / webcit / roomviews.c
1 /*
2  * Lots of different room-related operations.
3  *
4  * Copyright (c) 1996-2010 by the citadel.org team
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include "webcit.h"
22 #include "webserver.h"
23
24 char *viewdefs[VIEW_MAX];                       /* the different kinds of available views */
25
26 ROOM_VIEWS exchangeable_views[VIEW_MAX][VIEW_MAX] = {   /* the different kinds of available views for a view */
27 {VIEW_BBS, VIEW_MAILBOX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX }, 
28 {VIEW_BBS, VIEW_MAILBOX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX }, 
29 {VIEW_MAX, VIEW_MAX, VIEW_ADDRESSBOOK, VIEW_CALENDAR, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX }, 
30 {VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_CALENDAR, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX /*VIEW_CALBRIEF*/, VIEW_MAX, VIEW_MAX }, 
31 {VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_TASKS, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, },
32 {VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_NOTES, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, },
33 {VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_WIKI, VIEW_MAX, VIEW_MAX, VIEW_MAX}, 
34 {VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_CALENDAR, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX/*VIEW_CALBRIEF*/, VIEW_MAX, VIEW_MAX},
35 {VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_JOURNAL, VIEW_MAX }, 
36 {VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_DRAFTS, VIEW_MAX }, 
37 {VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_BLOG }, 
38         };
39 /* the brief calendar view is disabled: VIEW_CALBRIEF */
40
41 ROOM_VIEWS allowed_default_views[VIEW_MAX] = {
42         1, /* VIEW_BBS                  Bulletin board                  */
43         1, /* VIEW_MAILBOX              Mailbox summary                 */
44         1, /* VIEW_ADDRESSBOOK          Address book                    */
45         1, /* VIEW_CALENDAR             Calendar by month or day        */
46         1, /* VIEW_TASKS                Task list                       */
47         1, /* VIEW_NOTES                Sticky notes                    */
48         1, /* VIEW_WIKI                 Wiki                            */
49         0, /* VIEW_CALBRIEF             Calendar list of events         */
50         0, /* VIEW_JOURNAL              Journal                         */
51         0, /* VIEW_DRAFTS               Drafts                          */
52         1  /* VIEW_BLOG                 Blog                            */
53 };
54
55 /*
56  * Initialize the viewdefs with localized strings
57  */
58 void initialize_viewdefs(void) {
59         viewdefs[VIEW_BBS] = _("Bulletin Board");
60         viewdefs[VIEW_MAILBOX] = _("Mail Folder");
61         viewdefs[VIEW_ADDRESSBOOK] = _("Address Book");
62         viewdefs[VIEW_CALENDAR] = _("Calendar");
63         viewdefs[VIEW_TASKS] = _("Task List");
64         viewdefs[VIEW_NOTES] = _("Notes List");
65         viewdefs[VIEW_WIKI] = _("Wiki");
66         viewdefs[VIEW_CALBRIEF] = _("Calendar List");
67         viewdefs[VIEW_JOURNAL] = _("Journal");
68         viewdefs[VIEW_DRAFTS] = _("Drafts");
69         viewdefs[VIEW_BLOG] = _("Blog");
70 }
71
72
73
74 void tmplput_ROOM_COLLECTIONTYPE(StrBuf *Target, WCTemplputParams *TP) 
75 {
76         folder *Folder = (folder *)CTX;
77         
78         switch(Folder->view) {
79         case VIEW_CALENDAR:
80                 StrBufAppendBufPlain(Target, HKEY("vevent"), 0);
81                 break;
82         case VIEW_TASKS:
83                 StrBufAppendBufPlain(Target, HKEY("vtodo"), 0);
84                 break;
85         case VIEW_ADDRESSBOOK:
86                 StrBufAppendBufPlain(Target, HKEY("vcard"), 0);
87                 break;
88         case VIEW_NOTES:
89                 StrBufAppendBufPlain(Target, HKEY("vnotes"), 0);
90                 break;
91         case VIEW_JOURNAL:
92                 StrBufAppendBufPlain(Target, HKEY("vjournal"), 0);
93                 break;
94         case VIEW_WIKI:
95                 StrBufAppendBufPlain(Target, HKEY("wiki"), 0);
96                 break;
97         }
98 }
99
100
101
102 int ConditionalRoomHasGroupdavContent(StrBuf *Target, WCTemplputParams *TP)
103 {
104         folder *Folder = (folder *)CTX;
105
106         lprintf(0, "-> %s: %ld\n", ChrPtr(Folder->name), Folder->view);
107
108         return ((Folder->view == VIEW_CALENDAR) || 
109                 (Folder->view == VIEW_TASKS) || 
110                 (Folder->view == VIEW_ADDRESSBOOK) ||
111                 (Folder->view == VIEW_NOTES) ||
112                 (Folder->view == VIEW_JOURNAL) );
113 }
114
115
116
117
118 int ConditionalIsRoomtype(StrBuf *Target, WCTemplputParams *TP)
119 {
120         wcsession *WCC = WC;
121
122         if ((WCC == NULL) ||
123             (TP->Tokens->nParameters < 3))
124         {
125                 return ((WCC->CurRoom.view < VIEW_BBS) || 
126                         (WCC->CurRoom.view > VIEW_MAX));
127         }
128
129         return WCC->CurRoom.view == GetTemplateTokenNumber(Target, TP, 2, VIEW_BBS);
130 }
131
132
133 void tmplput_CurrentRoomViewString(StrBuf *Target, WCTemplputParams *TP) 
134 {
135         wcsession *WCC = WC;
136         StrBuf *Buf;
137
138         if ((WCC == NULL) ||
139             (WCC->CurRoom.defview >= VIEW_MAX) || 
140             (WCC->CurRoom.defview < VIEW_BBS))
141         {
142                 LogTemplateError(Target, "Token", ERR_PARM2, TP,
143                                  "Roomview [%ld] not valid\n", 
144                                  (WCC != NULL)? 
145                                  WCC->CurRoom.defview : -1);
146                 return;
147         }
148
149         Buf = NewStrBufPlain(_(viewdefs[WCC->CurRoom.defview]), -1);
150         StrBufAppendTemplate(Target, TP, Buf, 0);
151         FreeStrBuf(&Buf);
152 }
153
154 void tmplput_RoomViewString(StrBuf *Target, WCTemplputParams *TP) 
155 {
156         long CheckThis;
157         StrBuf *Buf;
158
159         CheckThis = GetTemplateTokenNumber(Target, TP, 0, 0);
160         if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS))
161         {
162                 LogTemplateError(Target, "Token", ERR_PARM2, TP,
163                                  "Roomview [%ld] not valid\n", 
164                                  CheckThis);
165                 return;
166         }
167
168         Buf = NewStrBufPlain(_(viewdefs[CheckThis]), -1);
169         StrBufAppendTemplate(Target, TP, Buf, 0);
170         FreeStrBuf(&Buf);
171 }
172
173
174
175 int ConditionalIsAllowedDefaultView(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         if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS))
185         {
186                 LogTemplateError(Target, "Conditional", ERR_PARM2, TP,
187                                  "Roomview [%ld] not valid\n", 
188                                  CheckThis);
189                 return 0;
190         }
191
192         return allowed_default_views[CheckThis] != 0;
193 }
194
195 int ConditionalThisRoomDefView(StrBuf *Target, WCTemplputParams *TP)
196 {
197         wcsession *WCC = WC;
198         long CheckThis;
199
200         if (WCC == NULL)
201                 return 0;
202
203         CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
204         return CheckThis == WCC->CurRoom.defview;
205 }
206
207 int ConditionalThisRoomCurrView(StrBuf *Target, WCTemplputParams *TP)
208 {
209         wcsession *WCC = WC;
210         long CheckThis;
211
212         if (WCC == NULL)
213                 return 0;
214
215         CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
216         return CheckThis == WCC->CurRoom.view;
217 }
218
219 int ConditionalThisRoomHaveView(StrBuf *Target, WCTemplputParams *TP)
220 {
221         wcsession *WCC = WC;
222         long CheckThis;
223         
224         if (WCC == NULL)
225                 return 0;
226
227         CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
228         if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS))
229         {
230                 LogTemplateError(Target, "Conditional", ERR_PARM2, TP,
231                                  "Roomview [%ld] not valid\n", 
232                                  CheckThis);
233                 return 0;
234         }
235
236         return exchangeable_views [WCC->CurRoom.defview][CheckThis] != VIEW_MAX;
237 }
238
239 void tmplput_ROOM_VIEW(StrBuf *Target, WCTemplputParams *TP) 
240 {
241         folder *Folder = (folder *)CTX;
242         StrBufAppendPrintf(Target, "%d", Folder->view);
243 }
244 void tmplput_ROOM_DEFVIEW(StrBuf *Target, WCTemplputParams *TP) 
245 {
246         folder *Folder = (folder *)CTX;
247         StrBufAppendPrintf(Target, "%d", Folder->defview);
248 }
249
250
251 void tmplput_CurrentRoomDefView(StrBuf *Target, WCTemplputParams *TP) 
252 {
253         wcsession *WCC = WC;
254
255         StrBufAppendPrintf(Target, "%d", WCC->CurRoom.defview);
256 }
257
258 void 
259 InitModule_ROOMVIEWS
260 (void)
261 {
262         initialize_viewdefs();
263
264         RegisterNamespace("THISROOM:VIEW_STRING", 0, 1, tmplput_CurrentRoomViewString, NULL, CTX_NONE);
265         RegisterNamespace("ROOM:VIEW_STRING", 1, 2, tmplput_RoomViewString, NULL, CTX_NONE);
266
267         RegisterConditional(HKEY("COND:ALLOWED_DEFAULT_VIEW"), 0, ConditionalIsAllowedDefaultView, CTX_NONE);
268         RegisterConditional(HKEY("COND:THISROOM:DEFAULT_VIEW"), 0, ConditionalThisRoomDefView, CTX_NONE);
269         RegisterNamespace("THISROOM:DEFAULT_VIEW", 0, 0, tmplput_CurrentRoomDefView, NULL, CTX_NONE);
270         RegisterNamespace("ROOM:INFO:DEFVIEW", 0, 1, tmplput_ROOM_DEFVIEW, NULL, CTX_ROOMS);
271
272         RegisterConditional(HKEY("COND:ROOM:TYPE_IS"), 0, ConditionalIsRoomtype, CTX_NONE);
273
274         RegisterConditional(HKEY("COND:THISROOM:HAVE_VIEW"), 0, ConditionalThisRoomHaveView, CTX_NONE);
275         RegisterConditional(HKEY("COND:ROOM:GROUPDAV_CONTENT"), 0, ConditionalRoomHasGroupdavContent, CTX_ROOMS);
276
277         RegisterConditional(HKEY("COND:THISROOM:CURR_VIEW"), 0, ConditionalThisRoomCurrView, CTX_NONE);
278         RegisterNamespace("ROOM:INFO:VIEW", 0, 1, tmplput_ROOM_VIEW, NULL, CTX_ROOMS);
279
280         RegisterNamespace("ROOM:INFO:COLLECTIONTYPE", 0, 1, tmplput_ROOM_COLLECTIONTYPE, NULL, CTX_ROOMS);
281 }