* migrate the WHO struct to strbuf
[citadel.git] / webcit / preferences.c
index 6c59ed24d1112f9bd3b7f4c86d36d5b5e677ad25..116b5431670111dfdb97fde292013904ac128a9b 100644 (file)
@@ -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 ChrPtr(Prefstr);
 }
+#endif
 
 /*
  * display preferences dialog
@@ -78,6 +109,7 @@ void load_preferences(void) {
                                }
                                FreeStrBuf(&Key);
                        }
+                       FreeStrBuf(&ReadBuf);
                }
        }
 
@@ -135,12 +167,14 @@ void save_preferences(void) {
                HashPos *HashPos;
                HashList *Hash;
                void *Value;
-               char *Key;
+               const char *Key;
                StrBuf *Buf;
                StrBuf *SubBuf = NULL;
                
                Hash = WC->hash_prefs;
+#ifdef DBG_PREFS_HASH
                dbg_PrintHash(Hash, PrintPref, NULL);
+#endif
                HashPos = GetNewHashPos();
                while (GetNextHashPos(Hash, HashPos, &len, &Key, &Value)!=0)
                {
@@ -167,9 +201,10 @@ void save_preferences(void) {
                                        if (n == 0)
                                                serv_printf("%s|%s", Key, ChrPtr(SubBuf));
                                        else
-                                               serv_printf(" %s", Key, ChrPtr(SubBuf));
+                                               serv_printf(" %s", ChrPtr(SubBuf));
 
                                        offset += nchars;
+                                       nchars = StrLength(Buf) - offset;
                                        n++;
                                }
                                
@@ -200,8 +235,9 @@ void save_preferences(void) {
 int get_PREFERENCE(const char *key, size_t keylen, StrBuf **value)
 {
        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) {
                *value = NULL;
                return 0;
@@ -287,6 +323,27 @@ void set_PREF_YESNO(const char *key, size_t keylen, int value, int save_to_serve
        }
 }
 
+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
  */
@@ -326,7 +383,7 @@ void display_preferences(void)
         */
        get_preference("roomlistview", &Buf);
        wprintf("<tr class=\"even\"><td>");
-       wprintf(_("Room list view"));
+       wprintf(PrefGetLocalStr(HKEY("roomlistview")));
        wprintf("</td><td>");
 
        wprintf("<input type=\"radio\" name=\"roomlistview\" VALUE=\"folders\"");
@@ -348,7 +405,7 @@ void display_preferences(void)
         */
 
        wprintf("<tr class=\"odd\"><td>");
-       wprintf(_("Time format"));
+       wprintf(PrefGetLocalStr(HKEY("calhourformat")));
        wprintf("</td><td>");
 
        wprintf("<input type=\"radio\" name=\"calhourformat\" VALUE=\"12\"");
@@ -373,7 +430,7 @@ void display_preferences(void)
        get_pref_long("daystart", &DayStart, 8);
 
        wprintf("<tr class=\"even\"><td>");
-       wprintf(_("Calendar day view begins at:"));
+       wprintf(PrefGetLocalStr(HKEY("daystart")));
        wprintf("</td><td>");
 
        wprintf("<select name=\"daystart\" size=\"1\">\n");
@@ -402,7 +459,7 @@ void display_preferences(void)
        get_pref_long("dayend", &DayEnd, 17);
 
        wprintf("<tr class=\"odd\"><td>");
-       wprintf(_("Calendar day view ends at:"));
+       wprintf(PrefGetLocalStr(HKEY("dayend")));
        wprintf("</td><td>");
 
        wprintf("<select name=\"dayend\" size=\"1\">\n");
@@ -430,7 +487,7 @@ void display_preferences(void)
         */
        get_pref_long("weekstart", &WeekStart, 17);
        wprintf("<tr class=\"even\"><td>");
-       wprintf(_("Week starts on:"));
+       wprintf(PrefGetLocalStr(HKEY("weekstart")));
        wprintf("</td><td>");
 
        wprintf("<select name=\"weekstart\" size=\"1\">\n");
@@ -470,6 +527,8 @@ void display_preferences(void)
                "       </script>                                                               "
        );
 
+       wprintf(PrefGetLocalStr(HKEY("use_sig")));
+
        wprintf("<input type=\"radio\" id=\"no_sig\" name=\"use_sig\" VALUE=\"no\"");
        if (!UseSig) wprintf(" checked");
        wprintf(" onChange=\"show_or_hide_sigbox();\" >");
@@ -479,7 +538,7 @@ void display_preferences(void)
        wprintf("<input type=\"radio\" id=\"yes_sig\" name=\"use_sig\" VALUE=\"yes\"");
        if (UseSig) wprintf(" checked");
        wprintf(" onChange=\"show_or_hide_sigbox();\" >");
-       wprintf(_("Use this signature:"));
+       wprintf(PrefGetLocalStr(HKEY("signature")));
        wprintf("<div id=\"signature_box\">"
                "<br><textarea name=\"signature\" cols=\"40\" rows=\"5\">"
        );
