X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=libcitadel%2Flib%2Fvcard.c;h=f12a4efb599642dd7a2931de9e0c58fce25869fb;hb=19fb2763b48d73c87bf6852d29e84353fd941842;hp=f0afd47060614acd9d58dcef65f78d5b44aa4bee;hpb=66dd141637df28bc5928173a7a346b5e61f84b4c;p=citadel.git diff --git a/libcitadel/lib/vcard.c b/libcitadel/lib/vcard.c index f0afd4706..f12a4efb5 100644 --- a/libcitadel/lib/vcard.c +++ b/libcitadel/lib/vcard.c @@ -1,11 +1,21 @@ /* - * $Id: vcard.c 5754 2007-11-16 05:52:26Z ajc $ - * * vCard implementation for Citadel * - * Copyright (C) 1999-2007 by Art Cancro - * This code is freely redistributable under the terms of the GNU General - * Public License. All other rights reserved. + * Copyright (C) 1999-2008 by the citadel.org development team. + * + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ @@ -34,7 +44,7 @@ #include -/** +/* * Constructor (empty vCard) * Returns an empty vcard */ @@ -51,7 +61,7 @@ struct vCard *vcard_new() { return v; } -/** +/* * Remove the "charset=" attribute from a vCard property name * */ @@ -83,7 +93,7 @@ void remove_charset_attribute(char *strbuf) * propname name of new property * propvalue value of new property */ -void vcard_add_prop(struct vCard *v, char *propname, char *propvalue) { +void vcard_add_prop(struct vCard *v, const char *propname, const char *propvalue) { ++v->numprops; v->prop = realloc(v->prop, (v->numprops * sizeof(struct vCardProp)) ); @@ -91,9 +101,14 @@ void vcard_add_prop(struct vCard *v, char *propname, char *propvalue) { v->prop[v->numprops-1].value = strdup(propvalue); } +/* + * Constructor - returns a new struct vcard given a serialized vcard + */ +struct vCard *VCardLoad(StrBuf *vbtext) { + return vcard_load((char*)ChrPtr(vbtext)); +} - -/** +/* * Constructor - returns a new struct vcard given a serialized vcard */ struct vCard *vcard_load(char *vtext) { @@ -108,7 +123,7 @@ struct vCard *vcard_load(char *vtext) { mycopy = strdup(vtext); if (mycopy == NULL) return NULL; - /** + /* * First, fix this big pile o' vCard to make it more parseable. * To make it easier to parse, we convert CRLF to LF, and unfold any * multi-line fields into single lines. @@ -123,22 +138,24 @@ struct vCard *vcard_load(char *vtext) { } v = vcard_new(); - if (v == NULL) return v; + if (v == NULL) + { + free(mycopy); + return v; + } ptr = mycopy; while (!IsEmptyStr(ptr)) { - colonpos = (-1); - nlpos = (-1); colonpos = pattern2(ptr, ":"); nlpos = pattern2(ptr, "\n"); if ((nlpos > colonpos) && (colonpos > 0)) { namebuf = malloc(colonpos + 1); valuebuf = malloc(nlpos - colonpos + 1); - strncpy(namebuf, ptr, colonpos); - namebuf[colonpos] = 0; - strncpy(valuebuf, &ptr[colonpos+1], nlpos-colonpos-1); - valuebuf[nlpos-colonpos-1] = 0; + memcpy(namebuf, ptr, colonpos); + namebuf[colonpos] = '\0'; + memcpy(valuebuf, &ptr[colonpos+1], nlpos-colonpos-1); + valuebuf[nlpos-colonpos-1] = '\0'; if (!strcasecmp(namebuf, "end")) { valid = 0; @@ -176,7 +193,7 @@ struct vCard *vcard_load(char *vtext) { } -/** +/* * Fetch the value of a particular key. * If is_partial is set to 1, a partial match is ok (for example, * a key of "tel;home" will satisfy a search for "tel"). @@ -255,7 +272,7 @@ void vcard_set_prop(struct vCard *v, char *name, char *value, int append) { if (v->magic != CTDL_VCARD_MAGIC) return; /* Self-check */ - /** If this key is already present, replace it */ + /* If this key is already present, replace it */ if (!append) if (v->numprops) for (i=0; i<(v->numprops); ++i) { if (!strcasecmp(v->prop[i].name, name)) { free(v->prop[i].name); @@ -287,9 +304,13 @@ char *vcard_serialize(struct vCard *v) size_t len; int is_utf8 = 0; + if (v == NULL) return NULL; /* self check */ if (v->magic != CTDL_VCARD_MAGIC) return NULL; /* self check */ - /** Figure out how big a buffer we need to allocate */ + /* Set the vCard version number to 2.1 at this time. */ + vcard_set_prop(v, "VERSION", "2.1", 0); + + /* Figure out how big a buffer we need to allocate */ len = 64; /* for begin, end, and a little padding for safety */ if (v->numprops) for (i=0; i<(v->numprops); ++i) { len = len +