"
- "
\n");
- do_template("endbox", NULL);
- wDumpContent(1);
+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); /* Render the address book */
+ return 0;
}
+int vcard_Cleanup(void **ViewSpecific)
+{
+ vcardview_struct *VS;
-/**
- * commit the edits to the citadel server
- */
-void edit_vcard(void) {
- long msgnum;
- char *partnum;
+ VS = (vcardview_struct*) *ViewSpecific;
+ wDumpContent(1);
+ if ((VS != NULL) &&
+ (VS->addrbook != NULL))
+ DeleteHash(&VS->addrbook);
+ if (VS != NULL)
+ free(VS);
- msgnum = lbstr("msgnum");
- partnum = bstr("partnum");
- do_edit_vcard(msgnum, partnum, "", NULL);
+ return 0;
}
+void render_MIME_VCard(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset)
+{
+ wc_mime_attachment *Mime = (wc_mime_attachment *) CTX(CTX_MIME_ATACH);
+ wcsession *WCC = WC;
+ if (StrLength(Mime->Data) == 0)
+ MimeLoadData(Mime);
+ if (StrLength(Mime->Data) > 0) {
+ struct vCard *v;
+ StrBuf *Buf;
+
+ Buf = NewStrBuf();
+ /** If it's my vCard I can edit it */
+ if ( (!strcasecmp(ChrPtr(WCC->CurRoom.name), USERCONFIGROOM))
+ || ((StrLength(WCC->CurRoom.name) > 11) &&
+ (!strcasecmp(&(ChrPtr(WCC->CurRoom.name)[11]), USERCONFIGROOM)))
+ || (WCC->CurRoom.view == VIEW_ADDRESSBOOK)
+ ) {
+ StrBufAppendPrintf(Buf, "
",
+ Mime->msgnum, ChrPtr(Mime->PartNum));
+ StrBufAppendPrintf(Buf, "[%s]", _("edit"));
+ }
+ /* In all cases, display the full card */
-/**
- * parse edited vcard from the browser
- */
-void submit_vcard(void) {
- struct vCard *v;
- char *serialized_vcard;
- char buf[SIZ];
- int i;
-
- if (!havebstr("ok_button")) {
- readloop(readnew);
- return;
- }
-
- if (havebstr("force_room")) {
- gotoroom(sbstr("force_room"));
- }
+ v = VCardLoad(Mime->Data);
- sprintf(buf, "ENT0 1|||4||");
- serv_puts(buf);
- serv_getln(buf, sizeof buf);
- if (buf[0] != '4') {
- edit_vcard();
- return;
- }
+ if (v != NULL) {
+ HashList *VC;
+ addrbookent ab;
+ memset(&ab, 0, sizeof(addrbookent));
- /** Make a vCard structure out of the data supplied in the form */
+ ab.VC = NewHash(0, lFlathash);
+ ab.ab_msgnum = Mime->msgnum;
- snprintf(buf, sizeof buf, "begin:vcard\r\n%s\r\nend:vcard\r\n",
- bstr("extrafields")
- );
- v = vcard_load(buf); /** Start with the extra fields */
- if (v == NULL) {
- safestrncpy(WC->ImportantMessage,
- _("An error has occurred."),
- sizeof WC->ImportantMessage
- );
- edit_vcard();
- return;
- }
+ parse_vcard(Target, v, VC, Mime);
+ display_one_vcard (Target, &ab, HKEY("vcard_msg_display"));
+ DeleteHash(&VC);
- snprintf(buf, sizeof buf, "%s;%s;%s;%s;%s",
- bstr("lastname"),
- bstr("firstname"),
- bstr("middlename"),
- bstr("prefix"),
- bstr("suffix") );
- vcard_add_prop(v, "n", buf);
-
- vcard_add_prop(v, "title", bstr("title"));
- vcard_add_prop(v, "fn", bstr("fullname"));
- vcard_add_prop(v, "org", bstr("org"));
-
- snprintf(buf, sizeof buf, "%s;%s;%s;%s;%s;%s;%s",
- bstr("pobox"),
- bstr("extadr"),
- bstr("street"),
- bstr("city"),
- bstr("state"),
- bstr("zipcode"),
- bstr("country") );
- vcard_add_prop(v, "adr", buf);
-
- vcard_add_prop(v, "tel;home", bstr("hometel"));
- vcard_add_prop(v, "tel;work", bstr("worktel"));
- vcard_add_prop(v, "tel;fax", bstr("faxtel"));
- vcard_add_prop(v, "tel;cell", bstr("mobiletel"));
- vcard_add_prop(v, "email;internet", bstr("primary_inetemail"));
-
- for (i=0; i
Data);
+ Mime->Data = Buf;
}
- serialized_vcard = vcard_serialize(v);
- vcard_free(v);
- if (serialized_vcard == NULL) {
- safestrncpy(WC->ImportantMessage,
- _("An error has occurred."),
- sizeof WC->ImportantMessage
- );
- edit_vcard();
- return;
- }
-
- serv_puts("Content-type: text/x-vcard; charset=UTF-8");
- serv_puts("");
- serv_printf("%s\r\n", serialized_vcard);
- serv_puts("000");
- free(serialized_vcard);
-
- if (!strcmp(bstr("return_to"), "select_user_to_edit")) {
- select_user_to_edit(NULL, NULL);
- }
- else if (!strcmp(bstr("return_to"), "do_welcome")) {
- do_welcome();
- }
- else {
- readloop(readnew);
- }
}
-
-
-/*
- * Extract an embedded photo from a vCard for display on the client
- */
-void display_vcard_photo_img(void)
+void
+ServerStartModule_VCARD
+(void)
{
- long msgnum = 0L;
- char *vcard;
- struct vCard *v;
- char *photosrc;
- const char *contentType;
- wcsession *WCC = WC;
+ ///VCToEnum = NewHash(0, NULL);
- msgnum = StrTol(WCC->UrlFragment2);
-
- vcard = load_mimepart(msgnum,"1");
- v = vcard_load(vcard);
-
- photosrc = vcard_get_prop(v, "PHOTO", 1,0,0);
- FlushStrBuf(WCC->WBuf);
- StrBufAppendBufPlain(WCC->WBuf, photosrc, -1, 0);
- if (StrBufDecodeBase64(WCC->WBuf) <= 0) {
- FlushStrBuf(WCC->WBuf);
-
- hprintf("HTTP/1.1 500 %s\n","Unable to get photo");
- output_headers(0, 0, 0, 0, 0, 0);
- hprintf("Content-Type: text/plain\r\n");
- wprintf(_("Could Not decode vcard photo\n"));
- end_burst();
- return;
- }
- contentType = GuessMimeType(ChrPtr(WCC->WBuf), StrLength(WCC->WBuf));
- http_transmit_thing(contentType, 0);
- free(v);
- free(photosrc);
}
-
+void
+ServerShutdownModule_VCARD
+(void)
+{
+ DeleteHash(&DefineToToken);
+ DeleteHash(&vcNames);
+ DeleteHash(&VCTokenToDefine);
+ /// DeleteHash(&VCToEnum);
+}
void
InitModule_VCARD
(void)
{
- WebcitAddUrlHandler(HKEY("edit_vcard"), edit_vcard, 0);
- WebcitAddUrlHandler(HKEY("submit_vcard"), submit_vcard, 0);
- WebcitAddUrlHandler(HKEY("vcardphoto"), display_vcard_photo_img, NEED_URL);
+ 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);
+
+ REGISTERTokenParamDefine(NAMESPERPAGE);
+
+
+ RegisterCTX(CTX_VCARD);
+ RegisterCTX(CTX_VCARD_LIST);
+ RegisterCTX(CTX_VCARD_TYPE);
+
+ RegisterReadLoopHandlerset(
+ VIEW_ADDRESSBOOK,
+ vcard_GetParamsGetServerCall,
+ NULL,
+ NULL,
+ NULL,
+ vcard_LoadMsgFromServer,
+ vcard_RenderView_or_Tail,
+ vcard_Cleanup);
+
+ RegisterIterator("MAIL:VCARDS", 0, NULL, CtxGetVcardList, NULL, NULL, CTX_VCARD, CTX_VCARD_LIST, IT_NOFLAG);
+
+
+ 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);
+
+ 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:MSGNO", 0, 1, tmpl_vcard_msgno, NULL, 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);
+
+ RegisterMimeRenderer(HKEY("text/x-vcard"), render_MIME_VCard, 1, 201);
+ RegisterMimeRenderer(HKEY("text/vcard"), render_MIME_VCard, 1, 200);
}
-