+ VS = (vcardview_struct*) *ViewSpecific;
+
+ ab_name = NULL;
+ fetch_ab_name(Msg, &ab_name);
+ if (ab_name == NULL)
+ return 0;
+ ++VS->num_ab;
+ VS->addrbook = realloc(VS->addrbook,
+ (sizeof(addrbookent) * VS->num_ab) );
+ safestrncpy(VS->addrbook[VS->num_ab-1].ab_name, ab_name,
+ sizeof(VS->addrbook[VS->num_ab-1].ab_name));
+ VS->addrbook[VS->num_ab-1].ab_msgnum = Msg->msgnum;
+ free(ab_name);
+ return 0;
+}
+
+
+int vcard_RenderView_or_Tail(SharedMessageStatus *Stat, void **ViewSpecific, long oper)
+{
+ const StrBuf *Mime;
+ vcardview_struct *VS;
+
+ VS = (vcardview_struct*) *ViewSpecific;
+ if (VS->is_singlecard)
+ read_message(WC->WBuf, HKEY("view_message"), lbstr("startmsg"), NULL, &Mime);
+ else
+ do_addrbook_view(VS->addrbook, VS->num_ab); /* Render the address book */
+ return 0;
+}
+
+int vcard_Cleanup(void **ViewSpecific)
+{
+ vcardview_struct *VS;
+
+ VS = (vcardview_struct*) *ViewSpecific;
+ wDumpContent(1);
+ if ((VS != NULL) &&
+ (VS->addrbook != NULL))
+ free(VS->addrbook);
+ if (VS != NULL)
+ free(VS);
+ return 0;
+}
+
+void
+ServerStartModule_VCARD
+(void)
+{
+ ///VCToEnum = NewHash(0, NULL);
+
+}
+
+void
+ServerShutdownModule_VCARD
+(void)
+{
+ DeleteHash(&DefineToToken);
+ DeleteHash(&vcNames);
+ DeleteHash(&VCTokenToDefine);
+ /// DeleteHash(&VCToEnum);
+}
+
+void
+InitModule_VCARD
+(void)
+{
+ RegisterCTX(CTX_VCARD);
+ RegisterCTX(CTX_VCARD_TYPE);
+ RegisterReadLoopHandlerset(
+ VIEW_ADDRESSBOOK,
+ vcard_GetParamsGetServerCall,
+ NULL,
+ NULL,
+ NULL,
+ vcard_LoadMsgFromServer,
+ vcard_RenderView_or_Tail,
+ vcard_Cleanup);
+ WebcitAddUrlHandler(HKEY("edit_vcard"), "", 0, edit_vcard, 0);
+ WebcitAddUrlHandler(HKEY("submit_vcard"), "", 0, submit_vcard, 0);
+ WebcitAddUrlHandler(HKEY("vcardphoto"), "", 0, display_vcard_photo_img, NEED_URL);
+/*
+ Put(VCToEnum, HKEY("n"), (void*)VC_n, reference_free_handler);
+ Put(VCToEnum, HKEY("fn"), (void*)VC_fn, reference_free_handler);
+ Put(VCToEnum, HKEY("title"), (void*)VC_title, reference_free_handler);
+ Put(VCToEnum, HKEY("org"), (void*)VC_org, reference_free_handler);
+ Put(VCToEnum, HKEY("email"), (void*)VC_email, reference_free_handler);
+ Put(VCToEnum, HKEY("tel"), (void*)VC_tel, reference_free_handler);
+ Put(VCToEnum, HKEY("work"), (void*)VC_work, reference_free_handler);
+ Put(VCToEnum, HKEY("home"), (void*)VC_home, reference_free_handler);
+ Put(VCToEnum, HKEY("cell"), (void*)VC_cell, reference_free_handler);
+ Put(VCToEnum, HKEY("adr"), (void*)VC_adr, reference_free_handler);
+ Put(VCToEnum, HKEY("photo"), (void*)VC_photo, reference_free_handler);
+ Put(VCToEnum, HKEY("version"), (void*)VC_version, reference_free_handler);
+ Put(VCToEnum, HKEY("rev"), (void*)VC_rev, reference_free_handler);
+ Put(VCToEnum, HKEY("label"), (void*)VC_label, reference_free_handler);
+*/
+/*
+ RegisterNamespace("VC", 1, 2, tmplput_VCARD_ITEM, NULL, CTX_VCARD);
+
+ REGISTERTokenParamDefine(VC_n);
+ REGISTERTokenParamDefine(VC_fn);
+ REGISTERTokenParamDefine(VC_title);
+ REGISTERTokenParamDefine(VC_org);
+ REGISTERTokenParamDefine(VC_email);
+ REGISTERTokenParamDefine(VC_tel);
+ REGISTERTokenParamDefine(VC_work);
+ REGISTERTokenParamDefine(VC_home);
+ REGISTERTokenParamDefine(VC_cell);
+ REGISTERTokenParamDefine(VC_adr);
+ REGISTERTokenParamDefine(VC_photo);
+ REGISTERTokenParamDefine(VC_version);
+ REGISTERTokenParamDefine(VC_rev);
+ REGISTERTokenParamDefine(VC_label);
+*/
+
+ {
+ StrBuf *Prefix = NewStrBufPlain(HKEY("VC:"));
+ DefineToToken = NewHash(1, lFlathash);
+ vcNames = NewHash(1, lFlathash);
+ VCTokenToDefine = NewHash(1, NULL);
+ autoRegisterTokens(&VCEnumCounter, VCStrE, Prefix, 0, 0);
+ FreeStrBuf(&Prefix);
+ }
+ RegisterCTX(CTX_VCARD);
+ RegisterNamespace("VC:ITEM", 2, 2, tmpl_vcard_item, preeval_vcard_item, CTX_VCARD);
+ RegisterNamespace("VC:CTXITEM", 1, 1, tmpl_vcard_context_item, NULL, CTX_VCARD_TYPE);
+ RegisterNamespace("VC:NAME", 1, 1, tmpl_vcard_name_str, preeval_vcard_name_str, CTX_VCARD);
+ RegisterNamespace("VC:CTXNAME", 1, 1, tmpl_vcard_context_name_str, NULL, CTX_VCARD_TYPE);
+ REGISTERTokenParamDefine(FlatString);
+ REGISTERTokenParamDefine(StringCluster);
+ REGISTERTokenParamDefine(PhoneNumber);
+ REGISTERTokenParamDefine(EmailAddr);
+ REGISTERTokenParamDefine(Street);
+ REGISTERTokenParamDefine(Number);
+ REGISTERTokenParamDefine(AliasFor);
+ REGISTERTokenParamDefine(Base64BinaryAttachment);
+ REGISTERTokenParamDefine(TerminateList);
+ REGISTERTokenParamDefine(Address);
+
+ RegisterConditional("VC:HAVE:TYPE", 1, conditional_VC_Havetype, CTX_VCARD);
+ RegisterFilteredIterator("VC:TYPE", 1, DefineToToken, NULL, NULL, NULL, filter_VC_ByType, CTX_VCARD_TYPE, CTX_VCARD, IT_NOFLAG);
+ RegisterFilteredIterator("VC:TYPE:ITEMS", 0, NULL, getContextVcard, NULL, NULL, filter_VC_ByContextType, CTX_STRBUF, CTX_VCARD_TYPE, IT_NOFLAG);
+}