2003-01-08 Anders Carlsson <andersca@codefactory.se>
authorAnders Carlsson <andersca@codefactory.se>
Tue, 7 Jan 2003 23:08:41 +0000 (23:08 +0000)
committerAnders Carlsson <andersca@codefactory.se>
Tue, 7 Jan 2003 23:08:41 +0000 (23:08 +0000)
* dbus/dbus-internals.c: (_dbus_type_to_string):
New function that returns a string describing a type.

* dbus/dbus-marshal.c: (_dbus_demarshal_byte_array):
* dbus/dbus-marshal.h:
* dbus/dbus-message.c: (dbus_message_get_fields_valist),
(dbus_message_iter_get_field_type), (dbus_message_iter_get_double),
(dbus_message_iter_get_byte_array):
* dbus/dbus-message.h:
Add new convenience functions for appending and getting message fields.
Also add demarshalling routines for byte arrays.

ChangeLog
dbus/dbus-internals.c
dbus/dbus-marshal.c
dbus/dbus-marshal.h
dbus/dbus-message.c
dbus/dbus-message.h

index 7a01a8f..339ef0e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2003-01-08  Anders Carlsson  <andersca@codefactory.se>
+
+       * dbus/dbus-internals.c: (_dbus_type_to_string):
+       New function that returns a string describing a type.
+       
+       * dbus/dbus-marshal.c: (_dbus_demarshal_byte_array):
+       * dbus/dbus-marshal.h:
+       * dbus/dbus-message.c: (dbus_message_get_fields_valist),
+       (dbus_message_iter_get_field_type), (dbus_message_iter_get_double),
+       (dbus_message_iter_get_byte_array):
+       * dbus/dbus-message.h:
+       Add new convenience functions for appending and getting message fields.
+       Also add demarshalling routines for byte arrays.
+
 2003-01-07  Anders Carlsson  <andersca@codefactory.se>
 
        * dbus/dbus-connection-internal.h:
index e24eb56..add963e 100644 (file)
@@ -349,6 +349,8 @@ _dbus_type_to_string (int type)
 {
   switch (type)
     {
+    case DBUS_TYPE_INVALID:
+      return "invalid";
     case DBUS_TYPE_INT32:
       return "int32";
     case DBUS_TYPE_UINT32:
@@ -357,6 +359,8 @@ _dbus_type_to_string (int type)
       return "double";
     case DBUS_TYPE_STRING:
       return "string";
+    case DBUS_TYPE_BYTE_ARRAY:
+      return "byte array";
     default:
       return "unknown";
     }
index 7c85ded..1462936 100644 (file)
@@ -396,6 +396,40 @@ _dbus_demarshal_string (DBusString *str,
   return retval;
 }
 
+unsigned char *
+_dbus_demarshal_byte_array (DBusString *str,
+                           int         byte_order,
+                           int         pos,
+                           int        *new_pos,
+                           int        *array_len)
+{
+  int len;
+  unsigned char *retval;
+  const char *data;
+
+  len = _dbus_demarshal_uint32 (str, byte_order, pos, &pos);
+
+  retval = dbus_malloc (len);
+
+  if (!retval)
+    return NULL;
+
+  _dbus_string_get_const_data_len (str, &data, pos, len);
+
+  if (!data)
+    return NULL;
+
+  memcpy (retval, data, len);
+
+  if (new_pos)
+    *new_pos = pos + len;
+
+  if (array_len)
+    *array_len = len;
+
+  return retval;
+}
+
 /** 
  * Returns the position right after the end position 
  * end position of a field
index 1f5e27a..4f1ba37 100644 (file)
@@ -63,22 +63,28 @@ dbus_bool_t _dbus_marshal_byte_array (DBusString          *str,
                                      const unsigned char *value,
                                      int                  len);
 
-double        _dbus_demarshal_double (DBusString *str,
-                                     int         byte_order,
-                                     int         pos,
-                                     int        *new_pos);
-dbus_int32_t  _dbus_demarshal_int32  (DBusString *str,
-                                     int         byte_order,
-                                     int         pos,
-                                     int        *new_pos);
-dbus_uint32_t _dbus_demarshal_uint32 (DBusString *str,
-                                     int         byte_order,
-                                     int         pos,
-                                     int        *new_pos);
-char *        _dbus_demarshal_string (DBusString *str,
-                                     int         byte_order,
-                                     int         pos,
-                                     int        *new_pos);
+double         _dbus_demarshal_double     (DBusString *str,
+                                          int         byte_order,
+                                          int         pos,
+                                          int        *new_pos);
+dbus_int32_t   _dbus_demarshal_int32      (DBusString *str,
+                                          int         byte_order,
+                                          int         pos,
+                                          int        *new_pos);
+dbus_uint32_t  _dbus_demarshal_uint32     (DBusString *str,
+                                          int         byte_order,
+                                          int         pos,
+                                          int        *new_pos);
+char *         _dbus_demarshal_string     (DBusString *str,
+                                          int         byte_order,
+                                          int         pos,
+                                          int        *new_pos);
+unsigned char *_dbus_demarshal_byte_array (DBusString *str,
+                                          int         byte_order,
+                                          int         pos,
+                                          int        *new_pos,
+                                          int        *array_len);
+
 
 dbus_bool_t _dbus_marshal_get_field_end_pos (DBusString *str,
                                             int         byte_order,
index 8dd7770..4926924 100644 (file)
@@ -559,7 +559,7 @@ dbus_message_get_fields_valist (DBusMessage *message,
   while (spec_type != 0)
     {
       msg_type = dbus_message_iter_get_field_type (iter);      
-
+      
       if (msg_type != spec_type)
        {
          _dbus_warn ("Field %d is specified to be of type \"%s\", but "
@@ -611,15 +611,26 @@ dbus_message_get_fields_valist (DBusMessage *message,
            *ptr = dbus_message_iter_get_string (iter);
            break;
          }
-         
-       default:
+
+       case DBUS_TYPE_BYTE_ARRAY:
+         {
+           char **ptr;
+           int *len;
+
+           ptr = va_arg (var_args, char **);
+           len = va_arg (var_args, int *);
+
+           *ptr = dbus_message_iter_get_byte_array (iter, len);
+           break;
+         }
+       default:          
          _dbus_warn ("Unknown field type %d\n", spec_type);
        }
       
       spec_type = va_arg (var_args, int);
       if (spec_type != 0 && !dbus_message_iter_next (iter))
        {
-         _dbus_warn ("More fields than exists in the message were specified");
+         _dbus_warn ("More fields than exist in the message were specified\n");
 
          dbus_message_iter_unref (iter);         
          return FALSE;
@@ -745,7 +756,7 @@ int
 dbus_message_iter_get_field_type (DBusMessageIter *iter)
 {
   const char *data;
-  
+
   if (iter->pos >= _dbus_string_get_length (&iter->message->body))
     return DBUS_TYPE_INVALID;
 
@@ -823,6 +834,15 @@ dbus_message_iter_get_double (DBusMessageIter *iter)
                                 iter->pos + 1, NULL);
 }
 
+unsigned char *
+dbus_message_iter_get_byte_array (DBusMessageIter *iter, int *len)
+{
+  _dbus_assert (dbus_message_iter_get_field_type (iter) == DBUS_TYPE_BYTE_ARRAY);
+
+  return _dbus_demarshal_byte_array (&iter->message->body, iter->message->byte_order,
+                                    iter->pos + 1, NULL, len);
+}
+
 /** @} */
 
 /**
index 1fa54e5..10fb48a 100644 (file)
@@ -79,6 +79,7 @@ int         dbus_message_iter_get_int32      (DBusMessageIter *iter);
 int         dbus_message_iter_get_uint32     (DBusMessageIter *iter);
 double      dbus_message_iter_get_double     (DBusMessageIter *iter);
 char *      dbus_message_iter_get_string     (DBusMessageIter *iter);
+unsigned char *dbus_message_iter_get_byte_array (DBusMessageIter *iter, int *len);