@@ -487,7 +546,7 @@ void display_preferences(void)
        get_preference("signature", &Signature);
        ebuf = NewStrBuf();
        StrBufEUid_unescapize(ebuf, Signature);
-       escputs(ChrPtr(ebuf));
+       escputs((char*)ChrPtr(ebuf));///TODO
        FreeStrBuf(&ebuf);
        wprintf("</textarea>"
                "</div>"
@@ -508,10 +567,10 @@ void display_preferences(void)
                StrBufPrintf(Buf, "%s", "UTF-8");
        }
        wprintf("<tr class=\"even\"><td>");
-       wprintf(_("Default character set for email headers:"));
+       wprintf(PrefGetLocalStr(HKEY("default_header_charset")));
        wprintf("</td><td>");
        wprintf("<input type=\"text\" NAME=\"default_header_charset\" MAXLENGTH=\"32\" VALUE=\"");
-       escputs(ChrPtr(Buf));
+       escputs((char*)ChrPtr(Buf)); // here shouldn't be bad chars, so...
        wprintf("\">");
        wprintf("</td></tr>");
 
@@ -521,7 +580,7 @@ void display_preferences(void)
 
        get_pref_yesno("emptyfloors", &ShowEmptyFloors, 0);
        wprintf("<tr class=\"odd\"><td>");
-       wprintf(_("Show empty floors"));
+       wprintf(PrefGetLocalStr(HKEY("emptyfloors")));
        wprintf("</td><td>");
 
        wprintf("<input type=\"radio\" name=\"emptyfloors\" VALUE=\"yes\"");
@@ -563,7 +622,7 @@ void display_preferences(void)
 void set_preferences(void)
 {
        long fmt;
-       StrBuf *ebuf;
+       StrBuf *buf, *encBuf;
        int *time_format_cache;
        
        time_format_cache = &(WC->time_format_cache);
@@ -595,12 +654,66 @@ void set_preferences(void)
        set_preference("default_header_charset", NewStrBufPlain(bstr("default_header_charset"), -1), 0);
        set_preference("emptyfloors", NewStrBufPlain(bstr("emptyfloors"), -1), 0);
 
-       ebuf = NewStrBufPlain(bstr("signature"), -1);
-       /////TODOeuid_escapize(ebuf);
-       set_preference("signature", ebuf, 1);
+       buf = NewStrBufPlain(bstr("signature"), -1);
+       encBuf = NewStrBuf();
+       StrBufEUid_escapize(encBuf, buf);
+       set_preference("signature", encBuf, 1);
 
        display_main_menu();
 }
 
 
+#define PRF_STRING 1
+#define PRF_INT 2
+#define PRF_QP_STRING 3
+#define PRF_YESNO 4
+
+
+void tmplput_CFG_Value(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context)
+{
+       StrBuf *Setting;
+       if (get_PREFERENCE(Token->Params[0]->Start,
+                          Token->Params[0]->len,
+                          &Setting))
+               StrBufAppendBuf(Target, Setting, 0);
+}
+
+void tmplput_CFG_Descr(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context)
+{
+       const char *SettingStr;
+       SettingStr = PrefGetLocalStr(Token->Params[0]->Start,
+                                    Token->Params[0]->len);
+       if (SettingStr != NULL) 
+               StrBufAppendBufPlain(Target, SettingStr, -1, 0);
+}
+
+
+void CfgZoneTempl(StrBuf *TemplBuffer, void *Context)
+{
+
+}
+
+
+void 
+InitModule_PREFERENCES
+(void)
+{
+       WebcitAddUrlHandler(HKEY("display_preferences"), display_preferences, 0);
+       WebcitAddUrlHandler(HKEY("set_preferences"), set_preferences, 0);
+
+       RegisterPreference("roomlistview",_("Room list view"),PRF_STRING);
+       RegisterPreference("calhourformat",_("Time format"), PRF_INT);
+       RegisterPreference("daystart", _("Calendar day view begins at:"), PRF_INT);
+       RegisterPreference("dayend", _("Calendar day view ends at:"), PRF_INT);
+       RegisterPreference("weekstart",_("Week starts on:"), PRF_INT);
+
+       RegisterPreference("use_sig",_("Attach signature to email messages?"), PRF_YESNO);
+       RegisterPreference("signature",_("Use this signature:"),PRF_QP_STRING);
+       RegisterPreference("default_header_charset", _("Default character set for email headers:") ,PRF_STRING);
+       RegisterPreference("emptyfloors", _("Show empty floors"), PRF_YESNO);
+       
+       RegisterNamespace("PREF:VALUE", 1, 1, tmplput_CFG_Value);
+       RegisterNamespace("PREF:DESCR", 1, 1, tmplput_CFG_Descr);
+       RegisterIterator("PREF:ZONE", ZoneHash, NULL, CfgZoneTempl, NULL);
+}
 /*@}*/