+2006-02-16 Robert McQueen <robot101@debian.org>
+
+ * dbus/dbus-message.c (dbus_message_iter_get_fixed_array):
+ Patch from Rob Taylor <rob.taylor@collabora.co.uk> to correct a bogus
+ assertion that the next element to read from the iter is fixed in
+ size. This is not the case when you are at the end of the iter,
+ because the next element type is INVALID.
+
+ * dbus/dbus-string.c (_dbus_string_init_const_len): Correct a
+ a bogus assert which means that you may not initialise a 0-length
+ string unless you provide a non-NULL pointer. This prevented
+ you from marshalling messages containing zero-length arrays in
+ some cases.
+
+ * glib/dbus-gvalue.c (demarshal_collection_array): Another patch
+ from Rob to correct bogus asserts when trying to demarshal an
+ array and get_fixed_array got you 0 elements. Append nothing to
+ the GArray in this case.
+
+ * test/glib/test-dbus-glib.c: Add a test case for round-tripping
+ an empty array via the glib bindings. Without all of the above
+ patches, this new test fails.
+
2006-02-16 Robert McQueen <robot101@debian.org>
* glib/dbus-gmain.c: Make the previous commit compile.
int *n_elements)
{
DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
+ int subtype = _dbus_type_reader_get_current_type(&real->u.reader);
_dbus_return_if_fail (_dbus_message_iter_check (real));
_dbus_return_if_fail (value != NULL);
- _dbus_return_if_fail (dbus_type_is_fixed (_dbus_type_reader_get_current_type (&real->u.reader)));
+ _dbus_return_if_fail ((subtype == DBUS_TYPE_INVALID) ||
+ dbus_type_is_fixed (subtype));
_dbus_type_reader_read_fixed_multi (&real->u.reader,
value, n_elements);
DBusRealString *real;
_dbus_assert (str != NULL);
- _dbus_assert (value != NULL);
+ _dbus_assert (len == 0 || value != NULL);
_dbus_assert (len <= _DBUS_STRING_MAX_MAX_LENGTH);
_dbus_assert (len >= 0);
dbus_message_iter_get_fixed_array (&subiter,
&msgarray,
&msgarray_len);
- g_assert (msgarray != NULL);
- g_assert (msgarray_len >= 0);
- g_array_append_vals (ret, msgarray, (guint) msgarray_len);
+ g_assert (msgarray != NULL || msgarray_len == 0);
+
+ if (msgarray_len)
+ g_array_append_vals (ret, msgarray, (guint) msgarray_len);
g_value_set_boxed_take_ownership (value, ret);
run_mainloop ();
+ {
+ GArray *array;
+ guint32 arraylen;
+
+ array = g_array_new (FALSE, TRUE, sizeof (guint32));
+
+ arraylen = 0;
+ g_print ("Calling (wrapped) zero-length recursive1\n");
+ if (!org_freedesktop_DBus_Tests_MyObject_recursive1 (proxy, array,
+ &arraylen, &error))
+ lose_gerror ("Failed to complete (wrapped) zero-length recursive1 call", error);
+ if (arraylen != 0)
+ lose ("(wrapped) zero-length recursive1 call returned invalid length %u", arraylen);
+ }
+
{
GArray *array;
guint32 val;