Added SILC Thread Queue API
[runtime.git] / lib / silccore / silcattrs.c
index 3dd0b79b9731ceeead70e0d3f34bf804fb3e713b..d40e53ac8495ec28080755834b9951d48d5b27e5 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 2002 - 2006 Pekka Riikonen
+  Copyright (C) 2002 - 2007 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -57,6 +57,7 @@ silc_attribute_payload_encode_int(SilcAttribute attribute,
 
     case SILC_ATTRIBUTE_USER_INFO:
       {
+#ifdef SILC_DIST_VCARD
        SilcVCard vcard = object;
        if (object_size != sizeof(*vcard))
          return NULL;
@@ -64,6 +65,7 @@ silc_attribute_payload_encode_int(SilcAttribute attribute,
        if (!str)
          return NULL;
        object = str;
+#endif /* SILC_DIST_VCARD */
       }
       break;
 
@@ -129,6 +131,7 @@ silc_attribute_payload_encode_int(SilcAttribute attribute,
        str = silc_mime_encode(mime, &object_size);
        if (!str)
          return NULL;
+       object = str;
       }
       break;
 
@@ -195,6 +198,27 @@ silc_attribute_payload_encode_int(SilcAttribute attribute,
       }
       break;
 
+    case SILC_ATTRIBUTE_PHONE_NUMBER:
+      {
+       SilcAttributeObjPN *pn = object;
+       if (object_size != sizeof(*pn))
+         return NULL;
+       if (!pn->number || strlen(pn->number) < 5)
+         return NULL;
+       tmpbuf = silc_buffer_alloc(0);
+       if (!tmpbuf)
+         return NULL;
+       if (silc_buffer_format(tmpbuf,
+                              SILC_STR_UI_INT(pn->format),
+                              SILC_STR_UI_SHORT(strlen(pn->number)),
+                              SILC_STR_UI16_STRING(pn->number),
+                              SILC_STR_END) < 0)
+         return NULL;
+       object = tmpbuf->data;
+       object_size = silc_buffer_len(tmpbuf);
+      }
+      break;
+
     case SILC_ATTRIBUTE_USER_PUBLIC_KEY:
     case SILC_ATTRIBUTE_SERVER_PUBLIC_KEY:
       {
@@ -353,7 +377,8 @@ SilcBuffer silc_attribute_payload_encode_data(SilcBuffer attrs,
 
   len = 4 + (SilcUInt16)data_len;
   buffer = silc_buffer_realloc(buffer,
-                              (buffer ? silc_buffer_truelen(buffer) + len : len));
+                              (buffer ? silc_buffer_truelen(buffer) +
+                               len : len));
   if (!buffer)
     return NULL;
   silc_buffer_pull(buffer, silc_buffer_len(buffer));
@@ -468,7 +493,7 @@ unsigned char *silc_attribute_get_verify_data(SilcDList attrs,
 /* Return parsed attribute object */
 
 SilcBool silc_attribute_get_object(SilcAttributePayload payload,
-                              void *object, SilcUInt32 object_size)
+                                  void *object, SilcUInt32 object_size)
 {
   SilcUInt16 len;
   SilcBool ret = FALSE;
@@ -479,12 +504,14 @@ SilcBool silc_attribute_get_object(SilcAttributePayload payload,
   switch (payload->attribute) {
   case SILC_ATTRIBUTE_USER_INFO:
     {
+#ifdef SILC_DIST_VCARD
       SilcVCard vcard = object;
       if (object_size != sizeof(*vcard))
        break;
       if (!silc_vcard_decode(payload->data, payload->data_len, vcard))
        break;
       ret = TRUE;
+#endif /* SILC_DIST_VCARD */
     }
     break;
 
@@ -610,6 +637,28 @@ SilcBool silc_attribute_get_object(SilcAttributePayload payload,
     }
     break;
 
+  case SILC_ATTRIBUTE_PHONE_NUMBER:
+    {
+      SilcAttributeObjPN *pn = object;
+      SilcBufferStruct buffer;
+      SilcUInt32 pn_format;
+      int res;
+      if (object_size != sizeof(*pn))
+       break;
+      silc_buffer_set(&buffer, (unsigned char *)payload->data,
+                     payload->data_len);
+      res =
+       silc_buffer_unformat(&buffer,
+                            SILC_STR_UI_INT(&pn_format),
+                            SILC_STR_UI16_STRING_ALLOC(&pn->number),
+                            SILC_STR_END);
+      if (res == -1)
+       break;
+      pn->format = pn_format;
+      ret = TRUE;
+    }
+    break;
+
   case SILC_ATTRIBUTE_USER_PUBLIC_KEY:
   case SILC_ATTRIBUTE_SERVER_PUBLIC_KEY:
     {