X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fpreferences.c;h=bf7bacbe59767c6f01f609f4faad3791a8ef683c;hb=ec636368885b210420016b3f544edcbab9189880;hp=f929fe72db4c7e027a741e156a439b30ad2434dd;hpb=ac50491fa5855cef50dcdcb2e1ce896438e63c34;p=citadel.git diff --git a/webcit/preferences.c b/webcit/preferences.c index f929fe72d..bf7bacbe5 100644 --- a/webcit/preferences.c +++ b/webcit/preferences.c @@ -1,19 +1,33 @@ /* - * $Id$ - * * Manage user preferences with a little help from the Citadel server. * + * 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" #include "webserver.h" -#include "groupdav.h" +#include "dav.h" HashList *PreferenceHooks; extern HashList *HandlerHash; typedef struct _PrefDef { - long Type; + ePrefType eType; StrBuf *Setting; const char *PrefStr; PrefEvalFunc OnLoad; @@ -21,9 +35,11 @@ typedef struct _PrefDef { } PrefDef; typedef struct _Preference { + PrefDef *Type; + ePrefType eFlatPrefType; + StrBuf *Key; StrBuf *Val; - PrefDef *Type; long lval; long decoded; @@ -49,14 +65,14 @@ void DestroyPreference(void *vPref) } void _RegisterPreference(const char *Setting, long SettingLen, const char *PrefStr, - long Type, + ePrefType Type, PrefEvalFunc OnLoad, const char *OnLoadName) { PrefDef *Newpref = (PrefDef*) malloc(sizeof(PrefDef)); Newpref->Setting = NewStrBufPlain(Setting, SettingLen); Newpref->PrefStr = PrefStr; - Newpref->Type = Type; + Newpref->eType = Type; Newpref->OnLoad = OnLoad; if (Newpref->OnLoad != NULL) { Newpref->OnLoadName = NewStrBufPlain(OnLoadName, -1); @@ -107,15 +123,17 @@ void GetPrefTypes(HashList *List) { PrefType = (PrefDef*) vPrefDef; Pref->Type = PrefType; + Pref->eFlatPrefType = Pref->Type->eType; - lprintf(1, "Loading [%s]with type [%ld] [\"%s\"]\n", + syslog(1, "Loading [%s]with type [%d] [\"%s\"]\n", ChrPtr(Pref->Key), - Pref->Type->Type, + Pref->Type->eType, ChrPtr(Pref->Val)); - switch (Pref->Type->Type) + switch (Pref->Type->eType) { - + case PRF_UNSET: /* WHUT? */ + break; case PRF_STRING: break; case PRF_INT: @@ -135,7 +153,7 @@ void GetPrefTypes(HashList *List) if (PrefType->OnLoad != NULL){ - lprintf(1, "Loading with: -> %s(\"%s\", %ld)\n", + syslog(1, "Loading with: -> %s(\"%s\", %ld)\n", ChrPtr(PrefType->OnLoadName), ChrPtr(Pref->Val), Pref->lval); @@ -153,7 +171,8 @@ void ParsePref(HashList **List, StrBuf *ReadBuf) Preference *LastData = NULL; while (!Done) { - StrBuf_ServGetln(ReadBuf); + if (StrBuf_ServGetln(ReadBuf) < 0) + break; if ( (StrLength(ReadBuf)==3) && !strcmp(ChrPtr(ReadBuf), "000")) { Done = 1; @@ -181,7 +200,7 @@ void ParsePref(HashList **List, StrBuf *ReadBuf) else { StrBufTrim(ReadBuf); - lprintf(1, "ignoring spurious preference line: [%s]\n", + syslog(1, "ignoring spurious preference line: [%s]\n", ChrPtr(ReadBuf)); DestroyPreference(Data); LastData = NULL; @@ -220,7 +239,7 @@ void load_preferences(void) serv_puts("000"); } while (!Done && - StrBuf_ServGetln(ReadBuf)) { + (StrBuf_ServGetln(ReadBuf) >= 0)) { if ( (StrLength(ReadBuf)==3) && !strcmp(ChrPtr(ReadBuf), "000")) { Done = 1; @@ -233,7 +252,7 @@ void load_preferences(void) serv_printf("MSG0 %ld", msgnum); StrBuf_ServGetln(ReadBuf); if (GetServerStatus(ReadBuf, NULL) == 1) { - while (StrBuf_ServGetln(ReadBuf), + while ((StrBuf_ServGetln(ReadBuf) >= 0) && (strcmp(ChrPtr(ReadBuf), "text") && strcmp(ChrPtr(ReadBuf), "000"))) { } @@ -374,7 +393,7 @@ void save_preferences(void) serv_puts("000"); } while (!Done && - StrBuf_ServGetln(ReadBuf)) { + (StrBuf_ServGetln(ReadBuf) >= 0)) { if ( (StrLength(ReadBuf)==3) && !strcmp(ChrPtr(ReadBuf), "000")) { Done = 1; @@ -444,6 +463,63 @@ int get_PREFERENCE(const char *key, size_t keylen, StrBuf **value) return Ret; } +/** + * \brief Write a key into the webcit preferences database for this user + * + * \params key key whichs value is to be modified + * \param keylen length of the key string + * \param value value to set + * \param save_to_server 1 = flush all data to the server, 0 = cache it for now + */ +long compare_preference(const Preference *PrefA, + const Preference *PrefB) +{ + ePrefType TypeA, TypeB; + + if (PrefA->Type != NULL) + TypeA = PrefA->Type->eType; + else + TypeA = PrefA->eFlatPrefType; + + if (PrefB->Type != NULL) + TypeB = PrefB->Type->eType; + else + TypeB = PrefB->eFlatPrefType; + + if ((TypeA != PRF_UNSET) && + (TypeB != PRF_UNSET) && + (TypeA != TypeB)) + { + if (TypeA > TypeB) + return 1; + else /* (PrefA->Type < PrefB->Type) */ + return -1; + } + + if (TypeB == PRF_UNSET) + TypeA = PRF_UNSET; + + switch (TypeA) + { + default: + case PRF_UNSET: + case PRF_STRING: + return strcmp(ChrPtr(PrefA->Val), + ChrPtr(PrefB->Val)); + case PRF_YESNO: + case PRF_INT: + if (PrefA->lval == PrefB->lval) + return 0; + else if (PrefA->lval > PrefB->lval) + return 1; + else + return -1; + case PRF_QP_STRING: + return strcmp(ChrPtr(PrefA->DeQPed), + ChrPtr(PrefB->DeQPed)); + } +} + /** * \brief Write a key into the webcit preferences database for this user * @@ -461,6 +537,7 @@ void set_preference_backend(const char *key, size_t keylen, { wcsession *WCC = WC; void *vPrefDef; + void *vPrefB; Preference *Pref; Pref = (Preference*) malloc(sizeof(Preference)); @@ -475,11 +552,13 @@ void set_preference_backend(const char *key, size_t keylen, if (PrefType != NULL) { Pref->Type = PrefType; - if (Pref->Type->Type != lPrefType) - lprintf(1, "warning: saving preference with wrong type [%s] %ld != %ld \n", - key, Pref->Type->Type, lPrefType); - switch (Pref->Type->Type) + Pref->eFlatPrefType = PrefType->eType; + if (Pref->Type->eType != lPrefType) + syslog(1, "warning: saving preference with wrong type [%s] %d != %ld \n", + key, Pref->Type->eType, lPrefType); + switch (Pref->Type->eType) { + case PRF_UNSET: /* default to string... */ case PRF_STRING: Pref->Val = value; Pref->decoded = 1; @@ -511,6 +590,7 @@ void set_preference_backend(const char *key, size_t keylen, Pref->Type->OnLoad(Pref->Val, Pref->lval); } else { + Pref->eFlatPrefType = lPrefType; switch (lPrefType) { case PRF_STRING: @@ -541,6 +621,13 @@ void set_preference_backend(const char *key, size_t keylen, break; } } + + if ((save_to_server != 0) && + GetHash(WCC->hash_prefs, key, keylen, &vPrefB) && + (vPrefB != NULL) && + (compare_preference (Pref, vPrefB) == 0)) + save_to_server = 0; + Put(WCC->hash_prefs, key, keylen, Pref, DestroyPreference); if (save_to_server) WCC->SavePrefsToServer = 1; @@ -722,7 +809,8 @@ void GetPreferences(HashList *Setting) if (!HaveBstr(SKEY(PrefType->Setting))) continue; - switch (PrefType->Type) { + switch (PrefType->eType) { + case PRF_UNSET: case PRF_STRING: Buf = NewStrBufDup(SBstr(SKEY(PrefType->Setting))); set_preference_backend(SKEY(PrefType->Setting), @@ -772,9 +860,7 @@ void GetPreferences(HashList *Setting) void set_preferences(void) { if (!havebstr("change_button")) { - safestrncpy(WC->ImportantMessage, - _("Cancelled. No settings were changed."), - sizeof WC->ImportantMessage); + AppendImportantMessage(_("Cancelled. No settings were changed."), -1); display_main_menu(); return; } @@ -791,8 +877,9 @@ void tmplput_CFG_Value(StrBuf *Target, WCTemplputParams *TP) if (Pref->Type == NULL) { StrBufAppendTemplate(Target, TP, Pref->Val, 1); } - switch (Pref->Type->Type) + switch (Pref->Type->eType) { + case PRF_UNSET: /* default to string... */ case PRF_STRING: StrBufAppendTemplate(Target, TP, Pref->Val, 1); break; @@ -977,15 +1064,17 @@ void DeleteGVSNHash(HashList **KillMe) /* - * Offer to make any page the user's "start page." + * Offer to make any page the user's "start page" (only if logged in) */ void offer_start_page(StrBuf *Target, WCTemplputParams *TP) { - wc_printf("Hdr->this_page)); - wc_printf("\">"); - wc_printf(_("Make this my start page")); - wc_printf(""); + if (WC->logged_in) { + wc_printf("Hdr->this_page)); + wc_printf("\">"); + wc_printf(_("Make this my start page")); + wc_printf(""); + }; } @@ -994,7 +1083,6 @@ void offer_start_page(StrBuf *Target, WCTemplputParams *TP) */ void change_start_page(void) { - wcsession *WCC = WC; const char *pch; void *vHandler; int ProhibitSave = 0; @@ -1022,13 +1110,9 @@ void change_start_page(void) 1, NULL); if (ProhibitSave == 1) - StrBufAppendBufPlain(WCC->ImportantMsg, - _("This isn't allowed to become the start page."), - -1, 0); + AppendImportantMessage(_("This isn't allowed to become the start page."), -1); else - StrBufAppendBufPlain(WCC->ImportantMsg, - _("You no longer have a start page selected."), - -1, 0); + AppendImportantMessage(_("You no longer have a start page selected."), -1); display_main_menu(); return; } @@ -1043,7 +1127,7 @@ void change_start_page(void) NULL); output_headers(1, 1, 0, 0, 0, 0); - do_template("newstartpage", NULL); + do_template("newstartpage"); wDumpContent(1); }