From 000d29a283b06517f0cfb599516a390e3afbf25c Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Tue, 7 Jan 2003 23:08:41 +0000 Subject: 2003-01-08 Anders Carlsson * 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 | 14 ++++++++++++++ dbus/dbus-internals.c | 4 ++++ dbus/dbus-marshal.c | 34 ++++++++++++++++++++++++++++++++++ dbus/dbus-marshal.h | 38 ++++++++++++++++++++++---------------- dbus/dbus-message.c | 30 +++++++++++++++++++++++++----- dbus/dbus-message.h | 1 + 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 + + * 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 * 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); -- cgit