GType _dbus_gtype_from_signature_iter (DBusSignatureIter *iter, gboolean is_client) { int current_type; current_type = dbus_signature_iter_get_current_type (iter); if (dbus_typecode_maps_to_basic (current_type)) return _dbus_gtype_from_basic_typecode (current_type); else if (current_type == DBUS_TYPE_OBJECT_PATH) return DBUS_TYPE_G_OBJECT_PATH; else if (current_type == DBUS_TYPE_SIGNATURE) return DBUS_TYPE_G_SIGNATURE; else if (current_type == DBUS_TYPE_VARIANT || current_type == DBUS_TYPE_ARRAY || current_type == DBUS_TYPE_STRUCT) { DBusSignatureIter subiter; g_assert (dbus_type_is_container (current_type)); if (current_type == DBUS_TYPE_VARIANT) return G_TYPE_VALUE; dbus_signature_iter_recurse (iter, &subiter); if (current_type == DBUS_TYPE_ARRAY) { int elt_type = dbus_signature_iter_get_current_type (&subiter); if (elt_type == DBUS_TYPE_DICT_ENTRY) return signature_iter_to_g_type_dict (&subiter, 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 (); return G_TYPE_INVALID; } } else { /* dbus-glib does not handle DBUS_TYPE_UNIX_FD or DBUS_TYPE_MAYBE */ return G_TYPE_INVALID; } }
/** * Initialize a new iterator pointing to the first type current * container. It's an error to call this if the current type is a * non-container (i.e. if dbus_type_is_container returns FALSE). * * @param iter the current interator * @param subiter an iterator to initialize pointing to the first child */ void dbus_signature_iter_recurse (const DBusSignatureIter *iter, DBusSignatureIter *subiter) { DBusSignatureRealIter *real_iter = (DBusSignatureRealIter *) iter; DBusSignatureRealIter *real_sub_iter = (DBusSignatureRealIter *) subiter; _dbus_return_if_fail (dbus_type_is_container (dbus_signature_iter_get_current_type (iter))); *real_sub_iter = *real_iter; real_sub_iter->pos++; if (dbus_signature_iter_get_current_type (subiter) == DBUS_TYPE_ARRAY) real_sub_iter->in_array = TRUE; }
static void iter_append_iter(DBusMessageIter *base, DBusMessageIter *iter) { int type; type = dbus_message_iter_get_arg_type(iter); if (dbus_type_is_basic(type)) { const void *value; dbus_message_iter_get_basic(iter, &value); dbus_message_iter_append_basic(base, type, &value); } else if (dbus_type_is_container(type)) { DBusMessageIter iter_sub, base_sub; char *sig; dbus_message_iter_recurse(iter, &iter_sub); switch (type) { case DBUS_TYPE_ARRAY: case DBUS_TYPE_VARIANT: sig = dbus_message_iter_get_signature(&iter_sub); break; default: sig = NULL; break; } dbus_message_iter_open_container(base, type, sig, &base_sub); if (sig != NULL) dbus_free(sig); while (dbus_message_iter_get_arg_type(&iter_sub) != DBUS_TYPE_INVALID) { iter_append_iter(&base_sub, &iter_sub); dbus_message_iter_next(&iter_sub); } dbus_message_iter_close_container(base, &base_sub); } }