diff options
author | Ryan Lortie <desrt@desrt.ca> | 2013-01-07 18:47:57 -0500 |
---|---|---|
committer | Ryan Lortie <desrt@desrt.ca> | 2013-01-08 13:19:33 -0500 |
commit | 2ec6269534cbf310dbd81e700e9860bf91cf8bfe (patch) | |
tree | 17988df2e712e772ecddd17d0acc765423970343 /service | |
parent | 92c6f91b41c1e0a26c9ab52640201930aa6f3e88 (diff) | |
download | dconf-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.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, |