diff options
| author | Anders Carlsson <andersca@codefactory.se> | 2003-01-07 23:08:41 +0000 | 
|---|---|---|
| committer | Anders Carlsson <andersca@codefactory.se> | 2003-01-07 23:08:41 +0000 | 
| commit | 000d29a283b06517f0cfb599516a390e3afbf25c (patch) | |
| tree | 256cc7e3e73cb5c71f1eaa13da25fb7971b9ce27 | |
| parent | 1f23ea99b37bfc8197f1c6a376f9afe08037f0f6 (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-- | ChangeLog | 14 | ||||
| -rw-r--r-- | dbus/dbus-internals.c | 4 | ||||
| -rw-r--r-- | dbus/dbus-marshal.c | 34 | ||||
| -rw-r--r-- | dbus/dbus-marshal.h | 38 | ||||
| -rw-r--r-- | dbus/dbus-message.c | 30 | ||||
| -rw-r--r-- | dbus/dbus-message.h | 1 | 
6 files changed, 100 insertions, 21 deletions
@@ -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);  | 
