X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fvcard_edit.c;h=5ec2799afcad92107e48e7f1a57aa93cac4a3470;hb=fb6f6fa4ec4e3277e30d84326d48e6850822d318;hp=d823624dfde260e8568b7d5c212183a2830e8f99;hpb=cef995d5a1adbe0286d85cc3b2f597aeb3590835;p=citadel.git diff --git a/webcit/vcard_edit.c b/webcit/vcard_edit.c index d823624df..5ec2799af 100644 --- a/webcit/vcard_edit.c +++ b/webcit/vcard_edit.c @@ -1,14 +1,61 @@ /* - * $Id$ + * Copyright (c) 1996-2012 by the citadel.org team + * + * This program is open source software. You can redistribute it and/or + * modify it under the terms of the GNU General Public License, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ #include "webcit.h" +#include "webserver.h" +#include "calendar.h" + + + +ConstStr VCStr [] = { + {HKEY("n")}, /* N is name, but only if there's no FN already there */ + {HKEY("fn")}, /* FN (full name) is a true 'display name' field */ + {HKEY("title")}, /* title */ + {HKEY("org")}, /* organization */ + {HKEY("email")}, + {HKEY("tel")}, + {HKEY("tel_tel")}, + {HKEY("tel_work")}, + {HKEY("tel_home")}, + {HKEY("tel_cell")}, + {HKEY("adr")}, + {HKEY("photo")}, + {HKEY("version")}, + {HKEY("rev")}, + {HKEY("label")} +}; + +typedef enum _eVC{ + VC_n, + VC_fn, + VC_title, + VC_org, + VC_email, + VC_tel, + VC_tel_tel, + VC_tel_work, + VC_tel_home, + VC_tel_cell, + VC_adr, + VC_photo, + VC_version, + VC_rev, + VC_label +} eVC; + +HashList *VCToEnum = NULL; - -/** - * \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 +65,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 +78,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 +98,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(buf, "MSG0 %ld|0", Msg->msgnum); /** unfortunately we need the mime info now */ - serv_getln(buf, sizeof buf); - if (buf[0] != '1') return; +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; - 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); + MimeLoadData(VCMime); + return VCMime; +} - if ( (!strcasecmp(mime_content_type, "text/x-vcard")) - || (!strcasecmp(mime_content_type, "text/vcard")) ) { - strcpy(vcard_partnum, mime_partnum); - } +/* + * 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; - if (!IsEmptyStr(vcard_partnum)) { - vcard_source = load_mimepart(Msg->msgnum, vcard_partnum); - if (vcard_source != NULL) { + VCMime = load_vcard(Msg); + if (VCMime == NULL) + return; - /* Grab the name off the card */ - display_vcard(WC->WBuf, vcard_source, 0, 0, namebuf, Msg->msgnum); + /* 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 +175,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 +213,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; @@ -243,7 +246,7 @@ void fetchname_parsed_vcard(struct vCard *v, char **storename) { } } if (is_qp) { - // %ff can become 6 bytes in utf8 + /* %ff can become 6 bytes in utf8 */ *storename = malloc(len * 2 + 3); j = CtdlDecodeQuotedPrintable( *storename, name, @@ -251,14 +254,19 @@ void fetchname_parsed_vcard(struct vCard *v, char **storename) { (*storename)[j] = 0; } else if (is_b64) { - // ff will become one byte.. + /* ff will become one byte.. */ *storename = malloc(len + 50); CtdlDecodeBase64( *storename, name, 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 +275,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 +288,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; @@ -307,7 +316,7 @@ void display_parsed_vcard(StrBuf *Target, struct vCard *v, int full, long msgnum strcpy(org, ""); if (!full) { - StrBufAppendPrintf(Target, "
"); + StrBufAppendPrintf(Target, " | |||
"); StrBufAppendPrintf(Target, _("Address:")); - StrBufAppendPrintf(Target, " | "); + StrBufAppendPrintf(Target, " | ");
for (j=0; j "); else StrBufAppendPrintf(Target, " "); } } - StrBufAppendPrintf(Target, " | |
"
- ""
- "");
+ StrBufAppendPrintf(Target, ""
+ ""
+ "");
StrEscAppend(Target, NULL, fullname, 0, 0);
- StrBufAppendPrintf(Target, "");
+ StrBufAppendPrintf(Target, "");
if (!IsEmptyStr(title)) {
- StrBufAppendPrintf(Target, " | ");
+ StrBufAppendPrintf(Target, " \"");
StrEscAppend(Target, NULL, title, 0, 0);
StrBufAppendPrintf(Target, " ");
}
if (!IsEmptyStr(org)) {
- StrBufAppendPrintf(Target, "");
+ StrBufAppendPrintf(Target, " ");
StrEscAppend(Target, NULL, org, 0, 0);
StrBufAppendPrintf(Target, " ");
}
- StrBufAppendPrintf(Target, " | ||
"); @@ -523,22 +532,177 @@ void display_parsed_vcard(StrBuf *Target, struct vCard *v, int full, long msgnum StrBufAppendPrintf(Target, " |
"); + 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"); ++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(" |