X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=libcitadel%2Flib%2Fvcard.c;h=f52bb29c49f5ba14ac66b93734ee82545396eb05;hb=954e5749b5e0102f8598fcc19fc10267f31a6cda;hp=e28f4783d30489bf9bc7ed99c05b973cb4ab02dd;hpb=0174c4b0d4d6f8aeb1e9f8801b2a2ce0e261489c;p=citadel.git diff --git a/libcitadel/lib/vcard.c b/libcitadel/lib/vcard.c index e28f4783d..f52bb29c4 100644 --- a/libcitadel/lib/vcard.c +++ b/libcitadel/lib/vcard.c @@ -1,11 +1,10 @@ /* - * $Id: vcard.c 5754 2007-11-16 05:52:26Z ajc $ - * * vCard implementation for Citadel * - * Copyright (C) 1999-2007 by the citadel.org development team. - * 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. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. */ @@ -34,7 +33,7 @@ #include -/** +/* * Constructor (empty vCard) * Returns an empty vcard */ @@ -51,7 +50,7 @@ struct vCard *vcard_new() { return v; } -/** +/* * Remove the "charset=" attribute from a vCard property name * */ @@ -83,7 +82,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 +90,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 +112,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 +127,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 +182,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 +261,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 +293,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 +