Remove $Id$ tags from most of webcit
[citadel.git] / webcit / iconbar.c
1 /*
2  * Displays and customizes the iconbar.
3  */
4
5 #include "webcit.h"
6
7 /* Values for ib_displayas ... don't change these or you will break the templates */
8 #define IB_PICTEXT      0       /* picture and text */
9 #define IB_PICONLY      1       /* just a picture */
10 #define IB_TEXTONLY     2       /* just text */
11
12 void DontDeleteThis(void *Data){}
13
14 #define IconbarIsEnabled(a, b) IconbarIsENABLED(a, sizeof(a) - 1, b)
15
16
17 HashList *IB_Seeting_Order = NULL;
18 typedef struct _dflt_IB_Setting {
19         int         DefVal;  /* default value for non-set users */
20         long        n;       /* counter for internal purposes   */
21         const char *Key;     /* Stringvalue */
22         long        len;     /* Length... */
23 }dflt_IB_Setting;
24
25 long nIBV = 0;
26 dflt_IB_Setting IconbarDefaults[] = {
27         {0,  0, HKEY("unused")},
28         {0,  1, HKEY("ib_displayas")},
29         {0,  2, HKEY("ib_logo")},
30         {1,  3, HKEY("ib_summary")},
31         {1,  4, HKEY("ib_inbox")},
32         {1,  5, HKEY("ib_calendar")},
33         {1,  6, HKEY("ib_contacts")},
34         {1,  7, HKEY("ib_notes")},
35         {1,  8, HKEY("ib_tasks")},
36         {1,  9, HKEY("ib_rooms")},
37         {1, 10, HKEY("ib_users")},
38         {1, 11, HKEY("ib_chat")},
39         {1, 12, HKEY("ib_advanced")},
40         {1, 13, HKEY("ib_logoff")},
41         {1, 14, HKEY("ib_citadel")},
42         {0, 15, HKEY("")}
43 };
44
45 HashList *IBDfl = NULL;
46
47
48 long IconbarIsENABLED(long val, const char *key, size_t keylen)
49 {
50         void *vIBDfl = NULL;
51         wcsession *WCC = WC;
52
53         if ((WCC != NULL) && 
54             (WCC->IBSettingsVec != NULL) && 
55             (val < nIBV))
56         {
57                 return WCC->IBSettingsVec[val];
58         }
59         if (GetHash(IBDfl, key, keylen, &vIBDfl)) {
60                 dflt_IB_Setting *Set = (dflt_IB_Setting*)vIBDfl;
61                 return Set->DefVal;
62         }
63         else 
64                 return 1;
65 }
66
67 #ifdef DBG_ICONBAR_HASH
68 static char nbuf[32];
69 inline const char *PrintInt(void *Prefstr)
70 {
71         snprintf(nbuf, sizeof(nbuf), "%ld", (long)Prefstr);
72         return nbuf;
73 }
74 #endif
75
76 /* 
77         hprintf("Cache-Control: private\r\n");
78 */
79
80
81 int ConditionalIsActiveStylesheet(StrBuf *Target, WCTemplputParams *TP) {
82         long testFor;
83         long lookAt;
84         long ib_displayas;
85
86         lookAt = GetTemplateTokenNumber(Target, TP, 3, IB_PICTEXT);
87         testFor = GetTemplateTokenNumber(Target, TP, 2, IB_PICTEXT);
88
89
90
91         ib_displayas = IconbarIsENABLED(lookAt, TKEY(3));
92 /*
93         printf ("%ld == %ld ? %s : %s\n", 
94                 testFor, 
95                 ib_displayas, 
96                 IconbarDefaults[lookAt ].Key, 
97                 ChrPtr(TP->Tokens->FlatToken));
98 */
99
100         return (testFor == ib_displayas);
101 }
102
103 void LoadIconSettings(StrBuf *iconbar, long lvalue)
104 {
105         void *vIBDfl;
106         dflt_IB_Setting *Set;
107         const char *pCh = NULL;
108
109         wcsession *WCC = WC;
110         StrBuf *buf;
111         StrBuf *key;
112         long val;
113
114         buf = NewStrBuf();
115         key = NewStrBuf();
116         if (WCC->IBSettingsVec == NULL)
117         {
118                 WCC->IBSettingsVec = (long*) malloc (nIBV * sizeof(long));
119         }
120         /**
121          * The initialized values of these variables also happen to
122          * specify the default values for users who haven't customized
123          * their iconbars.  These should probably be set in a master
124          * configuration somewhere.
125          */
126
127         while (StrBufExtract_NextToken(buf, iconbar, &pCh,  ',') >= 0)
128         {
129                 StrBufExtract_token(key, buf, 0, '=');
130                 val = StrBufExtract_long(buf, 1, '=');
131
132                 if (!GetHash(IBDfl, SKEY(key), &vIBDfl)) 
133                         continue;
134                 Set = (dflt_IB_Setting*)vIBDfl;
135
136                 WCC->IBSettingsVec[Set->n] = val;
137 /*              printf("%ld %s %s -> %ld \n", Set->n, Set->Key, IconbarDefaults[Set->n].Key, val);*/
138         }
139 #ifdef DBG_ICONBAR_HASH
140         dbg_PrintHash(WCC->IconBarSetttings, PrintInt, NULL);
141 #endif
142
143         FreeStrBuf(&key);
144         FreeStrBuf(&buf);
145 }
146
147
148 /*
149  * save changes to iconbar settings
150  */
151 void commit_iconbar(void) {
152         const StrBuf *MimeType;
153         StrBuf *iconbar;
154         StrBuf *buf;
155         int i;
156
157
158         if (!havebstr("ok_button")) {
159                 display_main_menu();
160                 return;
161         }
162
163         iconbar = NewStrBuf();
164         buf = NewStrBuf();
165         StrBufPrintf(iconbar, "ib_displayas=%d", ibstr("ib_displayas"));
166         for (i=0; i<(sizeof(IconbarDefaults)/sizeof(dflt_IB_Setting )); ++i) {
167                 char *Val;
168                 if (!strcasecmp(Bstr(IconbarDefaults[i].Key,
169                                      IconbarDefaults[i].len),
170                                 "yes")) 
171                 {
172                         Val = "1";
173                 }
174                 else if (!strcasecmp(Bstr(IconbarDefaults[i].Key,
175                                           IconbarDefaults[i].len),
176                                      "yeslist")) 
177                 {
178                         Val = "2";
179                 }
180                 else {
181                         Val = "0";
182                 }
183                 StrBufPrintf(buf, ",%s=%s", IconbarDefaults[i].Key, Val);
184                 StrBufAppendBuf(iconbar, buf, 0);
185
186         }
187         FreeStrBuf(&buf);
188         set_preference("iconbar", iconbar, 1);
189
190
191         begin_burst();
192         MimeType = DoTemplate(HKEY("iconbar_save"), NULL, &NoCtx);
193         http_transmit_thing(ChrPtr(MimeType), 0);
194 #ifdef DBG_ICONBAR_HASH
195         dbg_PrintHash(WC->IconBarSetttings, PrintInt, NULL);
196 #endif
197 }
198
199
200 void tmplput_iconbar(StrBuf *Target, WCTemplputParams *TP)
201 {
202         wcsession *WCC = WC;
203         
204         if ((WCC != NULL) && (WCC->logged_in)) {
205           DoTemplate(HKEY("iconbar"), NULL, &NoCtx);
206         }
207 }
208
209
210 void 
211 ServerShutdownModule_ICONBAR
212 (void)
213 {
214         DeleteHash(&IBDfl);
215 }
216
217
218
219 void
220 ServerStartModule_ICONBAR
221 (void)
222 {
223         int i = 1;
224         IBDfl = NewHash(1, NULL);
225
226         while (IconbarDefaults[i].len != 0)
227         {
228                 Put(IBDfl, 
229                     IconbarDefaults[i].Key, 
230                     IconbarDefaults[i].len, 
231                     &IconbarDefaults[i], 
232                     reference_free_handler);
233                 i++;
234         }
235 }
236
237 void 
238 InitModule_ICONBAR
239 (void)
240 {
241         long l;
242
243         /*WebcitAddUrlHandler(HKEY("user_iconbar"), "", 0, doUserIconStylesheet, 0); */
244         WebcitAddUrlHandler(HKEY("commit_iconbar"), "", 0, commit_iconbar, 0);
245         RegisterConditional(HKEY("COND:ICONBAR:ACTIVE"), 3, ConditionalIsActiveStylesheet, CTX_NONE);
246         RegisterNamespace("ICONBAR", 0, 0, tmplput_iconbar, NULL, CTX_NONE);
247
248         RegisterPreference("iconbar", _("Iconbar Setting"), PRF_STRING, LoadIconSettings);
249         l = 1;
250         while (IconbarDefaults[l].len != 0)
251         {
252                 RegisterTokenParamDefine(IconbarDefaults[l].Key, 
253                                          IconbarDefaults[l].len, l);
254                 l ++;
255         }
256         nIBV = l;
257 }
258
259
260
261 void 
262 SessionDestroyModule_ICONBAR
263 (wcsession *sess)
264 {
265         if (sess->IBSettingsVec != NULL)
266                 free(sess->IBSettingsVec);
267 }