X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fpreferences.c;h=b8330c9fdd6ac975f803661eaf77e63a1f63bffb;hb=6ec73d6906542ea2f8cca2e62f7625ee2e17ae03;hp=732ee1f593c20624432d7aac2c400039ddd2e34d;hpb=5a825607ef9581165e382ab6989c1c4d7cdf1254;p=citadel.git diff --git a/webcit/preferences.c b/webcit/preferences.c index 732ee1f59..b8330c9fd 100644 --- a/webcit/preferences.c +++ b/webcit/preferences.c @@ -16,6 +16,7 @@ typedef struct _PrefDef { StrBuf *Setting; const char *PrefStr; PrefEvalFunc OnLoad; + StrBuf *OnLoadName; } PrefDef; typedef struct _Preference { @@ -32,6 +33,7 @@ void DestroyPrefDef(void *vPrefDef) { PrefDef *Prefdef = (PrefDef*) vPrefDef; FreeStrBuf(&Prefdef->Setting); + FreeStrBuf(&Prefdef->OnLoadName); free(Prefdef); } @@ -44,16 +46,22 @@ void DestroyPreference(void *vPref) free(Pref); } -void RegisterPreference(const char *Setting, long SettingLen, - const char *PrefStr, - long Type, - PrefEvalFunc OnLoad) +void _RegisterPreference(const char *Setting, long SettingLen, + const char *PrefStr, + long Type, + PrefEvalFunc OnLoad, + const char *OnLoadName) { PrefDef *Newpref = (PrefDef*) malloc(sizeof(PrefDef)); Newpref->Setting = NewStrBufPlain(Setting, SettingLen); Newpref->PrefStr = PrefStr; Newpref->Type = Type; Newpref->OnLoad = OnLoad; + if (Newpref->OnLoad != NULL) { + Newpref->OnLoadName = NewStrBufPlain(OnLoadName, -1); + } + else + Newpref->OnLoadName = NULL; Put(PreferenceHooks, Setting, SettingLen, Newpref, DestroyPrefDef); } @@ -86,37 +94,74 @@ void GetPrefTypes(HashList *List) const char *Key; void *vSetting; void *vPrefDef; - Preference *Setting; + Preference *Pref; PrefDef *PrefType; It = GetNewHashPos(List, 0); while (GetNextHashPos(List, It, &len, &Key, &vSetting)) { - Setting = (Preference*) vSetting; - if (GetHash(PreferenceHooks, SKEY(Setting->Key), &vPrefDef) && + Pref = (Preference*) vSetting; + if (GetHash(PreferenceHooks, SKEY(Pref->Key), &vPrefDef) && (vPrefDef != NULL)) { PrefType = (PrefDef*) vPrefDef; - Setting->Type = PrefType; - if (PrefType->OnLoad != NULL) - PrefType->OnLoad(Setting->Val, Setting->lval); + Pref->Type = PrefType; + + lprintf(1, "Loading [%s]with type [%ld] [\"%s\"]\n", + ChrPtr(Pref->Key), + Pref->Type->Type, + ChrPtr(Pref->Val)); + + switch (Pref->Type->Type) + { + + case PRF_STRING: + break; + case PRF_INT: + Pref->lval = StrTol(Pref->Val); + Pref->decoded = 1; + break; + case PRF_QP_STRING: + Pref->DeQPed = NewStrBufPlain(NULL, StrLength(Pref->Val)); + StrBufEUid_unescapize(Pref->DeQPed, Pref->Val); + Pref->decoded = 1; + break; + case PRF_YESNO: + Pref->lval = strcmp(ChrPtr(Pref->Val), "yes") == 0; + Pref->decoded = 1; + break; + } + + if (PrefType->OnLoad != NULL){ + + lprintf(1, "Loading with: -> %s(\"%s\", %ld)\n", + ChrPtr(PrefType->OnLoadName), + ChrPtr(Pref->Val), + Pref->lval); + PrefType->OnLoad(Pref->Val, Pref->lval); + } } } + DeleteHashPos(&It); } void ParsePref(HashList **List, StrBuf *ReadBuf) { - StrBuf *Key; + int Done = 0; Preference *Data = NULL; Preference *LastData = NULL; - Key = NewStrBuf(); - while (StrBuf_ServGetln(ReadBuf), - strcmp(ChrPtr(ReadBuf), "000")) - { + while (!Done) { + StrBuf_ServGetln(ReadBuf); + if ( (StrLength(ReadBuf)==3) && + !strcmp(ChrPtr(ReadBuf), "000")) { + Done = 1; + break; + } + if ((ChrPtr(ReadBuf)[0] == ' ') && - (Data != NULL)) { - StrBufAppendBuf(Data->Val, ReadBuf, 1); + (LastData != NULL)) { + StrBufAppendBuf(LastData->Val, ReadBuf, 1); } else { LastData = Data = malloc(sizeof(Preference)); @@ -140,6 +185,7 @@ void ParsePref(HashList **List, StrBuf *ReadBuf) DestroyPreference(Data); LastData = NULL; } + Data = NULL; } } GetPrefTypes(*List); @@ -151,21 +197,31 @@ void ParsePref(HashList **List, StrBuf *ReadBuf) */ void load_preferences(void) { + wcsession *WCC = WC; + int Done = 0; StrBuf *ReadBuf; - char buf[SIZ]; long msgnum = 0L; - if (goto_config_room() != 0) return; /* oh well. */ + ReadBuf = NewStrBufPlain(NULL, SIZ * 4); + if (goto_config_room(ReadBuf) != 0) { + FreeStrBuf(&ReadBuf); + return; /* oh well. */ + } - ReadBuf = NewStrBuf(); serv_puts("MSGS ALL|0|1"); StrBuf_ServGetln(ReadBuf); if (GetServerStatus(ReadBuf, NULL) == 8) { serv_puts("subj|__ WebCit Preferences __"); serv_puts("000"); } - while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - msgnum = atol(buf); + while (!Done && + StrBuf_ServGetln(ReadBuf)) { + if ( (StrLength(ReadBuf)==3) && + !strcmp(ChrPtr(ReadBuf), "000")) { + Done = 1; + break; + } + msgnum = StrTol(ReadBuf); } if (msgnum > 0L) { @@ -177,39 +233,45 @@ void load_preferences(void) strcmp(ChrPtr(ReadBuf), "000"))) { } if (!strcmp(ChrPtr(ReadBuf), "text")) { - ParsePref(&WC->hash_prefs, ReadBuf); + ParsePref(&WCC->hash_prefs, ReadBuf); } } } /* Go back to the room we're supposed to be in */ - serv_printf("GOTO %s", ChrPtr(WC->wc_roomname)); - StrBuf_ServGetln(ReadBuf); - GetServerStatus(ReadBuf, NULL); + if (StrLength(WCC->wc_roomname) > 0) { + serv_printf("GOTO %s", ChrPtr(WCC->wc_roomname)); + StrBuf_ServGetln(ReadBuf); + GetServerStatus(ReadBuf, NULL); + } FreeStrBuf(&ReadBuf); } -/** - * \brief Goto the user's configuration room, creating it if necessary. - * \return 0 on success or nonzero upon failure. +/* + * Goto the user's configuration room, creating it if necessary. + * returns 0 on success or nonzero upon failure. */ -int goto_config_room(void) { - char buf[SIZ]; - +int goto_config_room(StrBuf *Buf) +{ serv_printf("GOTO %s", USERCONFIGROOM); - serv_getln(buf, sizeof buf); - if (buf[0] != '2') { /* try to create the config room if not there */ + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) != 2) { /* try to create the config room if not there */ serv_printf("CRE8 1|%s|4|0", USERCONFIGROOM); - serv_getln(buf, sizeof buf); + StrBuf_ServGetln(Buf); + GetServerStatus(Buf, NULL); + serv_printf("GOTO %s", USERCONFIGROOM); - serv_getln(buf, sizeof buf); - if (buf[0] != '2') return(1); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) != 2) { + return(1); + } } return(0); } void WritePrefsToServer(HashList *Hash) { + wcsession *WCC = WC; long len; HashPos *HashPos; void *vPref; @@ -217,7 +279,7 @@ void WritePrefsToServer(HashList *Hash) Preference *Pref; StrBuf *SubBuf = NULL; - Hash = WC->hash_prefs; + Hash = WCC->hash_prefs; #ifdef DBG_PREFS_HASH dbg_PrintHash(Hash, PrintPref, NULL); #endif @@ -233,7 +295,7 @@ void WritePrefsToServer(HashList *Hash) int n = 0; size_t offset, nchars; if (SubBuf == NULL) - SubBuf = NewStrBuf(); + SubBuf = NewStrBufPlain(NULL, SIZ); nchars = 1; offset = 0; while (nchars > 0) { @@ -268,37 +330,54 @@ void WritePrefsToServer(HashList *Hash) */ void save_preferences(void) { - char buf[SIZ]; + wcsession *WCC = WC; + int Done = 0; + StrBuf *ReadBuf; long msgnum = 0L; - if (goto_config_room() != 0) return; /* oh well. */ + ReadBuf = NewStrBuf(); + if (goto_config_room(ReadBuf) != 0) { + FreeStrBuf(&ReadBuf); + return; /* oh well. */ + } serv_puts("MSGS ALL|0|1"); - serv_getln(buf, sizeof buf); - if (buf[0] == '8') { + StrBuf_ServGetln(ReadBuf); + if (GetServerStatus(ReadBuf, NULL) == 8) { serv_puts("subj|__ WebCit Preferences __"); serv_puts("000"); } - while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - msgnum = atol(buf); + while (!Done && + StrBuf_ServGetln(ReadBuf)) { + if ( (StrLength(ReadBuf)==3) && + !strcmp(ChrPtr(ReadBuf), "000")) { + Done = 1; + break; + } + msgnum = StrTol(ReadBuf); } if (msgnum > 0L) { serv_printf("DELE %ld", msgnum); - serv_getln(buf, sizeof buf); + StrBuf_ServGetln(ReadBuf); + GetServerStatus(ReadBuf, NULL); } serv_printf("ENT0 1||0|1|__ WebCit Preferences __|"); - serv_getln(buf, sizeof buf); - if (buf[0] == '4') { + StrBuf_ServGetln(ReadBuf); + if (GetServerStatus(ReadBuf, NULL) == 4) { - WritePrefsToServer(WC->hash_prefs); + WritePrefsToServer(WCC->hash_prefs); serv_puts(""); serv_puts("000"); } /** Go back to the room we're supposed to be in */ - serv_printf("GOTO %s", ChrPtr(WC->wc_roomname)); - serv_getln(buf, sizeof buf); + if (StrLength(WCC->wc_roomname) > 0) { + serv_printf("GOTO %s", ChrPtr(WCC->wc_roomname)); + StrBuf_ServGetln(ReadBuf); + GetServerStatus(ReadBuf, NULL); + } + FreeStrBuf(&ReadBuf); } /** @@ -352,6 +431,7 @@ void set_preference_backend(const char *key, size_t keylen, int save_to_server, PrefDef *PrefType) { + wcsession *WCC = WC; void *vPrefDef; Preference *Pref; @@ -433,9 +513,9 @@ void set_preference_backend(const char *key, size_t keylen, break; } } - Put(WC->hash_prefs, key, keylen, Pref, DestroyPreference); + Put(WCC->hash_prefs, key, keylen, Pref, DestroyPreference); - if (save_to_server) WC->SavePrefsToServer = 1; + if (save_to_server) WCC->SavePrefsToServer = 1; } void set_PREFERENCE(const char *key, size_t keylen, StrBuf *value, int save_to_server) @@ -544,6 +624,28 @@ void set_X_PREFS(const char *key, size_t keylen, const char *xkey, size_t xkeyle } +long get_ROOM_PREFS_LONG(const char *key, size_t keylen, long *value, long Default) +{ + Preference *Pref; + int Ret; + + Ret = get_room_prefs_backend(key, keylen, &Pref); + + if (Ret == 0) { + *value = Default; + return 0; + } + + if (Pref->decoded) + *value = Pref->lval; + else { + *value = Pref->lval = atol(ChrPtr(Pref->Val)); + Pref->decoded = 1; + } + return Ret; +} + + StrBuf *get_ROOM_PREFS(const char *key, size_t keylen) { Preference *Pref; @@ -632,6 +734,7 @@ void GetPreferences(HashList *Setting) } } WCC->hash_prefs = Tmp; + DeleteHashPos(&It); } @@ -702,6 +805,15 @@ void tmplput_CFG_Descr(StrBuf *Target, WCTemplputParams *TP) if (SettingStr != NULL) StrBufAppendBufPlain(Target, SettingStr, -1, 0); } +void tmplput_CFG_RoomValueLong(StrBuf *Target, WCTemplputParams *TP) +{ + long lvalue; + long defval; + + defval = GetTemplateTokenNumber(Target, TP, 1, 0); + get_ROOM_PREFS_LONG(TKEY(0), &lvalue, defval); + StrBufAppendPrintf(Target, "%ld", lvalue); +} void tmplput_CFG_RoomValue(StrBuf *Target, WCTemplputParams *TP) { StrBuf *pref = get_ROOM_PREFS(TKEY(0)); @@ -716,12 +828,6 @@ int ConditionalHasRoomPreference(StrBuf *Target, WCTemplputParams *TP) return 0; } -void CfgZoneTempl(StrBuf *TemplBuffer, WCTemplputParams *TP) -{ - StrBuf *Zone = (StrBuf*) CTX; - - SVPutBuf("ZONENAME", Zone, 1); -} int ConditionalPreference(StrBuf *Target, WCTemplputParams *TP) { @@ -838,17 +944,10 @@ void DeleteGVSNHash(HashList **KillMe) void offer_start_page(StrBuf *Target, WCTemplputParams *TP) { wprintf("this_page)); + urlescputs(ChrPtr(WC->Hdr->this_page)); wprintf("\">"); wprintf(_("Make this my start page")); wprintf(""); -#ifdef TECH_PREVIEW - wprintf("
wc_roomname)); - wprintf("\" title=\"RSS 2.0 feed for "); - escputs(ChrPtr(WC->wc_roomname)); - wprintf("\">\"RSS\"\n"); -#endif } @@ -884,19 +983,36 @@ void change_start_page(void) } +void LoadStartpage(StrBuf *URL, long lvalue) +{ + const char *pch; + pch = strchr(ChrPtr(URL), '?'); + if (pch == NULL) { + /* purge the sins of the past... */ + pch = strchr(ChrPtr(URL), '&'); + if (pch != NULL) { + StrBufPeek(URL, pch, -1, '?'); + WC->SavePrefsToServer = 1; + } + } +} + + void InitModule_PREFERENCES (void) { - WebcitAddUrlHandler(HKEY("set_preferences"), set_preferences, 0); - WebcitAddUrlHandler(HKEY("change_start_page"), change_start_page, 0); + WebcitAddUrlHandler(HKEY("set_preferences"), "", 0, set_preferences, 0); + WebcitAddUrlHandler(HKEY("change_start_page"), "", 0, change_start_page, 0); + RegisterPreference("startpage", _("Prefered startpage"), PRF_STRING, LoadStartpage); - RegisterNamespace("OFFERSTARTPAGE", 0, 0, offer_start_page, CTX_NONE); - RegisterNamespace("PREF:ROOM:VALUE", 1, 2, tmplput_CFG_RoomValue, CTX_NONE); - RegisterNamespace("PREF:VALUE", 1, 2, tmplput_CFG_Value, CTX_NONE); - RegisterNamespace("PREF:DESCR", 1, 1, tmplput_CFG_Descr, CTX_NONE); - RegisterIterator("PREF:ZONE", 0, ZoneHash, NULL, CfgZoneTempl, NULL, CTX_PREF, CTX_NONE, IT_NOFLAG); + RegisterNamespace("OFFERSTARTPAGE", 0, 0, offer_start_page, NULL, CTX_NONE); + RegisterNamespace("PREF:ROOM:VALUE", 1, 2, tmplput_CFG_RoomValue, NULL, CTX_NONE); + RegisterNamespace("PREF:ROOM:VALUE:INT", 1, 2, tmplput_CFG_RoomValueLong, NULL, CTX_NONE); + RegisterNamespace("PREF:VALUE", 1, 2, tmplput_CFG_Value, NULL, CTX_NONE); + + RegisterNamespace("PREF:DESCR", 1, 1, tmplput_CFG_Descr, NULL, CTX_NONE); RegisterConditional(HKEY("COND:PREF"), 4, ConditionalPreference, CTX_NONE); RegisterConditional(HKEY("COND:PREF:SET"), 4, ConditionalHasPreference, CTX_NONE); @@ -908,4 +1024,48 @@ InitModule_PREFERENCES GetGVSNHash, NULL, DeleteGVSNHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG); } + + +void +ServerStartModule_PREFERENCES +(void) +{ + PreferenceHooks = NewHash(1, NULL); +} + + + +void +ServerShutdownModule_PREFERENCES +(void) +{ + DeleteHash(&PreferenceHooks); +} + +void +SessionDetachModule__PREFERENCES +(wcsession *sess) +{ + if (sess->SavePrefsToServer) { + save_preferences(); + sess->SavePrefsToServer = 0; + } +} + +void +SessionNewModule_PREFERENCES +(wcsession *sess) +{ + sess->hash_prefs = NewHash(1,NULL); +} + +void +SessionDestroyModule_PREFERENCES +(wcsession *sess) +{ + DeleteHash(&sess->hash_prefs); +} + + + /*@}*/