Added silc_argument_payload_encode_one.
authorPekka Riikonen <priikone@silcnet.org>
Mon, 25 Nov 2002 20:23:16 +0000 (20:23 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Mon, 25 Nov 2002 20:23:16 +0000 (20:23 +0000)
lib/silccore/silcargument.c
lib/silccore/silcargument.h

index 58ddbed9be2bb01c42da45073145edfe8adff7bb..c58a1c9809d2c3e35dda4a7258c8adb40e1ecb53 100644 (file)
@@ -153,6 +153,33 @@ SilcBuffer silc_argument_payload_encode(SilcUInt32 argc,
   return buffer;
 }
 
+/* Encode one argument to buffer */
+
+SilcBuffer silc_argument_payload_encode_one(SilcBuffer args,
+                                           unsigned char *arg,
+                                           SilcUInt32 arg_len,
+                                           SilcUInt32 arg_type)
+{
+  SilcBuffer buffer = args;
+  int len;
+
+  len = 3 + arg_len;
+  buffer = silc_buffer_realloc(buffer,
+                              (buffer ? buffer->truelen + len : len));
+  if (!buffer)
+    return NULL;
+  silc_buffer_pull(buffer, buffer->len);
+  silc_buffer_pull_tail(buffer, len);
+  silc_buffer_format(buffer, 
+                    SILC_STR_UI_SHORT(arg_len),
+                    SILC_STR_UI_CHAR(arg_type),
+                    SILC_STR_UI_XNSTRING(arg, arg_len),
+                    SILC_STR_END);
+  silc_buffer_push(buffer, buffer->data - buffer->head);
+
+  return buffer;
+}
+
 /* Same as above but encode the buffer from SilcArgumentPayload structure
    instead of raw data. */
 
@@ -213,6 +240,7 @@ SilcUInt32 silc_argument_get_arg_num(SilcArgumentPayload payload)
 /* Returns first argument from payload. */
 
 unsigned char *silc_argument_get_first_arg(SilcArgumentPayload payload,
+                                          SilcUInt32 *type,
                                           SilcUInt32 *ret_len)
 {
   if (!payload)
@@ -220,6 +248,8 @@ unsigned char *silc_argument_get_first_arg(SilcArgumentPayload payload,
 
   payload->pos = 0;
 
+  if (type)
+    *type = payload->argv_types[payload->pos];
   if (ret_len)
     *ret_len = payload->argv_lens[payload->pos];
 
@@ -229,6 +259,7 @@ unsigned char *silc_argument_get_first_arg(SilcArgumentPayload payload,
 /* Returns next argument from payload or NULL if no more arguments. */
 
 unsigned char *silc_argument_get_next_arg(SilcArgumentPayload payload,
+                                         SilcUInt32 *type,
                                          SilcUInt32 *ret_len)
 {
   if (!payload)
@@ -237,6 +268,8 @@ unsigned char *silc_argument_get_next_arg(SilcArgumentPayload payload,
   if (payload->pos >= payload->argc)
     return NULL;
 
+  if (type)
+    *type = payload->argv_types[payload->pos];
   if (ret_len)
     *ret_len = payload->argv_lens[payload->pos];
 
index 305b690287291a5f8fb654a3c9ae482cbeea6840..b0d8382a55b45d71d8c54d7652b9e81f02ad827e 100644 (file)
@@ -91,6 +91,28 @@ SilcBuffer silc_argument_payload_encode(SilcUInt32 argc,
                                        SilcUInt32 *argv_lens,
                                        SilcUInt32 *argv_types);
 
+/****f* silccore/SilcArgumentAPI/silc_argument_payload_encode_one
+ *
+ * SYNOPSIS
+ *
+ *    SilcBuffer silc_argument_payload_encode_one(SilcBuffer args,
+ *                                                unsigned char *arg,
+ *                                                SilcUInt32 arg_len,
+ *                                                SilcUInt32 arg_type);
+ *
+ * DESCRIPTION
+ *
+ *    Same as silc_argument_payload_encode but encodes one argument to
+ *    the buffer `args' and returns the buffer.  The returned buffer
+ *    may be different than the `args'.  If `args' is NULL for the first
+ *    argument this allocates the buffer and returns it.
+ *
+ ***/
+SilcBuffer silc_argument_payload_encode_one(SilcBuffer args,
+                                           unsigned char *arg,
+                                           SilcUInt32 arg_len,
+                                           SilcUInt32 arg_type);
+
 /****f* silccore/SilcArgumentAPI/silc_argument_payload_encode_payload
  *
  * SYNOPSIS
@@ -147,6 +169,7 @@ SilcUInt32 silc_argument_get_arg_num(SilcArgumentPayload payload);
  *
  ***/
 unsigned char *silc_argument_get_first_arg(SilcArgumentPayload payload,
+                                          SilcUInt32 *type,
                                           SilcUInt32 *ret_len);
 
 /****f* silccore/SilcArgumentAPI/silc_argument_get_next_arg
@@ -165,6 +188,7 @@ unsigned char *silc_argument_get_first_arg(SilcArgumentPayload payload,
  *
  ***/
 unsigned char *silc_argument_get_next_arg(SilcArgumentPayload payload,
+                                         SilcUInt32 *type,
                                          SilcUInt32 *ret_len);
 
 /****f* silccore/SilcArgumentAPI/silc_argument_get_arg_type