X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fpreferences.c;h=116b5431670111dfdb97fde292013904ac128a9b;hb=3c8aa1790772c4f64f75a9c3ae3260154abd0120;hp=c8ec33116afa8f0cb1714486a114912d8c81f8cf;hpb=502a3baa576469141cf6f72fd805f1317d35fa12;p=citadel.git diff --git a/webcit/preferences.c b/webcit/preferences.c index c8ec33116..116b54316 100644 --- a/webcit/preferences.c +++ b/webcit/preferences.c @@ -9,10 +9,41 @@ #include "webserver.h" #include "groupdav.h" + +HashList *PreferenceHooks; + +typedef struct _Prefs { + long Type; + const char *Setting; + const char *PrefStr; +} Prefs; + +void RegisterPreference(const char *Setting, const char *PrefStr, long Type) +{ + Prefs *Newpref = (Prefs*) malloc(sizeof(Prefs)); + Newpref->Setting = Setting; + Newpref->PrefStr = PrefStr; + Newpref->Type = Type; + Put(PreferenceHooks, Setting, strlen(Setting), Newpref, NULL); +} + +const char *PrefGetLocalStr(const char *Setting, long len) +{ + void *hash_value; + if (GetHash(PreferenceHooks, Setting, len, &hash_value) != 0) { + Prefs *Newpref = (Prefs*) hash_value; + return _(Newpref->PrefStr); + + } + return ""; +} + +#ifdef DBG_PREFS_HASH inline const char *PrintPref(void *Prefstr) { - return Prefstr; + return ChrPtr(Prefstr); } +#endif /* * display preferences dialog @@ -20,7 +51,7 @@ inline const char *PrintPref(void *Prefstr) void load_preferences(void) { char buf[SIZ]; long msgnum = 0L; - char key[SIZ], value[SIZ]; + StrBuf *ReadBuf; serv_printf("GOTO %s", USERCONFIGROOM); serv_getln(buf, sizeof buf); @@ -40,17 +71,45 @@ void load_preferences(void) { serv_printf("MSG0 %ld", msgnum); serv_getln(buf, sizeof buf); if (buf[0] == '1') { - while (serv_getln(buf, sizeof buf), - (strcmp(buf, "text") && strcmp(buf, "000"))) { + ReadBuf = NewStrBuf(); + while (StrBuf_ServGetln(ReadBuf), + (strcmp(ChrPtr(ReadBuf), "text") && + strcmp(ChrPtr(ReadBuf), "000"))) { } - if (!strcmp(buf, "text")) { - while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - extract_token(key, buf, 0, '|', sizeof key); - extract_token(value, buf, 1, '|', sizeof value); - if (!IsEmptyStr(key)) - Put(WC->hash_prefs, key, strlen(key), strdup(value), free); + if (!strcmp(ChrPtr(ReadBuf), "text")) { + StrBuf *Key; + StrBuf *Data = NULL; + StrBuf *LastData = NULL; + + Key = NewStrBuf(); + while (StrBuf_ServGetln(ReadBuf), + strcmp(ChrPtr(ReadBuf), "000")) + { + if ((ChrPtr(ReadBuf)[0] == ' ') && + (Data != NULL)) { + StrBufAppendBuf(Data, ReadBuf, 1); + } + else { + LastData = Data = NewStrBuf(); + StrBufExtract_token(Key, ReadBuf, 0, '|'); + StrBufExtract_token(Data, ReadBuf, 1, '|'); + if (!IsEmptyStr(ChrPtr(Key))) + { + Put(WC->hash_prefs, + ChrPtr(Key), StrLength(Key), + Data, + HFreeStrBuf); + } + else + { + FreeStrBuf(&Data); + LastData = NULL; + } + } } + FreeStrBuf(&Key); } + FreeStrBuf(&ReadBuf); } } @@ -108,15 +167,54 @@ void save_preferences(void) { HashPos *HashPos; HashList *Hash; void *Value; - char *Key; + const char *Key; + StrBuf *Buf; + StrBuf *SubBuf = NULL; Hash = WC->hash_prefs; - PrintHash(Hash, PrintPref, NULL); +#ifdef DBG_PREFS_HASH + dbg_PrintHash(Hash, PrintPref, NULL); +#endif HashPos = GetNewHashPos(); while (GetNextHashPos(Hash, HashPos, &len, &Key, &Value)!=0) { - serv_printf("%s|%s", Key, (char*)Value); + size_t nchars; + Buf = (StrBuf*) Value; + if (Buf == NULL) + continue; + nchars = StrLength(Buf); + if (nchars > 80){ + int n = 0; + size_t offset, nchars; + if (SubBuf == NULL) + SubBuf = NewStrBuf(); + nchars = 1; + offset = 0; + while (nchars > 0) { + if (n == 0) + nchars = 70; + else + nchars = 80; + + nchars = StrBufSub(SubBuf, Buf, offset, nchars); + + if (n == 0) + serv_printf("%s|%s", Key, ChrPtr(SubBuf)); + else + serv_printf(" %s", ChrPtr(SubBuf)); + + offset += nchars; + nchars = StrLength(Buf) - offset; + n++; + } + + } + else + serv_printf("%s|%s", Key, ChrPtr(Buf)); + } + if (SubBuf != NULL) + FreeStrBuf(&SubBuf); serv_puts(""); serv_puts("000"); DeleteHashPos(&HashPos); @@ -130,52 +228,139 @@ void save_preferences(void) { /** * \brief query the actual setting of key in the citadel database * \param key config key to query - * \param value value to the key to get - * \param value_len length of the value string + * \param keylen length of the key string + * \param value StrBuf-value to the key to get + * \returns found? */ -void get_preference(char *key, char *value, size_t value_len) { +int get_PREFERENCE(const char *key, size_t keylen, StrBuf **value) +{ void *hash_value = NULL; - - strcpy(value, ""); - PrintHash(WC->hash_prefs, PrintPref, NULL); - if (GetHash(WC->hash_prefs, key, strlen(key), &hash_value) == 0) - return; - - if(hash_value) - safestrncpy(value, hash_value, value_len); +#ifdef DBG_PREFS_HASH + dbg_PrintHash(WC->hash_prefs, PrintPref, NULL); +#endif + if (GetHash(WC->hash_prefs, key, keylen, &hash_value) == 0) { + *value = NULL; + return 0; + } + else { + *value = NULL; + *value = (StrBuf*) hash_value; + return 1; + } } /** * \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 */ -void set_preference(char *key, char *value, int save_to_server) { +void set_PREFERENCE(const char *key, size_t keylen, StrBuf *value, int save_to_server) { - Put(WC->hash_prefs, key, strlen(key), strdup(value), free); + Put(WC->hash_prefs, key, keylen, value, HFreeStrBuf); if (save_to_server) save_preferences(); } +int get_PREF_LONG(const char *key, size_t keylen, long *value, long Default) +{ + int ret; + StrBuf *val; + ret = get_PREFERENCE(key, keylen, &val); + if (ret) { + *value = atol(ChrPtr(val)); + } + else { + *value = Default; + } + + return ret; +} + + +void set_PREF_LONG(const char *key, size_t keylen, long value, int save_to_server) +{ + StrBuf *val; + if (get_PREFERENCE(key, keylen, &val)) { + StrBufPrintf(val, "%ld", value); + } + else { + val = NewStrBuf(); + StrBufPrintf(val, "%ld", value); + set_PREFERENCE(key, keylen, val, save_to_server); + } +} +int get_PREF_YESNO(const char *key, size_t keylen, int *value, int Default) +{ + int ret; + StrBuf *val; + ret = get_PREFERENCE(key, keylen, &val); + if (ret) { + *value = strcmp(ChrPtr(val), "yes") == 0; + } + else { + *value = Default; + } + + return ret; +} + +void set_PREF_YESNO(const char *key, size_t keylen, int value, int save_to_server) +{ + StrBuf *val; + if (get_PREFERENCE(key, keylen, &val)) { + StrBufPrintf(val, "%s", (value)?"yes":"no"); + } + else { + val = NewStrBuf(); + StrBufPrintf(val, "%s", (value)?"yes":"no"); + set_PREFERENCE(key, keylen, val, save_to_server); + } +} + +StrBuf *get_ROOM_PREFS(const char *key, size_t keylen) +{ + StrBuf *pref_name, *pref_value; + + pref_name = NewStrBuf (); + StrBufPrintf(pref_name, "%s %s", key, WC->wc_roomname); + get_pref(pref_name, &pref_value); + FreeStrBuf(&pref_name); + return pref_value; +} + +void set_ROOM_PREFS(const char *key, size_t keylen, StrBuf *value, int save_to_server) +{ + StrBuf *pref_name; + + pref_name = NewStrBuf (); + StrBufPrintf(pref_name, "%s %s", key, WC->wc_roomname); + set_PREFERENCE(ChrPtr(pref_name), StrLength(pref_name), value, save_to_server); + FreeStrBuf(&pref_name); +} + /** * \brief display form for changing your preferences and settings */ void display_preferences(void) { output_headers(1, 1, 1, 0, 0, 0); - char ebuf[300]; - char buf[256]; + StrBuf *ebuf = NULL; int i; + long DayEnd, DayStart, WeekStart; + int UseSig, ShowEmptyFloors; int time_format; time_t tt; struct tm tm; char daylabel[32]; - + StrBuf *Buf; + StrBuf *Signature; + time_format = get_time_format_cached (); wprintf("