4 * Displays and customizes the iconbar.
9 /* Values for ib_displayas ... don't change these or you will break the templates */
10 #define IB_PICTEXT 0 /* picture and text */
11 #define IB_PICONLY 1 /* just a picture */
12 #define IB_TEXTONLY 2 /* just text */
14 void DontDeleteThis(void *Data){}
16 #define IconbarIsEnabled(a, b) IconbarIsENABLED(a, sizeof(a) - 1, b)
19 HashList *IB_Seeting_Order = NULL;
20 typedef struct _dflt_IB_Setting {
21 int DefVal; /* default value for non-set users */
22 long n; /* counter for internal purposes */
23 const char *Key; /* Stringvalue */
24 long len; /* Length... */
28 dflt_IB_Setting IconbarDefaults[] = {
29 {0, 0, HKEY("unused")},
30 {0, 1, HKEY("ib_displayas")},
31 {0, 2, HKEY("ib_logo")},
32 {1, 3, HKEY("ib_summary")},
33 {1, 4, HKEY("ib_inbox")},
34 {1, 5, HKEY("ib_calendar")},
35 {1, 6, HKEY("ib_contacts")},
36 {1, 7, HKEY("ib_notes")},
37 {1, 8, HKEY("ib_tasks")},
38 {1, 9, HKEY("ib_rooms")},
39 {1, 10, HKEY("ib_users")},
40 {1, 11, HKEY("ib_chat")},
41 {1, 12, HKEY("ib_advanced")},
42 {1, 13, HKEY("ib_logoff")},
43 {1, 14, HKEY("ib_citadel")},
47 HashList *IBDfl = NULL;
50 long IconbarIsENABLED(long val, const char *key, size_t keylen)
56 (WCC->IBSettingsVec != NULL) &&
59 return WCC->IBSettingsVec[val];
61 if (GetHash(IBDfl, key, keylen, &vIBDfl)) {
62 dflt_IB_Setting *Set = (dflt_IB_Setting*)vIBDfl;
69 #ifdef DBG_ICONBAR_HASH
71 inline const char *PrintInt(void *Prefstr)
73 snprintf(nbuf, sizeof(nbuf), "%ld", (long)Prefstr);
78 /* Produces a stylesheet which hides any iconbar icons the user does not want * /
79 void doUserIconStylesheet(void) {
86 output_custom_content_header("text/css");
87 hprintf("Cache-Control: private\r\n");
90 wc_printf("#global { left: 16%%; }\r\n");
91 pos = GetNewHashPos(WC->IconBarSettings, 0);
92 while(GetNextHashPos(WC->IconBarSettings, pos, &HKLen, &key, &Data)) {
95 && strncasecmp("ib_displayas",key,12)
96 && strncasecmp("ib_logoff", key, 9)) {
97 / * Don't shoot me for this * /
98 wc_printf("#%s { display: none !important; }\r\n",key);
99 } else if (!strncasecmp("ib_users",key, 8) && value == 2) {
100 wc_printf("#online_users { display: block; !important } \r\n");
107 void doUserIconStylesheet(void) {
114 // output_custom_content_header("text/css");
115 const StrBuf *MimeType;
117 MimeType = DoTemplate(HKEY("user_iconbar"), NULL, &NoCtx);
118 http_transmit_thing(ChrPtr(MimeType), 0);
119 hprintf("Cache-Control: private\r\n");
127 int ConditionalIsActiveStylesheet(StrBuf *Target, WCTemplputParams *TP) {
132 lookAt = GetTemplateTokenNumber(Target, TP, 3, IB_PICTEXT);
133 testFor = GetTemplateTokenNumber(Target, TP, 2, IB_PICTEXT);
137 ib_displayas = IconbarIsENABLED(lookAt, TKEY(3));
139 printf ("%ld == %ld ? %s : %s\n",
142 IconbarDefaults[lookAt ].Key,
143 ChrPtr(TP->Tokens->FlatToken));
146 return (testFor == ib_displayas);
149 void LoadIconSettings(StrBuf *iconbar, long lvalue)
152 dflt_IB_Setting *Set;
153 const char *pCh = NULL;
162 if (WCC->IBSettingsVec == NULL)
164 WCC->IBSettingsVec = (long*) malloc (nIBV * sizeof(long));
167 * The initialized values of these variables also happen to
168 * specify the default values for users who haven't customized
169 * their iconbars. These should probably be set in a master
170 * configuration somewhere.
173 while (StrBufExtract_NextToken(buf, iconbar, &pCh, ',') >= 0)
175 StrBufExtract_token(key, buf, 0, '=');
176 val = StrBufExtract_long(buf, 1, '=');
178 if (!GetHash(IBDfl, SKEY(key), &vIBDfl))
180 Set = (dflt_IB_Setting*)vIBDfl;
182 WCC->IBSettingsVec[Set->n] = val;
183 printf("%ld %s %s -> %ld \n", Set->n, Set->Key, IconbarDefaults[Set->n].Key, val);
185 #ifdef DBG_ICONBAR_HASH
186 dbg_PrintHash(WCC->IconBarSetttings, PrintInt, NULL);
195 * save changes to iconbar settings
197 void commit_iconbar(void) {
198 const StrBuf *MimeType;
204 if (!havebstr("ok_button")) {
209 iconbar = NewStrBuf();
211 StrBufPrintf(iconbar, "ib_displayas=%d", ibstr("ib_displayas"));
212 for (i=0; i<(sizeof(IconbarDefaults)/sizeof(dflt_IB_Setting )); ++i) {
214 if (!strcasecmp(Bstr(IconbarDefaults[i].Key,
215 IconbarDefaults[i].len),
220 else if (!strcasecmp(Bstr(IconbarDefaults[i].Key,
221 IconbarDefaults[i].len),
229 StrBufPrintf(buf, ",%s=%s", IconbarDefaults[i].Key, Val);
230 StrBufAppendBuf(iconbar, buf, 0);
234 set_preference("iconbar", iconbar, 1);
238 MimeType = DoTemplate(HKEY("iconbar_save"), NULL, &NoCtx);
239 http_transmit_thing(ChrPtr(MimeType), 0);
240 #ifdef DBG_ICONBAR_HASH
241 dbg_PrintHash(WC->IconBarSetttings, PrintInt, NULL);
246 void tmplput_iconbar(StrBuf *Target, WCTemplputParams *TP)
250 if ((WCC != NULL) && (WCC->logged_in)) {
251 DoTemplate(HKEY("iconbar"), NULL, &NoCtx);
257 ServerShutdownModule_ICONBAR
266 ServerStartModule_ICONBAR
270 IBDfl = NewHash(1, NULL);
272 while (IconbarDefaults[i].len != 0)
275 IconbarDefaults[i].Key,
276 IconbarDefaults[i].len,
278 reference_free_handler);
289 /*WebcitAddUrlHandler(HKEY("user_iconbar"), "", 0, doUserIconStylesheet, 0); */
290 WebcitAddUrlHandler(HKEY("commit_iconbar"), "", 0, commit_iconbar, 0);
291 RegisterConditional(HKEY("COND:ICONBAR:ACTIVE"), 3, ConditionalIsActiveStylesheet, CTX_NONE);
292 RegisterNamespace("ICONBAR", 0, 0, tmplput_iconbar, NULL, CTX_NONE);
294 RegisterPreference("iconbar", _("Iconbar Setting"), PRF_STRING, LoadIconSettings);
296 while (IconbarDefaults[l].len != 0)
298 RegisterTokenParamDefine(IconbarDefaults[l].Key,
299 IconbarDefaults[l].len, l);
308 SessionDestroyModule_ICONBAR
311 if (sess->IBSettingsVec != NULL)
312 free(sess->IBSettingsVec);