X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fvcard_edit.c;h=d5369aa78e9ea1ab45ddb44f9d5a677e313bf832;hb=f5c1330914acc193f96892efc191a32ee537dfb5;hp=ccdaba684e5bf53178b4e0dc723a941971b3f752;hpb=fe6de48992523706b2bfe7e09d5389777970d728;p=citadel.git diff --git a/webcit/vcard_edit.c b/webcit/vcard_edit.c index ccdaba684..d5369aa78 100644 --- a/webcit/vcard_edit.c +++ b/webcit/vcard_edit.c @@ -1,14 +1,9 @@ -/* - * $Id$ - */ #include "webcit.h" +#include "calendar.h" - -/** - * \brief Record compare function for sorting address book indices - * \param ab1 adressbook one - * \param ab2 adressbook two +/* + * Record compare function for sorting address book indices */ int abcmp(const void *ab1, const void *ab2) { return(strcasecmp( @@ -18,11 +13,9 @@ int abcmp(const void *ab1, const void *ab2) { } -/** - * \brief Helper function for do_addrbook_view() +/* + * Helper function for do_addrbook_view() * Converts a name into a three-letter tab label - * \param tabbuf the tabbuffer to add name to - * \param name the name to add to the tabbuffer */ void nametab(char *tabbuf, long len, char *name) { stresc(tabbuf, len, name, 0, 0); @@ -33,55 +26,8 @@ void nametab(char *tabbuf, long len, char *name) { } -/** - * \brief display the adressbook overview - * \param msgnum the citadel message number - * \param alpha what???? - */ -void display_addressbook(long msgnum, char alpha) { - //char buf[SIZ]; - /* char mime_partnum[SIZ]; */ -/* char mime_filename[SIZ]; */ -/* char mime_content_type[SIZ]; */ - ///char mime_disposition[SIZ]; - //int mime_length; - char vcard_partnum[SIZ]; - StrBuf *vcard_source = NULL; - message_summary summ;////TODO: this will leak - - memset(&summ, 0, sizeof(summ)); - ///safestrncpy(summ.subj, _("(no subject)"), sizeof summ.subj); -///Load Message headers -// Msg = - if (!IsEmptyStr(vcard_partnum)) { - vcard_source = load_mimepart(msgnum, vcard_partnum); - if (vcard_source != NULL) { - - /** Display the summary line */ - display_vcard(WC->WBuf, vcard_source, alpha, 0, NULL, msgnum); - - /** If it's my vCard I can edit it */ - if ( (!strcasecmp(ChrPtr(WC->wc_roomname), USERCONFIGROOM)) - || (!strcasecmp(&(ChrPtr(WC->wc_roomname)[11]), USERCONFIGROOM)) - || (WC->wc_view == VIEW_ADDRESSBOOK) - ) { - wprintf("", - msgnum, vcard_partnum); - wprintf("[%s]", _("edit")); - } - - FreeStrBuf(&vcard_source); - } - } - -} - - - -/** - * \brief If it's an old "Firstname Lastname" style record, try to convert it. - * \param namebuf name to analyze, reverse if nescessary +/* + * If it's an old "Firstname Lastname" style record, try to convert it. */ void lastfirst_firstlast(char *namebuf) { char firstname[SIZ]; @@ -100,58 +46,66 @@ void lastfirst_firstlast(char *namebuf) { sprintf(namebuf, "%s; %s", lastname, firstname); } -/** - * \brief fetch what??? name - * \param msgnum the citadel message number - * \param namebuf where to put the name in??? - */ -void fetch_ab_name(message_summary *Msg, char **namebuf) { - char buf[SIZ]; - char mime_partnum[SIZ]; - char mime_filename[SIZ]; - char mime_content_type[SIZ]; - char mime_disposition[SIZ]; - int mime_length; - char vcard_partnum[SIZ]; - StrBuf *vcard_source = NULL; - int i, len; - message_summary summ;/// TODO this will lak - - if (namebuf == NULL) return; - - memset(&summ, 0, sizeof(summ)); - //////safestrncpy(summ.subj, "(no subject)", sizeof summ.subj); - serv_printf("MSG0 %ld|0", Msg->msgnum); /** unfortunately we need the mime info now */ - serv_getln(buf, sizeof buf); - if (buf[0] != '1') return; - - while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - if (!strncasecmp(buf, "part=", 5)) { - extract_token(mime_filename, &buf[5], 1, '|', sizeof mime_filename); - extract_token(mime_partnum, &buf[5], 2, '|', sizeof mime_partnum); - extract_token(mime_disposition, &buf[5], 3, '|', sizeof mime_disposition); - extract_token(mime_content_type, &buf[5], 4, '|', sizeof mime_content_type); - mime_length = extract_int(&buf[5], 5); - - if ( (!strcasecmp(mime_content_type, "text/x-vcard")) - || (!strcasecmp(mime_content_type, "text/vcard")) ) { - strcpy(vcard_partnum, mime_partnum); - } +wc_mime_attachment *load_vcard(message_summary *Msg) +{ + HashPos *it; + StrBuf *FoundCharset = NewStrBuf(); + StrBuf *Error; + void *vMime; + const char *Key; + long len; + wc_mime_attachment *Mime; + wc_mime_attachment *VCMime = NULL; + + Msg->MsgBody = (wc_mime_attachment*) malloc(sizeof(wc_mime_attachment)); + memset(Msg->MsgBody, 0, sizeof(wc_mime_attachment)); + Msg->MsgBody->msgnum = Msg->msgnum; + + load_message(Msg, FoundCharset, &Error); + + FreeStrBuf(&FoundCharset); + /* look up the vcard... */ + it = GetNewHashPos(Msg->AllAttach, 0); + while (GetNextHashPos(Msg->AllAttach, it, &len, &Key, &vMime) && + (vMime != NULL)) + { + Mime = (wc_mime_attachment*) vMime; + if ((strcmp(ChrPtr(Mime->ContentType), + "text/x-vcard") == 0) || + (strcmp(ChrPtr(Mime->ContentType), + "text/vcard") == 0)) + { + VCMime = Mime; + break; } } + DeleteHashPos(&it); + if (VCMime == NULL) + return NULL; - if (!IsEmptyStr(vcard_partnum)) { - vcard_source = load_mimepart(Msg->msgnum, vcard_partnum); - if (vcard_source != NULL) { + MimeLoadData(VCMime); + return VCMime; +} - /* Grab the name off the card */ - display_vcard(WC->WBuf, vcard_source, 0, 0, namebuf, Msg->msgnum); +/* + * fetch the display name off a vCard + */ +void fetch_ab_name(message_summary *Msg, char **namebuf) { + long len; + int i; + wc_mime_attachment *VCMime = NULL; + + if (namebuf == NULL) return; + + VCMime = load_vcard(Msg); + if (VCMime == NULL) + return; + + /* Grab the name off the card */ + display_vcard(WC->WBuf, VCMime, 0, 0, namebuf, Msg->msgnum); - FreeStrBuf(&vcard_source); - } - } if (*namebuf != NULL) { lastfirst_firstlast(*namebuf); striplt(*namebuf); @@ -169,9 +123,8 @@ void fetch_ab_name(message_summary *Msg, char **namebuf) { -/** - * \brief Turn a vCard "n" (name) field into something displayable. - * \param name the name field to convert +/* + * Turn a vCard "n" (name) field into something displayable. */ void vcard_n_prettyize(char *name) { @@ -208,14 +161,12 @@ void vcard_n_prettyize(char *name) -/** - * \brief preparse a vcard name +/* + * preparse a vcard name * display_vcard() calls this after parsing the textual vCard into * our 'struct vCard' data object. * This gets called instead of display_parsed_vcard() if we are only looking * to extract the person's name instead of displaying the card. - * \param v the vcard to retrieve the name from - * \param storename where to put the name at */ void fetchname_parsed_vcard(struct vCard *v, char **storename) { char *name; @@ -258,7 +209,12 @@ void fetchname_parsed_vcard(struct vCard *v, char **storename) { len); } else { - *storename = strdup(name); + size_t len; + + len = strlen (name); + + *storename = malloc(len + 3); /* \0 + eventualy missing ', '*/ + memcpy(*storename, name, len + 1); } /* vcard_n_prettyize(storename); */ } @@ -267,8 +223,8 @@ void fetchname_parsed_vcard(struct vCard *v, char **storename) { -/** - * \brief html print a vcard +/* + * html print a vcard * display_vcard() calls this after parsing the textual vCard into * our 'struct vCard' data object. * @@ -280,11 +236,12 @@ void fetchname_parsed_vcard(struct vCard *v, char **storename) { * fields we understand, and then render them in a pretty fashion at the * end. Then we make a second pass, outputting all the fields we don't * understand in a simple two-column name/value format. - * \param v the vCard to display - * \param full display all items of the vcard? - * \param msgnum Citadel message pointer + * v the vCard to display + * full display all items of the vcard? + * msgnum Citadel message pointer */ -void display_parsed_vcard(StrBuf *Target, struct vCard *v, int full, long msgnum) { +void display_parsed_vcard(StrBuf *Target, struct vCard *v, int full, wc_mime_attachment *Mime) +{ int i, j; char buf[SIZ]; char *name; @@ -348,7 +305,7 @@ void display_parsed_vcard(StrBuf *Target, struct vCard *v, int full, long msgnum len = strlen(v->prop[i].value); /* if we have some untagged QP, detect it here. */ if (!is_qp && (strstr(v->prop[i].value, "=?")!=NULL)) - utf8ify_rfc822_string(v->prop[i].value); + utf8ify_rfc822_string(&v->prop[i].value); if (is_qp) { // %ff can become 6 bytes in utf8 @@ -369,9 +326,9 @@ void display_parsed_vcard(StrBuf *Target, struct vCard *v, int full, long msgnum thisvalue = strdup(v->prop[i].value); } - /** Various fields we may encounter ***/ + /* Various fields we may encounter ***/ - /** N is name, but only if there's no FN already there */ + /* N is name, but only if there's no FN already there */ if (!strcasecmp(firsttoken, "n")) { if (IsEmptyStr(fullname)) { strcpy(fullname, thisvalue); @@ -379,17 +336,17 @@ void display_parsed_vcard(StrBuf *Target, struct vCard *v, int full, long msgnum } } - /** FN (full name) is a true 'display name' field */ + /* FN (full name) is a true 'display name' field */ else if (!strcasecmp(firsttoken, "fn")) { strcpy(fullname, thisvalue); } - /** title */ + /* title */ else if (!strcasecmp(firsttoken, "title")) { strcpy(title, thisvalue); } - /** organization */ + /* organization */ else if (!strcasecmp(firsttoken, "org")) { strcpy(org, thisvalue); } @@ -525,20 +482,21 @@ void display_parsed_vcard(StrBuf *Target, struct vCard *v, int full, long msgnum -/** - * \brief Display a textual vCard +/* + * Display a textual vCard * (Converts to a vCard object and then calls the actual display function) * Set 'full' to nonzero to display the whole card instead of a one-liner. * Or, if "storename" is non-NULL, just store the person's name in that * buffer instead of displaying the card at all. - * \param vcard_source the buffer containing the vcard text - * \param alpha what??? - * \param full should we usse all lines? - * \param storename where to store??? - * \param msgnum Citadel message pointer + * + * vcard_source the buffer containing the vcard text + * alpha Display only if name begins with this letter of the alphabet + * full Display the full vCard (otherwise just the display name) + * storename If not NULL, also store the display name here + * msgnum Citadel message pointer */ void display_vcard(StrBuf *Target, - StrBuf *vcard_source, + wc_mime_attachment *Mime, char alpha, int full, char **storename, @@ -550,7 +508,7 @@ void display_vcard(StrBuf *Target, StrBuf *Buf2; char this_alpha = 0; - v = VCardLoad(vcard_source); + v = VCardLoad(Mime->Data); if (v == NULL) return; @@ -567,11 +525,12 @@ void display_vcard(StrBuf *Target, if (storename != NULL) { fetchname_parsed_vcard(v, storename); } - else if ( (alpha == 0) - || ((isalpha(alpha)) && (tolower(alpha) == tolower(this_alpha)) ) - || ((!isalpha(alpha)) && (!isalpha(this_alpha))) - ) { - display_parsed_vcard(Target, v, full,msgnum); + else if ((alpha == 0) || + ((isalpha(alpha)) && (tolower(alpha) == tolower(this_alpha))) || + ((!isalpha(alpha)) && (!isalpha(this_alpha))) + ) + { + display_parsed_vcard(Target, v, full, Mime); } vcard_free(v); @@ -579,10 +538,11 @@ void display_vcard(StrBuf *Target, -/** - * \brief Render the address book using info we gathered during the scan - * \param addrbook the addressbook to render - * \param num_ab the number of the addressbook +/* + * Render the address book using info we gathered during the scan + * + * addrbook the addressbook to render + * num_ab the number of the addressbook */ void do_addrbook_view(addrbookent *addrbook, int num_ab) { int i = 0; @@ -599,9 +559,9 @@ void do_addrbook_view(addrbookent *addrbook, int num_ab) { char **tablabels; if (num_ab == 0) { - wprintf("


