diff options
author | Vincent Untz <vuntz@gnome.org> | 2010-04-15 22:18:59 -0400 |
---|---|---|
committer | Vincent Untz <vuntz@gnome.org> | 2010-04-15 22:21:08 -0400 |
commit | 176c77c783e93f136a2fc27ea5110a20337bdeac (patch) | |
tree | 5c6676396654de28e9d47d1d3435ec7eb8a21b77 | |
parent | e28f5a55b0778f552dbfc5bb0b599ad2fa8d8a84 (diff) | |
download | gconf-176c77c783e93f136a2fc27ea5110a20337bdeac.tar.gz |
[gsettings] Use GConfChangeSet for write_keys
This enables us to do some pseudo-atomical transaction, which is good
enough.
Also simplify the code for write.
-rw-r--r-- | gsettings/gconfsettingsbackend.c | 83 |
1 files changed, 38 insertions, 45 deletions
diff --git a/gsettings/gconfsettingsbackend.c b/gsettings/gconfsettingsbackend.c index 70eff7d0..9980a021 100644 --- a/gsettings/gconfsettingsbackend.c +++ b/gsettings/gconfsettingsbackend.c @@ -421,12 +421,14 @@ gconf_settings_backend_read (GSettingsBackend *backend, } static gboolean -gconf_settings_backend_write_one (const gchar *key, - GVariant *value, - GConfSettingsBackend *gconf) +gconf_settings_backend_write (GSettingsBackend *backend, + const gchar *key, + GVariant *value, + gpointer origin_tag) { - GConfValue *gconf_value; - GError *error; + GConfSettingsBackend *gconf = GCONF_SETTINGS_BACKEND (backend); + GConfValue *gconf_value; + GError *error; gconf_value = gconf_settings_backend_gvariant_to_gconf_value (value); if (gconf_value == NULL) @@ -434,75 +436,66 @@ gconf_settings_backend_write_one (const gchar *key, error = NULL; gconf_client_set (gconf->priv->client, key, gconf_value, &error); + gconf_value_free (gconf_value); + if (error != NULL) { g_error_free (error); return FALSE; } + g_settings_backend_changed (backend, key, origin_tag); + return TRUE; + //FIXME: eat gconf notification for the change we just did } -typedef struct { - GConfSettingsBackend *gconf; - GTree *failed_keys; -} GConfSettingsBackendWriteHelper; - static gboolean -gconf_settings_backend_write_one_helper (const gchar *key, - GVariant *value, - GConfSettingsBackendWriteHelper *helper) +gconf_settings_backend_write_one_to_changeset (const gchar *key, + GVariant *value, + GConfChangeSet *changeset) { - gboolean success; + GConfValue *gconf_value; - success = gconf_settings_backend_write_one (key, value, helper->gconf); + gconf_value = gconf_settings_backend_gvariant_to_gconf_value (value); + if (gconf_value == NULL) + return TRUE; - if (!success) - g_tree_insert (helper->failed_keys, (gpointer) key, GINT_TO_POINTER(1)); + gconf_change_set_set_nocopy (changeset, key, gconf_value); return FALSE; } static gboolean -gconf_settings_backend_write (GSettingsBackend *backend, - const gchar *key, - GVariant *value, - gpointer origin_tag) -{ - GConfSettingsBackend *gconf = GCONF_SETTINGS_BACKEND (backend); - gboolean success; - - success = gconf_settings_backend_write_one (key, value, gconf); - - //FIXME: need to keep failed value in memory so we can return it if it's being requested before we do the second event - //FIXME: eat gconf notification for the change we just did - if (success) - g_settings_backend_changed (backend, key, origin_tag); - - return success; -} - -static gboolean gconf_settings_backend_write_keys (GSettingsBackend *backend, GTree *tree, gpointer origin_tag) { GConfSettingsBackend *gconf = GCONF_SETTINGS_BACKEND (backend); - GConfSettingsBackendWriteHelper helper; - gboolean success; + GConfChangeSet *changeset; + GConfChangeSet *reversed; + gboolean success; + + changeset = gconf_change_set_new (); - helper.gconf = gconf; - helper.failed_keys = g_tree_new ((GCompareFunc) g_strcmp0); + g_tree_foreach (tree, (GTraverseFunc) gconf_settings_backend_write_one_to_changeset, changeset); - g_tree_foreach (tree, (GTraverseFunc) gconf_settings_backend_write_one_helper, &helper); - g_settings_backend_changed_tree (backend, tree, origin_tag); + if (gconf_change_set_size (changeset) != g_tree_nnodes (tree)) + { + gconf_change_set_unref (changeset); + return FALSE; + } - success = g_tree_nnodes (helper.failed_keys) == 0; + reversed = gconf_client_reverse_change_set (gconf->priv->client, changeset, NULL); + success = gconf_client_commit_change_set (gconf->priv->client, changeset, FALSE, NULL); if (!success) - g_settings_backend_changed_tree (backend, helper.failed_keys, NULL); + gconf_client_commit_change_set (gconf->priv->client, reversed, FALSE, NULL); + else + g_settings_backend_changed_tree (backend, tree, origin_tag); - g_tree_unref (helper.failed_keys); + gconf_change_set_unref (changeset); + gconf_change_set_unref (reversed); return success; } |