+ /** Go back to the room we're supposed to be in */
+ if (StrLength(WCC->wc_roomname) > 0) {
+ serv_printf("GOTO %s", ChrPtr(WCC->wc_roomname));
+ StrBuf_ServGetln(ReadBuf);
+ GetServerStatus(ReadBuf, NULL);
+ }
+ FreeStrBuf(&ReadBuf);
+}
+
+/**
+ * \brief query the actual setting of key in the citadel database
+ * \param key config key to query
+ * \param keylen length of the key string
+ * \param value StrBuf-value to the key to get
+ * \returns found?
+ */
+int get_pref_backend(const char *key, size_t keylen, Preference **Pref)
+{
+ void *hash_value = NULL;
+#ifdef DBG_PREFS_HASH
+ dbg_PrintHash(WC->hash_prefs, PrintPref, NULL);
+#endif
+ if (GetHash(WC->hash_prefs, key, keylen, &hash_value) == 0) {
+ *Pref = NULL;
+ return 0;
+ }
+ else {
+ *Pref = (Preference*) hash_value;
+ return 1;
+ }
+}
+
+int get_PREFERENCE(const char *key, size_t keylen, StrBuf **value)
+{
+ Preference *Pref;
+ int Ret;
+
+ Ret = get_pref_backend(key, keylen, &Pref);
+ if (Ret != 0)
+ *value = Pref->Val;
+ else
+ *value = NULL;
+ 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
+ */
+void set_preference_backend(const char *key, size_t keylen,
+ long lvalue,
+ StrBuf *value,
+ long lPrefType,
+ int save_to_server,
+ PrefDef *PrefType)
+{
+ wcsession *WCC = WC;
+ void *vPrefDef;
+ Preference *Pref;
+
+ Pref = (Preference*) malloc(sizeof(Preference));
+ memset(Pref, 0, sizeof(Preference));
+ Pref->Key = NewStrBufPlain(key, keylen);
+
+ if ((PrefType == NULL) &&
+ GetHash(PreferenceHooks, SKEY(Pref->Key), &vPrefDef) &&
+ (vPrefDef != NULL))
+ PrefType = (PrefDef*) vPrefDef;
+
+ 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)
+ {
+ case PRF_STRING:
+ Pref->Val = value;
+ Pref->decoded = 1;
+ break;
+ case PRF_INT:
+ Pref->lval = lvalue;
+ Pref->Val = value;
+ if (Pref->Val == NULL)
+ Pref->Val = NewStrBufPlain(NULL, 64);
+ StrBufPrintf(Pref->Val, "%ld", lvalue);
+ Pref->decoded = 1;
+ break;
+ case PRF_QP_STRING:
+ Pref->DeQPed = value;
+ Pref->Val = NewStrBufPlain(NULL, StrLength(Pref->DeQPed) * 3);
+ StrBufEUid_escapize(Pref->Val, Pref->DeQPed);
+ Pref->decoded = 1;
+ break;
+ case PRF_YESNO:
+ Pref->lval = lvalue;
+ if (lvalue)
+ Pref->Val = NewStrBufPlain(HKEY("yes"));
+ else
+ Pref->Val = NewStrBufPlain(HKEY("no"));
+ Pref->decoded = 1;
+ break;
+ }
+ if (Pref->Type->OnLoad != NULL)
+ Pref->Type->OnLoad(Pref->Val, Pref->lval);
+ }
+ else {
+ switch (lPrefType)
+ {
+ case PRF_STRING:
+ Pref->Val = value;
+ Pref->decoded = 1;
+ break;
+ case PRF_INT:
+ Pref->lval = lvalue;
+ Pref->Val = value;
+ if (Pref->Val == NULL)
+ Pref->Val = NewStrBufPlain(NULL, 64);
+ StrBufPrintf(Pref->Val, "%ld", lvalue);
+ Pref->decoded = 1;
+ break;
+ case PRF_QP_STRING:
+ Pref->DeQPed = value;
+ Pref->Val = NewStrBufPlain(NULL, StrLength(Pref->DeQPed) * 3);
+ StrBufEUid_escapize(Pref->Val, Pref->DeQPed);
+ Pref->decoded = 1;
+ break;
+ case PRF_YESNO:
+ Pref->lval = lvalue;
+ if (lvalue)
+ Pref->Val = NewStrBufPlain(HKEY("yes"));
+ else
+ Pref->Val = NewStrBufPlain(HKEY("no"));
+ Pref->decoded = 1;
+ break;
+ }
+ }
+ Put(WCC->hash_prefs, key, keylen, Pref, DestroyPreference);
+
+ if (save_to_server) WCC->SavePrefsToServer = 1;
+}
+
+void set_PREFERENCE(const char *key, size_t keylen, StrBuf *value, int save_to_server)
+{
+ set_preference_backend(key, keylen, 0, value, PRF_STRING, save_to_server, NULL);
+}
+
+int get_PREF_LONG(const char *key, size_t keylen, long *value, long Default)
+{
+ Preference *Pref;
+ int Ret;
+
+ Ret = get_pref_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;
+}
+
+
+void set_PREF_LONG(const char *key, size_t keylen, long value, int save_to_server)
+{
+ set_preference_backend(key, keylen, value, NULL, PRF_INT, save_to_server, NULL);
+}
+
+int get_PREF_YESNO(const char *key, size_t keylen, int *value, int Default)
+{
+ Preference *Pref;
+ int Ret;
+
+ Ret = get_pref_backend(key, keylen, &Pref);
+ if (Ret == 0) {
+ *value = Default;
+ return 0;
+ }
+
+ if (Pref->decoded)
+ *value = Pref->lval;
+ else {
+ *value = Pref->lval = strcmp(ChrPtr(Pref->Val), "yes") == 0;
+ Pref->decoded = 1;
+ }
+ return Ret;
+}
+
+void set_PREF_YESNO(const char *key, size_t keylen, long value, int save_to_server)
+{
+ set_preference_backend(key, keylen, value, NULL, PRF_YESNO, save_to_server, NULL);
+}
+
+int get_room_prefs_backend(const char *key, size_t keylen,
+ Preference **Pref)
+{
+ StrBuf *pref_name;
+ int Ret;
+
+ pref_name = NewStrBufPlain (HKEY("ROOM:"));
+ StrBufAppendBuf(pref_name, WC->wc_roomname, 0);
+ StrBufAppendBufPlain(pref_name, HKEY(":"), 0);
+ StrBufAppendBufPlain(pref_name, key, keylen, 0);
+ Ret = get_pref_backend(SKEY(pref_name), Pref);
+ FreeStrBuf(&pref_name);
+
+ return Ret;
+}
+
+const StrBuf *get_X_PREFS(const char *key, size_t keylen,
+ const char *xkey, size_t xkeylen)
+{
+ int ret;
+ StrBuf *pref_name;
+ Preference *Prf;
+
+ pref_name = NewStrBufPlain (HKEY("XPREF:"));
+ StrBufAppendBufPlain(pref_name, xkey, xkeylen, 0);
+ StrBufAppendBufPlain(pref_name, HKEY(":"), 0);
+ StrBufAppendBufPlain(pref_name, key, keylen, 0);
+
+ ret = get_pref_backend(SKEY(pref_name), &Prf);
+ FreeStrBuf(&pref_name);
+
+ if (ret)
+ return Prf->Val;
+ else return NULL;
+}
+
+void set_X_PREFS(const char *key, size_t keylen, const char *xkey, size_t xkeylen, StrBuf *value, int save_to_server)
+{
+ StrBuf *pref_name;
+
+ pref_name = NewStrBufPlain (HKEY("XPREF:"));
+ StrBufAppendBufPlain(pref_name, xkey, xkeylen, 0);
+ StrBufAppendBufPlain(pref_name, HKEY(":"), 0);
+ StrBufAppendBufPlain(pref_name, key, keylen, 0);
+
+ set_preference_backend(SKEY(pref_name), 0, value, PRF_STRING, save_to_server, NULL);
+ FreeStrBuf(&pref_name);
+}
+
+
+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;