+ {
+ const char *pch;
+ long len;
+
+ GetTemplateTokenString(Target, TP, 3, &pch, &len);
+
+ return ((len == StrLength(Pref)) &&
+ (strcmp(pch, ChrPtr(Pref)) == 0));
+ }
+}
+
+int ConditionalHasPreference(StrBuf *Target, WCTemplputParams *TP)
+{
+ StrBuf *Pref;
+
+ if (!get_PREFERENCE(TKEY(2), &Pref) ||
+ (Pref == NULL))
+ return 0;
+ else
+ return 1;
+}
+
+
+/********************************************************************************
+ * preferences stored discrete in citserver
+ ********************************************************************************/
+CtxType CTX_VEA = CTX_NONE;
+typedef struct __ValidEmailAddress {
+ StrBuf *Address;
+ int IsDefault;
+}ValidEmailAddress;
+
+void DeleteValidEmailAddress(void *v)
+{
+ ValidEmailAddress *VEA = (ValidEmailAddress*)v;
+ FreeStrBuf(&VEA->Address);
+ free(VEA);
+}
+void tmplput_VEA(StrBuf *Target, WCTemplputParams *TP)
+{
+ ValidEmailAddress* VEA = (ValidEmailAddress*) CTX((CTX_VEA));
+ StrBufAppendTemplate(Target, TP, VEA->Address, 0);
+}
+int ConditionalPreferenceIsDefaulVEA(StrBuf *Target, WCTemplputParams *TP)
+{
+ ValidEmailAddress* VEA = (ValidEmailAddress*) CTX((CTX_VEA));
+ return VEA->IsDefault;
+}
+HashList *GetGVEAHash(StrBuf *Target, WCTemplputParams *TP)
+{
+ StrBuf *Rcp;
+ HashList *List = NULL;
+ int Done = 0;
+ int i, n = 1;
+ char N[64];
+ StrBuf *DefaultFrom = NULL;
+ const StrBuf *EnvelopeTo;
+ ValidEmailAddress *VEA;
+
+ get_preference("defaultfrom", &DefaultFrom);
+ EnvelopeTo = sbstr("nvto");
+ Rcp = NewStrBuf();
+ serv_puts("GVEA");
+ StrBuf_ServGetln(Rcp);
+ if (GetServerStatus(Rcp, NULL) == 1) {
+ FlushStrBuf(Rcp);
+ List = NewHash(1, NULL);
+ while (!Done && (StrBuf_ServGetln(Rcp)>=0)) {
+ if ( (StrLength(Rcp)==3) &&
+ !strcmp(ChrPtr(Rcp), "000"))
+ {
+ Done = 1;
+ }
+ else {
+ VEA = (ValidEmailAddress*) malloc(sizeof(ValidEmailAddress));
+ i = snprintf(N, sizeof(N), "%d", n);
+ StrBufTrim(Rcp);
+ VEA->Address = Rcp;
+ if (StrLength(EnvelopeTo) > 0)
+ VEA->IsDefault = strstr(ChrPtr(EnvelopeTo), ChrPtr(Rcp)) != NULL;
+ else if (StrLength(DefaultFrom) > 0)
+ VEA->IsDefault = !strcmp(ChrPtr(Rcp), ChrPtr(DefaultFrom));
+ else
+ VEA->IsDefault = 0;
+
+ Put(List, N, i, VEA, DeleteValidEmailAddress);
+ Rcp = NewStrBuf();
+ }
+ n++;
+ }
+ }
+ FreeStrBuf(&Rcp);
+ return List;
+}
+void DeleteGVEAHash(HashList **KillMe)
+{
+ DeleteHash(KillMe);
+}
+
+HashList *GetGVSNHash(StrBuf *Target, WCTemplputParams *TP)
+{
+ StrBuf *Rcp;
+ HashList *List = NULL;
+ int Done = 0;
+ int i, n = 1;
+ char N[64];
+
+ Rcp = NewStrBuf();
+ serv_puts("GVSN");
+ StrBuf_ServGetln(Rcp);
+ if (GetServerStatus(Rcp, NULL) == 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);
+}
+
+
+
+
+/*
+ * Offer to make any page the user's "start page" (only if logged in)
+ */
+void offer_start_page(StrBuf *Target, WCTemplputParams *TP)
+{
+ if (WC->logged_in) {
+ wc_printf("<a href=\"change_start_page?startpage=");
+ urlescputs(ChrPtr(WC->Hdr->this_page));
+ wc_printf("\">");
+ wc_printf(_("Make this my start page"));
+ wc_printf("</a>");
+ };
+}
+
+
+/*
+ * Change the user's start page
+ */
+void change_start_page(void)
+{
+ const char *pch;
+ void *vHandler;
+ int ProhibitSave = 0;
+ const StrBuf *pStartPage = sbstr("startpage");
+
+ if (pStartPage != NULL) {
+ pch = strchr(ChrPtr(pStartPage), '?');
+
+ if ((pch != NULL) && (
+ GetHash(HandlerHash, ChrPtr(pStartPage), pch - ChrPtr(pStartPage), &vHandler),
+ (vHandler != NULL) &&
+ ((((WebcitHandler*)vHandler)->Flags & PROHIBIT_STARTPAGE) != 0)))
+ { /* OK, This handler doesn't want to be set as start page, prune it. */
+ ProhibitSave = 1;
+ }
+ }
+
+ if ((pStartPage == NULL) ||
+ (ProhibitSave == 1))
+ {
+ set_preference_backend(HKEY("startpage"),
+ 0,
+ NewStrBufPlain(HKEY("")),
+ PRF_STRING,
+ 1,
+ NULL);
+ if (ProhibitSave == 1)
+ AppendImportantMessage(_("This isn't allowed to become the start page."), -1);
+ else
+ AppendImportantMessage(_("You no longer have a start page selected."), -1);
+ display_main_menu();
+ return;
+ }
+
+
+
+ set_preference_backend(HKEY("startpage"),
+ 0,
+ NewStrBufDup(pStartPage),
+ PRF_STRING,
+ 1,
+ NULL);
+
+ output_headers(1, 1, 0, 0, 0, 0);
+ do_template("newstartpage");
+ wDumpContent(1);
+}
+
+
+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;
+ }