summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Untz <vuntz@gnome.org>2010-04-15 22:18:59 -0400
committerVincent Untz <vuntz@gnome.org>2010-04-15 22:21:08 -0400
commit176c77c783e93f136a2fc27ea5110a20337bdeac (patch)
tree5c6676396654de28e9d47d1d3435ec7eb8a21b77
parente28f5a55b0778f552dbfc5bb0b599ad2fa8d8a84 (diff)
downloadgconf-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.c83
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;
}