2005-07-24 Colin Walters <walters@verbum.org>
authorColin Walters <walters@verbum.org>
Sun, 24 Jul 2005 18:04:23 +0000 (18:04 +0000)
committerColin Walters <walters@verbum.org>
Sun, 24 Jul 2005 18:04:23 +0000 (18:04 +0000)
* glib/dbus-gvalue.c (signature_iter_to_g_type_array): Don't require
typedata; recursive arrays won't have it.

* test/glib/test-dbus-glib.c:
* test/glib/test-service-glib.c:
* test/glib/test-service-glib.xml: Add recursive arrays tests.

ChangeLog
glib/dbus-gvalue.c
test/glib/test-dbus-glib.c
test/glib/test-service-glib.c
test/glib/test-service-glib.xml

index 0158c1a..946c133 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2005-07-24  Colin Walters  <walters@verbum.org>
+
+       * glib/dbus-gvalue.c (signature_iter_to_g_type_array): Don't require
+       typedata; recursive arrays won't have it.
+
+       * test/glib/test-dbus-glib.c:
+       * test/glib/test-service-glib.c:
+       * test/glib/test-service-glib.xml: Add recursive arrays tests.
+       
 2005-07-20  John (J5) Palmieir  <johnp@redhat.com>
 
        * python/_dbus.py, _util.py, decorators.py, extract.py, matchrules.py.
