\n");
+ wc_printf("\n");
- wprintf(""
+ wc_printf(""
"%s "
"%s "
"%s "
"%s "
"%s \n",
- _("Prefix"), _("First"), _("Middle"), _("Last"), _("Suffix")
+ _("Prefix"), _("First Name"), _("Middle Name"), _("Last Name"), _("Suffix")
);
- wprintf(" ",
prefix);
- wprintf(" ",
firstname);
- wprintf(" ",
middlename);
- wprintf(" ",
lastname);
- wprintf("
\n",
suffix);
- wprintf("");
- wprintf("");
+ wc_printf("\n");
+ wc_printf("
\n");
- wprintf("\n");
- do_template("endbox", NULL);
+ wc_printf("
\n");
+ do_template("box_end");
wDumpContent(1);
+ if (Msg != NULL) {
+ DestroyMessageSummary(Msg);
+ }
}
-/**
+/*
* commit the edits to the citadel server
*/
void edit_vcard(void) {
@@ -1010,49 +1547,69 @@ void edit_vcard(void) {
msgnum = lbstr("msgnum");
partnum = bstr("partnum");
- do_edit_vcard(msgnum, partnum, "", NULL);
+ do_edit_vcard(msgnum, partnum, NULL, NULL, "", NULL);
}
-/**
+/*
* parse edited vcard from the browser
*/
void submit_vcard(void) {
struct vCard *v;
char *serialized_vcard;
char buf[SIZ];
+ StrBuf *Buf;
+ const StrBuf *ForceRoom;
int i;
if (!havebstr("ok_button")) {
- readloop(readnew);
+ readloop(readnew, eUseDefault);
return;
}
if (havebstr("force_room")) {
- gotoroom(sbstr("force_room"));
+ ForceRoom = sbstr("force_room");
+ if (gotoroom(ForceRoom) != 200) {
+ AppendImportantMessage(_("Unable to enter the room to save your message"), -1);
+ AppendImportantMessage(HKEY(": "));
+ AppendImportantMessage(SKEY(ForceRoom));
+ AppendImportantMessage(HKEY("; "));
+ AppendImportantMessage(_("Aborting."), -1);
+
+ if (!strcmp(bstr("return_to"), "select_user_to_edit")) {
+ select_user_to_edit(NULL);
+ }
+ else if (!strcmp(bstr("return_to"), "do_welcome")) {
+ do_welcome();
+ }
+ else if (!IsEmptyStr(bstr("return_to"))) {
+ http_redirect(bstr("return_to"));
+ }
+ else {
+ readloop(readnew, eUseDefault);
+ }
+ return;
+ }
}
- sprintf(buf, "ENT0 1|||4||");
- serv_puts(buf);
- serv_getln(buf, sizeof buf);
- if (buf[0] != '4') {
+ Buf = NewStrBuf();
+ serv_write(HKEY("ENT0 1|||4\n"));
+ if (!StrBuf_ServGetln(Buf) && (GetServerStatus(Buf, NULL) != 4))
+ {
edit_vcard();
return;
}
- /** Make a vCard structure out of the data supplied in the form */
-
- snprintf(buf, sizeof buf, "begin:vcard\r\n%s\r\nend:vcard\r\n",
- bstr("extrafields")
+ /* Make a vCard structure out of the data supplied in the form */
+ StrBufPrintf(Buf, "begin:vcard\r\n%s\r\nend:vcard\r\n",
+ bstr("extrafields")
);
- v = vcard_load(buf); /** Start with the extra fields */
+ v = VCardLoad(Buf); /* Start with the extra fields */
if (v == NULL) {
- safestrncpy(WC->ImportantMessage,
- _("An error has occurred."),
- sizeof WC->ImportantMessage
- );
+ AppendImportantMessage(_("An error has occurred."), -1);
edit_vcard();
+ FreeStrBuf(&Buf);
return;
}
@@ -1094,29 +1651,31 @@ void submit_vcard(void) {
serialized_vcard = vcard_serialize(v);
vcard_free(v);
if (serialized_vcard == NULL) {
- safestrncpy(WC->ImportantMessage,
- _("An error has occurred."),
- sizeof WC->ImportantMessage
- );
+ AppendImportantMessage(_("An error has occurred."), -1);
edit_vcard();
+ FreeStrBuf(&Buf);
return;
}
- serv_puts("Content-type: text/x-vcard; charset=UTF-8");
- serv_puts("");
+ serv_write(HKEY("Content-type: text/x-vcard; charset=UTF-8\n"));
+ serv_write(HKEY("\n"));
serv_printf("%s\r\n", serialized_vcard);
- serv_puts("000");
+ serv_write(HKEY("000\n"));
free(serialized_vcard);
if (!strcmp(bstr("return_to"), "select_user_to_edit")) {
- select_user_to_edit(NULL, NULL);
+ select_user_to_edit(NULL);
}
else if (!strcmp(bstr("return_to"), "do_welcome")) {
do_welcome();
}
+ else if (!IsEmptyStr(bstr("return_to"))) {
+ http_redirect(bstr("return_to"));
+ }
else {
- readloop(readnew);
+ readloop(readnew, eUseDefault);
}
+ FreeStrBuf(&Buf);
}
@@ -1127,16 +1686,16 @@ void submit_vcard(void) {
void display_vcard_photo_img(void)
{
long msgnum = 0L;
- char *vcard;
+ StrBuf *vcard;
struct vCard *v;
char *photosrc;
const char *contentType;
wcsession *WCC = WC;
- msgnum = StrTol(WCC->UrlFragment2);
+ msgnum = StrBufExtract_long(WCC->Hdr->HR.ReqLine, 0, '/');
vcard = load_mimepart(msgnum,"1");
- v = vcard_load(vcard);
+ v = VCardLoad(vcard);
photosrc = vcard_get_prop(v, "PHOTO", 1,0,0);
FlushStrBuf(WCC->WBuf);
@@ -1147,7 +1706,8 @@ void display_vcard_photo_img(void)
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"));
+ begin_burst();
+ wc_printf(_("Could Not decode vcard photo\n"));
end_burst();
return;
}
@@ -1157,14 +1717,181 @@ void display_vcard_photo_img(void)
free(photosrc);
}
+typedef struct _vcardview_struct {
+ long is_singlecard;
+ addrbookent *addrbook;
+ long num_ab;
+
+} vcardview_struct;
+
+int vcard_GetParamsGetServerCall(SharedMessageStatus *Stat,
+ void **ViewSpecific,
+ long oper,
+ char *cmd,
+ long len,
+ char *filter,
+ long flen)
+{
+ vcardview_struct *VS;
+
+ VS = (vcardview_struct*) malloc (sizeof(vcardview_struct));
+ memset(VS, 0, sizeof(vcardview_struct));
+ *ViewSpecific = (void*)VS;
+
+ VS->is_singlecard = ibstr("is_singlecard");
+ if (VS->is_singlecard != 1) {
+ if (oper == do_search) {
+ snprintf(cmd, len, "MSGS SEARCH|%s", bstr("query"));
+ }
+ else {
+ strcpy(cmd, "MSGS ALL");
+ }
+ Stat->maxmsgs = 9999999;
+ }
+ return 200;
+}
+
+int vcard_LoadMsgFromServer(SharedMessageStatus *Stat,
+ void **ViewSpecific,
+ message_summary* Msg,
+ int is_new,
+ int i)
+{
+ vcardview_struct *VS;
+ char *ab_name;
+
+ 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(&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);
+ RegisterCTX(CTX_VCARD);
+ 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);
+ VCTokenToDefine = NewHash(1, NULL);
+ autoRegisterTokens(&VCEnumCounter, VCStrE, Prefix, 0);
+ FreeStrBuf(&Prefix);
+ }
+ RegisterCTX(CTX_VCARD);
+ RegisterNamespace("VC:ITEM", 2, 2, tmpl_vcard_item, preeval_vcard_item, CTX_VCARD);
+ RegisterNamespace("VC:NAME", 1, 1, tmpl_vcard_name_str, preeval_vcard_name_str, CTX_VCARD);
+ REGISTERTokenParamDefine(FlatString);
+ REGISTERTokenParamDefine(StringCluster);
+ REGISTERTokenParamDefine(PhoneNumber);
+ REGISTERTokenParamDefine(EmailAddr);
+ REGISTERTokenParamDefine(Street);
+ REGISTERTokenParamDefine(Number);
+ REGISTERTokenParamDefine(AliasFor);
+ REGISTERTokenParamDefine(Base64BinaryAttachment);
+ REGISTERTokenParamDefine(TerminateList);
+
+ RegisterConditional("VC:HAVE:TYPE", 1, conditional_VC_Havetype, CTX_VCARD);
+ RegisterFilteredIterator("VC:TYPE", 1, NULL, NULL, NULL, NULL, filter_VC_ByType, CTX_STRBUF, CTX_VCARD, IT_NOFLAG);
}