[dconf] GSettings: implement _read_user_value()



commit 863fa5c1ee630a2ba3988896a957b922faceee87
Author: Ryan Lortie <desrt desrt ca>
Date:   Sun Oct 27 11:09:39 2013 -0700

    GSettings: implement _read_user_value()
    
    Implement g_settings_backend_read_user_value() in DConfSettingsBackend.
    
    This will help us support g_settings_get_user_value() properly.
    
    We add a new engine API to support this as well.  It takes a
    read_through queue, even though we don't bother using that from
    DConfSettingsBackend.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=668233

 configure.ac                     |    2 +-
 engine/dconf-engine.c            |   45 ++++++++++++++++++++++++++++++++++++++
 engine/dconf-engine.h            |    5 ++++
 gsettings/dconfsettingsbackend.c |   11 +++++++++
 4 files changed, 62 insertions(+), 1 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 90ad234..e603e20 100644
--- a/configure.ac
+++ b/configure.ac
@@ -43,7 +43,7 @@ GLIB_GSETTINGS
 GTK_DOC_CHECK([1.15])
 
 # Dependencies
-PKG_CHECK_MODULES(glib, glib-2.0 >= 2.35.2)
+PKG_CHECK_MODULES(glib, glib-2.0 >= 2.39.1)
 PKG_CHECK_MODULES(gio, gio-unix-2.0)
 PKG_CHECK_MODULES(dbus, dbus-1)
 
diff --git a/engine/dconf-engine.c b/engine/dconf-engine.c
index 7beff95..b82d842 100644
--- a/engine/dconf-engine.c
+++ b/engine/dconf-engine.c
@@ -546,6 +546,51 @@ dconf_engine_read (DConfEngine *engine,
   return value;
 }
 
+GVariant *
+dconf_engine_read_user_value (DConfEngine *engine,
+                              GQueue      *read_through,
+                              const gchar *key)
+{
+  gboolean found_key = FALSE;
+  GVariant *value = NULL;
+
+  /* This is a simplified version of the above.  We get to ignore locks
+   * and system-level settings.
+   *
+   * NB: we may find "NULL", which is why we have a separate variable.
+   */
+
+  /* Ignore the queues if we don't have a writable database */
+  if (engine->n_sources == 0 || !engine->sources[0]->writable)
+    return NULL;
+
+  /* First check read-through */
+  if (read_through)
+    found_key = dconf_engine_find_key_in_queue (read_through, key, &value);
+
+  /* Next pending/in-flight */
+  if (!found_key)
+    {
+      dconf_engine_lock_queues (engine);
+
+      /* Check the pending queue first because those were submitted
+       * more recently.
+       */
+      found_key = dconf_engine_find_key_in_queue (&engine->pending, key, &value) ||
+                  dconf_engine_find_key_in_queue (&engine->in_flight, key, &value);
+
+      dconf_engine_unlock_queues (engine);
+    }
+
+  /* Finally, check the user database */
+  if (!found_key && engine->sources[0]->values)
+    value = gvdb_table_get_value (engine->sources[0]->values, key);
+
+  dconf_engine_release_sources (engine);
+
+  return value;
+}
+
 gchar **
 dconf_engine_list (DConfEngine *engine,
                    const gchar *dir,
diff --git a/engine/dconf-engine.h b/engine/dconf-engine.h
index a52e971..a7677d3 100644
--- a/engine/dconf-engine.h
+++ b/engine/dconf-engine.h
@@ -125,6 +125,11 @@ GVariant *              dconf_engine_read                               (DConfEn
                                                                          const gchar             *key);
 
 G_GNUC_INTERNAL
+GVariant *              dconf_engine_read_user_value                    (DConfEngine             *engine,
+                                                                         GQueue                  
*read_through,
+                                                                         const gchar             *key);
+
+G_GNUC_INTERNAL
 gchar **                dconf_engine_list                               (DConfEngine             *engine,
                                                                          const gchar             *dir,
                                                                          gint                    *length);
diff --git a/gsettings/dconfsettingsbackend.c b/gsettings/dconfsettingsbackend.c
index 53f701e..85930d2 100644
--- a/gsettings/dconfsettingsbackend.c
+++ b/gsettings/dconfsettingsbackend.c
@@ -63,6 +63,16 @@ dconf_settings_backend_read (GSettingsBackend   *backend,
   return value;
 }
 
+static GVariant *
+dconf_settings_backend_read_user_value (GSettingsBackend   *backend,
+                                        const gchar        *key,
+                                        const GVariantType *expected_type)
+{
+  DConfSettingsBackend *dcsb = (DConfSettingsBackend *) backend;
+
+  return dconf_engine_read_user_value (dcsb->engine, NULL, key);
+}
+
 static gboolean
 dconf_settings_backend_write (GSettingsBackend *backend,
                               const gchar      *key,
@@ -193,6 +203,7 @@ dconf_settings_backend_class_init (GSettingsBackendClass *class)
   object_class->finalize = dconf_settings_backend_finalize;
 
   class->read = dconf_settings_backend_read;
+  class->read_user_value = dconf_settings_backend_read_user_value;
   class->write = dconf_settings_backend_write;
   class->write_tree = dconf_settings_backend_write_tree;
   class->reset = dconf_settings_backend_reset;


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