summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorRyan Lortie <desrt@desrt.ca>2013-01-07 18:47:57 -0500
committerRyan Lortie <desrt@desrt.ca>2013-01-08 13:19:33 -0500
commit2ec6269534cbf310dbd81e700e9860bf91cf8bfe (patch)
tree17988df2e712e772ecddd17d0acc765423970343 /service
parent92c6f91b41c1e0a26c9ab52640201930aa6f3e88 (diff)
downloaddconf-2ec6269534cbf310dbd81e700e9860bf91cf8bfe.tar.gz
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.
Diffstat (limited to 'service')
-rw-r--r--service/dconf-service.c50
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,