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("\">\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);
+}
+
+
+
/*@}*/