summaryrefslogtreecommitdiffstats
path: root/glib/dbus-gsignature.c
diff options
context:
space:
mode:
Diffstat (limited to 'glib/dbus-gsignature.c')
-rw-r--r--glib/dbus-gsignature.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/glib/dbus-gsignature.c b/glib/dbus-gsignature.c
index a0370b0e..5df959db 100644
--- a/glib/dbus-gsignature.c
+++ b/glib/dbus-gsignature.c
@@ -117,6 +117,25 @@ signature_iter_to_g_type_array (DBusSignatureIter *iter, gboolean is_client)
return G_TYPE_INVALID;
}
+static GType
+signature_iter_to_g_type_struct (DBusSignatureIter *iter, gboolean is_client)
+{
+ GArray *types;
+ GType ret;
+ types = g_array_new (FALSE, FALSE, sizeof (GType));
+ do
+ {
+ GType curtype;
+ curtype = _dbus_gtype_from_signature_iter (iter, is_client);
+ g_array_append_val (types, curtype);
+ }
+ while (dbus_signature_iter_next (iter));
+
+ ret = dbus_g_type_get_structv ("GValueArray", types->len, (GType*) types->data);
+ g_array_free (types, TRUE);
+ return ret;
+}
+
GType
_dbus_gtype_from_signature_iter (DBusSignatureIter *iter, gboolean is_client)
{
@@ -136,8 +155,6 @@ _dbus_gtype_from_signature_iter (DBusSignatureIter *iter, gboolean is_client)
if (current_type == DBUS_TYPE_VARIANT)
return G_TYPE_VALUE;
- if (current_type == DBUS_TYPE_STRUCT)
- return G_TYPE_VALUE_ARRAY;
dbus_signature_iter_recurse (iter, &subiter);
@@ -149,6 +166,10 @@ _dbus_gtype_from_signature_iter (DBusSignatureIter *iter, gboolean is_client)
else
return signature_iter_to_g_type_array (&subiter, is_client);
}
+ else if (current_type == DBUS_TYPE_STRUCT)
+ {
+ return signature_iter_to_g_type_struct (&subiter, is_client);
+ }
else
{
g_assert_not_reached ();