* remove old (replaced) code
[citadel.git] / webcit / preferences.c
index c29ec1c0f43326bf50776120858ca8216f68c8d6..382667f38e89f9f1860dff8b2172ea2e5c042831 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)
                {
@@ -158,7 +192,7 @@ void save_preferences(void) {
                                offset = 0;
                                while (nchars > 0) {
                                        if (n == 0)
-                                               nchars = 71;
+                                               nchars = 70;
                                        else 
                                                nchars = 80;
 
@@ -170,6 +204,7 @@ void save_preferences(void) {
                                                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,16 +527,18 @@ 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");
+       if (!UseSig) wprintf(" checked");
        wprintf(" onChange=\"show_or_hide_sigbox();\" >");
        wprintf(_("No signature"));
        wprintf("</input>&nbsp,&nbsp;&nbsp;\n");
 
        wprintf("<input type=\"radio\" id=\"yes_sig\" name=\"use_sig\" VALUE=\"yes\"");
-       if (!UseSig) wprintf(" checked");
+       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((char*)ChrPtr(ebuf));///TODO
+       StrEscPuts(ebuf);
        FreeStrBuf(&ebuf);
        wprintf("</textarea>"
                "</div>"
@@ -504,14 +563,15 @@ void display_preferences(void)
 
        /** Character set to assume is in use for improperly encoded headers */
        if (!get_preference("default_header_charset", &Buf)) {
-               Buf = NewStrBuf();////TODO: freeme!
+               Buf = NewStrBuf();
                StrBufPrintf(Buf, "%s", "UTF-8");
+               set_preference("default_header_charset", Buf, 0);
        }
        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((char*)ChrPtr(Buf)); // here shouldn't be bad chars, so...
+       StrEscPuts(Buf); // here shouldn't be bad chars, so...
        wprintf("\">");
        wprintf("</td></tr>");
 
@@ -521,7 +581,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\"");
@@ -566,42 +626,207 @@ void set_preferences(void)
        StrBuf *buf, *encBuf;
        int *time_format_cache;
        
-       time_format_cache = &(WC->time_format_cache);
-
-       if (!havebstr("change_button")) {
-               safestrncpy(WC->ImportantMessage, 
-                       _("Cancelled.  No settings were changed."),
-                       sizeof WC->ImportantMessage);
-               display_main_menu();
-               return;
-       }
+        time_format_cache = &(WC->time_format_cache);
+
+        if (!havebstr("change_button")) {
+                safestrncpy(WC->ImportantMessage, 
+                        _("Cancelled.  No settings were changed."),
+                        sizeof WC->ImportantMessage);
+                display_main_menu();
+                return;
+        }
+
+        /**
+         * Set the last argument to 1 only for the final setting, so
+         * we don't send the prefs file to the server repeatedly
+         */
+        set_preference("roomlistview", NewStrBufPlain(bstr("roomlistview"), -1), 0);
+        fmt = lbstr("calhourformat");
+        set_pref_long("calhourformat", fmt, 0);
+        if (fmt == 24) 
+                *time_format_cache = WC_TIMEFORMAT_24;
+        else
+                *time_format_cache = WC_TIMEFORMAT_AMPM;
+
+        set_pref_long("weekstart", lbstr("weekstart"), 0);
+        set_pref_yesno("use_sig", yesbstr("use_sig"), 0);
+        set_pref_long("daystart", lbstr("daystart"), 0);
+        set_pref_long("dayend", lbstr("dayend"), 0);
+        set_preference("default_header_charset", NewStrBufPlain(bstr("default_header_charset"), -1), 0);
+        set_preference("emptyfloors", NewStrBufPlain(bstr("emptyfloors"), -1), 0);
+        set_preference("defaultfrom", NewStrBufDup(sbstr("defaultfrom")), 0);
+        set_preference("defaultname", NewStrBufDup(sbstr("defaultname")), 0);
+        set_preference("defaulthandle", NewStrBufDup(sbstr("defaulthandle")), 0);
 
-       /**
-        * Set the last argument to 1 only for the final setting, so
-        * we don't send the prefs file to the server repeatedly
-        */
-       set_preference("roomlistview", NewStrBufPlain(bstr("roomlistview"), -1), 0);
-       fmt = lbstr("calhourformat");
-       set_pref_long("calhourformat", fmt, 0);
-       if (fmt == 24) 
-               *time_format_cache = WC_TIMEFORMAT_24;
-       else
-               *time_format_cache = WC_TIMEFORMAT_AMPM;
-
-       set_pref_long("weekstart", lbstr("weekstart"), 0);
-       set_pref_yesno("use_sig", yesbstr("use_sig"), 0);
-       set_pref_long("daystart", lbstr("daystart"), 0);
-       set_pref_long("dayend", lbstr("dayend"), 0);
-       set_preference("default_header_charset", NewStrBufPlain(bstr("default_header_charset"), -1), 0);
-       set_preference("emptyfloors", NewStrBufPlain(bstr("emptyfloors"), -1), 0);
 
        buf = NewStrBufPlain(bstr("signature"), -1);
        encBuf = NewStrBuf();
        StrBufEUid_escapize(encBuf, buf);
        set_preference("signature", encBuf, 1);
+       FreeStrBuf(&buf);
 
        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 *Tokens, void *Context, int ContextType)
+{
+       StrBuf *Setting;
+       if (get_PREFERENCE(Tokens->Params[0]->Start,
+                          Tokens->Params[0]->len,
+                          &Setting))
+       StrBufAppendTemplate(Target, nArgs, Tokens, Context, ContextType, Setting, 1);
+}
+
+void tmplput_CFG_Descr(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       const char *SettingStr;
+       SettingStr = PrefGetLocalStr(Tokens->Params[0]->Start,
+                                    Tokens->Params[0]->len);
+       if (SettingStr != NULL) 
+               StrBufAppendBufPlain(Target, SettingStr, -1, 0);
+}
+
+
+void CfgZoneTempl(StrBuf *TemplBuffer, void *vContext, WCTemplateToken *Token)
+{
+       StrBuf *Zone = (StrBuf*) vContext;
+
+       SVPutBuf("ZONENAME", Zone, 1);
+}
+
+int ConditionalPreference(WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       StrBuf *Pref;
+
+       if (!get_PREFERENCE(Tokens->Params[2]->Start,
+                           Tokens->Params[2]->len,
+                           &Pref)) 
+               return 0;
+       
+       if (Tokens->nParameters == 3) {
+               return 1;
+       }
+       else if (Tokens->Params[3]->Type == TYPE_STR)
+               return ((Tokens->Params[3]->len == StrLength(Pref)) &&
+                       (strcmp(Tokens->Params[3]->Start, ChrPtr(Pref)) == 0));
+       else 
+               return (StrTol(Pref) == Tokens->Params[3]->lvalue);
+}
+
+HashList *GetGVEAHash(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       StrBuf *Rcp;
+       HashList *List = NULL;
+       int Done = 0;
+       int i, n = 1;
+       char N[64];
+
+       Rcp = NewStrBuf();
+       serv_puts("GVEA");
+       StrBuf_ServGetln(Rcp);
+       if (ChrPtr(Rcp)[0] == '1') {
+               FlushStrBuf(Rcp);
+               List = NewHash(1, NULL);
+               while (!Done && (StrBuf_ServGetln(Rcp)>=0)) {
+                       if ( (StrLength(Rcp)==3) && 
+                            !strcmp(ChrPtr(Rcp), "000")) 
+                       {
+                               Done = 1;
+                       }
+                       else {
+                               i = snprintf(N, sizeof(N), "%d", n);
+                               StrBufTrim(Rcp);
+                               Put(List, N, i, Rcp, HFreeStrBuf);
+                               Rcp = NewStrBuf();
+                       }
+                       n++;
+               }
+       }
+       FreeStrBuf(&Rcp);
+       return List;
+}
+void DeleteGVEAHash(HashList **KillMe)
+{
+       DeleteHash(KillMe);
+}
+
+HashList *GetGVSNHash(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       StrBuf *Rcp;
+       HashList *List = NULL;
+       int Done = 0;
+       int i, n = 1;
+       char N[64];
+
+       Rcp = NewStrBuf();
+       serv_puts("GVSN");
+       StrBuf_ServGetln(Rcp);
+       if (ChrPtr(Rcp)[0] == '1') {
+               FlushStrBuf(Rcp);
+               List = NewHash(1, NULL);
+               while (!Done && (StrBuf_ServGetln(Rcp)>=0)) {
+                       if ( (StrLength(Rcp)==3) && 
+                            !strcmp(ChrPtr(Rcp), "000")) 
+                       {
+                               Done = 1;
+                       }
+                       else {
+                               i = snprintf(N, sizeof(N), "%d", n);
+                               StrBufTrim(Rcp);
+                               Put(List, N, i, Rcp, HFreeStrBuf);
+                               Rcp = NewStrBuf();
+                       }
+                       n++;
+               }
+       }
+       FreeStrBuf(&Rcp);
+       return List;
+}
+void DeleteGVSNHash(HashList **KillMe)
+{
+       DeleteHash(KillMe);
+}
+
+
+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);
+       RegisterPreference("defaultfrom", _("Prefered Email Address"), PRF_STRING);
+       RegisterPreference("defaultname", _("Prefered Email Sendername"), PRF_STRING);
+       RegisterPreference("defaulthandle", _("Prefered Name for posting messages"), PRF_STRING);
+
+       
+       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);
+
+       RegisterConditional(HKEY("COND:PREF"), 4, ConditionalPreference, CTX_NONE);
+       
+       RegisterIterator("PREF:VALID:EMAIL:ADDR", 0, NULL, 
+                        GetGVEAHash, NULL, DeleteGVEAHash, CTX_STRBUF, CTX_NONE);
+       RegisterIterator("PREF:VALID:EMAIL:NAME", 0, NULL, 
+                        GetGVSNHash, NULL, DeleteGVSNHash, CTX_STRBUF, CTX_NONE);
+
+}
 /*@}*/