Implemented the draft-riikonen-presence-attrs and Attribute
authorPekka Riikonen <priikone@silcnet.org>
Sun, 8 Sep 2002 15:55:01 +0000 (15:55 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 8 Sep 2002 15:55:01 +0000 (15:55 +0000)
Payload.

CHANGES
TODO
doc/draft-riikonen-presence-attrs-00.nroff
includes/silcincludes.h
lib/silccore/DIRECTORY
lib/silccore/Makefile.am
lib/silccore/silcargument.h
lib/silccore/silcattrs.c [new file with mode: 0644]
lib/silccore/silcattrs.h [new file with mode: 0644]
lib/silccore/silccommand.h
lib/silccore/silcid.h

diff --git a/CHANGES b/CHANGES
index e6e65d8f967dec39078861a74469e722e313abc1..335577e2dea111743d7e5c552d2d72adfb7708b7 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+Sun Sep  8 18:39:25 EEST 2002  Pekka Riikonen <priikone@silcnet.org>
+
+       * Implemented the draft-riikonen-precense-attrs draft and
+         the Attribute Payload into the lib/silccore/silcattrs.[ch].
+
 Sun Sep  8 13:13:44 EEST 2002  Pekka Riikonen <priikone@silcnet.org>
 
        * Distribute the SERVER_SIGNOFF notify also to local backup
 Sun Sep  8 13:13:44 EEST 2002  Pekka Riikonen <priikone@silcnet.org>
 
        * Distribute the SERVER_SIGNOFF notify also to local backup
diff --git a/TODO b/TODO
index 3e8e5a893d4022827dc676d88412869ab10535ca..09bc72497311ec945c386d811e61de8166a0a095 100644 (file)
--- a/TODO
+++ b/TODO
@@ -11,6 +11,9 @@ TODO/bugs in Irssi SILC client
 TODO/bugs In SILC Client Library
 ================================
 
 TODO/bugs In SILC Client Library
 ================================
 
+ o Add support for the <Requested Attributes> in WHOIS.  Sending and
+   reception should be added.
+
  o The PRIVATE_MESSAGE_KEY packet is not handled (it is implemented 
    though).  This should be added and perhaps new client operation
    should be added to notify application that it was received and
  o The PRIVATE_MESSAGE_KEY packet is not handled (it is implemented 
    though).  This should be added and perhaps new client operation
    should be added to notify application that it was received and
@@ -27,9 +30,8 @@ TODO/bugs In SILC Server
    when some server is connecting and connecting fails (like too many
    connections, etc).  Some weird crashes relating to this occurred.
 
    when some server is connecting and connecting fails (like too many
    connections, etc).  Some weird crashes relating to this occurred.
 
- o Implement the <Requested Attributes> and the Attribute Payload to
-   the core library, client and server.  Maybe implementations of
-   RFC 2425 and RFC 2426 to make it complete.
+ o Add support for the <Requested Attributes> in WHOIS.  Sending and
+   reception, with clients and servers should be added.
 
  o Backup router related issues:
 
 
  o Backup router related issues:
 
index 811ec637387d1d4de9e9c1a9f06746d81a94e694..90f4dfb8cdba0903f9fa4ed2fd281cb88d086778 100644 (file)
@@ -539,7 +539,7 @@ multiple same attributes in the packet.
      provided references.
 
 
      provided references.
 
 
-16   ATTRIBUTE_SERVER_DIGITAL_SIGNATURE
+15   ATTRIBUTE_SERVER_DIGITAL_SIGNATURE
 
      This attribute value includes digital signature of all Attribute
      Payloads except this attribute, but including the attribute
 
      This attribute value includes digital signature of all Attribute
      Payloads except this attribute, but including the attribute
index a098bca6a108cbedc57bdf746a6af961bcbaced6..aa53ee7423ea225264f0e0d890654c29cec91219 100644 (file)
@@ -264,6 +264,7 @@ extern "C" {
 #include "silcmode.h"
 #include "silcauth.h"
 #include "silcprivate.h"
 #include "silcmode.h"
 #include "silcauth.h"
 #include "silcprivate.h"
+#include "silcattrs.h"
 
 #ifdef SILC_SIM
 /* SILC Module library includes */
 
 #ifdef SILC_SIM
 /* SILC Module library includes */
index 5c089628e01a5b4618e9e58d272a4465da5c9899..26f0776302f3232e7b0f1bc9aee562b41dcb1552 100644 (file)
@@ -11,6 +11,7 @@
 @LINK=silcidcache.html:SILC ID Cache Interface
 @LINK=silcargument.html:SILC Argument Interface
 @LINK=silcprivate.html:SILC Private Message Interface
 @LINK=silcidcache.html:SILC ID Cache Interface
 @LINK=silcargument.html:SILC Argument Interface
 @LINK=silcprivate.html:SILC Private Message Interface
+@LINK=silcattrs.html:SILC Attributes Interface
 @LINK=silcpacket.html:Packet Protocol Interface
 -->
 
 @LINK=silcpacket.html:Packet Protocol Interface
 -->
 
index 0864b51e85ff22b1238fe2bf03f14ee57bc10c23..920b7c88354daf788349ea24801d3c6cb65b9dd5 100644 (file)
@@ -3,12 +3,11 @@
 #
 #  Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
 #
 #
 #  Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
 #
-#  Copyright (C) 2000 Pekka Riikonen
+#  Copyright (C) 2000 - 2002 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
 #
 #  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
-#  the Free Software Foundation; either version 2 of the License, or
-#  (at your option) any later version.
+#  the Free Software Foundation; version 2 of the License.
 #
 #  This program is distributed in the hope that it will be useful,
 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
 #
 #  This program is distributed in the hope that it will be useful,
 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -29,6 +28,7 @@ libsilccore_a_SOURCES = \
        silcargument.c \
        silcnotify.c \
        silcauth.c \
        silcargument.c \
        silcnotify.c \
        silcauth.c \
+       silcattrs.c \
        silcprivate.c
 
 if SILC_DIST_TOOLKIT
        silcprivate.c
 
 if SILC_DIST_TOOLKIT
@@ -43,6 +43,7 @@ include_HEADERS =     \
        silcpacket.h    \
        silcargument.h  \
        silcstatus.h    \
        silcpacket.h    \
        silcargument.h  \
        silcstatus.h    \
+       silcattrs.h     \
        silcprivate.h
 endif
 
        silcprivate.h
 endif
 
index 62c945fcd7be5507de4c03f405b0783efad1d719..bb38c75fd29a1431354262e43cce51ae2508d2c2 100644 (file)
 #ifndef SILCPAYLOAD_H
 #define SILCPAYLOAD_H
 
 #ifndef SILCPAYLOAD_H
 #define SILCPAYLOAD_H
 
+/****s* silccore/SilcArgumentAPI/SilcArgumentPayload
+ *
+ * NAME
+ * 
+ *    typedef struct SilcArgumentPayloadStruct *SilcArgumentPayload;
+ *
+ * DESCRIPTION
+ *
+ *    This context is the actual Argument Payload and is allocated
+ *    by silc_argument_payload_parse and given as argument usually to
+ *    all silc_argument_payload_* functions.  It is freed by the
+ *    silc_argument_payload_free function.
+ *
+ ***/
+typedef struct SilcArgumentPayloadStruct *SilcArgumentPayload;
+
 /****f* silccore/SilcArgumentAPI/silc_argument_payload_parse
  *
  * SYNOPSIS
 /****f* silccore/SilcArgumentAPI/silc_argument_payload_parse
  *
  * SYNOPSIS
diff --git a/lib/silccore/silcattrs.c b/lib/silccore/silcattrs.c
new file mode 100644 (file)
index 0000000..652333e
--- /dev/null
@@ -0,0 +1,408 @@
+/*
+
+  silcattrs.c 
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2002 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
+  the Free Software Foundation; version 2 of the License.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+*/
+/* Implementation of Attribute Payload routines */
+/* $Id$ */
+
+#include "silcincludes.h"
+#include "silcattrs.h"
+
+/******************************************************************************
+
+                             Attribute Payload
+
+******************************************************************************/
+
+struct SilcAttributePayloadStruct {
+  SilcAttribute attribute;
+  SilcAttributeFlags flags;
+  SilcUInt16 data_len;
+  unsigned char *data;
+};
+
+/* Parse one attribute payload */
+
+SilcAttributePayload
+silc_attribute_payload_parse(const unsigned char *payload,
+                            SilcUInt32 payload_len)
+{
+  SilcBufferStruct buffer;
+  SilcAttributePayload newp;
+  int ret;
+
+  SILC_LOG_DEBUG(("Parsing attribute payload"));
+
+  silc_buffer_set(&buffer, (unsigned char *)payload, payload_len);
+  newp = silc_calloc(1, sizeof(*newp));
+  if (!newp)
+    return NULL;
+
+  /* Parse the Attribute Payload. */
+  ret = silc_buffer_unformat(&buffer,
+                            SILC_STR_UI_CHAR(&newp->attribute),
+                            SILC_STR_UI_CHAR(&newp->flags),
+                            SILC_STR_UI16_NSTRING_ALLOC(&newp->data, 
+                                                        &newp->data_len),
+                            SILC_STR_END);
+  if (ret == -1)
+    goto err;
+
+  if (newp->data_len > buffer.len - 4) {
+    SILC_LOG_ERROR(("Incorrect attribute payload"));
+    goto err;
+  }
+
+  return newp;
+
+ err:
+  silc_attribute_payload_free(newp);
+  return NULL;
+}
+
+/* Encode one attribute payload */
+
+SilcBuffer silc_attribute_payload_encode(SilcAttribute attribute,
+                                        SilcAttributeFlags flags,
+                                        const unsigned char *data,
+                                        SilcUInt32 data_len)
+{
+  SilcBuffer buffer;
+
+  SILC_LOG_DEBUG(("Encoding Attribute Payload"));
+
+  buffer = silc_buffer_alloc_size(4 + data_len);
+  if (!buffer)
+    return NULL;
+
+  /* Encode the Attribute Payload */
+  silc_buffer_format(buffer, 
+                    SILC_STR_UI_CHAR(attribute),
+                    SILC_STR_UI_CHAR(flags),
+                    SILC_STR_UI_SHORT((SilcUInt16)data_len),
+                    SILC_STR_UI_XNSTRING(data, data_len),
+                    SILC_STR_END);
+
+  return buffer;
+}
+
+/* Parse list of payloads */
+
+SilcDList silc_attribute_payload_parse_list(const unsigned char *payload,
+                                           SilcUInt32 payload_len)
+{
+  SilcBufferStruct buffer;
+  SilcDList list;
+  SilcAttributePayload newp;
+  int len, ret;
+
+  SILC_LOG_DEBUG(("Parsing Attribute Payload list"));
+
+  silc_buffer_set(&buffer, (unsigned char *)payload, payload_len);
+  list = silc_dlist_init();
+
+  while (buffer.len) {
+    newp = silc_calloc(1, sizeof(*newp));
+    if (!newp)
+      goto err;
+    ret = silc_buffer_unformat(&buffer,
+                              SILC_STR_UI_CHAR(&newp->attribute),
+                              SILC_STR_UI_CHAR(&newp->flags),
+                              SILC_STR_UI16_NSTRING_ALLOC(&newp->data, 
+                                                          &newp->data_len),
+                              SILC_STR_END);
+    if (ret == -1)
+      goto err;
+
+    if (newp->data_len > buffer.len) {
+      SILC_LOG_ERROR(("Incorrect attribute payload in list"));
+      goto err;
+    }
+
+    len = 4 + newp->data_len;
+    if (buffer.len < len)
+      break;
+    silc_buffer_pull(&buffer, len);
+
+    silc_dlist_add(list, newp);
+  }
+  
+  return list;
+
+ err:
+  silc_attribute_payload_list_free(list);
+  return NULL;
+}
+
+/* Encode list of payloads */
+
+SilcBuffer silc_attribute_payload_encode_list(SilcUInt32 num_attrs, ...)
+{
+  SilcBuffer buffer = NULL;
+  va_list ap;
+  int i, len = 0;
+  SilcAttribute attribute;
+  SilcAttributeFlags flags;
+  unsigned char *data;
+  SilcUInt32 data_len;
+
+  if (!num_attrs)
+    return NULL;
+
+  va_start(ap, num_attrs);
+  for (i = 0; i < num_attrs; i++) {
+    attribute = va_arg(ap, SilcUInt32);
+    flags = va_arg(ap, SilcUInt32);
+    data = va_arg(ap, unsigned char *);
+    data_len = va_arg(ap, SilcUInt32);
+
+    if (data || !data_len)
+      continue;
+
+    len = 4 + data_len;
+    buffer = silc_buffer_realloc(buffer,
+                                (buffer ? buffer->truelen + len : len));
+    silc_buffer_pull_tail(buffer, (buffer->end - buffer->data));
+    silc_buffer_format(buffer, 
+                      SILC_STR_UI_CHAR(attribute),
+                      SILC_STR_UI_CHAR(flags),
+                      SILC_STR_UI_SHORT((SilcUInt16)data_len),
+                      SILC_STR_UI_XNSTRING(data, data_len),
+                      SILC_STR_END);
+    silc_buffer_pull(buffer, len);
+  }
+  va_end(ap);
+
+  if (buffer)
+    silc_buffer_push(buffer, buffer->data - buffer->head);
+
+  return buffer;
+}
+
+/* Free Attribute Payload */
+
+void silc_attribute_payload_free(SilcAttributePayload payload)
+{
+  silc_free(payload->data);
+  silc_free(payload);
+}
+
+/* Free's list of Attribute Payloads */
+
+void silc_attribute_payload_list_free(SilcDList list)
+{
+  SilcAttributePayload entry;
+
+  silc_dlist_start(list);
+  while ((entry = silc_dlist_get(list)) != SILC_LIST_END) {
+    silc_attribute_payload_free(entry);
+    silc_dlist_del(list, entry);
+  }
+
+  silc_dlist_uninit(list);
+}
+
+/* Return attribute type */
+
+SilcAttribute silc_attribute_get_attribute(SilcAttributePayload payload)
+{
+  return payload->attribute;
+}
+
+/* Return attribute flags */
+
+SilcAttributeFlags silc_attribute_get_flags(SilcAttributePayload payload)
+{
+  return payload->flags;
+}
+
+/* Return attribute data from the payload */
+
+const unsigned char *silc_attribute_get_data(SilcAttributePayload payload,
+                                            SilcUInt32 *data_len)
+{
+  if (data_len)
+    *data_len = payload->data_len;
+  return (const unsigned char *)payload->data;
+}
+
+/* Return parsed attribute object */
+
+bool silc_attribute_get_object(SilcAttributePayload payload,
+                              SilcAttribute attribute,
+                              void **object, SilcUInt32 object_size)
+{
+  SilcUInt16 len;
+  bool ret = FALSE;
+
+  if (!attribute || !object || !(*object))
+    return FALSE;
+
+  switch (attribute) {
+  case SILC_ATTRIBUTE_USER_INFO:
+    SILC_NOT_IMPLEMENTED("SILC_ATTRIBUTE_USER_INFO");
+    break;
+
+  case SILC_ATTRIBUTE_SERVICE:
+    {
+      SilcAttributeObjService *service = *object;
+      if (object_size != sizeof(*service))
+       break;
+      if (payload->data_len < 7)
+       break;
+      SILC_GET32_MSB(service->port, payload->data);
+      SILC_GET16_MSB(len, payload->data + 4);
+      if (payload->data_len < 7 + len)
+       break;
+      memcpy(service->address, payload->data + 6,
+            (len < sizeof(service->address) - 1 ? len :
+             sizeof(service->address) - 1));
+      service->status = payload->data[6 + len] ? TRUE : FALSE;
+      ret = TRUE;
+    }
+    break;
+
+  case SILC_ATTRIBUTE_STATUS_MOOD:
+  case SILC_ATTRIBUTE_PREFERRED_CONTACT:
+    {
+      SilcUInt32 *mask = *object;
+      if (object_size != sizeof(SilcUInt32))
+       break;
+      if (payload->data_len < 4)
+       break;
+      SILC_GET32_MSB(*mask, payload->data);
+      ret = TRUE;
+    }
+    break;
+
+  case SILC_ATTRIBUTE_STATUS_FREETEXT:
+  case SILC_ATTRIBUTE_PREFERRED_LANGUAGE:
+  case SILC_ATTRIBUTE_TIMEZONE:
+    {
+      char *string = *object;
+      if (payload->data_len < 2)
+       break;
+      SILC_GET16_MSB(len, payload->data);
+      if (payload->data_len < 2 + len)
+       break;
+      if (object_size < len)
+       break;
+      memcpy(string, payload->data + 2, len);
+      ret = TRUE;
+    }
+    break;
+
+  case SILC_ATTRIBUTE_STATUS_MESSAGE:
+  case SILC_ATTRIBUTE_EXTENSION:
+    {
+      SilcAttributeObjMime *mime = *object;
+      if (object_size != sizeof(*mime))
+       break;
+      mime->mime = silc_memdup(payload->data, payload->data_len);
+      mime->mime_len = payload->data_len;
+      ret = TRUE;
+    }
+    break;
+
+  case SILC_ATTRIBUTE_GEOLOCATION:
+    {
+      SilcAttributeObjGeo *geo = *object;
+      SilcBufferStruct buffer;
+      int res;
+      if (object_size != sizeof(*geo))
+       break;
+      silc_buffer_set(&buffer, (unsigned char *)payload->data,
+                     payload->data_len);
+      res = silc_buffer_unformat(&buffer,
+                                SILC_STR_UI16_STRING_ALLOC(&geo->longitude),
+                                SILC_STR_UI16_STRING_ALLOC(&geo->latitude),
+                                SILC_STR_UI16_STRING_ALLOC(&geo->altitude),
+                                SILC_STR_UI16_STRING_ALLOC(&geo->accuracy),
+                                SILC_STR_END);
+      if (res == 1)
+       break;
+      ret = TRUE;
+    }
+    break;
+
+  case SILC_ATTRIBUTE_DEVICE_INFO:
+    {
+      SilcAttributeObjDevice *dev = *object;
+      SilcBufferStruct buffer;
+      SilcUInt32 type;
+      int res;
+      if (object_size != sizeof(*dev))
+       break;
+      silc_buffer_set(&buffer, (unsigned char *)payload->data,
+                     payload->data_len);
+      res =
+       silc_buffer_unformat(&buffer,
+                            SILC_STR_UI_INT(&type),
+                            SILC_STR_UI16_STRING_ALLOC(&dev->manufacturer),
+                            SILC_STR_UI16_STRING_ALLOC(&dev->version),
+                            SILC_STR_UI16_STRING_ALLOC(&dev->model),
+                            SILC_STR_UI16_STRING_ALLOC(&dev->language),
+                            SILC_STR_END);
+      if (res == 1)
+       break;
+      dev->type = type;
+      ret = TRUE;
+    }
+    break;
+
+  case SILC_ATTRIBUTE_USER_PUBLIC_KEY:
+  case SILC_ATTRIBUTE_SERVER_PUBLIC_KEY:
+    {
+      SilcAttributeObjPk *pk = *object;
+      SilcBufferStruct buffer;
+      int res;
+      if (object_size != sizeof(*pk))
+       break;
+      silc_buffer_set(&buffer, (unsigned char *)payload->data,
+                     payload->data_len);
+      res =
+       silc_buffer_unformat(&buffer,
+                            SILC_STR_UI16_NSTRING_ALLOC(&pk->type, &len),
+                            SILC_STR_END);
+      if (res == 1)
+       break;
+      pk->data = silc_memdup(payload->data + 2 + len,
+                            payload->data_len - 2 - len);
+      pk->data_len = payload->data_len - 2 - len;
+      ret = TRUE;
+    }
+    break;
+
+  case SILC_ATTRIBUTE_USER_DIGITAL_SIGNATURE:
+  case SILC_ATTRIBUTE_SERVER_DIGITAL_SIGNATURE:
+    {
+      SilcAttributeObjPk *pk = *object;
+      if (object_size != sizeof(*pk))
+       break;
+      pk->type = NULL;
+      pk->data = silc_memdup(payload->data, payload->data_len);
+      pk->data_len = payload->data_len;
+      ret = TRUE;
+    }
+    break;
+
+  default:
+    break;
+  }
+
+  return ret;
+}
diff --git a/lib/silccore/silcattrs.h b/lib/silccore/silcattrs.h
new file mode 100644 (file)
index 0000000..3038c34
--- /dev/null
@@ -0,0 +1,458 @@
+/*
+
+  silcattrs.h 
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2002 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
+  the Free Software Foundation; version 2 of the License.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+*/
+
+/****h* silccore/SILC Attribute Interface
+ *
+ * DESCRIPTION
+ *
+ * Implementation of the Attribute Payload that may be used to send and
+ * retrieve user online precense information in the SILC network.  This
+ * implements the draft-riikonen-precense-attrs draft.
+ *
+ ***/
+
+#ifndef SILCATTRS_H
+#define SILCATTRS_H
+
+/****s* silccore/SilcAttributesAPI/SilcAttributePayload
+ *
+ * NAME
+ * 
+ *    typedef struct SilcAttributePayloadStruct *SilcAttributePayload;
+ *
+ * DESCRIPTION
+ *
+ *    This context is the actual Attribute Payload and is allocated
+ *    by silc_attribute_payload_parse and given as attribute usually to
+ *    all silc_attribute_payload_* functions.  It is freed by the
+ *    silc_attribute_payload_free function.
+ *
+ ***/
+typedef struct SilcAttributePayloadStruct *SilcAttributePayload;
+
+/****d* silccore/SilcAttributesAPI/SilcAttribute
+ *
+ * NAME
+ * 
+ *    typedef unsigned char SilcAttribute;
+ *
+ * DESCRIPTION
+ *
+ *    The SilcAttribute type definition and the attributes. The attributes
+ *    listed here are the official attributes defined in the internet
+ *    draft.  They define the contents of the attribute payload and the
+ *    type of the attribute.
+ *
+ * SOURCE
+ */
+typedef unsigned char SilcAttribute;
+
+/* All defined attributes.  See the specs for detailed information.  The
+   comment is the structure or data type that must be used with the
+   silc_attribute_get_object function to fetch parsed attribute. */
+#define SILC_ATTRIBUTE_NONE                     0
+#define SILC_ATTRIBUTE_USER_INFO                1
+#define SILC_ATTRIBUTE_SERVICE                  2 /* SilcAttributeObjService */
+#define SILC_ATTRIBUTE_STATUS_MOOD              3 /* SilcAttributeMood */
+#define SILC_ATTRIBUTE_STATUS_FREETEXT          4 /* char * (UTF-8 string) */
+#define SILC_ATTRIBUTE_STATUS_MESSAGE           5 /* SilcAttributeObjMime */
+#define SILC_ATTRIBUTE_PREFERRED_LANGUAGE       6 /* char * (UTF-8 string) */
+#define SILC_ATTRIBUTE_PREFERRED_CONTACT        7 /* SilcAttributeContact */
+#define SILC_ATTRIBUTE_TIMEZONE                 8 /* char * (UTF-8 string */
+#define SILC_ATTRIBUTE_GEOLOCATION              9 /* SilcAttributeObjGeo */
+#define SILC_ATTRIBUTE_DEVICE_INFO              10 /* SilcAttributeObjDevice */
+#define SILC_ATTRIBUTE_EXTENSION                11 /* SilcAttributeObjMime */
+#define SILC_ATTRIBUTE_USER_PUBLIC_KEY          12 /* SilcAttributeObjPk */
+#define SILC_ATTRIBUTE_SERVER_PUBLIC_KEY        13 /* SilcAttributeObjPk */
+#define SILC_ATTRIBUTE_USER_DIGITAL_SIGNATURE   14 /* SilcAttributeObjPk */
+#define SILC_ATTRIBUTE_SERVER_DIGITAL_SIGNATURE 15 /* SilcAttributeObjPk */
+/***/
+
+/****d* silccore/SilcAttributesAPI/SilcAttributeFlags
+ *
+ * NAME
+ * 
+ *    typedef unsigned char SilcAttributeFlags;
+ *
+ * DESCRIPTION
+ *
+ *    Attribute Payload flags defined by the specification.
+ *
+ * SOURCE
+ */
+typedef unsigned char SilcAttributeFlags;
+
+/* All defined flags */
+#define SILC_ATTRIBUTE_FLAG_NONE          0x00    /* No flags */
+#define SILC_ATTRIBUTE_FLAG_INVALID       0x01   /* Invalid attribute */
+#define SILC_ATTRIBUTE_FLAG_VALID         0x02   /* Valid attribute */
+/***/
+
+/****d* silccore/SilcAttributesAPI/SilcAttributeMood
+ *
+ * NAME
+ * 
+ *    typedef enum { ... } SilcAttributeMood;
+ *
+ * DESCRIPTION
+ *
+ *    The user mood indicators defined by the specification.  This is
+ *    bit mask.
+ *
+ * SOURCE
+ */
+typedef enum {
+  SILC_ATTRIBUTE_MOOD_NORMAL      = 0x00000000,          /* normal mood */
+  SILC_ATTRIBUTE_MOOD_HAPPY       = 0x00000001,          /* user feel happy */
+  SILC_ATTRIBUTE_MOOD_SAD         = 0x00000002,          /* user feel sad */
+  SILC_ATTRIBUTE_MOOD_ANGRY       = 0x00000004,          /* user feel angry */
+  SILC_ATTRIBUTE_MOOD_JEALOUS     = 0x00000008,          /* user feel jealous */
+  SILC_ATTRIBUTE_MOOD_ASHAMED     = 0x00000010,          /* user feel ashamed */
+  SILC_ATTRIBUTE_MOOD_INVINCIBLE  = 0x00000020,          /* user feel invincible */
+  SILC_ATTRIBUTE_MOOD_INLOVE      = 0x00000040,          /* user feel in love */
+  SILC_ATTRIBUTE_MOOD_SLEEPY      = 0x00000080,          /* user feel sleepy */
+  SILC_ATTRIBUTE_MOOD_BORED       = 0x00000100,          /* user feel bored */
+  SILC_ATTRIBUTE_MOOD_EXCITED     = 0x00000200,          /* user feel exited */
+  SILC_ATTRIBUTE_MOOD_ANXIOUS     = 0x00000400,          /* user feel anxious */
+} SilcAttributeMood;
+/***/
+
+/****d* silccore/SilcAttributesAPI/SilcAttributeContact
+ *
+ * NAME
+ * 
+ *    typedef enum { ... } SilcAttributeContact;
+ *
+ * DESCRIPTION
+ *
+ *    The defined preferred contact methods defined by the specification.
+ *    This is bit mask.
+ *
+ * SOURCE
+ */
+typedef enum {
+  SILC_ATTRIBUTE_CONTACT_NONE    = 0x00000000,   /* no specific method */
+  SILC_ATTRIBUTE_CONTACT_EMAIL   = 0x00000001,   /* email preferred */
+  SILC_ATTRIBUTE_CONTACT_CALL    = 0x00000002,   /* phone call preferred */
+  SILC_ATTRIBUTE_CONTACT_PAGE    = 0x00000004,   /* "paging" preferred */
+  SILC_ATTRIBUTE_CONTACT_SMS     = 0x00000008,   /* SMS preferred */
+  SILC_ATTRIBUTE_CONTACT_MMS     = 0x00000010,   /* MMS preferred */
+  SILC_ATTRIBUTE_CONTACT_CHAT    = 0x00000020,   /* chatting preferred */
+} SilcAttributeContact;
+/***/
+
+/****d* silccore/SilcAttributesAPI/SilcAttributeDevice
+ *
+ * NAME
+ * 
+ *    typedef enum { ... } SilcAttributeDevice;
+ *
+ * DESCRIPTION
+ *
+ *    The defined device types defined by the specification.
+ *
+ * SOURCE
+ */
+typedef enum {
+  SILC_ATTRIBUTE_DEVICE_COMPUTER      = 0,       /* device is computer */
+  SILC_ATTRIBUTE_DEVICE_MOBILE_PHONE  = 1,       /* device is mobile phone */
+  SILC_ATTRIBUTE_DEVICE_PDA           = 2,       /* device is PDA */
+  SILC_ATTRIBUTE_DEVICE_TERMINAL      = 3,       /* device is terminal */
+} SilcAttributeDevice;
+/***/
+
+/****f* silccore/SilcAttributesAPI/silc_attribute_payload_parse
+ *
+ * SYNOPSIS
+ *
+ *    SilcAttributePayload
+ *    silc_attribute_payload_parse(const unsigned char *payload,
+ *                                 SilcUInt32 payload_len);
+ *
+ * DESCRIPTION
+ *
+ *    Parses one attribute payload sent as argument and saves it to
+ *    SilcAttributePayload context.  The new allocated context is returned.
+ ***/
+SilcAttributePayload
+silc_attribute_payload_parse(const unsigned char *payload,
+                            SilcUInt32 payload_len);
+
+/****f* silccore/SilcAttributesAPI/silc_attribute_payload_encode
+ *
+ * SYNOPSIS
+ *
+ *    SilcBuffer silc_attribute_payload_encode(SilcAttribute attribute,
+ *                                             SilcAttributeFlags flags,
+ *                                             const unsigned char *data,
+ *                                             SilcUInt32 data_len);
+ *
+ * DESCRIPTION
+ *
+ *    Encodes one attribute payload and returns allocated buffer.  The
+ *    `attributes' is the attribute type with `flags' and the actual
+ *    attribute data indicated by `data' and `data_len'.
+ *
+ ***/
+SilcBuffer silc_attribute_payload_encode(SilcAttribute attribute,
+                                        SilcAttributeFlags flags,
+                                        const unsigned char *data,
+                                        SilcUInt32 data_len);
+
+/****f* silccore/SilcAttributesAPI/silc_attribute_payload_parse_list
+ *
+ * SYNOPSIS
+ *
+ *    SilcDList
+ *    silc_attribute_payload_parse_list(const unsigned char *payload,
+ *                                      SilcUInt32 payload_len);
+ *
+ * DESCRIPTION
+ *
+ *    Parses list of Attribute payloads returning list of payloads. This
+ *    is equivalent to the silc_attribute_payload_parse except that the
+ *    `buffer' now includes multiple Attribute Payloads one after the other.
+ *    You can produce such a list with silc_attribute_payload_encode_list
+ *    function.
+ *
+ ***/
+SilcDList silc_attribute_payload_parse_list(const unsigned char *payload,
+                                           SilcUInt32 payload_len);
+
+/****f* silccore/SilcAttributesAPI/silc_attribute_payload_encode_list
+ *
+ * SYNOPSIS
+ *
+ *    SilcBuffer silc_attribute_payload_encode(SilcUInt32 num_attrs, ...);
+ *
+ * DESCRIPTION
+ *
+ *    Encodes a list of Attribute payloads.  The `num_attrs' indicates the
+ *    number of attributes sent as argument.  The variable argument list
+ *    sent as argument includes the attribute, attribute flags, attribute
+ *    data and attribute data length.  One attribute is one of these
+ *    { attribute, attribute flags, data and data length } arguments.
+ *    Returns the attribute payloads in data buffer one after the other.
+ *    You can parse such list with silc_attribute_payload_parse_list
+ *    function.
+ *
+ ***/
+SilcBuffer silc_attribute_payload_encode_list(SilcUInt32 num_attrs, ...);
+
+/****f* silccore/SilcAttributesAPI/silc_attribute_payload_free
+ *
+ * SYNOPSIS
+ *
+ *    void silc_attribute_payload_free(SilcAttributePayload payload);
+ *
+ * DESCRIPTION
+ *
+ *    Frees the Attribute Payload and all data in it.
+ *
+ ***/
+void silc_attribute_payload_free(SilcAttributePayload payload);
+
+/****f* silccore/SilcAttributesAPI/silc_attribute_payload_list_free
+ *
+ * SYNOPSIS
+ *
+ *    void silc_attribute_payload_list_free(SilcDList list);
+ *
+ * DESCRIPTION
+ *
+ *    Frees list of Attribute Payloads and all data in them.
+ *
+ ***/
+void silc_attribute_payload_list_free(SilcDList list);
+
+/****f* silccore/SilcAttributesAPI/silc_attribute_get_attribute
+ *
+ * SYNOPSIS
+ *
+ *    SilcAttribute silc_attribute_get_attribute(SilcAttributePayload payload);
+ *
+ * DESCRIPTION
+ *
+ *    Return the attribute type from the payload indicated by `payload'.
+ *
+ ***/
+SilcAttribute silc_attribute_get_attribute(SilcAttributePayload payload);
+
+/****f* silccore/SilcAttributesAPI/silc_attribute_get_flags
+ *
+ * SYNOPSIS
+ *
+ *    SilcAttributeFlags
+ *    silc_attribute_get_flags(SilcAttributePayload payload);
+ *
+ * DESCRIPTION
+ *
+ *    Return the attribute flags from the payload indicated by `payload'.
+ *
+ ***/
+SilcAttributeFlags silc_attribute_get_flags(SilcAttributePayload payload);
+
+/****f* silccore/SilcAttributesAPI/silc_attribute_get_data
+ *
+ * SYNOPSIS
+ *
+ *    const unsigned char *
+ *    silc_attribute_get_data(SilcAttributePayload payload,
+ *                            SilcUInt32 *data_len);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the attribute data from the payload indicated by the `payload'
+ *    The caller must not free the returned data pointer.
+ *
+ ***/
+const unsigned char *silc_attribute_get_data(SilcAttributePayload payload,
+                                            SilcUInt32 *data_len);
+
+/* Object structures */
+
+/****s* silccore/SilcAttributesAPI/SilcAttributesObjService
+ *
+ * NAME
+ * 
+ *    typedef struct { ... } SilcAttributesObjService;
+ *
+ * DESCRIPTION
+ *
+ *    SILC_ATTRIBUTE_SERVICE type object structure.
+ *
+ * SOURCE
+ */
+typedef struct {
+  SilcUInt32 port;             /* IANA specified service port */
+  char address[256];           /* service address */
+  bool status;                 /* online status (TRUE present in service) */
+} SilcAttributeObjService;
+/***/
+
+/****s* silccore/SilcAttributesAPI/SilcAttributesObjMime
+ *
+ * NAME
+ * 
+ *    typedef struct { ... } SilcAttributesObjMime;
+ *
+ * DESCRIPTION
+ *
+ *    Data type for MIME object as attribute.  Caller must free the
+ *    MIME data buffer inside the structure.
+ *
+ * SOURCE
+ */
+typedef struct {
+  unsigned char *mime;         /* allocated MIME buffer */
+  SilcUInt32 mime_len;         /* length of the allocated MIME buffer */
+} SilcAttributeObjMime;
+/***/
+
+/****s* silccore/SilcAttributesAPI/SilcAttributesObjGeo
+ *
+ * NAME
+ * 
+ *    typedef struct { ... } SilcAttributesObjGeo;
+ *
+ * DESCRIPTION
+ *
+ *    SILC_ATTRIBUTE_GEOLOCATION type object.  The caller must free the
+ *    strings inside the structure.
+ *
+ * SOURCE
+ */
+typedef struct {
+  char *longitude;             /* Longitude */
+  char *latitude;              /* Latitude */
+  char *altitude;              /* Altitude */
+  char *accuracy;              /* Accuracy in meters */
+} SilcAttributeObjGeo;
+/***/
+
+/****s* silccore/SilcAttributesAPI/SilcAttributesObjDevice
+ *
+ * NAME
+ * 
+ *    typedef struct { ... } SilcAttributesObjDevice;
+ *
+ * DESCRIPTION
+ *
+ *    SILC_ATTRIBUTE_DEVICE_INFO type object.  The caller must free the
+ *    strings inside the structure.
+ *
+ * SOURCE
+ */
+typedef struct {
+  SilcAttributeDevice type;    /* device type */
+  char *manufacturer;          /* manufacturer of the device */
+  char *version;               /* device version string */
+  char *model;                 /* device model string */
+  char *language;              /* device language (ISO 639-2/T) */
+} SilcAttributeObjDevice;
+/***/
+
+/****s* silccore/SilcAttributesAPI/SilcAttributesObjPk
+ *
+ * NAME
+ * 
+ *    typedef struct { ... } SilcAttributesObjPk;
+ *
+ * DESCRIPTION
+ *
+ *    Data type for public key, certificate or digital signatures.  The
+ *    caller must free the data inside the structure.
+ *
+ * SOURCE
+ */
+typedef struct {
+  char *type;                  /* public key/certificate type, NULL
+                                  when contains digital signature. */
+  unsigned char *data;         /* public key/cert/signature data. The
+                                  encoding depends of the `type'. */
+  SilcUInt32 data_len;         /* data length */
+} SilcAttributeObjPk;
+/***/
+
+/****f* silccore/SilcAttributesAPI/silc_attribute_get_object
+ *
+ * SYNOPSIS
+ *
+ *    bool silc_attribute_get_object(SilcAttributePayload payload,
+ *                                   SilcAttribute attribute,
+ *                                   const void **object,
+ *                                   SilcUInt32 object_size);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the already parsed attribute object by the attribute type
+ *    indicated by `attribute'.  Copies the data into the `object' which
+ *    must be sent as argument (and must be of correct type and size).
+ *    The `object_size' indicates the size of the `*object' sent.
+ *    Returns TRUE if the `attribute' attribute was found and FALSE
+ *    if such attribute is not present in the `payload', or the `object_size'
+ *    is not sufficient.  See the definition of SilcAttribute for the
+ *    list attributes and the required object types for attributes.
+ *
+ ***/
+bool silc_attribute_get_object(SilcAttributePayload payload,
+                              SilcAttribute attribute,
+                              void **object, SilcUInt32 object_size);
+
+#endif /* SILCATTRS_H */
index 3fbda03a977df1dfa22a862d308599749b938ca3..b864a4261c20ab6f20617e7eb37006a77f67d0ff 100644 (file)
@@ -154,7 +154,6 @@ typedef unsigned char SilcCommand;
 
 /* Private range start */
 #define SILC_COMMAND_PRIVATE            200
 
 /* Private range start */
 #define SILC_COMMAND_PRIVATE            200
-
 #define SILC_COMMAND_PRIV_CONNECT       200
 #define SILC_COMMAND_PRIV_CLOSE         201
 #define SILC_COMMAND_PRIV_SHUTDOWN      202
 #define SILC_COMMAND_PRIV_CONNECT       200
 #define SILC_COMMAND_PRIV_CLOSE         201
 #define SILC_COMMAND_PRIV_SHUTDOWN      202
index 855d54704691aa06c0162b95ab721fd28d505cac..4a042d16f71de5a3ea8355c84c6374ab0c5d5b68 100644 (file)
@@ -85,22 +85,6 @@ typedef SilcUInt16 SilcIdType;
  ***/
 typedef struct SilcIDPayloadStruct *SilcIDPayload;
 
  ***/
 typedef struct SilcIDPayloadStruct *SilcIDPayload;
 
-/****s* silccore/SilcIDAPI/SilcArgumentPayload
- *
- * NAME
- * 
- *    typedef struct SilcArgumentPayloadStruct *SilcArgumentPayload;
- *
- * DESCRIPTION
- *
- *    This context is the actual Argument Payload and is allocated
- *    by silc_argument_payload_parse and given as argument usually to
- *    all silc_argument_payload_* functions.  It is freed by the
- *    silc_argument_payload_free function.
- *
- ***/
-typedef struct SilcArgumentPayloadStruct *SilcArgumentPayload;
-
 /* Prototypes */
 
 /****f* silccore/SilcIDAPI/silc_id_payload_parse
 /* Prototypes */
 
 /****f* silccore/SilcIDAPI/silc_id_payload_parse