From: Art Cancro Date: Fri, 16 Nov 2007 17:15:22 +0000 (+0000) Subject: Move vcard.c into libcitadel. X-Git-Tag: v7.86~2779 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=66dd141637df28bc5928173a7a346b5e61f84b4c Move vcard.c into libcitadel. --- diff --git a/citadel/Makefile.in b/citadel/Makefile.in index 79d40df39..9c8445176 100644 --- a/citadel/Makefile.in +++ b/citadel/Makefile.in @@ -29,8 +29,7 @@ EXEEXT=@EXEEXT@ CLIENT_TARGETS=citadel$(EXEEXT) whobbs$(EXEEXT) stress$(EXEEXT) SERVER_TARGETS=citserver -SERV_MODULES=vcard.o \ - crc16.o \ +SERV_MODULES=crc16.o \ md5.o \ ical_dezonify.o @@ -82,7 +81,7 @@ SOURCES=aidepost.c auth.c base64.c chkpwd.c chkpw.c citadel.c citadel_ipc.c \ server_main.c \ setup.c snprintf.c \ stress.c support.c sysdep.c user_ops.c userlist.c \ - whobbs.c vcard.c \ + whobbs.c \ crc16.c journaling.c citadel_dirs.c include Make_sources diff --git a/citadel/journaling.c b/citadel/journaling.c index 9ea772860..e344e6ba9 100644 --- a/citadel/journaling.c +++ b/citadel/journaling.c @@ -45,8 +45,7 @@ #include "html.h" #include "genstamp.h" #include "internet_addressing.h" -#include "vcard.h" -#include "serv_vcard.h" /* Needed for vcard_getuser and extract_inet_email_addrs */ +#include "serv_vcard.h" /* Needed for vcard_getuser and extract_inet_email_addrs */ #include "journaling.h" struct jnlq *jnlq = NULL; /* journal queue */ diff --git a/citadel/modules/autocompletion/serv_autocompletion.c b/citadel/modules/autocompletion/serv_autocompletion.c index 9ca03240c..02f09969c 100644 --- a/citadel/modules/autocompletion/serv_autocompletion.c +++ b/citadel/modules/autocompletion/serv_autocompletion.c @@ -39,7 +39,6 @@ #include "user_ops.h" #include "room_ops.h" #include "database.h" -#include "vcard.h" #include "serv_autocompletion.h" #include "ctdl_module.h" diff --git a/citadel/modules/vcard/serv_vcard.c b/citadel/modules/vcard/serv_vcard.c index 0e3d264f8..7cb8d6d53 100644 --- a/citadel/modules/vcard/serv_vcard.c +++ b/citadel/modules/vcard/serv_vcard.c @@ -60,7 +60,6 @@ #include "database.h" #include "msgbase.h" #include "internet_addressing.h" -#include "vcard.h" #include "serv_vcard.h" #include "ctdl_module.h" diff --git a/citadel/msgbase.c b/citadel/msgbase.c index 48f2eb727..c75cd1e26 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -48,7 +48,6 @@ #include "html.h" #include "genstamp.h" #include "internet_addressing.h" -#include "vcard.h" #include "euidindex.h" #include "journaling.h" #include "citadel_dirs.h" diff --git a/citadel/vcard.c b/citadel/vcard.c deleted file mode 100644 index 75a2c9f7c..000000000 --- a/citadel/vcard.c +++ /dev/null @@ -1,401 +0,0 @@ -/* - * $Id$ - * - * vCard implementation for Citadel - * - * Copyright (C) 1999-2005 by Art Cancro - * This code is freely redistributable under the terms of the GNU General - * Public License. All other rights reserved. - */ - - -#include -#include -#include -#include -#include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif - -#include -#include -#include -#include -#include -#include -#include "citadel.h" -#include "server.h" -#include "support.h" -#include "vcard.h" - - - - - -/** - * \brief Constructor (empty vCard) - * \return an empty vcard - */ -struct vCard *vcard_new() { - struct vCard *v; - - v = (struct vCard *) malloc(sizeof(struct vCard)); - if (v == NULL) return v; - - v->magic = CTDL_VCARD_MAGIC; - v->numprops = 0; - v->prop = NULL; - - return v; -} - -/** - * \brief Remove the "charset=" attribute from a vCard property name - * - * \param strbuf The property name string to be stripped - */ -void remove_charset_attribute(char *strbuf) -{ - int i, t; - char compare[256]; - - t = num_tokens(strbuf, ';'); - for (i=0; i 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; - - if (!strcasecmp(namebuf, "end")) { - valid = 0; - } - if ( (!strcasecmp(namebuf, "begin")) - && (!strcasecmp(valuebuf, "vcard")) - ) { - valid = 1; - } - - if ( (valid) && (strcasecmp(namebuf, "begin")) ) { - remove_charset_attribute(namebuf); - ++v->numprops; - v->prop = realloc(v->prop, - (v->numprops * sizeof(struct vCardProp)) - ); - v->prop[v->numprops-1].name = namebuf; - v->prop[v->numprops-1].value = valuebuf; - } - else { - free(namebuf); - free(valuebuf); - } - - } - - while ( (*ptr != '\n') && (!IsEmptyStr(ptr)) ) { - ++ptr; - } - if (*ptr == '\n') ++ptr; - } - - free(mycopy); - return v; -} - - -/** - * \brief 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"). - * Set "instance" to a value higher than 0 to return subsequent instances - * of the same key. - * Set "get_propname" to nonzero to fetch the property name instead of value. - * \param v vCard to get keyvalue from - * \param propname key to retrieve - * \param is_partial dunno??? - * \param instance if >0 return a later token of the value - * \param get_propname if nonzero get the real property name??? - * \return the requested value / token / propertyname - */ -char *vcard_get_prop(struct vCard *v, char *propname, - int is_partial, int instance, int get_propname) { - int i; - int found_instance = 0; - - if (v->numprops) for (i=0; i<(v->numprops); ++i) { - if ( (!strcasecmp(v->prop[i].name, propname)) - || (propname[0] == 0) - || ( (!strncasecmp(v->prop[i].name, - propname, strlen(propname))) - && (v->prop[i].name[strlen(propname)] == ';') - && (is_partial) ) ) { - if (instance == found_instance++) { - if (get_propname) { - return(v->prop[i].name); - } - else { - return(v->prop[i].value); - } - } - } - } - - return NULL; -} - - - - -/** - * \brief Destructor - * kill a vCard - * \param v the vCard to purge from memory - */ -void vcard_free(struct vCard *v) { - int i; - - if (v->magic != CTDL_VCARD_MAGIC) return; /* Self-check */ - - if (v->numprops) for (i=0; i<(v->numprops); ++i) { - free(v->prop[i].name); - free(v->prop[i].value); - } - - if (v->prop != NULL) free(v->prop); - - memset(v, 0, sizeof(struct vCard)); - free(v); -} - - - - -/** - * \brief Set a name/value pair in the card - * \param v vCard to inspect - * \param name key to set - * \param value the value to assign to key - * \param append should we append the value to an existing one? - */ -void vcard_set_prop(struct vCard *v, char *name, char *value, int append) { - int i; - - if (v->magic != CTDL_VCARD_MAGIC) return; /** Self-check */ - - /** 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); - free(v->prop[i].value); - v->prop[i].name = strdup(name); - v->prop[i].value = strdup(value); - return; - } - } - - /** Otherwise, append it */ - ++v->numprops; - v->prop = realloc(v->prop, - (v->numprops * sizeof(struct vCardProp)) ); - v->prop[v->numprops-1].name = strdup(name); - v->prop[v->numprops-1].value = strdup(value); -} - - - - -/** - * \brief Serialize a 'struct vcard' into an actual vcard. - * \param v vCard to serialize - * \return the serialized vCard - */ -char *vcard_serialize(struct vCard *v) -{ - char *ser; - int i, j; - size_t len; - int is_utf8 = 0; - - if (v->magic != CTDL_VCARD_MAGIC) return NULL; /** self check */ - - /** 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 + - strlen(v->prop[i].name) + - strlen(v->prop[i].value) + 16; - } - - ser = malloc(len); - if (ser == NULL) return NULL; - - safestrncpy(ser, "begin:vcard\r\n", len); - if (v->numprops) for (i=0; i<(v->numprops); ++i) { - if ( (strcasecmp(v->prop[i].name, "end")) && (v->prop[i].value != NULL) ) { - is_utf8 = 0; - for (j=0; !IsEmptyStr(&v->prop[i].value[j]); ++j) { - if ( (v->prop[i].value[j] < 32) || (v->prop[i].value[j] > 126) ) { - is_utf8 = 1; - } - } - strcat(ser, v->prop[i].name); - if (is_utf8) { - strcat(ser, ";charset=UTF-8"); - } - strcat(ser, ":"); - strcat(ser, v->prop[i].value); - strcat(ser, "\r\n"); - } - } - strcat(ser, "end:vcard\r\n"); - - return ser; -} - - - -/* - * \brief Convert FN (Friendly Name) into N (Name) - * - * \param vname Supplied friendly-name - * \param n Target buffer to store Name - * \param vname_size Size of buffer - */ -void vcard_fn_to_n(char *vname, char *n, size_t vname_size) { - char lastname[256]; - char firstname[256]; - char middlename[256]; - char honorific_prefixes[256]; - char honorific_suffixes[256]; - char buf[256]; - - safestrncpy(buf, n, sizeof buf); - - /* Try to intelligently convert the screen name to a - * fully expanded vCard name based on the number of - * words in the name - */ - safestrncpy(lastname, "", sizeof lastname); - safestrncpy(firstname, "", sizeof firstname); - safestrncpy(middlename, "", sizeof middlename); - safestrncpy(honorific_prefixes, "", sizeof honorific_prefixes); - safestrncpy(honorific_suffixes, "", sizeof honorific_suffixes); - - /* Honorific suffixes */ - if (num_tokens(buf, ',') > 1) { - extract_token(honorific_suffixes, buf, (num_tokens(buf, ' ') - 1), ',', - sizeof honorific_suffixes); - remove_token(buf, (num_tokens(buf, ',') - 1), ','); - } - - /* Find a last name */ - extract_token(lastname, buf, (num_tokens(buf, ' ') - 1), ' ', sizeof lastname); - remove_token(buf, (num_tokens(buf, ' ') - 1), ' '); - - /* Find honorific prefixes */ - if (num_tokens(buf, ' ') > 2) { - extract_token(honorific_prefixes, buf, 0, ' ', sizeof honorific_prefixes); - remove_token(buf, 0, ' '); - } - - /* Find a middle name */ - if (num_tokens(buf, ' ') > 1) { - extract_token(middlename, buf, (num_tokens(buf, ' ') - 1), ' ', sizeof middlename); - remove_token(buf, (num_tokens(buf, ' ') - 1), ' '); - } - - /* Anything left is probably the first name */ - safestrncpy(firstname, buf, sizeof firstname); - striplt(firstname); - - /* Compose the structured name */ - snprintf(vname, vname_size, "%s;%s;%s;%s;%s", lastname, firstname, middlename, - honorific_prefixes, honorific_suffixes); -} - - - - diff --git a/citadel/vcard.h b/citadel/vcard.h deleted file mode 100644 index 077c34345..000000000 --- a/citadel/vcard.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * $Id$ - * - * vCard implementation for Citadel - * - * Copyright (C) 1999 by Art Cancro - * This code is freely redistributable under the terms of the GNU General - * Public License. All other rights reserved. - */ - - -#define CTDL_VCARD_MAGIC 0xa1f9 - -/* - * This data structure represents a vCard object currently in memory. - */ -struct vCard { - int magic; - int numprops; - struct vCardProp { - char *name; - char *value; - } *prop; -}; - - -struct vCard *vcard_new(void); -void vcard_add_prop(struct vCard *v, char *propname, char *propvalue); -struct vCard *vcard_load(char *); -void vcard_free(struct vCard *); -void vcard_set_prop(struct vCard *v, char *name, char *value, int append); -char *vcard_get_prop(struct vCard *v, char *propname, int is_partial, - int instance, int return_propname); -char *vcard_serialize(struct vCard *); -void vcard_fn_to_n(char *vname, char *n, size_t vname_size); diff --git a/libcitadel/Makefile.in b/libcitadel/Makefile.in index a95cf2128..212436bb8 100755 --- a/libcitadel/Makefile.in +++ b/libcitadel/Makefile.in @@ -83,13 +83,14 @@ LINK_LIB = $(LIBTOOL) $(LTFLAGS) --mode=link $(COMPILE) -no-undefined $(VSNFLAG) LINK_EXE = $(LIBTOOL) $(LTFLAGS) --mode=link $(COMPILE) $(LDFLAGS) -o $@ LINK_CXX_EXE = $(LIBTOOL) $(LTFLAGS) --mode=link $(CXXCOMPILE) $(LDFLAGS) -o $@ -LIB_OBJS = lib/libcitadel.lo lib/mime_parser.lo lib/tools.lo +LIB_OBJS = lib/libcitadel.lo lib/mime_parser.lo lib/tools.lo lib/vcard.lo $(LIBRARY): $(LIB_OBJS) $(LINK_LIB) $(LIB_OBJS) lib/libcitadel.lo: lib/libcitadel.c lib/libcitadel.h lib/mime_parser.lo: lib/mime_parser.c lib/libcitadel.h lib/tools.lo: lib/tools.c lib/libcitadel.h +lib/vcard.lo: lib/vcard.c lib/libcitadel.h .SUFFIXES: .c .cpp .lo .o diff --git a/libcitadel/lib/libcitadel.h b/libcitadel/lib/libcitadel.h index 99a3a27fb..62d3a4f29 100644 --- a/libcitadel/lib/libcitadel.h +++ b/libcitadel/lib/libcitadel.h @@ -189,3 +189,30 @@ int is_msg_in_mset(char *mset, long msgnum); int pattern2(char *search, char *patn); void stripltlen(char *, int *); + + +/* vCard stuff */ + +#define CTDL_VCARD_MAGIC 0xa1f9 + +/* This data structure represents a vCard object currently in memory. */ +struct vCard { + int magic; + int numprops; + struct vCardProp { + char *name; + char *value; + } *prop; +}; + + +struct vCard *vcard_new(void); +void vcard_add_prop(struct vCard *v, char *propname, char *propvalue); +struct vCard *vcard_load(char *); +void vcard_free(struct vCard *); +void vcard_set_prop(struct vCard *v, char *name, char *value, int append); +char *vcard_get_prop(struct vCard *v, char *propname, int is_partial, + int instance, int return_propname); +char *vcard_serialize(struct vCard *); +void vcard_fn_to_n(char *vname, char *n, size_t vname_size); +void remove_charset_attribute(char *strbuf); diff --git a/libcitadel/lib/vcard.c b/libcitadel/lib/vcard.c new file mode 100644 index 000000000..f0afd4706 --- /dev/null +++ b/libcitadel/lib/vcard.c @@ -0,0 +1,389 @@ +/* + * $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. + */ + + +#include +#include +#include +#include +#include + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#include +#include +#include +#include +#include +#include + + +/** + * Constructor (empty vCard) + * Returns an empty vcard + */ +struct vCard *vcard_new() { + struct vCard *v; + + v = (struct vCard *) malloc(sizeof(struct vCard)); + if (v == NULL) return v; + + v->magic = CTDL_VCARD_MAGIC; + v->numprops = 0; + v->prop = NULL; + + return v; +} + +/** + * Remove the "charset=" attribute from a vCard property name + * + */ +void remove_charset_attribute(char *strbuf) +{ + int i, t; + char compare[256]; + + t = num_tokens(strbuf, ';'); + for (i=0; i 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; + + if (!strcasecmp(namebuf, "end")) { + valid = 0; + } + if ( (!strcasecmp(namebuf, "begin")) + && (!strcasecmp(valuebuf, "vcard")) + ) { + valid = 1; + } + + if ( (valid) && (strcasecmp(namebuf, "begin")) ) { + remove_charset_attribute(namebuf); + ++v->numprops; + v->prop = realloc(v->prop, + (v->numprops * sizeof(struct vCardProp)) + ); + v->prop[v->numprops-1].name = namebuf; + v->prop[v->numprops-1].value = valuebuf; + } + else { + free(namebuf); + free(valuebuf); + } + + } + + while ( (*ptr != '\n') && (!IsEmptyStr(ptr)) ) { + ++ptr; + } + if (*ptr == '\n') ++ptr; + } + + free(mycopy); + return v; +} + + +/** + * 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"). + * Set "instance" to a value higher than 0 to return subsequent instances + * of the same key. + * + * Set "get_propname" to nonzero to fetch the property name instead of value. + * v vCard to get keyvalue from + * propname key to retrieve + * is_partial + * instance if nonzero return a later token of the value + * get_propname if nonzero get the real property name??? + * + * returns the requested value / token / propertyname + */ +char *vcard_get_prop(struct vCard *v, char *propname, + int is_partial, int instance, int get_propname) { + int i; + int found_instance = 0; + + if (v->numprops) for (i=0; i<(v->numprops); ++i) { + if ( (!strcasecmp(v->prop[i].name, propname)) + || (propname[0] == 0) + || ( (!strncasecmp(v->prop[i].name, + propname, strlen(propname))) + && (v->prop[i].name[strlen(propname)] == ';') + && (is_partial) ) ) { + if (instance == found_instance++) { + if (get_propname) { + return(v->prop[i].name); + } + else { + return(v->prop[i].value); + } + } + } + } + + return NULL; +} + + + + +/* + * Destructor + */ +void vcard_free(struct vCard *v) { + int i; + + if (v->magic != CTDL_VCARD_MAGIC) return; /* Self-check */ + + if (v->numprops) for (i=0; i<(v->numprops); ++i) { + free(v->prop[i].name); + free(v->prop[i].value); + } + + if (v->prop != NULL) free(v->prop); + + memset(v, 0, sizeof(struct vCard)); + free(v); +} + + + + +/* + * Set a name/value pair in the card + * v vCard to manipulate + * name key to set + * value the value to assign to key + * append if nonzero, append rather than replace if this key already exists. + */ +void vcard_set_prop(struct vCard *v, char *name, char *value, int append) { + int i; + + if (v->magic != CTDL_VCARD_MAGIC) return; /* Self-check */ + + /** 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); + free(v->prop[i].value); + v->prop[i].name = strdup(name); + v->prop[i].value = strdup(value); + return; + } + } + + /* Otherwise, append it */ + ++v->numprops; + v->prop = realloc(v->prop, + (v->numprops * sizeof(struct vCardProp)) ); + v->prop[v->numprops-1].name = strdup(name); + v->prop[v->numprops-1].value = strdup(value); +} + + + + +/* + * Serialize a 'struct vcard' into an actual vcard. + */ +char *vcard_serialize(struct vCard *v) +{ + char *ser; + int i, j; + size_t len; + int is_utf8 = 0; + + if (v->magic != CTDL_VCARD_MAGIC) return NULL; /* self check */ + + /** 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 + + strlen(v->prop[i].name) + + strlen(v->prop[i].value) + 16; + } + + ser = malloc(len); + if (ser == NULL) return NULL; + + safestrncpy(ser, "begin:vcard\r\n", len); + if (v->numprops) for (i=0; i<(v->numprops); ++i) { + if ( (strcasecmp(v->prop[i].name, "end")) && (v->prop[i].value != NULL) ) { + is_utf8 = 0; + for (j=0; !IsEmptyStr(&v->prop[i].value[j]); ++j) { + if ( (v->prop[i].value[j] < 32) || (v->prop[i].value[j] > 126) ) { + is_utf8 = 1; + } + } + strcat(ser, v->prop[i].name); + if (is_utf8) { + strcat(ser, ";charset=UTF-8"); + } + strcat(ser, ":"); + strcat(ser, v->prop[i].value); + strcat(ser, "\r\n"); + } + } + strcat(ser, "end:vcard\r\n"); + + return ser; +} + + + +/* + * Convert FN (Friendly Name) into N (Name) + * + * vname Supplied friendly-name + * n Target buffer to store Name + * vname_size Size of buffer + */ +void vcard_fn_to_n(char *vname, char *n, size_t vname_size) { + char lastname[256]; + char firstname[256]; + char middlename[256]; + char honorific_prefixes[256]; + char honorific_suffixes[256]; + char buf[256]; + + safestrncpy(buf, n, sizeof buf); + + /* Try to intelligently convert the screen name to a + * fully expanded vCard name based on the number of + * words in the name + */ + safestrncpy(lastname, "", sizeof lastname); + safestrncpy(firstname, "", sizeof firstname); + safestrncpy(middlename, "", sizeof middlename); + safestrncpy(honorific_prefixes, "", sizeof honorific_prefixes); + safestrncpy(honorific_suffixes, "", sizeof honorific_suffixes); + + /* Honorific suffixes */ + if (num_tokens(buf, ',') > 1) { + extract_token(honorific_suffixes, buf, (num_tokens(buf, ' ') - 1), ',', + sizeof honorific_suffixes); + remove_token(buf, (num_tokens(buf, ',') - 1), ','); + } + + /* Find a last name */ + extract_token(lastname, buf, (num_tokens(buf, ' ') - 1), ' ', sizeof lastname); + remove_token(buf, (num_tokens(buf, ' ') - 1), ' '); + + /* Find honorific prefixes */ + if (num_tokens(buf, ' ') > 2) { + extract_token(honorific_prefixes, buf, 0, ' ', sizeof honorific_prefixes); + remove_token(buf, 0, ' '); + } + + /* Find a middle name */ + if (num_tokens(buf, ' ') > 1) { + extract_token(middlename, buf, (num_tokens(buf, ' ') - 1), ' ', sizeof middlename); + remove_token(buf, (num_tokens(buf, ' ') - 1), ' '); + } + + /* Anything left is probably the first name */ + safestrncpy(firstname, buf, sizeof firstname); + striplt(firstname); + + /* Compose the structured name */ + snprintf(vname, vname_size, "%s;%s;%s;%s;%s", lastname, firstname, middlename, + honorific_prefixes, honorific_suffixes); +} + + + + diff --git a/webcit/Makefile.in b/webcit/Makefile.in index 2c024f9d6..8af3349ee 100644 --- a/webcit/Makefile.in +++ b/webcit/Makefile.in @@ -44,7 +44,7 @@ webserver: webserver.o context_loop.o ical_dezonify.o \ cookie_conversion.o locate_host.o floors.o summary.o \ webcit.o auth.o tcp_sockets.o mainmenu.o serv_func.o who.o \ roomops.o messages.o userlist.o paging.o sysmsgs.o useredit.o \ - vcard.o vcard_edit.o preferences.o html2html.o listsub.o \ + vcard_edit.o preferences.o html2html.o listsub.o \ graphics.o netconf.o siteconfig.o subst.o rss.o \ calendar.o calendar_tools.o calendar_view.o event.o smtpqueue.o \ availability.o iconbar.o crypto.o inetconf.o notes.o wiki.o \ @@ -56,7 +56,7 @@ webserver: webserver.o context_loop.o ical_dezonify.o \ $(CC) webserver.o context_loop.o cookie_conversion.o \ webcit.o auth.o tcp_sockets.o mainmenu.o serv_func.o who.o listsub.o \ roomops.o messages.o userlist.o paging.o sysmsgs.o useredit.o \ - locate_host.o siteconfig.o subst.o vcard.o vcard_edit.o floors.o \ + locate_host.o siteconfig.o subst.o vcard_edit.o floors.o \ graphics.o netconf.o preferences.o html2html.o rss.o \ summary.o calendar.o calendar_tools.o calendar_view.o event.o wiki.o \ availability.o ical_dezonify.o iconbar.o crypto.o inetconf.o notes.o \ diff --git a/webcit/html2html.c b/webcit/html2html.c index f96c23908..893acf2a9 100644 --- a/webcit/html2html.c +++ b/webcit/html2html.c @@ -8,7 +8,6 @@ */ /*@{*/ #include "webcit.h" -#include "vcard.h" #include "webserver.h" diff --git a/webcit/messages.c b/webcit/messages.c index 935e9a367..ed90acba3 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -8,7 +8,6 @@ */ /*@{*/ #include "webcit.h" -#include "vcard.h" #include "webserver.h" #include "groupdav.h" diff --git a/webcit/vcard.c b/webcit/vcard.c deleted file mode 100644 index 50675cc53..000000000 --- a/webcit/vcard.c +++ /dev/null @@ -1,384 +0,0 @@ -/* - * $Id$ - * Copyright (C) 1999-2006 by Art Cancro - * This code is freely redistributable under the terms of the GNU General - * Public License. All other rights reserved. - */ -/** - * \defgroup VCardMain vCard data type implementation for the Citadel system. - * \ingroup VCards - */ -/*@{*/ -#include "webcit.h" -#include "webserver.h" -#include "vcard.h" - -/** - * \brief Constructor (empty vCard) - * \return an empty vcard - */ -struct vCard *vcard_new() { - struct vCard *v; - - v = (struct vCard *) malloc(sizeof(struct vCard)); - if (v == NULL) return v; - - v->magic = CTDL_VCARD_MAGIC; - v->numprops = 0; - v->prop = NULL; - - return v; -} - -/** - * \brief Remove the "charset=" attribute from a vCard property name - * - * \param strbuf The property name string to be stripped - */ -void remove_charset_attribute(char *strbuf) -{ - int i, t; - char compare[256]; - - t = num_tokens(strbuf, ';'); - for (i=0; i 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; - - if (!strcasecmp(namebuf, "end")) { - valid = 0; - } - if ( (!strcasecmp(namebuf, "begin")) - && (!strcasecmp(valuebuf, "vcard")) - ) { - valid = 1; - } - - if ( (valid) && (strcasecmp(namebuf, "begin")) ) { - remove_charset_attribute(namebuf); - ++v->numprops; - v->prop = realloc(v->prop, - (v->numprops * sizeof(struct vCardProp)) - ); - v->prop[v->numprops-1].name = namebuf; - v->prop[v->numprops-1].value = valuebuf; - } - else { - free(namebuf); - free(valuebuf); - } - - } - - while ( (*ptr != '\n') && (*ptr != '\0') ) { - ++ptr; - } - if (*ptr == '\n') ++ptr; - } - - free(mycopy); - return v; -} - - -/** - * \brief 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"). - * Set "instance" to a value higher than 0 to return subsequent instances - * of the same key. - * Set "get_propname" to nonzero to fetch the property name instead of value. - * \param v vCard to get keyvalue from - * \param propname key to retrieve - * \param is_partial dunno??? - * \param instance if >0 return a later token of the value - * \param get_propname if nonzero get the real property name??? - * \return the requested value / token / propertyname - */ -char *vcard_get_prop(struct vCard *v, char *propname, - int is_partial, int instance, int get_propname) { - int i; - int found_instance = 0; - int len; - - len = strlen(propname); - if (v->numprops) for (i=0; i<(v->numprops); ++i) { - if ( (!strcasecmp(v->prop[i].name, propname)) - || (propname[0] == 0) - || ( (!strncasecmp(v->prop[i].name, - propname, len)) - && (v->prop[i].name[len] == ';') - && (is_partial) ) ) { - if (instance == found_instance++) { - if (get_propname) { - return(v->prop[i].name); - } - else { - return(v->prop[i].value); - } - } - } - } - - return NULL; -} - - - - -/** - * \brief Destructor - * kill a vCard - * \param v the vCard to purge from memory - */ -void vcard_free(struct vCard *v) { - int i; - - if (v->magic != CTDL_VCARD_MAGIC) return; /* Self-check */ - - if (v->numprops) for (i=0; i<(v->numprops); ++i) { - free(v->prop[i].name); - free(v->prop[i].value); - } - - if (v->prop != NULL) free(v->prop); - - memset(v, 0, sizeof(struct vCard)); - free(v); -} - - - - -/** - * \brief Set a name/value pair in the card - * \param v vCard to inspect - * \param name key to set - * \param value the value to assign to key - * \param append should we append the value to an existing one? - */ -void vcard_set_prop(struct vCard *v, char *name, char *value, int append) { - int i; - - if (v->magic != CTDL_VCARD_MAGIC) return; /** Self-check */ - - /** 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); - free(v->prop[i].value); - v->prop[i].name = strdup(name); - v->prop[i].value = strdup(value); - return; - } - } - - /** Otherwise, append it */ - ++v->numprops; - v->prop = realloc(v->prop, - (v->numprops * sizeof(struct vCardProp)) ); - v->prop[v->numprops-1].name = strdup(name); - v->prop[v->numprops-1].value = strdup(value); -} - - - - -/** - * \brief Serialize a struct vcard into its standard format. - * \param v vCard to serialize - * \return the serialized vCard - */ -char *vcard_serialize(struct vCard *v) -{ - char *ser; - int i, j; - size_t len; - int is_utf8 = 0; - - if (v->magic != CTDL_VCARD_MAGIC) return NULL; /** self check */ - - /** 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 + - strlen(v->prop[i].name) + - strlen(v->prop[i].value) + 16; - } - - ser = malloc(len); - if (ser == NULL) return NULL; - - safestrncpy(ser, "begin:vcard\r\n", len); - if (v->numprops) for (i=0; i<(v->numprops); ++i) { - if ( (strcasecmp(v->prop[i].name, "end")) && (v->prop[i].value != NULL) ) { - is_utf8 = 0; - for (j=0; jprop[i].value); ++j) { - if ( (v->prop[i].value[j] < 32) || (v->prop[i].value[j] > 126) ) { - is_utf8 = 1; - } - } - strcat(ser, v->prop[i].name); - if (is_utf8) { - strcat(ser, ";charset=UTF-8"); - } - strcat(ser, ":"); - strcat(ser, v->prop[i].value); - strcat(ser, "\r\n"); - } - } - strcat(ser, "end:vcard\r\n"); - - return ser; -} - - - -/* - * \brief Convert FN (Friendly Name) into N (Name) - * - * \param vname Supplied friendly-name - * \param n Target buffer to store Name - * \param vname_size Size of buffer - */ -void vcard_fn_to_n(char *vname, char *n, size_t vname_size) { - char lastname[256]; - char firstname[256]; - char middlename[256]; - char honorific_prefixes[256]; - char honorific_suffixes[256]; - char buf[256]; - - safestrncpy(buf, n, sizeof buf); - - /* Try to intelligently convert the screen name to a - * fully expanded vCard name based on the number of - * words in the name - */ - safestrncpy(lastname, "", sizeof lastname); - safestrncpy(firstname, "", sizeof firstname); - safestrncpy(middlename, "", sizeof middlename); - safestrncpy(honorific_prefixes, "", sizeof honorific_prefixes); - safestrncpy(honorific_suffixes, "", sizeof honorific_suffixes); - - /* Honorific suffixes */ - if (num_tokens(buf, ',') > 1) { - extract_token(honorific_suffixes, buf, (num_tokens(buf, ' ') - 1), ',', - sizeof honorific_suffixes); - remove_token(buf, (num_tokens(buf, ',') - 1), ','); - } - - /* Find a last name */ - extract_token(lastname, buf, (num_tokens(buf, ' ') - 1), ' ', sizeof lastname); - remove_token(buf, (num_tokens(buf, ' ') - 1), ' '); - - /* Find honorific prefixes */ - if (num_tokens(buf, ' ') > 2) { - extract_token(honorific_prefixes, buf, 0, ' ', sizeof honorific_prefixes); - remove_token(buf, 0, ' '); - } - - /* Find a middle name */ - if (num_tokens(buf, ' ') > 1) { - extract_token(middlename, buf, (num_tokens(buf, ' ') - 1), ' ', sizeof middlename); - remove_token(buf, (num_tokens(buf, ' ') - 1), ' '); - } - - /* Anything left is probably the first name */ - safestrncpy(firstname, buf, sizeof firstname); - striplt(firstname); - - /* Compose the structured name */ - snprintf(vname, vname_size, "%s;%s;%s;%s;%s", lastname, firstname, middlename, - honorific_prefixes, honorific_suffixes); -} - - - - - - -/*@}*/ diff --git a/webcit/vcard.h b/webcit/vcard.h deleted file mode 100644 index 33a455905..000000000 --- a/webcit/vcard.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * $Id$ - * Copyright (C) 1999 by Art Cancro - * This code is freely redistributable under the terms of the GNU General - * Public License. All other rights reserved. - */ -/** - * \defgroup VcardHeader vCard implementation for Citadel - * \ingroup VCards - * - */ - -/*@{ */ -#define CTDL_VCARD_MAGIC 0xa1f9 /**< magic byte vcards start with??? */ - -/** - * \brief This data structure represents a vCard object currently in memory. - */ -struct vCard { - int magic; /**< the Magic Byte */ - int numprops; /**< number of properties this vcard will have */ - struct vCardProp { - char *name; /**< Keyname of the property */ - char *value; /**< value of the property */ - } *prop; /**< Vcard Property. Linked list??? */ -}; - - -struct vCard *vcard_new(void); -struct vCard *vcard_load(char *); -void vcard_free(struct vCard *); -void vcard_set_prop(struct vCard *v, char *name, char *value, int append); -char *vcard_get_prop(struct vCard *v, char *propname, int is_partial, - int instance, int return_propname); -char *vcard_serialize(struct vCard *); -void vcard_add_prop(struct vCard *v, char *propname, char *propvalue); - - -/*@}*/ diff --git a/webcit/vcard_edit.c b/webcit/vcard_edit.c index a4067e104..b527217f1 100644 --- a/webcit/vcard_edit.c +++ b/webcit/vcard_edit.c @@ -7,7 +7,6 @@ */ /*@{*/ #include "webcit.h" -#include "vcard.h" /** * \brief Edit the vCard component of a MIME message.