+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(LOG_DEBUG, "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(LOG_DEBUG, "Loading with: -> %s(\"%s\", %ld)\n",
+ ChrPtr(PrefType->OnLoadName),
+ ChrPtr(Pref->Val),
+ Pref->lval);
+ PrefType->OnLoad(Pref->Val, Pref->lval);
+ }
+ }
+ }
+ DeleteHashPos(&It);
+}
+
+void ParsePref(HashList **List, StrBuf *ReadBuf)
+{
+ int Done = 0;
+ Preference *Data = NULL;
+ Preference *LastData = NULL;
+
+ while (!Done) {
+ if (StrBuf_ServGetln(ReadBuf) < 0)
+ break;
+ if ( (StrLength(ReadBuf)==3) &&
+ !strcmp(ChrPtr(ReadBuf), "000")) {
+ Done = 1;
+ break;
+ }
+
+ if ((ChrPtr(ReadBuf)[0] == ' ') &&
+ (LastData != NULL)) {
+ StrBufAppendBuf(LastData->Val, ReadBuf, 1);
+ }
+ else {
+ LastData = Data = malloc(sizeof(Preference));
+ memset(Data, 0, sizeof(Preference));
+ Data->Key = NewStrBuf();
+ Data->Val = NewStrBuf();
+ StrBufExtract_token(Data->Key, ReadBuf, 0, '|');
+ StrBufExtract_token(Data->Val, ReadBuf, 1, '|');
+
+ /***************** BEGIN VILE SLEAZY HACK ************************/
+
+ /* some users might still have this start page configured, which now breaks */
+
+ if ( (!strcasecmp(ChrPtr(Data->Key), "startpage"))
+ && (!strcasecmp(ChrPtr(Data->Val), "/do_template?template=summary_page"))
+ ) {
+ FreeStrBuf(&Data->Val);
+ Data->Val = NewStrBufPlain(HKEY("/summary"));
+ }
+
+ /******************* END VILE SLEAZY HACK ************************/
+
+ if (!IsEmptyStr(ChrPtr(Data->Key)))
+ {
+ Put(*List,
+ SKEY(Data->Key),
+ Data,
+ DestroyPreference);
+ }
+ else
+ {
+ StrBufTrim(ReadBuf);
+ syslog(LOG_INFO, "ignoring spurious preference line: [%s]\n",
+ ChrPtr(ReadBuf));
+ DestroyPreference(Data);
+ LastData = NULL;
+ }
+ Data = NULL;
+ }
+ }
+ GetPrefTypes(*List);
+}
+
+