X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Ficonbar.c;h=422ebbc103ea8b6807cae53c466f81d3d16cf8da;hb=fb6f6fa4ec4e3277e30d84326d48e6850822d318;hp=3ed1e38be203d8ab612351711254ee98f2df3bc7;hpb=6c0e5b60853210d4bd65789a53b0a087cd26d512;p=citadel.git diff --git a/webcit/iconbar.c b/webcit/iconbar.c index 3ed1e38be..422ebbc10 100644 --- a/webcit/iconbar.c +++ b/webcit/iconbar.c @@ -1,7 +1,15 @@ /* - * $Id$ - * * Displays and customizes the iconbar. + * + * Copyright (c) 1996-2012 by the citadel.org team + * + * This program is open source software. You can redistribute it and/or + * modify it under the terms of the GNU General Public License, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ #include "webcit.h" @@ -15,21 +23,55 @@ void DontDeleteThis(void *Data){} #define IconbarIsEnabled(a, b) IconbarIsENABLED(a, sizeof(a) - 1, b) -long IconbarIsENABLED(const char *key, size_t keylen, long defval) + +HashList *IB_Seeting_Order = NULL; +typedef struct _dflt_IB_Setting { + int DefVal; /* default value for non-set users */ + long n; /* counter for internal purposes */ + const char *Key; /* Stringvalue */ + long len; /* Length... */ +}dflt_IB_Setting; + +long nIBV = 0; +dflt_IB_Setting IconbarDefaults[] = { + {0, 0, HKEY("unused")}, + {0, 1, HKEY("ib_displayas")}, + {0, 2, HKEY("ib_logo")}, + {1, 3, HKEY("ib_summary")}, + {1, 4, HKEY("ib_inbox")}, + {1, 5, HKEY("ib_calendar")}, + {1, 6, HKEY("ib_contacts")}, + {1, 7, HKEY("ib_notes")}, + {1, 8, HKEY("ib_tasks")}, + {1, 9, HKEY("ib_rooms")}, + {1, 10, HKEY("ib_users")}, + {1, 11, HKEY("ib_chat")}, + {1, 12, HKEY("ib_advanced")}, + {1, 13, HKEY("ib_logoff")}, + {1, 14, HKEY("ib_citadel")}, + {0, 15, HKEY("")} +}; + +HashList *IBDfl = NULL; + + +long IconbarIsENABLED(long val, const char *key, size_t keylen) { - void *Data = NULL; + void *vIBDfl = NULL; wcsession *WCC = WC; - if (WCC == NULL) - return defval; - - if (GetHash(WCC->IconBarSettings, - key, - keylen, - &Data)) - return (long) Data; + if ((WCC != NULL) && + (WCC->IBSettingsVec != NULL) && + (val < nIBV)) + { + return WCC->IBSettingsVec[val]; + } + if (GetHash(IBDfl, key, keylen, &vIBDfl)) { + dflt_IB_Setting *Set = (dflt_IB_Setting*)vIBDfl; + return Set->DefVal; + } else - return defval; + return 1; } #ifdef DBG_ICONBAR_HASH @@ -41,73 +83,69 @@ inline const char *PrintInt(void *Prefstr) } #endif -/* Produces a stylesheet which hides any iconbar icons the user does not want */ -void doUserIconStylesheet(void) { - HashPos *pos; - void *Data; - long value; - const char *key; - long HKLen; - - output_custom_content_header("text/css"); +/* hprintf("Cache-Control: private\r\n"); - - begin_burst(); - wprintf("#global { left: 16%%; }\r\n"); - pos = GetNewHashPos(WC->IconBarSettings, 0); - while(GetNextHashPos(WC->IconBarSettings, pos, &HKLen, &key, &Data)) { - value = (long) Data; - if (value == 0 - && strncasecmp("ib_displayas",key,12) - && strncasecmp("ib_logoff", key, 9)) { - /* Don't shoot me for this */ - wprintf("#%s { display: none !important; }\r\n",key); - } else if (!strncasecmp("ib_users",key, 8) && value == 2) { - wprintf("#online_users { display: block; !important } \r\n"); - } - } - DeleteHashPos(&pos); - end_burst(); -} +*/ + int ConditionalIsActiveStylesheet(StrBuf *Target, WCTemplputParams *TP) { long testFor; - int ib_displayas; + long lookAt; + long ib_displayas; + + lookAt = GetTemplateTokenNumber(Target, TP, 3, IB_PICTEXT); + testFor = GetTemplateTokenNumber(Target, TP, 2, IB_PICTEXT); + + + + ib_displayas = IconbarIsENABLED(lookAt, TKEY(3)); +/* + printf ("%ld == %ld ? %s : %s\n", + testFor, + ib_displayas, + IconbarDefaults[lookAt ].Key, + ChrPtr(TP->Tokens->FlatToken)); +*/ - testFor = GetTemplateTokenNumber(Target, TP, 3, IB_PICTEXT); - ib_displayas = IconbarIsENABLED(TKEY(2),0); return (testFor == ib_displayas); } void LoadIconSettings(StrBuf *iconbar, long lvalue) { + void *vIBDfl; + dflt_IB_Setting *Set; + const char *pCh = NULL; + wcsession *WCC = WC; StrBuf *buf; StrBuf *key; long val; - int i, nTokens; - buf = NewStrBuf();; + buf = NewStrBuf(); key = NewStrBuf(); - if (WCC->IconBarSettings == NULL) - WCC->IconBarSettings = NewHash(1, NULL); - /** + if (WCC->IBSettingsVec == NULL) + { + WCC->IBSettingsVec = (long*) malloc (nIBV * sizeof(long)); + } + /* * The initialized values of these variables also happen to * specify the default values for users who haven't customized * their iconbars. These should probably be set in a master * configuration somewhere. */ - nTokens = StrBufNum_tokens(iconbar, ','); - for (i=0; i= 0) + { StrBufExtract_token(key, buf, 0, '='); val = StrBufExtract_long(buf, 1, '='); - Put(WCC->IconBarSettings, - ChrPtr(key), StrLength(key), - (void*)val, DontDeleteThis); - } + if (!GetHash(IBDfl, SKEY(key), &vIBDfl)) + continue; + Set = (dflt_IB_Setting*)vIBDfl; + + WCC->IBSettingsVec[Set->n] = val; +/* printf("%ld %s %s -> %ld \n", Set->n, Set->Key, IconbarDefaults[Set->n].Key, val);*/ + } #ifdef DBG_ICONBAR_HASH dbg_PrintHash(WCC->IconBarSetttings, PrintInt, NULL); #endif @@ -126,21 +164,6 @@ void commit_iconbar(void) { StrBuf *buf; int i; - char *boxen[] = { - "ib_logo", - "ib_summary", - "ib_inbox", - "ib_calendar", - "ib_contacts", - "ib_notes", - "ib_tasks", - "ib_rooms", - "ib_users", - "ib_chat", - "ib_advanced", - "ib_logoff", - "ib_citadel" - }; if (!havebstr("ok_button")) { display_main_menu(); @@ -150,18 +173,24 @@ void commit_iconbar(void) { iconbar = NewStrBuf(); buf = NewStrBuf(); StrBufPrintf(iconbar, "ib_displayas=%d", ibstr("ib_displayas")); - for (i=0; i<(sizeof(boxen)/sizeof(char *)); ++i) { + for (i=0; i<(sizeof(IconbarDefaults)/sizeof(dflt_IB_Setting )); ++i) { char *Val; - if (!strcasecmp(BSTR(boxen[i]), "yes")) { + if (!strcasecmp(Bstr(IconbarDefaults[i].Key, + IconbarDefaults[i].len), + "yes")) + { Val = "1"; } - else if (!strcasecmp(BSTR(boxen[i]), "yeslist")) { + else if (!strcasecmp(Bstr(IconbarDefaults[i].Key, + IconbarDefaults[i].len), + "yeslist")) + { Val = "2"; } else { Val = "0"; } - StrBufPrintf(buf, ",%s=%s", boxen[i], Val); + StrBufPrintf(buf, ",%s=%s", IconbarDefaults[i].Key, Val); StrBufAppendBuf(iconbar, buf, 0); } @@ -178,25 +207,127 @@ void commit_iconbar(void) { } +/* + * Display the icon bar as long as we have an active session, + * and either the user is logged in or the server allows guest mode. + */ void tmplput_iconbar(StrBuf *Target, WCTemplputParams *TP) { wcsession *WCC = WC; - if ((WCC != NULL) && (WCC->logged_in)) { - DoTemplate(HKEY("iconbar"), NULL, &NoCtx); + if ( (WCC != NULL) + && ( (WCC->logged_in) + || (WCC->serv_info->serv_supports_guest) + ) + ) { + DoTemplate(HKEY("iconbar"), NULL, &NoCtx); } } + +void +ServerShutdownModule_ICONBAR +(void) +{ + DeleteHash(&IBDfl); +} + + + +void +ServerStartModule_ICONBAR +(void) +{ + int i = 1; + IBDfl = NewHash(1, NULL); + + while (IconbarDefaults[i].len != 0) + { + Put(IBDfl, + IconbarDefaults[i].Key, + IconbarDefaults[i].len, + &IconbarDefaults[i], + reference_free_handler); + i++; + } +} + + +int ConditionalWholistExpanded(StrBuf *Target, WCTemplputParams *TP) +{ + int r = 0; + if (WC) r = WC->ib_wholist_expanded; + syslog(LOG_DEBUG, "ConditionalWholistExpanded() returns %d", r); + return(r); +} + + +int ConditionalRoomlistExpanded(StrBuf *Target, WCTemplputParams *TP) +{ + if (WC) return(WC->ib_roomlist_expanded); + return(0); +} + + + +/* + * Toggle the roomlist expanded state in session memory + */ +void toggle_roomlist_expanded_state(void) { + wcsession *WCC = WC; + + if (!WCC) { + wc_printf("no session"); + return; + } + + WCC->ib_roomlist_expanded = IBSTR("wstate"); + wc_printf("%d", WCC->ib_roomlist_expanded); + syslog(LOG_DEBUG, "ib_roomlist_expanded set to %d", WCC->ib_roomlist_expanded); +} + + +/* + * Toggle the wholist expanded state in session memory + */ +void toggle_wholist_expanded_state(void) { + wcsession *WCC = WC; + + if (!WCC) { + wc_printf("no session"); + return; + } + + WCC->ib_wholist_expanded = IBSTR("wstate"); + wc_printf("%d", WCC->ib_wholist_expanded); + syslog(LOG_DEBUG, "ib_wholist_expanded set to %d", WCC->ib_wholist_expanded); +} + + void InitModule_ICONBAR (void) { - WebcitAddUrlHandler(HKEY("user_iconbar"), doUserIconStylesheet, 0); - WebcitAddUrlHandler(HKEY("commit_iconbar"), commit_iconbar, 0); + long l; + + /*WebcitAddUrlHandler(HKEY("user_iconbar"), "", 0, doUserIconStylesheet, 0); */ + WebcitAddUrlHandler(HKEY("commit_iconbar"), "", 0, commit_iconbar, 0); + WebcitAddUrlHandler(HKEY("toggle_wholist_expanded_state"), "", 0, toggle_wholist_expanded_state, AJAX); + WebcitAddUrlHandler(HKEY("toggle_roomlist_expanded_state"), "", 0, toggle_roomlist_expanded_state, AJAX); RegisterConditional(HKEY("COND:ICONBAR:ACTIVE"), 3, ConditionalIsActiveStylesheet, CTX_NONE); - RegisterNamespace("ICONBAR", 0, 0, tmplput_iconbar, 0); + RegisterNamespace("ICONBAR", 0, 0, tmplput_iconbar, NULL, CTX_NONE); + RegisterConditional(HKEY("COND:ICONBAR:WHOLISTEXPANDED"), 0, ConditionalWholistExpanded, CTX_NONE); + RegisterConditional(HKEY("COND:ICONBAR:ROOMLISTEXPANDED"), 0, ConditionalRoomlistExpanded, CTX_NONE); RegisterPreference("iconbar", _("Iconbar Setting"), PRF_STRING, LoadIconSettings); + l = 1; + while (IconbarDefaults[l].len != 0) + { + RegisterTokenParamDefine(IconbarDefaults[l].Key, + IconbarDefaults[l].len, l); + l ++; + } + nIBV = l; } @@ -205,5 +336,7 @@ void SessionDestroyModule_ICONBAR (wcsession *sess) { - DeleteHash(&sess->IconBarSettings); + if (sess->IBSettingsVec != NULL) + free(sess->IBSettingsVec); } +