[dconf] service: add new 'string set' utility pseudoclass



commit 2ec6269534cbf310dbd81e700e9860bf91cf8bfe
Author: Ryan Lortie <desrt desrt ca>
Date:   Mon Jan 7 18:47:57 2013 -0500

    service: add new 'string set' utility pseudoclass
    
    Add a thin wrapper around GHashTable for dealing with sets of strings.
    
    Port the subtree introspection enumeration code to use it.

 service/dconf-service.c |   50 ++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 41 insertions(+), 9 deletions(-)
---
diff --git a/service/dconf-service.c b/service/dconf-service.c
index 63ffff6..c769936 100644
--- a/service/dconf-service.c
+++ b/service/dconf-service.c
@@ -51,31 +51,63 @@ dconf_service_signalled (gpointer user_data)
 }
 
 static gchar **
-dconf_service_subtree_enumerate (GDBusConnection *connection,
-                                 const gchar     *sender,
-                                 const gchar     *object_path,
-                                 gpointer         user_data)
+string_set_free (GHashTable *set)
 {
-  DConfService *service = user_data;
   GHashTableIter iter;
   gchar **result;
-  gpointer key;
   gint n_items;
+  gpointer key;
   gint i = 0;
 
-  n_items = g_hash_table_size (service->writers);
+  n_items = g_hash_table_size (set);
   result = g_new (gchar *, n_items + 1);
 
-  g_hash_table_iter_init (&iter, service->writers);
+  g_hash_table_iter_init (&iter, set);
   while (g_hash_table_iter_next (&iter, &key, NULL))
-    result[i++] = g_strdup (key);
+    {
+      result[i++] = key;
+      g_hash_table_iter_steal (&iter);
+    }
   result[i] = NULL;
 
   g_assert_cmpint (n_items, ==, i);
+  g_hash_table_unref (set);
 
   return result;
 }
 
+static GHashTable *
+string_set_new (void)
+{
+  return g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+}
+
+static void
+string_set_add (GHashTable  *set,
+                const gchar *string)
+{
+  g_hash_table_add (set, g_strdup (string));
+}
+
+static gchar **
+dconf_service_subtree_enumerate (GDBusConnection *connection,
+                                 const gchar     *sender,
+                                 const gchar     *object_path,
+                                 gpointer         user_data)
+{
+  DConfService *service = user_data;
+  GHashTableIter iter;
+  GHashTable *set;
+  gpointer key;
+
+  set = string_set_new ();
+  g_hash_table_iter_init (&iter, service->writers);
+  while (g_hash_table_iter_next (&iter, &key, NULL))
+    string_set_add (set, key);
+
+  return string_set_free (set);
+}
+
 GDBusInterfaceInfo **
 dconf_service_subtree_introspect (GDBusConnection *connection,
                                   const gchar     *sender,



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