Added silc_vcard_alloc. silc_vcard_free now checks for dynamically
authorPekka Riikonen <priikone@silcnet.org>
Tue, 15 Oct 2002 18:32:34 +0000 (18:32 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Tue, 15 Oct 2002 18:32:34 +0000 (18:32 +0000)
allocated context.

lib/silcutil/silcvcard.c
lib/silcutil/silcvcard.h

index 3a008f687833c3ad1b119111697d7db75ad4d322..e6fdf3c5023bd642ab29ebda3699502e0425b0fe 100644 (file)
 #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 */
index ec448086f355c8bfe3be44ec5c12c0081f597ea5..cb0fb5edbde8c280c38660ce9e4c45cb30b7e384 100644 (file)
@@ -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