"); - wprintf(_("This address book is empty.")); - wprintf("
\n"); + wc_printf("


"); + wc_printf(_("This address book is empty.")); + wc_printf("
\n"); return; } @@ -613,9 +573,9 @@ void do_addrbook_view(addrbookent *addrbook, int num_ab) { tablabels = malloc(num_pages * sizeof (char *)); if (tablabels == NULL) { - wprintf("


"); - wprintf(_("An internal error has occurred.")); - wprintf("
\n"); + wc_printf("


"); + wc_printf(_("An internal error has occurred.")); + wc_printf("
\n"); return; } @@ -637,43 +597,43 @@ void do_addrbook_view(addrbookent *addrbook, int num_ab) { if ((i / NAMESPERPAGE) != page) { /* New tab */ page = (i / NAMESPERPAGE); if (page > 0) { - wprintf("\n"); + wc_printf("\n"); end_tab(page-1, num_pages); } begin_tab(page, num_pages); - wprintf("\n"); + wc_printf("
\n"); displayed = 0; } if ((displayed % 4) == 0) { if (displayed > 0) { - wprintf("\n"); + wc_printf("\n"); } bg = 1 - bg; - wprintf("", + wc_printf("", (bg ? "DDDDDD" : "FFFFFF") ); } - wprintf("\n"); + wc_printf("\n"); ++displayed; } /* Placeholders for empty columns at end */ if ((num_ab % 4) != 0) { for (i=0; i<(4-(num_ab % 4)); ++i) { - wprintf(""); + wc_printf(""); } } - wprintf("
"); + wc_printf(""); - wprintf("", bstr("alpha")); + wc_printf("?maxmsgs=1?is_summary=0?alpha=%s\">", bstr("alpha")); vcard_n_prettyize(addrbook[i].ab_name); escputs(addrbook[i].ab_name); - wprintf("  
\n"); + wc_printf("\n"); end_tab((num_pages-1), num_pages); begin_tab(num_pages, num_pages); @@ -698,11 +658,10 @@ void do_addrbook_view(addrbookent *addrbook, int num_ab) { void do_edit_vcard(long msgnum, char *partnum, message_summary *VCMsg, wc_mime_attachment *VCAtt, - char *return_to, + const char *return_to, const char *force_room) { - StrBuf *Buf; - char buf[SIZ]; - size_t total_len = 0; + message_summary *Msg = NULL; + wc_mime_attachment *VCMime = NULL; struct vCard *v; int i; char *key, *value; @@ -760,41 +719,22 @@ void do_edit_vcard(long msgnum, char *partnum, ((VCMsg != NULL) && (VCAtt != NULL))) { if ((VCMsg == NULL) && (VCAtt == NULL)) { - sprintf(buf, "MSG0 %ld|1", msgnum); - serv_puts(buf); - serv_getln(buf, sizeof buf); - if (buf[0] != '1') { - convenience_page("770000", _("Error"), &buf[4]); - return; - } - while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - if (!strncasecmp(buf, "from=", 5)) { - safestrncpy(whatuser, &buf[5], sizeof whatuser); - } - else if (!strncasecmp(buf, "node=", 5)) { - strcat(whatuser, " @ "); - strcat(whatuser, &buf[5]); - } - } - Buf = NewStrBuf(); - serv_printf(buf, "DLAT %ld|%s", msgnum, partnum); - StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) != 6) { - convenience_page("770000", "Error", &(ChrPtr(Buf)[4])); + + Msg = (message_summary *) malloc(sizeof(message_summary)); + memset(Msg, 0, sizeof(message_summary)); + Msg->msgnum = msgnum; + VCMime = load_vcard(Msg); + if (VCMime == NULL) { + convenience_page("770000", _("Error"), "");///TODO: important message + DestroyMessageSummary(Msg); return; } - - StrBufCutLeft(Buf, 4); - total_len = StrBufExtract_long(Buf, 0, '|'); - - StrBuf_ServGetBLOBBuffered(Buf, total_len); - v = VCardLoad(Buf); + v = VCardLoad(VCMime->Data); } else { v = VCardLoad(VCAtt->Data); } - FreeStrBuf(&Buf); /* Populate the variables for our form */ i = 0; @@ -885,173 +825,174 @@ void do_edit_vcard(long msgnum, char *partnum, vcard_free(v); } - /** Display the form */ + /* Display the form */ output_headers(1, 1, 1, 0, 0, 0); - svput("BOXTITLE", WCS_STRING, _("Edit contact information")); - do_template("beginboxx", NULL); + do_template("beginbox_1", NULL); + StrBufAppendBufPlain(WC->WBuf, _("Edit contact information"), -1, 0); + do_template("beginbox_2", NULL); - wprintf("
\n"); - wprintf("\n", WC->nonce); + wc_printf("\n"); + wc_printf("\n", WC->nonce); if (force_room != NULL) { - wprintf("\n"); + wc_printf("\">\n"); } - wprintf("
" + wc_printf("
" "
\n"); - wprintf("" + wc_printf("
" "" "" "" "" "\n", - _("Prefix"), _("First"), _("Middle"), _("Last"), _("Suffix") + _("Prefix"), _("First Name"), _("Middle Name"), _("Last Name"), _("Suffix") ); - wprintf("", prefix); - wprintf("", firstname); - wprintf("", middlename); - wprintf("", lastname); - wprintf("
%s%s%s%s%s
\n", suffix); - wprintf(""); - wprintf("
"); + wc_printf(""); + wc_printf("
"); - wprintf(_("Display name:")); - wprintf("
" + wc_printf(_("Display name:")); + wc_printf("
" "

\n", fullname ); - wprintf(_("Title:")); - wprintf("
" + wc_printf(_("Title:")); + wc_printf("
" "

\n", title ); - wprintf(_("Organization:")); - wprintf("
" + wc_printf(_("Organization:")); + wc_printf("
" "

\n", org ); - wprintf("
"); + wc_printf(""); - wprintf(""); - wprintf("
"); - wprintf(_("PO box:")); - wprintf("" + wc_printf(""); + wc_printf("\n", pobox); - wprintf("\n", extadr); - wprintf("\n", street); - wprintf("\n", city); - wprintf("\n", state); - wprintf("\n", zipcode); - wprintf("\n", country); - wprintf("
"); + wc_printf(_("PO box:")); + wc_printf("" "
"); - wprintf(_("Address:")); - wprintf("" + wc_printf("
"); + wc_printf(_("Address:")); + wc_printf("" "
" + wc_printf("
" "
"); - wprintf(_("City:")); - wprintf("" + wc_printf("
"); + wc_printf(_("City:")); + wc_printf("" "
"); - wprintf(_("State:")); - wprintf("" + wc_printf("
"); + wc_printf(_("State:")); + wc_printf("" "
"); - wprintf(_("ZIP code:")); - wprintf("" + wc_printf("
"); + wc_printf(_("ZIP code:")); + wc_printf("" "
"); - wprintf(_("Country:")); - wprintf("" + wc_printf("
"); + wc_printf(_("Country:")); + wc_printf("" "
\n"); + wc_printf("
\n"); - wprintf("
\n"); + wc_printf("
\n"); - wprintf("" + wc_printf("
"); - wprintf(_("Home telephone:")); - wprintf("
" "\n", hometel); - wprintf("" + wc_printf("" "\n", worktel); - wprintf("" + wc_printf("" "\n", mobiletel); - wprintf("" + wc_printf("" "
"); + wc_printf(_("Home telephone:")); + wc_printf(""); - wprintf(_("Work telephone:")); - wprintf(""); + wc_printf(_("Work telephone:")); + wc_printf("
"); - wprintf(_("Mobile telephone:")); - wprintf("
"); + wc_printf(_("Mobile telephone:")); + wc_printf(""); - wprintf(_("Fax number:")); - wprintf(""); + wc_printf(_("Fax number:")); + wc_printf("
\n", faxtel); - wprintf(""); - wprintf("
"); + wc_printf(""); + wc_printf("
"); - wprintf("" + wc_printf("
" "
"); - wprintf(_("Primary Internet e-mail address")); - wprintf("
" + wc_printf(_("Primary Internet e-mail address")); + wc_printf("
" "
" + wc_printf("\">
" "
"); - wprintf(_("Internet e-mail aliases")); - wprintf("
" + wc_printf(_("Internet e-mail aliases")); + wc_printf("
" "
\n"); + wc_printf("
\n"); - wprintf("
\n"); + wc_printf("
\n"); - wprintf("\n"); + wc_printf("\">\n"); - wprintf("\n"); + wc_printf("\n"); - wprintf("
\n" + wc_printf("
\n" "" " " "" @@ -1060,13 +1001,16 @@ void do_edit_vcard(long msgnum, char *partnum, _("Cancel") ); - wprintf("\n"); + wc_printf("\n"); do_template("endbox", NULL); wDumpContent(1); + if (Msg != NULL) { + DestroyMessageSummary(Msg); + } } -/** +/* * commit the edits to the citadel server */ void edit_vcard(void) { @@ -1080,7 +1024,7 @@ void edit_vcard(void) { -/** +/* * parse edited vcard from the browser */ void submit_vcard(void) { @@ -1092,7 +1036,7 @@ void submit_vcard(void) { int i; if (!havebstr("ok_button")) { - readloop(readnew); + readloop(readnew, eUseDefault); return; } @@ -1110,15 +1054,18 @@ void submit_vcard(void) { StrBufAppendBufPlain(WCC->ImportantMsg, _("Aborting."), -1, 0); - /// todo: call the master dispatcher again... + 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); + readloop(readnew, eUseDefault); } return; } @@ -1132,12 +1079,12 @@ void submit_vcard(void) { return; } - /** Make a vCard structure out of the data supplied in the form */ + /* Make a vCard structure out of the data supplied in the form */ Buf = NewStrBuf(); StrBufPrintf(Buf, "begin:vcard\r\n%s\r\nend:vcard\r\n", bstr("extrafields") ); - v = VCardLoad(Buf); /** Start with the extra fields */ + v = VCardLoad(Buf); /* Start with the extra fields */ FreeStrBuf(&Buf); if (v == NULL) { safestrncpy(WCC->ImportantMessage, @@ -1206,8 +1153,11 @@ void submit_vcard(void) { 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); } } @@ -1225,7 +1175,7 @@ void display_vcard_photo_img(void) const char *contentType; wcsession *WCC = WC; - msgnum = StrTol(WCC->UrlFragment2); + msgnum = StrBufExtract_long(WCC->Hdr->HR.ReqLine, 0, '/'); vcard = load_mimepart(msgnum,"1"); v = VCardLoad(vcard); @@ -1239,7 +1189,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; } @@ -1249,14 +1200,105 @@ 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) +{ + 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 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); + RegisterReadLoopHandlerset( + VIEW_ADDRESSBOOK, + vcard_GetParamsGetServerCall, + 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); }