X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Ficonbar.c;h=e1ea9b0ec6cd3907d25f4031d314d6d639abe0a0;hb=HEAD;hp=4dfc3e74e38d6a89d45b60b9abcb4bdf2ca26022;hpb=3cd7008448ee696d9e4e2987bad838a9cb53a794;p=citadel.git diff --git a/webcit/iconbar.c b/webcit/iconbar.c index 4dfc3e74e..e1ea9b0ec 100644 --- a/webcit/iconbar.c +++ b/webcit/iconbar.c @@ -1,533 +1,343 @@ -/* $Id$ */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +/* + * 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" +/* Values for ib_displayas ... don't change these or you will break the templates */ +#define IB_PICTEXT 0 /* picture and text */ +#define IB_PICONLY 1 /* just a picture */ +#define IB_TEXTONLY 2 /* just text */ + +void DontDeleteThis(void *Data){} + +#define IconbarIsEnabled(a, b) IconbarIsENABLED(a, sizeof(a) - 1, b) + + +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 *vIBDfl = NULL; + wcsession *WCC = WC; + + 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 1; +} + +#ifdef DBG_ICONBAR_HASH +static char nbuf[32]; +inline const char *PrintInt(void *Prefstr) +{ + snprintf(nbuf, sizeof(nbuf), "%ld", (long)Prefstr); + return nbuf; +} +#endif -/* Values for ib_displayas */ -#define IB_PICTEXT 0 -#define IB_PICONLY 1 -#define IB_TEXTONLY 2 +/* + hprintf("Cache-Control: private\r\n"); +*/ + + +int ConditionalIsActiveStylesheet(StrBuf *Target, WCTemplputParams *TP) { + long testFor; + long lookAt; + long ib_displayas; + + lookAt = GetTemplateTokenNumber(Target, TP, 3, IB_PICTEXT); + testFor = GetTemplateTokenNumber(Target, TP, 2, IB_PICTEXT); -void do_iconbar(void) { - char iconbar[SIZ]; - char buf[SIZ]; - char key[SIZ], value[SIZ]; - int i; - /* The initialized values of these variables also happen to + + ib_displayas = IconbarIsENABLED(lookAt, TKEY(3)); +/* + printf ("%ld == %ld ? %s : %s\n", + testFor, + ib_displayas, + IconbarDefaults[lookAt ].Key, + ChrPtr(TP->Tokens->FlatToken)); +*/ + + 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; + + buf = NewStrBuf(); + key = NewStrBuf(); + 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. */ - int ib_displayas = 0; /* pictures and text, pictures, text */ - int ib_logo = 1; /* Site logo */ - int ib_summary = 0; /* Summary page icon */ - int ib_inbox = 0; /* Inbox icon */ - int ib_calendar = 0; /* Calendar icon */ - int ib_contacts = 0; /* Contacts icon */ - int ib_tasks = 0; /* Tasks icon */ - int ib_rooms = 1; /* Rooms icon */ - int ib_users = 1; /* Users icon */ - int ib_advanced = 1; /* Advanced Options icon */ - int ib_logoff = 1; /* Logoff button */ - int ib_citadel = 1; /* 'Powered by Citadel' logo */ - /* - */ - get_preference("iconbar", iconbar); - for (i=0; i= 0) + { + StrBufExtract_token(key, buf, 0, '='); + val = StrBufExtract_long(buf, 1, '='); + 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 + FreeStrBuf(&key); + FreeStrBuf(&buf); +} - output_headers(11); - do_template("beginbox_nt"); - wprintf("
\n"); +/* + * save changes to iconbar settings + */ +void commit_iconbar(void) { + const StrBuf *MimeType; + StrBuf *iconbar; + StrBuf *buf; + int i; - if (ib_logo) if (ib_displayas != IB_TEXTONLY) wprintf( - "\"\" \"" - "
\n" - ); - if (ib_summary) { - wprintf("" - "" - ); - if (ib_displayas != IB_TEXTONLY) { - wprintf("
"); - } - if (ib_displayas != IB_PICONLY) { - wprintf("Summary
"); - } - wprintf("
\n"); + if (!havebstr("ok_button")) { + display_main_menu(); + return; } - if (ib_inbox) { - wprintf("" - "" - ); - if (ib_displayas != IB_TEXTONLY) { - wprintf("
"); + iconbar = NewStrBuf(); + buf = NewStrBuf(); + StrBufPrintf(iconbar, "ib_displayas=%d", ibstr("ib_displayas")); + for (i=0; i<(sizeof(IconbarDefaults)/sizeof(dflt_IB_Setting )); ++i) { + char *Val; + if (!strcasecmp(Bstr(IconbarDefaults[i].Key, + IconbarDefaults[i].len), + "yes")) + { + Val = "1"; } - if (ib_displayas != IB_PICONLY) { - wprintf("Mail
"); + else if (!strcasecmp(Bstr(IconbarDefaults[i].Key, + IconbarDefaults[i].len), + "yeslist")) + { + Val = "2"; } - wprintf("
\n"); - } - - if (ib_calendar) { - wprintf("" - "" - ); - if (ib_displayas != IB_TEXTONLY) { - wprintf("
"); - } - if (ib_displayas != IB_PICONLY) { - wprintf("Calendar
"); + else { + Val = "0"; } - wprintf("
\n"); - } + StrBufPrintf(buf, ",%s=%s", IconbarDefaults[i].Key, Val); + StrBufAppendBuf(iconbar, buf, 0); - if (ib_contacts) { - wprintf("" - "" - ); - if (ib_displayas != IB_TEXTONLY) { - wprintf("
"); - } - if (ib_displayas != IB_PICONLY) { - wprintf("Contacts
"); - } - wprintf("
\n"); } + FreeStrBuf(&buf); + set_preference("iconbar", iconbar, 1); - if (ib_tasks) { - wprintf("" - "" - ); - if (ib_displayas != IB_TEXTONLY) { - wprintf("
"); - } - if (ib_displayas != IB_PICONLY) { - wprintf("Tasks
"); - } - wprintf("
\n"); - } - if (ib_rooms) { - wprintf("" - "" - ); - if (ib_displayas != IB_TEXTONLY) { - wprintf("
"); - } - if (ib_displayas != IB_PICONLY) { - wprintf("Rooms
"); - } - wprintf("
\n"); - } + begin_burst(); + MimeType = DoTemplate(HKEY("iconbar_save"), NULL, &NoCtx); + http_transmit_thing(ChrPtr(MimeType), 0); +#ifdef DBG_ICONBAR_HASH + dbg_PrintHash(WC->IconBarSetttings, PrintInt, NULL); +#endif +} - if (ib_users) { - wprintf("" - "" - ); - if (ib_displayas != IB_TEXTONLY) { - wprintf("
"); - } - if (ib_displayas != IB_PICONLY) { - wprintf("Users
"); - } - wprintf("
\n"); - } - if (ib_advanced) { - wprintf("" - "" - ); - if (ib_displayas != IB_TEXTONLY) { - wprintf("
"); - } - if (ib_displayas != IB_PICONLY) { - wprintf("Advanced options
"); - } - wprintf("
\n"); +/* + * 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) || + ((WCC->serv_info != NULL) && + (WCC->serv_info->serv_supports_guest)) + ) ) + { + DoTemplate(HKEY("iconbar"), NULL, &NoCtx); } +} - if (ib_logoff) { - wprintf("" - "" - ); - if (ib_displayas != IB_TEXTONLY) { - wprintf("
"); - } - if (ib_displayas != IB_PICONLY) { - wprintf("Log off
"); - } - wprintf("
\n"); + +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++; } +} + - wprintf( - "" - "customize this menu" - "
\n" - ); - - if (ib_citadel) if (ib_displayas != IB_TEXTONLY) wprintf( - "" - "powered by
\"CITADEL/UX\"
" - "
\n" - ); - - wprintf("
\n"); - do_template("endbox"); - wDumpContent(2); +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); +} -void display_customize_iconbar(void) { - char iconbar[SIZ]; - char buf[SIZ]; - char key[SIZ], value[SIZ]; - int i; - /* 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. - */ - int ib_displayas = IB_PICTEXT; /* pictures and text, pictures, text */ - int ib_logo = 1; /* Site logo */ - int ib_summary = 0; /* Summary page icon */ - int ib_inbox = 0; /* Inbox icon */ - int ib_calendar = 0; /* Calendar icon */ - int ib_contacts = 0; /* Contacts icon */ - int ib_tasks = 0; /* Tasks icon */ - int ib_rooms = 1; /* Rooms icon */ - int ib_users = 1; /* Users icon */ - int ib_advanced = 1; /* Advanced Options icon */ - int ib_logoff = 1; /* Logoff button */ - int ib_citadel = 1; /* 'Powered by Citadel' logo */ - /* - */ - get_preference("iconbar", iconbar); - for (i=0; i\n"); - - wprintf("
" - "Display icons as: "); - for (i=0; i<=2; ++i) { - wprintf(""); - if (i == IB_PICTEXT) wprintf("pictures and text"); - if (i == IB_PICONLY) wprintf("pictures only"); - if (i == IB_TEXTONLY) wprintf("text only"); - wprintf("\n"); - } - wprintf("

\n"); - - wprintf("Select the icons you would like to see displayed " - "in the "icon bar" menu on the left side of the " - "screen.

\n" - ); - - wprintf("\n"); - - wprintf("\n", - (ib_logo ? "CHECKED" : "") - ); - - wprintf("\n", - (ib_summary ? "CHECKED" : "") - ); - - wprintf("\n", - (ib_inbox ? "CHECKED" : "") - ); - - wprintf("\n", - (ib_contacts ? "CHECKED" : "") - ); - -#ifdef WEBCIT_WITH_CALENDAR_SERVICE - wprintf("\n", - (ib_calendar ? "CHECKED" : "") - ); - - wprintf("\n", - (ib_tasks ? "CHECKED" : "") - ); -#endif /* WEBCIT_WITH_CALENDAR_SERVICE */ - - wprintf("\n", - (ib_rooms ? "CHECKED" : "") - ); - - wprintf("\n", - (ib_users ? "CHECKED" : "") - ); - - wprintf("\n", - (ib_advanced ? "CHECKED" : "") - ); - - wprintf("\n", - (ib_logoff ? "CHECKED" : "") - ); - wprintf("\n", - (ib_citadel ? "CHECKED" : "") - ); - - wprintf("
" - "" - "" - "\" \"" - "" - "Site logo
" - "A graphic describing this site" - "
" - "" - "" - "\" \"" - "" - "Summary
" - "Your summary page" - "
" - "" - "" - "\" \"" - "" - "Mail (inbox)
" - "A shortcut to your e-mail Inbox." - "
" - "" - "" - "\" \"" - "" - "Contacts
" - "Your personal address book." - "
" - "" - "" - "\" \"" - "" - "Calendar
" - "A shortcut to your personal calendar." - "
" - "" - "" - "\" \"" - "" - "Tasks
" - "A shortcut to your personal task list." - "
" - "" - "" - "\" \"" - "" - "Rooms
" - "Clicking this icon displays a list of all accesible " - "rooms (or folders) available." - "
" - "" - "" - "\" \"" - "" - "Users
" - "Clicking this icon displays a list of all users " - "currently logged in." - "
" - "" - "" - "\" \"" - "" - "Advanced options
" - "Access to the complete menu of Citadel functions." - "
" - "" - "" - "\" \"" - "" - "Log off
" - "Exit from the Citadel system. If you remove this icon " - "then you will have no way out!" - "
" - "" - "" - "\" \"" - "" - "Citadel logo
" - "Displays the "Powered by Citadel" graphic" - "

\n" - "
" - "" - " " - "" - "
\n" - ); - - do_template("endbox"); - wDumpContent(2); + 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); } -void commit_iconbar(void) { - char iconbar[SIZ]; - int i; +/* + * Toggle the wholist expanded state in session memory + */ +void toggle_wholist_expanded_state(void) { + wcsession *WCC = WC; - char *boxen[] = { - "ib_logo", - "ib_summary", - "ib_inbox", - "ib_calendar", - "ib_contacts", - "ib_tasks", - "ib_rooms", - "ib_users", - "ib_advanced", - "ib_logoff", - "ib_citadel" - }; - - if (strcmp(bstr("sc"), "OK")) { - display_main_menu(); + if (!WCC) { + wc_printf("no session"); return; } - sprintf(iconbar, "ib_displayas=%d", atoi(bstr("ib_displayas"))); + 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); +} - for (i=0; i<(sizeof(boxen)/sizeof(char *)); ++i) { - sprintf(&iconbar[strlen(iconbar)], ",%s=", boxen[i]); - if (!strcasecmp(bstr(boxen[i]), "yes")) { - sprintf(&iconbar[strlen(iconbar)], "1"); - } - else { - sprintf(&iconbar[strlen(iconbar)], "0"); - } + +void +InitModule_ICONBAR +(void) +{ + 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("COND:ICONBAR:ACTIVE", 3, ConditionalIsActiveStylesheet, CTX_NONE); + RegisterNamespace("ICONBAR", 0, 0, tmplput_iconbar, NULL, CTX_NONE); + RegisterConditional("COND:ICONBAR:WHOLISTEXPANDED", 0, ConditionalWholistExpanded, CTX_NONE); + RegisterConditional("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; +} + - set_preference("iconbar", iconbar); - - output_headers(3); - do_template("beginbox_nt"); - wprintf( - "" - " " - "Your icon bar has been updated. Please select any of its " - "choices to continue.\n" - ); - do_template("endbox"); - wDumpContent(2); + +void +SessionDestroyModule_ICONBAR +(wcsession *sess) +{ + if (sess->IBSettingsVec != NULL) + free(sess->IBSettingsVec); } +