summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Lortie <desrt@desrt.ca>2011-05-18 17:53:07 -0400
committerMatthias Clasen <mclasen@redhat.com>2011-05-20 23:50:55 -0400
commit89908908d50c5a5d3c7d73fc9a63a19d9a681cf3 (patch)
treebfea762d71886b99e554e579ff5fbe130972c3b1
parentbb488d4c4ff5d18f5f0f45ca8aae1863b3ca8b1a (diff)
GApplication: fix remote action states
Fix up remote_action_info_new_from_iter() to do its job better and use it from all places that it's appropriate. Closes #650236.
-rw-r--r--gio/gapplicationimpl-dbus.c55
1 files changed, 31 insertions, 24 deletions
diff --git a/gio/gapplicationimpl-dbus.c b/gio/gapplicationimpl-dbus.c
index 406b8390d..6290bd4ae 100644
--- a/gio/gapplicationimpl-dbus.c
+++ b/gio/gapplicationimpl-dbus.c
@@ -417,27 +417,50 @@ g_application_impl_destroy (GApplicationImpl *impl)
g_slice_free (GApplicationImpl, impl);
}
+static void
+unwrap_fake_maybe (GVariant **value)
+{
+ GVariant *tmp;
+
+ if (g_variant_n_children (*value))
+ g_variant_get_child (*value, 0, "v", &tmp);
+ else
+ tmp = NULL;
+
+ g_variant_unref (*value);
+ *value = tmp;
+}
+
RemoteActionInfo *
remote_action_info_new_from_iter (GVariantIter *iter)
{
RemoteActionInfo *info;
- const gchar *name;
GVariant *param_type;
gboolean enabled;
GVariant *state;
+ gchar *name;
if (!g_variant_iter_next (iter, "(s@avb@av)", &name,
&param_type, &enabled, &state))
return NULL;
+ unwrap_fake_maybe (&param_type);
+ unwrap_fake_maybe (&state);
+
info = g_slice_new (RemoteActionInfo);
- info->parameter_type = g_variant_type_copy (
- g_variant_type_element (
- g_variant_get_type (param_type)));
+ info->name = name;
info->enabled = enabled;
info->state = state;
- g_variant_unref (param_type);
+ if (param_type != NULL)
+ {
+ info->parameter_type = g_variant_type_copy (
+ g_variant_type_element (
+ g_variant_get_type (param_type)));
+ g_variant_unref (param_type);
+ }
+ else
+ info->parameter_type = NULL;
return info;
}
@@ -705,32 +728,16 @@ g_application_impl_register (GApplication *application,
/* Create and populate the hashtable */
{
+ RemoteActionInfo *info;
GVariant *descriptions;
GVariantIter iter;
- GVariant *param_type;
- gboolean enabled;
- GVariant *state;
- gchar *name;
*remote_actions = g_hash_table_new (g_str_hash, g_str_equal);
descriptions = g_variant_get_child_value (reply, 0);
g_variant_iter_init (&iter, descriptions);
- while (g_variant_iter_next (&iter, "(s@avb@av)", &name,
- &param_type, &enabled, &state))
- {
- RemoteActionInfo *action;
-
- action = g_slice_new (RemoteActionInfo);
- action->parameter_type = g_variant_type_copy (
- g_variant_type_element (
- g_variant_get_type (param_type)));
- action->enabled = enabled;
- action->state = state;
-
- g_hash_table_insert (*remote_actions, name, action);
- g_variant_unref (param_type);
- }
+ while ((info = remote_action_info_new_from_iter (&iter)))
+ g_hash_table_insert (*remote_actions, info->name, info);
g_variant_unref (descriptions);
}