+void LoadStartpage(StrBuf *URL, long lvalue)
+{
+ const char *pch;
+ void *vHandler;
+ pch = strchr(ChrPtr(URL), '?');
+ if (pch == NULL) {
+ /* purge the sins of the past... */
+ pch = strchr(ChrPtr(URL), '&');
+ if (pch != NULL) {
+ StrBufPeek(URL, pch, -1, '?');
+ WC->SavePrefsToServer = 1;
+ }
+ }
+ else if (GetHash(HandlerHash, ChrPtr(URL), pch - ChrPtr(URL), &vHandler),
+ (vHandler != NULL) &&
+ ((((WebcitHandler*)vHandler)->Flags & PROHIBIT_STARTPAGE) != 0))
+ { /* OK, This handler doesn't want to be set as start page, prune it. */
+ FlushStrBuf(URL);
+ WC->SavePrefsToServer = 1;
+ }
+}
+
+
+void
+InitModule_PREFERENCES
+(void)
+{
+ RegisterCTX(CTX_VEA);
+
+ WebcitAddUrlHandler(HKEY("set_preferences"), "", 0, set_preferences, 0);
+ WebcitAddUrlHandler(HKEY("change_start_page"), "", 0, change_start_page, 0);
+
+ RegisterPreference("startpage", _("Prefered startpage"), PRF_STRING, LoadStartpage);
+
+ RegisterNamespace("OFFERSTARTPAGE", 0, 0, offer_start_page, NULL, CTX_NONE);
+ RegisterNamespace("PREF:ROOM:VALUE", 1, 2, tmplput_CFG_RoomValue, NULL, CTX_NONE);
+ RegisterNamespace("PREF:ROOM:VALUE:INT", 1, 2, tmplput_CFG_RoomValueLong, NULL, CTX_NONE);
+ RegisterNamespace("PREF:VALUE", 1, 2, tmplput_CFG_Value, NULL, CTX_NONE);
+
+ RegisterNamespace("PREF:DESCR", 1, 1, tmplput_CFG_Descr, NULL, CTX_NONE);
+
+ RegisterConditional("COND:PREF", 4, ConditionalPreference, CTX_NONE);
+ RegisterConditional("COND:PREF:SET", 4, ConditionalHasPreference, CTX_NONE);
+ RegisterConditional("COND:ROOM:SET", 4, ConditionalHasRoomPreference, CTX_NONE);
+
+ RegisterIterator("PREF:VALID:EMAIL:ADDR", 0, NULL,
+ GetGVEAHash, NULL, DeleteGVEAHash, CTX_VEA, CTX_NONE, IT_NOFLAG);
+ RegisterNamespace("PREF:VALID:EMAIL:ADDR:STR", 1, 1, tmplput_VEA, NULL, CTX_VEA);
+ RegisterConditional("COND:PREF:VALID:EMAIL:ADDR:STR", 4, ConditionalPreferenceIsDefaulVEA, CTX_VEA);
+
+ RegisterIterator("PREF:VALID:EMAIL:NAME", 0, NULL,
+ GetGVSNHash, NULL, DeleteGVSNHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+
+}
+
+
+void
+ServerStartModule_PREFERENCES
+(void)
+{
+ PreferenceHooks = NewHash(1, NULL);
+}
+
+
+
+void
+ServerShutdownModule_PREFERENCES
+(void)
+{
+ DeleteHash(&PreferenceHooks);
+}
+
+void
+SessionDetachModule__PREFERENCES
+(wcsession *sess)
+{
+ if (sess->SavePrefsToServer) {
+ save_preferences();
+ sess->SavePrefsToServer = 0;
+ }
+}
+
+void
+SessionNewModule_PREFERENCES
+(wcsession *sess)
+{
+ sess->hash_prefs = NewHash(1,NULL);
+}
+
+void
+SessionDestroyModule_PREFERENCES
+(wcsession *sess)
+{
+ DeleteHash(&sess->hash_prefs);
+}