summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@codefactory.se>2003-01-21 14:07:09 +0000
committerAnders Carlsson <andersca@codefactory.se>2003-01-21 14:07:09 +0000
commit9e1199fed2c96fe305a27e5d3d4e1950ed2f0d0f (patch)
tree273f2d661f6e0d9f7debf2a60dcb076f66811e65
parentaff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10 (diff)
2003-01-21 Anders Carlsson <andersca@codefactory.se>
* dbus/dbus-marshal.c: (_dbus_marshal_double), (_dbus_marshal_int32), (_dbus_marshal_uint32), (_dbus_marshal_int32_array), (_dbus_marshal_uint32_array), (_dbus_marshal_double_array), (_dbus_marshal_string_array), (_dbus_demarshal_int32_array), (_dbus_demarshal_uint32_array), (_dbus_demarshal_double_array), (_dbus_demarshal_string_array), (_dbus_marshal_get_field_end_pos), (_dbus_marshal_test): * dbus/dbus-marshal.h: * dbus/dbus-protocol.h: Add support for marshalling and demarshalling integer, double and string arrays.
-rw-r--r--ChangeLog14
-rw-r--r--dbus/dbus-marshal.c405
-rw-r--r--dbus/dbus-marshal.h71
-rw-r--r--dbus/dbus-protocol.h19
4 files changed, 464 insertions, 45 deletions
diff --git a/ChangeLog b/ChangeLog
index 2049004e..54168e9d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
2003-01-21 Anders Carlsson <andersca@codefactory.se>
+ * dbus/dbus-marshal.c: (_dbus_marshal_double),
+ (_dbus_marshal_int32), (_dbus_marshal_uint32),
+ (_dbus_marshal_int32_array), (_dbus_marshal_uint32_array),
+ (_dbus_marshal_double_array), (_dbus_marshal_string_array),
+ (_dbus_demarshal_int32_array), (_dbus_demarshal_uint32_array),
+ (_dbus_demarshal_double_array), (_dbus_demarshal_string_array),
+ (_dbus_marshal_get_field_end_pos), (_dbus_marshal_test):
+ * dbus/dbus-marshal.h:
+ * dbus/dbus-protocol.h:
+ Add support for marshalling and demarshalling integer, double
+ and string arrays.
+
+2003-01-21 Anders Carlsson <andersca@codefactory.se>
+
* bus/Makefile.am:
Add driver.[ch]
diff --git a/dbus/dbus-marshal.c b/dbus/dbus-marshal.c
index 395c2cce..148ce08e 100644
--- a/dbus/dbus-marshal.c
+++ b/dbus/dbus-marshal.c
@@ -148,10 +148,8 @@ _dbus_marshal_double (DBusString *str,
double value)
{
_dbus_assert (sizeof (double) == 8);
-
- if (!_dbus_string_set_length (str,
- _DBUS_ALIGN_VALUE (_dbus_string_get_length (str),
- sizeof (double))))
+
+ if (!_dbus_string_align_length (str, sizeof (double)))
return FALSE;
if (byte_order != DBUS_COMPILER_BYTE_ORDER)
@@ -173,9 +171,7 @@ _dbus_marshal_int32 (DBusString *str,
int byte_order,
dbus_int32_t value)
{
- if (!_dbus_string_set_length (str,
- _DBUS_ALIGN_VALUE (_dbus_string_get_length (str),
- sizeof (dbus_int32_t))))
+ if (!_dbus_string_align_length (str, sizeof (dbus_int32_t)))
return FALSE;
if (byte_order != DBUS_COMPILER_BYTE_ORDER)
@@ -197,11 +193,9 @@ _dbus_marshal_uint32 (DBusString *str,
int byte_order,
dbus_uint32_t value)
{
- if (!_dbus_string_set_length (str,
- _DBUS_ALIGN_VALUE (_dbus_string_get_length (str),
- sizeof (dbus_uint32_t))))
+ if (!_dbus_string_align_length (str, sizeof (dbus_uint32_t)))
return FALSE;
-
+
if (byte_order != DBUS_COMPILER_BYTE_ORDER)
swap_bytes ((unsigned char *)&value, sizeof (dbus_uint32_t));
@@ -243,8 +237,8 @@ _dbus_marshal_string (DBusString *str,
*
* @param str the string to append the marshalled value to
* @param byte_order the byte order to use
- * @param value the byte array
- * @param len the length of the byte array
+ * @param value the array
+ * @param len number of elements in the array
* @returns #TRUE on success
*/
dbus_bool_t
@@ -269,6 +263,146 @@ _dbus_marshal_byte_array (DBusString *str,
}
/**
+ * Marshals a 32 bit signed integer array
+ *
+ * @param str the string to append the marshalled value to
+ * @param byte_order the byte order to use
+ * @param value the array
+ * @param len the length of the array
+ * @returns #TRUE on success
+ */
+dbus_bool_t
+_dbus_marshal_int32_array (DBusString *str,
+ int byte_order,
+ const dbus_int32_t *value,
+ int len)
+{
+ int i, old_string_len;
+
+ old_string_len = _dbus_string_get_length (str);
+
+ if (!_dbus_marshal_uint32 (str, byte_order, len))
+ goto error;
+
+ for (i = 0; i < len; i++)
+ if (!_dbus_marshal_int32 (str, byte_order, value[i]))
+ goto error;
+
+ return TRUE;
+
+ error:
+ /* Restore previous length */
+ _dbus_string_set_length (str, old_string_len);
+
+ return FALSE;
+}
+
+/**
+ * Marshals a 32 bit unsigned integer array
+ *
+ * @param str the string to append the marshalled value to
+ * @param byte_order the byte order to use
+ * @param value the array
+ * @param len the length of the array
+ * @returns #TRUE on success
+ */
+dbus_bool_t
+_dbus_marshal_uint32_array (DBusString *str,
+ int byte_order,
+ const dbus_uint32_t *value,
+ int len)
+{
+ int i, old_string_len;
+
+ old_string_len = _dbus_string_get_length (str);
+
+ if (!_dbus_marshal_uint32 (str, byte_order, len))
+ goto error;
+
+ for (i = 0; i < len; i++)
+ if (!_dbus_marshal_uint32 (str, byte_order, value[i]))
+ goto error;
+
+ return TRUE;
+
+ error:
+ /* Restore previous length */
+ _dbus_string_set_length (str, old_string_len);
+
+ return FALSE;
+}
+
+/**
+ * Marshals a double array
+ *
+ * @param str the string to append the marshalled value to
+ * @param byte_order the byte order to use
+ * @param value the array
+ * @param len the length of the array
+ * @returns #TRUE on success
+ */
+dbus_bool_t
+_dbus_marshal_double_array (DBusString *str,
+ int byte_order,
+ const double *value,
+ int len)
+{
+ int i, old_string_len;
+
+ old_string_len = _dbus_string_get_length (str);
+
+ if (!_dbus_marshal_uint32 (str, byte_order, len))
+ goto error;
+
+ for (i = 0; i < len; i++)
+ if (!_dbus_marshal_double (str, byte_order, value[i]))
+ goto error;
+
+ return TRUE;
+
+ error:
+ /* Restore previous length */
+ _dbus_string_set_length (str, old_string_len);
+
+ return FALSE;
+}
+
+/**
+ * Marshals a string array
+ *
+ * @param str the string to append the marshalled value to
+ * @param byte_order the byte order to use
+ * @param value the array
+ * @param len the length of the array
+ * @returns #TRUE on success
+ */
+dbus_bool_t
+_dbus_marshal_string_array (DBusString *str,
+ int byte_order,
+ const char **value,
+ int len)
+{
+ int i, old_string_len;
+
+ old_string_len = _dbus_string_get_length (str);
+
+ if (!_dbus_marshal_uint32 (str, byte_order, len))
+ goto error;
+
+ for (i = 0; i < len; i++)
+ if (!_dbus_marshal_string (str, byte_order, value[i]))
+ goto error;
+
+ return TRUE;
+
+ error:
+ /* Restore previous length */
+ _dbus_string_set_length (str, old_string_len);
+
+ return FALSE;
+}
+
+/**
* Demarshals a double.
*
* @param str the string containing the data
@@ -448,6 +582,168 @@ _dbus_demarshal_byte_array (DBusString *str,
return retval;
}
+/**
+ * Demarshals a 32 bit signed integer array.
+ *
+ * @param str the string containing the data
+ * @param byte_order the byte order
+ * @param pos the position in the string
+ * @param new_pos the new position of the string
+ * @param array_len length of the demarshaled data
+ * @returns the demarshaled data.
+ */
+dbus_int32_t *
+_dbus_demarshal_int32_array (DBusString *str,
+ int byte_order,
+ int pos,
+ int *new_pos,
+ int *array_len)
+{
+ int len, i;
+ dbus_int32_t *retval;
+
+ len = _dbus_demarshal_uint32 (str, byte_order, pos, &pos);
+
+ retval = dbus_new (dbus_int32_t, len);
+
+ if (!retval)
+ return NULL;
+
+ for (i = 0; i < len; i++)
+ retval[i] = _dbus_demarshal_int32 (str, byte_order, pos, &pos);
+
+ if (new_pos)
+ *new_pos = pos;
+
+ if (array_len)
+ *array_len = len;
+
+ return retval;
+}
+
+/**
+ * Demarshals a 32 bit unsigned integer array.
+ *
+ * @param str the string containing the data
+ * @param byte_order the byte order
+ * @param pos the position in the string
+ * @param new_pos the new position of the string
+ * @param array_len length of the demarshaled data
+ * @returns the demarshaled data.
+ */
+dbus_uint32_t *
+_dbus_demarshal_uint32_array (DBusString *str,
+ int byte_order,
+ int pos,
+ int *new_pos,
+ int *array_len)
+{
+ int len, i;
+ dbus_uint32_t *retval;
+
+ len = _dbus_demarshal_uint32 (str, byte_order, pos, &pos);
+
+ retval = dbus_new (dbus_uint32_t, len);
+
+ if (!retval)
+ return NULL;
+
+ for (i = 0; i < len; i++)
+ retval[i] = _dbus_demarshal_uint32 (str, byte_order, pos, &pos);
+
+ if (new_pos)
+ *new_pos = pos;
+
+ if (array_len)
+ *array_len = len;
+
+ return retval;
+}
+
+/**
+ * Demarshals a double array.
+ *
+ * @param str the string containing the data
+ * @param byte_order the byte order
+ * @param pos the position in the string
+ * @param new_pos the new position of the string
+ * @param array_len length of the demarshaled data
+ * @returns the demarshaled data.
+ */
+double *
+_dbus_demarshal_double_array (DBusString *str,
+ int byte_order,
+ int pos,
+ int *new_pos,
+ int *array_len)
+{
+ int len, i;
+ double *retval;
+
+ len = _dbus_demarshal_uint32 (str, byte_order, pos, &pos);
+
+ retval = dbus_new (double, len);
+
+ if (!retval)
+ return NULL;
+
+ for (i = 0; i < len; i++)
+ retval[i] = _dbus_demarshal_double (str, byte_order, pos, &pos);
+
+ if (new_pos)
+ *new_pos = pos;
+
+ if (array_len)
+ *array_len = len;
+
+ return retval;
+}
+
+/**
+ * Demarshals a string array.
+ *
+ * @param str the string containing the data
+ * @param byte_order the byte order
+ * @param pos the position in the string
+ * @param new_pos the new position of the string
+ * @param array_len length of the demarshaled data
+ * @returns the demarshaled data.
+ */
+char **
+_dbus_demarshal_string_array (DBusString *str,
+ int byte_order,
+ int pos,
+ int *new_pos,
+ int *array_len)
+{
+ int len, i, j;
+ char **retval;
+
+ len = _dbus_demarshal_uint32 (str, byte_order, pos, &pos);
+
+ retval = dbus_new (char *, len);
+
+ if (!retval)
+ return NULL;
+
+ for (i = 0; i < len; i++)
+ {
+ retval[i] = _dbus_demarshal_string (str, byte_order, pos, &pos);
+
+ if (retval[i] == 0)
+ goto error;
+ }
+
+ return retval;
+
+ error:
+ for (j = 0; j < i; j++)
+ dbus_free (retval[i]);
+ dbus_free (retval);
+
+ return NULL;
+}
+
/**
* Returns the position right after the end position
* end position of a field
@@ -501,28 +797,86 @@ _dbus_marshal_get_field_end_pos (DBusString *str,
case DBUS_TYPE_STRING:
{
- int len, new_pos;
+ int len;
/* Demarshal the length */
- len = _dbus_demarshal_uint32 (str, byte_order, pos + 1, &new_pos);
+ len = _dbus_demarshal_uint32 (str, byte_order, pos + 1, &pos);
- *end_pos = new_pos + len + 1;
+ *end_pos = pos + len + 1;
break;
}
case DBUS_TYPE_BYTE_ARRAY:
{
+ int len;
+
+ /* Demarshal the length */
+ len = _dbus_demarshal_uint32 (str, byte_order, pos + 1, &pos);
+
+ *end_pos = pos + len;
+
+ break;
+ }
+
+ case DBUS_TYPE_INT32_ARRAY:
+ {
+ int len, new_pos;
+
+ /* Demarshal the length */
+ len = _dbus_demarshal_uint32 (str, byte_order, pos + 1, &new_pos);
+
+ *end_pos = _DBUS_ALIGN_VALUE (new_pos, sizeof (dbus_int32_t))
+ + (len * sizeof (dbus_int32_t));
+
+ break;
+ }
+
+ case DBUS_TYPE_UINT32_ARRAY:
+ {
int len, new_pos;
/* Demarshal the length */
len = _dbus_demarshal_uint32 (str, byte_order, pos + 1, &new_pos);
+
+ *end_pos = _DBUS_ALIGN_VALUE (new_pos, sizeof (dbus_uint32_t))
+ + (len * sizeof (dbus_uint32_t));
+
+ break;
+ }
+
+ case DBUS_TYPE_DOUBLE_ARRAY:
+ {
+ int len, new_pos;
- *end_pos = new_pos + len;
+ /* Demarshal the length */
+ len = _dbus_demarshal_uint32 (str, byte_order, pos + 1, &new_pos);
+ *end_pos = _DBUS_ALIGN_VALUE (new_pos, sizeof (double))
+ + (len * sizeof (double));
+
break;
}
+ case DBUS_TYPE_STRING_ARRAY:
+ {
+ int len, i;
+
+ /* Demarshal the length */
+ len = _dbus_demarshal_uint32 (str, byte_order, pos + 1, &pos);
+
+ for (i = 0; i < len; i++)
+ {
+ int str_len;
+
+ /* Demarshal string length */
+ str_len = _dbus_demarshal_uint32 (str, byte_order, pos, &pos);
+ pos += str_len + 1;
+ }
+
+ *end_pos = pos;
+ break;
+ }
default:
_dbus_warn ("Unknown message field type %d\n", *data);
return FALSE;
@@ -628,12 +982,12 @@ _dbus_marshal_test (void)
{
DBusString str;
char *tmp1, *tmp2;
- int pos = 0;
+ dbus_int32_t array1[3] = { 0x123, 0x456, 0x789 }, *array2;
+ int pos = 0, len;
if (!_dbus_string_init (&str, _DBUS_INT_MAX))
_dbus_assert_not_reached ("failed to init string");
-
/* Marshal doubles */
if (!_dbus_marshal_double (&str, DBUS_BIG_ENDIAN, 3.14))
_dbus_assert_not_reached ("could not marshal double value");
@@ -676,8 +1030,21 @@ _dbus_marshal_test (void)
_dbus_assert (strcmp (tmp1, tmp2) == 0);
dbus_free (tmp2);
+ /* Marshal signed integer arrays */
+ if (!_dbus_marshal_int32_array (&str, DBUS_BIG_ENDIAN, array1, 3))
+ _dbus_assert_not_reached ("could not marshal integer array");
+ _dbus_verbose_bytes_of_string (&str, 0, _dbus_string_get_length (&str));
+ array2 = _dbus_demarshal_int32_array (&str, DBUS_BIG_ENDIAN, pos, &pos, &len);
+ printf ("length is: %d\n", len);
+ if (len != 3)
+ _dbus_assert_not_reached ("Signed integer array lengths differ!\n");
+
+
+
+
_dbus_string_free (&str);
+
return TRUE;
}
diff --git a/dbus/dbus-marshal.h b/dbus/dbus-marshal.h
index 1c4c0e40..5184318e 100644
--- a/dbus/dbus-marshal.h
+++ b/dbus/dbus-marshal.h
@@ -76,23 +76,39 @@ void _dbus_pack_uint32 (dbus_uint32_t value,
dbus_uint32_t _dbus_unpack_uint32 (int byte_order,
const unsigned char *data);
-
-dbus_bool_t _dbus_marshal_double (DBusString *str,
- int byte_order,
- double value);
-dbus_bool_t _dbus_marshal_int32 (DBusString *str,
- int byte_order,
- dbus_int32_t value);
-dbus_bool_t _dbus_marshal_uint32 (DBusString *str,
- int byte_order,
- dbus_uint32_t value);
-dbus_bool_t _dbus_marshal_string (DBusString *str,
- int byte_order,
- const char *value);
-dbus_bool_t _dbus_marshal_byte_array (DBusString *str,
- int byte_order,
- const unsigned char *value,
- int len);
+
+dbus_bool_t _dbus_marshal_int32 (DBusString *str,
+ int byte_order,
+ dbus_int32_t value);
+dbus_bool_t _dbus_marshal_uint32 (DBusString *str,
+ int byte_order,
+ dbus_uint32_t value);
+dbus_bool_t _dbus_marshal_double (DBusString *str,
+ int byte_order,
+ double value);
+dbus_bool_t _dbus_marshal_string (DBusString *str,
+ int byte_order,
+ const char *value);
+dbus_bool_t _dbus_marshal_byte_array (DBusString *str,
+ int byte_order,
+ const unsigned char *value,
+ int len);
+dbus_bool_t _dbus_marshal_int32_array (DBusString *str,
+ int byte_order,
+ const dbus_int32_t *value,
+ int len);
+dbus_bool_t _dbus_marshal_uint32_array (DBusString *str,
+ int byte_order,
+ const dbus_uint32_t *value,
+ int len);
+dbus_bool_t _dbus_marshal_double_array (DBusString *str,
+ int byte_order,
+ const double *value,
+ int len);
+dbus_bool_t _dbus_marshal_string_array (DBusString *str,
+ int byte_order,
+ const char **value,
+ int len);
double _dbus_demarshal_double (DBusString *str,
int byte_order,
@@ -115,7 +131,26 @@ unsigned char *_dbus_demarshal_byte_array (DBusString *str,
int pos,
int *new_pos,
int *array_len);
-
+dbus_int32_t *_dbus_demarshal_int32_array (DBusString *str,
+ int byte_order,
+ int pos,
+ int *new_pos,
+ int *array_len);
+dbus_uint32_t *_dbus_demarshal_uint32_array (DBusString *str,
+ int byte_order,
+ int pos,
+ int *new_pos,
+ int *array_len);
+double *_dbus_demarshal_double_array (DBusString *str,
+ int byte_order,
+ int pos,
+ int *new_pos,
+ int *array_len);
+char **_dbus_demarshal_string_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-protocol.h b/dbus/dbus-protocol.h
index 76ffa52c..fb0169cd 100644
--- a/dbus/dbus-protocol.h
+++ b/dbus/dbus-protocol.h
@@ -38,15 +38,18 @@ extern "C" {
/* Data types */
#define DBUS_TYPE_INVALID 0
-#define DBUS_TYPE_INT32 1
-#define DBUS_TYPE_UINT32 2
-#define DBUS_TYPE_DOUBLE 3
-#define DBUS_TYPE_INT32_ARRAY 4
-#define DBUS_TYPE_UINT32_ARRAY 5
-#define DBUS_TYPE_DOUBLE_ARRAY 6
-#define DBUS_TYPE_BYTE_ARRAY 7
-#define DBUS_TYPE_STRING 8
+#define DBUS_TYPE_NIL 1
+#define DBUS_TYPE_INT32 2
+#define DBUS_TYPE_UINT32 3
+#define DBUS_TYPE_DOUBLE 4
+#define DBUS_TYPE_STRING 5
+#define DBUS_TYPE_INT32_ARRAY 6
+#define DBUS_TYPE_UINT32_ARRAY 7
+#define DBUS_TYPE_DOUBLE_ARRAY 8
+#define DBUS_TYPE_BYTE_ARRAY 9
+#define DBUS_TYPE_STRING_ARRAY 10
+#
/* Header fields */
#define DBUS_HEADER_FIELD_NAME "name"
#define DBUS_HEADER_FIELD_SERVICE "srvc"