[glib] GApplication: fix remote action states



commit 0e63b57eea5b1785a9831864aa2fac5ec29d26a1
Author: Ryan Lortie <desrt desrt ca>
Date:   Wed May 18 17:53:07 2011 -0400

    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.

 gio/gapplicationimpl-dbus.c |   55 ++++++++++++++++++++++++------------------
 1 files changed, 31 insertions(+), 24 deletions(-)
---
diff --git a/gio/gapplicationimpl-dbus.c b/gio/gapplicationimpl-dbus.c
index c59c90e..e285e12 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;
 }
@@ -708,32 +731,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);
   }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]