index e5f019f..2570f2a 100644 (file)
@@ -416,16 +416,11 @@ static GType
 signature_iter_to_g_type_array (DBusSignatureIter *iter, gboolean is_client)
 {
   GType elt_gtype;
-  DBusGTypeMarshalData *typedata;
 
   elt_gtype = dbus_gtype_from_signature_iter (iter, is_client);
   if (elt_gtype == G_TYPE_INVALID)
     return G_TYPE_INVALID;
 
-  typedata = g_type_get_qdata (elt_gtype, dbus_g_type_metadata_data_quark ());
-  if (typedata == NULL)
-    return G_TYPE_INVALID;
-  
   if (elt_gtype == G_TYPE_OBJECT)
     return DBUS_TYPE_G_OBJECT_ARRAY;
   if (elt_gtype == G_TYPE_STRING)
index 962db15..368a576 100644 (file)
@@ -974,6 +974,57 @@ main (int argc, char **argv)
   }
 
   {
+    GPtrArray *in_array;
+    GPtrArray *out_array;
+    char **strs;
+    GArray *uints;
+
+    in_array = g_ptr_array_new ();
+
+    strs = g_new0 (char *, 3);
+    strs[0] = "foo";
+    strs[1] = "bar";
+    strs[2] = NULL;
+    g_ptr_array_add (in_array, strs);
+
+    strs = g_new0 (char *, 4);
+    strs[0] = "baz";
+    strs[1] = "whee";
+    strs[2] = "moo";
+    strs[3] = NULL;
+    g_ptr_array_add (in_array, strs);
+
+    out_array = NULL;
+    g_print ("Calling RecArrays\n");
+    if (!dbus_g_proxy_call (proxy, "RecArrays", &error,
+                           dbus_g_type_get_collection ("GPtrArray", G_TYPE_STRV), in_array,
+                           G_TYPE_INVALID,
+                           dbus_g_type_get_collection ("GPtrArray",
+                                                       dbus_g_type_get_collection ("GPtrArray",
+                                                                                   G_TYPE_UINT)), &out_array, 
+                           G_TYPE_INVALID))
+      lose_gerror ("Failed to complete RecArrays call", error);
+    g_free (g_ptr_array_index (in_array, 0));
+    g_free (g_ptr_array_index (in_array, 1));
+
+    g_assert (out_array);
+    g_assert (out_array->len == 2);
+    uints = g_ptr_array_index (out_array, 0);
+    g_assert (uints);
+    g_assert (uints->len == 3);
+    g_assert (g_array_index (uints, guint, 0) == 10);
+    g_assert (g_array_index (uints, guint, 1) == 42);
+    g_assert (g_array_index (uints, guint, 2) == 27);
+    g_array_free (uints, TRUE);
+    uints = g_ptr_array_index (out_array, 1);
+    g_assert (uints);
+    g_assert (uints->len == 1);
+    g_assert (g_array_index (uints, guint, 0) == 30);
+    g_array_free (uints, TRUE);
+    g_ptr_array_free (out_array, TRUE);
+  }
+
+  {
     guint val;
     char *ret_path;
     DBusGProxy *ret_proxy;
index b0043e8..1c62a49 100644 (file)
@@ -69,6 +69,8 @@ gboolean my_object_recursive2 (MyObject *obj, guint32 reqlen, GArray **array, GE
 
 gboolean my_object_many_stringify (MyObject *obj, GHashTable *vals, GHashTable **ret, GError **error);
 
+gboolean my_object_rec_arrays (MyObject *obj, GPtrArray *in, GPtrArray **ret, GError **error);
+
 gboolean my_object_objpath (MyObject *obj, const char *in, const char **arg1, GError **error);
 
 gboolean my_object_get_objs (MyObject *obj, GPtrArray **objs, GError **error);
@@ -459,6 +461,105 @@ my_object_many_stringify (MyObject *obj, GHashTable /* char * -> GValue * */ *va
 }
 
 gboolean
+my_object_rec_arrays (MyObject *obj, GPtrArray *in, GPtrArray **ret, GError **error)
+{
+  guint i;
+  char **strs;
+  GArray *ints;
+  guint v_UINT;
+  
+  if (in->len != 2)
+    {
+      g_set_error (error,
+                  MY_OBJECT_ERROR,
+                  MY_OBJECT_ERROR_FOO,
+                  "invalid array len");
+      return FALSE;
+    }
+  
+  strs = g_ptr_array_index (in, 0);
+  if (!*strs || strcmp (*strs, "foo"))
+    {
+      g_set_error (error,
+                  MY_OBJECT_ERROR,
+                  MY_OBJECT_ERROR_FOO,
+                  "invalid string 0");
+      return FALSE;
+    }
+  strs++;
+  if (!*strs || strcmp (*strs, "bar"))
+    {
+      g_set_error (error,
+                  MY_OBJECT_ERROR,
+                  MY_OBJECT_ERROR_FOO,
+                  "invalid string 1");
+      return FALSE;
+    }
+  strs++;
+  if (*strs)
+    {
+      g_set_error (error,
+                  MY_OBJECT_ERROR,
+                  MY_OBJECT_ERROR_FOO,
+                  "invalid string array len in pos 0");
+      return FALSE;
+    }
+  strs = g_ptr_array_index (in, 1);
+  if (!*strs || strcmp (*strs, "baz"))
+    {
+      g_set_error (error,
+                  MY_OBJECT_ERROR,
+                  MY_OBJECT_ERROR_FOO,
+                  "invalid string 0");
+      return FALSE;
+    }
+  strs++;
+  if (!*strs || strcmp (*strs, "whee"))
+    {
+      g_set_error (error,
+                  MY_OBJECT_ERROR,
+                  MY_OBJECT_ERROR_FOO,
+                  "invalid string 1");
+      return FALSE;
+    }
+  strs++;
+  if (!*strs || strcmp (*strs, "moo"))
+    {
+      g_set_error (error,
+                  MY_OBJECT_ERROR,
+                  MY_OBJECT_ERROR_FOO,
+                  "invalid string 2");
+      return FALSE;
+    }
+  strs++;
+  if (*strs)
+    {
+      g_set_error (error,
+                  MY_OBJECT_ERROR,
+                  MY_OBJECT_ERROR_FOO,
+                  "invalid string array len in pos 1");
+      return FALSE;
+    }
+
+  *ret = g_ptr_array_new ();
+
+  ints = g_array_new (TRUE, TRUE, sizeof (guint));
+  v_UINT = 10;
+  g_array_append_val (ints, v_UINT);
+  v_UINT = 42;
+  g_array_append_val (ints, v_UINT);
+  v_UINT = 27;
+  g_array_append_val (ints, v_UINT);
+  g_ptr_array_add (*ret, ints);
+
+  ints = g_array_new (TRUE, TRUE, sizeof (guint));
+  v_UINT = 30;
+  g_array_append_val (ints, v_UINT);
+  g_ptr_array_add (*ret, ints);
+  return TRUE;
+}
+
+gboolean
 my_object_objpath (MyObject *obj, const char *incoming, const char **outgoing, GError **error)
 {
   if (strcmp (incoming, "/org/freedesktop/DBus/Tests/MyTestObject"))
index f63bead..1fd6155 100644 (file)
       <arg type="a{ss}" direction="out"/>
     </method>
 
+    <method name="RecArrays">
+      <arg type="aas" name="val" direction="in"/>
+      <arg type="aau" direction="out"/>
+    </method>
+
     <method name="Objpath">
       <arg type="o" direction="in"/>
       <arg type="o" direction="out">