summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@codefactory.se>2003-01-07 23:08:41 +0000
committerAnders Carlsson <andersca@codefactory.se>2003-01-07 23:08:41 +0000
commit000d29a283b06517f0cfb599516a390e3afbf25c (patch)
tree256cc7e3e73cb5c71f1eaa13da25fb7971b9ce27
parent1f23ea99b37bfc8197f1c6a376f9afe08037f0f6 (diff)
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.
-rw-r--r--ChangeLog14
-rw-r--r--dbus/dbus-internals.c4
-rw-r--r--dbus/dbus-marshal.c34
-rw-r--r--dbus/dbus-marshal.h38
-rw-r--r--dbus/dbus-message.c30
-rw-r--r--dbus/dbus-message.h1
6 files changed, 100 insertions, 21 deletions
diff --git a/ChangeLog b/ChangeLog
index 7a01a8f9..339ef0ec 100644
--- 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:
diff --git a/dbus/dbus-internals.c b/dbus/dbus-internals.c
index e24eb56b..add963e9 100644
--- a/dbus/dbus-internals.c
+++ b/dbus/dbus-internals.c
@@ -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";
}
diff --git a/dbus/dbus-marshal.c b/dbus/dbus-marshal.c
index 7c85ded0..14629362 100644
--- a/dbus/dbus-marshal.c
+++ b/dbus/dbus-marshal.c
@@ -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
diff --git a/dbus/dbus-marshal.h b/dbus/dbus-marshal.h
index 1f5e27a8..4f1ba37e 100644
--- a/dbus/dbus-marshal.h
+++ b/dbus/dbus-marshal.h
@@ -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,
diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c
index 8dd77708..49269247 100644
--- a/dbus/dbus-message.c
+++ b/dbus/dbus-message.c
@@ -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);
+}
+
/** @} */
/**
diff --git a/dbus/dbus-message.h b/dbus/dbus-message.h
index 1fa54e57..10fb48a3 100644
--- a/dbus/dbus-message.h
+++ b/dbus/dbus-message.h
@@ -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);