+#include "dav.h"
+
+HashList *PreferenceHooks;
+extern HashList *HandlerHash;
+
+typedef struct _PrefDef {
+ ePrefType eType;
+ StrBuf *Setting;
+ const char *PrefStr;
+ PrefEvalFunc OnLoad;
+ StrBuf *OnLoadName;
+} PrefDef;
+
+typedef struct _Preference {
+ PrefDef *Type;
+ ePrefType eFlatPrefType;
+
+ StrBuf *Key;
+ StrBuf *Val;
+
+ long lval;
+ long decoded;
+ StrBuf *DeQPed;
+} Preference;
+
+void DestroyPrefDef(void *vPrefDef)
+{
+ PrefDef *Prefdef = (PrefDef*) vPrefDef;
+ FreeStrBuf(&Prefdef->Setting);
+ FreeStrBuf(&Prefdef->OnLoadName);
+ free(Prefdef);
+}
+
+void DestroyPreference(void *vPref)
+{
+ Preference *Pref = (Preference*) vPref;
+ FreeStrBuf(&Pref->Key);
+ FreeStrBuf(&Pref->Val);
+ FreeStrBuf(&Pref->DeQPed);
+ free(Pref);
+
+}
+
+void _RegisterPreference(const char *Setting, long SettingLen,
+ const char *PrefStr,
+ ePrefType Type,
+ PrefEvalFunc OnLoad,
+ const char *OnLoadName)
+{
+ PrefDef *Newpref = (PrefDef*) malloc(sizeof(PrefDef));
+ Newpref->Setting = NewStrBufPlain(Setting, SettingLen);
+ Newpref->PrefStr = PrefStr;
+ Newpref->eType = Type;
+ Newpref->OnLoad = OnLoad;
+ if (Newpref->OnLoad != NULL) {
+ Newpref->OnLoadName = NewStrBufPlain(OnLoadName, -1);
+ }
+ else
+ Newpref->OnLoadName = NULL;
+ Put(PreferenceHooks, Setting, SettingLen, Newpref, DestroyPrefDef);
+}
+
+const char *PrefGetLocalStr(const char *Setting, long len)
+{
+ void *hash_value;
+ if (GetHash(PreferenceHooks, Setting, len, &hash_value) != 0) {
+ PrefDef *Newpref = (PrefDef*) hash_value;
+ return _(Newpref->PrefStr);
+
+ }
+ return "";
+}
+
+#ifdef DBG_PREFS_HASH
+inline const char *PrintPref(void *vPref)
+{
+ Preference *Pref = (Preference*) vPref;
+ if (Pref->DeQPed != NULL)
+ return ChrPtr(Pref->DeQPed);
+ else
+ return ChrPtr(Pref->Val);
+}
+#endif
+
+void GetPrefTypes(HashList *List)
+{
+ HashPos *It;
+ long len;
+ const char *Key;
+ void *vSetting;
+ void *vPrefDef;
+ Preference *Pref;
+ PrefDef *PrefType;
+
+ It = GetNewHashPos(List, 0);
+ while (GetNextHashPos(List, It, &len, &Key, &vSetting))
+ {
+ Pref = (Preference*) vSetting;
+ if (GetHash(PreferenceHooks, SKEY(Pref->Key), &vPrefDef) &&
+ (vPrefDef != NULL))
+ {
+ PrefType = (PrefDef*) vPrefDef;
+ Pref->Type = PrefType;
+ Pref->eFlatPrefType = Pref->Type->eType;
+
+ syslog(1, "Loading [%s]with type [%d] [\"%s\"]\n",
+ ChrPtr(Pref->Key),
+ Pref->Type->eType,
+ ChrPtr(Pref->Val));
+
+ switch (Pref->Type->eType)
+ {
+ case PRF_UNSET: /* WHUT? */
+ break;
+ 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){
+
+ syslog(1, "Loading with: -> %s(\"%s\", %ld)\n",
+ ChrPtr(PrefType->OnLoadName),
+ ChrPtr(Pref->Val),
+ Pref->lval);
+ PrefType->OnLoad(Pref->Val, Pref->lval);
+ }
+ }
+ }
+ DeleteHashPos(&It);
+}