From: Pekka Riikonen Date: Tue, 15 Oct 2002 18:32:34 +0000 (+0000) Subject: Added silc_vcard_alloc. silc_vcard_free now checks for dynamically X-Git-Tag: silc.client.0.9.6~13 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=56922abcb004a93a2ff45d47d9bd2f34b2c24e88 Added silc_vcard_alloc. silc_vcard_free now checks for dynamically allocated context. --- diff --git a/lib/silcutil/silcvcard.c b/lib/silcutil/silcvcard.c index 3a008f68..e6fdf3c5 100644 --- a/lib/silcutil/silcvcard.c +++ b/lib/silcutil/silcvcard.c @@ -25,53 +25,6 @@ #define VCARD_VERSION "VERSION:3.0\n" #define VCARD_FOOTER "END:VCARD" -/* Free all data inside the card structure */ - -static void silc_vcard_free_internal(SilcVCard vcard) -{ - int i; - - silc_free(vcard->full_name); - silc_free(vcard->family_name); - silc_free(vcard->first_name); - silc_free(vcard->middle_names); - silc_free(vcard->prefix); - silc_free(vcard->suffix); - silc_free(vcard->nickname); - silc_free(vcard->bday); - silc_free(vcard->title); - silc_free(vcard->role); - silc_free(vcard->org_name); - silc_free(vcard->org_unit); - silc_free(vcard->categories); - silc_free(vcard->class); - silc_free(vcard->url); - silc_free(vcard->label); - for (i = 0; i < vcard->num_addrs; i++) { - silc_free(vcard->addrs[i].type); - silc_free(vcard->addrs[i].pbox); - silc_free(vcard->addrs[i].ext_addr); - silc_free(vcard->addrs[i].street_addr); - silc_free(vcard->addrs[i].city); - silc_free(vcard->addrs[i].state); - silc_free(vcard->addrs[i].code); - silc_free(vcard->addrs[i].country); - } - silc_free(vcard->addrs); - for (i = 0; i < vcard->num_tels; i++) { - silc_free(vcard->tels[i].type); - silc_free(vcard->tels[i].tel); - } - silc_free(vcard->tels); - for (i = 0; i < vcard->num_emails; i++) { - silc_free(vcard->emails[i].type); - silc_free(vcard->emails[i].address); - } - silc_free(vcard->emails); - silc_free(vcard->note); - silc_free(vcard->rev); -} - /* Encode VCard */ unsigned char *silc_vcard_encode(SilcVCard vcard, SilcUInt32 *vcard_len) @@ -363,20 +316,74 @@ bool silc_vcard_decode(const unsigned char *data, SilcUInt32 data_len, } if (!has_begin || !has_end) { - silc_vcard_free_internal(vcard); + silc_vcard_free(vcard); return FALSE; } return TRUE; } +/* Allocate vcard context */ + +SilcVCard silc_vcard_alloc(void) +{ + SilcVCard vcard = silc_calloc(1, sizeof(*vcard)); + if (!vcard) + return NULL; + vcard->dynamic = TRUE; + return vcard; +} + /* Free the vcard structure */ void silc_vcard_free(SilcVCard vcard) { - silc_vcard_free_internal(vcard); - memset(vcard, 'F', sizeof(*vcard)); - silc_free(vcard); + int i; + + silc_free(vcard->full_name); + silc_free(vcard->family_name); + silc_free(vcard->first_name); + silc_free(vcard->middle_names); + silc_free(vcard->prefix); + silc_free(vcard->suffix); + silc_free(vcard->nickname); + silc_free(vcard->bday); + silc_free(vcard->title); + silc_free(vcard->role); + silc_free(vcard->org_name); + silc_free(vcard->org_unit); + silc_free(vcard->categories); + silc_free(vcard->class); + silc_free(vcard->url); + silc_free(vcard->label); + for (i = 0; i < vcard->num_addrs; i++) { + silc_free(vcard->addrs[i].type); + silc_free(vcard->addrs[i].pbox); + silc_free(vcard->addrs[i].ext_addr); + silc_free(vcard->addrs[i].street_addr); + silc_free(vcard->addrs[i].city); + silc_free(vcard->addrs[i].state); + silc_free(vcard->addrs[i].code); + silc_free(vcard->addrs[i].country); + } + silc_free(vcard->addrs); + for (i = 0; i < vcard->num_tels; i++) { + silc_free(vcard->tels[i].type); + silc_free(vcard->tels[i].tel); + } + silc_free(vcard->tels); + for (i = 0; i < vcard->num_emails; i++) { + silc_free(vcard->emails[i].type); + silc_free(vcard->emails[i].address); + } + silc_free(vcard->emails); + silc_free(vcard->note); + silc_free(vcard->rev); + + if (vcard->dynamic) { + memset(vcard, 'F', sizeof(*vcard)); + silc_free(vcard); + } } /* Print card to file stream */ diff --git a/lib/silcutil/silcvcard.h b/lib/silcutil/silcvcard.h index ec448086..cb0fb5ed 100644 --- a/lib/silcutil/silcvcard.h +++ b/lib/silcutil/silcvcard.h @@ -23,9 +23,9 @@ * * Implementation of the VCard 3.0 standard (RFC 2426) that can be used * with Requested Attributes (in WHOIS command) to deliver personal - * information. All fields are not supported since some other the + * information. All fields are not supported since some of the * information are not needed in context of SILC. If such VCard is - * received this ignores the unsupported fields. + * received this implementation ignores the unsupported fields. * ***/ @@ -96,6 +96,8 @@ typedef struct { char *note; /* a note, string */ char *rev; /* revision of card, UTC date string */ + + bool dynamic; /* TRUE when dynamically allocated */ } SilcVCardStruct, *SilcVCard; /***/ @@ -135,6 +137,20 @@ unsigned char *silc_vcard_encode(SilcVCard vcard, SilcUInt32 *vcard_len); bool silc_vcard_decode(const unsigned char *data, SilcUInt32 data_len, SilcVCard vcard); +/****f* silcutil/SilcVCard/silc_vcard_alloc + * + * SYNOPSIS + * + * SilcVCard silc_vcard_alloc(void); + * + * DESCRIPTION + * + * Allocate a SilcVCard context which must be freed with the + * silc_vcard_free function. + * + ***/ +SilcVCard silc_vcard_alloc(void); + /****f* silcutil/SilcVCard/silc_vcard_free * * SYNOPSIS