[dconf] port client library to Vala



commit 78084a0dbfd705f214f79f8e254a54f8cb1a391f
Author: Ryan Lortie <desrt desrt ca>
Date:   Mon Jul 19 12:17:48 2010 -0400

    port client library to Vala
    
     - the API is now completely implemented
    
     - update 'engine' API to be vala-bindable without annotations
    
     - update GSettings backend to new engine API
    
     - drop the readtype non-sense
    
     - build/api fixups for editor and commandline tool

 bin/.gitignore                   |    1 -
 bin/Makefile.am                  |    2 +-
 bin/dconf.vala                   |   25 ++
 client/.gitignore                |    4 +
 client/Makefile.am               |   13 +-
 client/dconf-client.c            |  620 --------------------------------------
 client/dconf-client.h            |   13 +-
 client/dconf-client.vala         |  143 +++++++++
 client/dconf.vapi                |   60 ----
 client/engine.vapi               |   32 ++
 editor/Makefile.am               |    4 +-
 engine/dconf-engine.c            |  130 ++++++---
 engine/dconf-engine.h            |   35 ++-
 gsettings/dconfsettingsbackend.c |   30 +-
 14 files changed, 350 insertions(+), 762 deletions(-)
---
diff --git a/bin/.gitignore b/bin/.gitignore
index b9cdeb5..d657c26 100644
--- a/bin/.gitignore
+++ b/bin/.gitignore
@@ -1,4 +1,3 @@
 dconf
-dconf-update
 *.c
 *.stamp
diff --git a/bin/Makefile.am b/bin/Makefile.am
index ee64db7..8559f7c 100644
--- a/bin/Makefile.am
+++ b/bin/Makefile.am
@@ -3,6 +3,6 @@ INCLUDES = -I$(top_srcdir)/common -I$(top_srcdir)/engine -I$(top_srcdir)/client
 
 bin_PROGRAMS = dconf
 
-dconf_VALAFLAGS = --pkg=gio-2.0 ../client/dconf.vapi --pkg=posix --pkg=gio-2.0
+dconf_VALAFLAGS = --vapidir ../client --pkg=gio-2.0 --pkg=posix --pkg=dconf
 dconf_LDADD = $(gio_LIBS) ../client/libdconf.la
 dconf_SOURCES = dconf.vala dconf-update.vala ../gvdb/gvdb-builder.c gvdb.vapi fixes.vapi
diff --git a/bin/dconf.vala b/bin/dconf.vala
index 2bc2ab1..d052a11 100644
--- a/bin/dconf.vala
+++ b/bin/dconf.vala
@@ -44,6 +44,19 @@ void do_write (DConf.Client client, string key, string val) throws Error {
 	client.write (key, Variant.parse (null, val));
 }
 
+void do_lock (DConf.Client client, string key, bool locked) throws Error {
+	DConf.verify_key (key);
+
+	client.set_lock (key, locked);
+}
+
+void do_watch (DConf.Client client, string name) throws Error {
+	DConf.verify_path (name);
+
+	client.watch (name);
+	new MainLoop (null, false).run ();
+}
+
 void main (string[] args) {
 	try {
 		var client = new DConf.Client ();
@@ -67,6 +80,18 @@ void main (string[] args) {
 				do_update ();
 				break;
 
+			case "lock":
+				do_lock (client, args[2], true);
+				break;
+
+			case "unlock":
+				do_lock (client, args[2], false);
+				break;
+
+			case "watch":
+				do_watch (client, args[2]);
+				break;
+
 			default:
 				error ("unknown command");
 				break;
diff --git a/client/.gitignore b/client/.gitignore
new file mode 100644
index 0000000..522859e
--- /dev/null
+++ b/client/.gitignore
@@ -0,0 +1,4 @@
+dconf.vapi
+*.c
+*.stamp
+*.deps
diff --git a/client/Makefile.am b/client/Makefile.am
index 9dc20b6..98dfab0 100644
--- a/client/Makefile.am
+++ b/client/Makefile.am
@@ -15,7 +15,7 @@ typelibdir = $(libdir)/girepository-1.0
 typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
 endif
 
-AM_CFLAGS = -std=c89 -Wall -Wmissing-prototypes -Wwrite-strings
+AM_CFLAGS = -std=c89 -Wall -Wmissing-prototypes -Wwrite-strings -D__dconf_h__
 INCLUDES = -I$(top_srcdir)/common -I$(top_srcdir)/gvdb -I$(top_srcdir)/engine $(gio_CFLAGS)
 
 lib_LTLIBRARIES = libdconf.la
@@ -30,7 +30,16 @@ libdconf_la_SOURCES = \
 	../common/dconf-paths.c		\
 	../engine/dconf-engine.c	\
 	../gvdb/gvdb-reader.c		\
-	dconf-client.c
+	dconf-client.vala engine.vapi
+libdconf_la_VALAFLAGS = --library dconf --pkg=gio-2.0
+
+dconf.vapi: libdconf.la
+
+dconf.deps:
+	echo gio-2.0 > dconf.deps
+
+vapi_DATA = dconf.vapi dconf.deps
+vapidir = $(datadir)/vala/vapi
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = dconf.pc
diff --git a/client/dconf-client.h b/client/dconf-client.h
index 13dc558..137fe18 100644
--- a/client/dconf-client.h
+++ b/client/dconf-client.h
@@ -34,9 +34,10 @@ typedef GObjectClass DConfClientClass;
 typedef struct _DConfClient DConfClient;
 
 typedef void          (*DConfWatchFunc)                                 (DConfClient          *client,
-                                                                         const gchar          *tag,
                                                                          const gchar          *path,
                                                                          const gchar * const  *items,
+                                                                         gint                  n_items,
+                                                                         const gchar          *tag,
                                                                          gpointer              user_data);
 
 GType                   dconf_client_get_type                           (void);
@@ -55,7 +56,7 @@ GVariant *              dconf_client_read_no_default                    (DConfCl
 
 gchar **                dconf_client_list                               (DConfClient          *client,
                                                                          const gchar          *dir,
-                                                                         gsize                *length);
+                                                                         gint                 *length);
 
 gboolean                dconf_client_is_writable                        (DConfClient          *client,
                                                                          const gchar          *key,
@@ -116,24 +117,28 @@ gboolean                dconf_client_write_many_finish                  (DConfCl
 
 gboolean                dconf_client_watch                              (DConfClient          *client,
                                                                          const gchar          *name,
+                                                                         GCancellable         *cancellable,
                                                                          GError              **error);
 void                    dconf_client_watch_async                        (DConfClient          *client,
                                                                          const gchar          *name,
+                                                                         GCancellable         *cancellable,
                                                                          GAsyncReadyCallback   callback,
                                                                          gpointer              user_data);
 gboolean                dconf_client_watch_finish                       (DConfClient          *client,
                                                                          GAsyncResult         *result,
-                                                                         gpointer              user_data);
+                                                                         GError              **error);
 gboolean                dconf_client_unwatch                            (DConfClient          *client,
                                                                          const gchar          *name,
+                                                                         GCancellable         *cancellable,
                                                                          GError              **error);
 void                    dconf_client_unwatch_async                      (DConfClient          *client,
                                                                          const gchar          *name,
+                                                                         GCancellable         *cancellable,
                                                                          GAsyncReadyCallback   callback,
                                                                          gpointer              user_data);
 gboolean                dconf_client_unwatch_finish                     (DConfClient          *client,
                                                                          GAsyncResult         *result,
-                                                                         gpointer              user_data);
+                                                                         GError              **error);
 G_END_DECLS
 
 #endif /* __dconf_client_h__ */
diff --git a/client/dconf-client.vala b/client/dconf-client.vala
new file mode 100644
index 0000000..0e71b7c
--- /dev/null
+++ b/client/dconf-client.vala
@@ -0,0 +1,143 @@
+[CCode (cheader_filename = "dconf.h")]
+namespace DConf {
+	public delegate void WatchFunc (DConf.Client client, string path, string[] items, string tag);
+
+	public class Client : Object {
+		Engine engine;
+		WatchFunc watch_func;
+
+		static BusType get_bus_type (EngineMessage dcem) {
+			switch (dcem.bus_type) {
+				case 'e':
+					return BusType.SESSION;
+				case 'y':
+					return BusType.SYSTEM;
+				default:
+					assert_not_reached ();
+			}
+		}
+
+		void call_sync (EngineMessage dcem, out string tag, Cancellable? cancellable) throws Error {
+			var connection = Bus.get_sync (get_bus_type (dcem), cancellable);
+
+			foreach (var message in dcem.body) {
+				var reply = connection.call_sync (dcem.destination, dcem.object_path, dcem  interface, dcem.method,
+				                                  message, dcem.reply_type, DBusCallFlags.NONE, -1, cancellable);
+				if (dcem.tagged) {
+					reply.get ("(s)", out tag);
+				}
+			}
+		}
+
+		async void call_async (EngineMessage dcem, out string tag, Cancellable? cancellable) throws Error {
+			var connection = yield Bus.get (get_bus_type (dcem), cancellable);
+
+			foreach (var message in dcem.body) {
+				var reply = yield connection.call (dcem.destination, dcem.object_path, dcem  interface, dcem.method,
+				                                   message, dcem.reply_type, DBusCallFlags.NONE, -1, cancellable);
+				if (dcem.tagged) {
+					reply.get ("(s)", out tag);
+				}
+			}
+		}
+
+		public bool write (string key, Variant? value, out string tag = null, Cancellable? cancellable = null) throws Error {
+			if (&tag == null) { /* bgo #591673 */
+				string junk;
+				call_sync (engine.write (key, value), out junk, cancellable);
+			} else {
+				call_sync (engine.write (key, value), out tag, cancellable);
+			}
+			return true;
+		}
+
+		public async bool write_async (string key, Variant? value, out string tag = null, Cancellable? cancellable = null) throws Error {
+			yield call_async (engine.write (key, value), out tag, cancellable);
+			return true;
+		}
+
+		public bool set_lock (string key, bool locked, Cancellable? cancellable = null) throws Error {
+			call_sync (engine.set_lock (key, locked), null, cancellable);
+			return true;
+		}
+
+		public async bool set_lock_async (string key, bool locked, Cancellable? cancellable = null) throws Error {
+			yield call_async (engine.set_lock (key, locked), null, cancellable);
+			return true;
+		}
+
+		public Variant? read (string key) {
+			return engine.read (key);
+		}
+
+		public Variant? read_default (string key) {
+			return engine.read_default (key);
+		}
+
+		public Variant? read_no_default (string key) {
+			return engine.read_no_default (key);
+		}
+
+		public string[] list (string dir) {
+			return engine.list (dir);
+		}
+
+		public bool watch (string name, Cancellable? cancellable = null) throws GLib.Error {
+			call_sync (engine.watch (name), null, cancellable);
+			return true;
+		}
+
+		public async bool watch_async (string name, Cancellable? cancellable = null) throws GLib.Error {
+			yield call_async (engine.watch (name), null, cancellable);
+			return true;
+		}
+
+		public bool unwatch (string name, Cancellable? cancellable = null) throws GLib.Error {
+			call_sync (engine.unwatch (name), null, cancellable);
+			return true;
+		}
+
+		public async bool unwatch_async (string name, Cancellable? cancellable = null) throws GLib.Error {
+			yield call_async (engine.unwatch (name), null, cancellable);
+			return true;
+		}
+
+		static Variant? service_func (EngineMessage dcem) {
+			try {
+				var connection = Bus.get_sync (get_bus_type (dcem), null);
+				return connection.call_sync (dcem.destination, dcem.object_path, dcem  interface, dcem.method,
+				                             dcem.body, dcem.reply_type, DBusCallFlags.NONE, -1, null);
+			} catch {
+				return null;
+			}
+		}
+
+		public Client (string? profile = null, owned WatchFunc? watch_func = null) {
+			Engine.set_service_func (service_func);
+
+			engine = new Engine (profile);
+			this.watch_func = watch_func;
+		}
+	}
+
+	public extern bool is_path (string str, Error *error = null);
+	public extern bool is_key (string str, Error *error = null);
+	public extern bool is_dir (string str, Error *error = null);
+	public extern bool is_rel_path (string str, Error *error = null);
+	public extern bool is_rel_key (string str, Error *error = null);
+	public extern bool is_rel_dir (string str, Error *error = null);
+	[CCode (cname = "dconf_is_path")]
+	public extern bool verify_path (string str) throws Error;
+	[CCode (cname = "dconf_is_key")]
+	public extern bool verify_key (string str) throws Error;
+	[CCode (cname = "dconf_is_dir")]
+	public extern bool verify_dir (string str) throws Error;
+	[CCode (cname = "dconf_is_rel_path")]
+	public extern bool verify_rel_path (string str) throws Error;
+	[CCode (cname = "dconf_is_rel_key")]
+	public extern bool verify_rel_key (string str) throws Error;
+	[CCode (cname = "dconf_is_rel_dir")]
+	public extern bool verify_rel_dir (string str) throws Error;
+}
+
+// vim:noet sw=4 ts=4
diff --git a/client/engine.vapi b/client/engine.vapi
new file mode 100644
index 0000000..b0a6909
--- /dev/null
+++ b/client/engine.vapi
@@ -0,0 +1,32 @@
+namespace DConf {
+	[Compact]
+	[CCode (cheader_filename = "dconf-engine.h")]
+	class Engine {
+		internal Engine (string? profile);
+		internal EngineMessage write (string key, GLib.Variant? value) throws GLib.Error;
+		internal GLib.Variant? read (string key);
+		internal GLib.Variant? read_default (string key);
+		internal GLib.Variant? read_no_default (string key);
+		internal EngineMessage set_lock (string key, bool locked);
+		internal string[] list (string dir, void*junk = null);
+		internal static void set_service_func (ServiceFunc func);
+		internal EngineMessage watch (string name);
+		internal EngineMessage unwatch (string name);
+	}
+
+	struct EngineMessage {
+		int bus_type;
+		string destination;
+		string object_path;
+		string @interface;
+		string method;
+		bool tagged;
+		GLib.VariantType reply_type;
+		GLib.Variant body;
+	}
+
+	[CCode (has_target = false)]
+	delegate GLib.Variant? ServiceFunc (EngineMessage dcem);
+}
+
+// vim:noet sw=4 ts=4
diff --git a/editor/Makefile.am b/editor/Makefile.am
index a5ec825..7e29429 100644
--- a/editor/Makefile.am
+++ b/editor/Makefile.am
@@ -1,6 +1,6 @@
 bin_PROGRAMS = dconf-editor
 
 AM_CFLAGS = $(gtk_CFLAGS) $(gee_CFLAGS) $(libxml_CFLAGS) -I$(top_srcdir)/common -I$(top_srcdir)/client
-AM_VALAFLAGS = --pkg gee-1.0 --pkg gtk+-2.0 --pkg libxml-2.0
+AM_VALAFLAGS = --vapidir ../client --pkg gee-1.0 --pkg gtk+-2.0 --pkg libxml-2.0 --pkg dconf
 dconf_editor_LDADD = ../client/libdconf.la $(gtk_LIBS) $(gee_LIBS) $(libxml_LIBS)
-dconf_editor_SOURCES = dconf-editor.vala dconf-model.vala dconf-schema.vala dconf-view.vala ../client/dconf.vapi
+dconf_editor_SOURCES = dconf-editor.vala dconf-model.vala dconf-schema.vala dconf-view.vala
diff --git a/engine/dconf-engine.c b/engine/dconf-engine.c
index cd05c79..73aadc7 100644
--- a/engine/dconf-engine.c
+++ b/engine/dconf-engine.c
@@ -34,6 +34,25 @@
 static DConfEngineServiceFunc dconf_engine_service_func;
 
 void
+dconf_engine_message_destroy (DConfEngineMessage *dcem)
+{
+  if (dcem->body)
+    {
+      g_variant_unref (dcem->body);
+      dcem->body = NULL;
+    }
+}
+
+void
+dconf_engine_message_copy (DConfEngineMessage *orig,
+                           DConfEngineMessage *copy)
+{
+  *copy = *orig;
+  if (orig->body)
+    copy->body = g_variant_ref (orig->body);
+}
+
+void
 dconf_engine_set_service_func (DConfEngineServiceFunc func)
 {
   dconf_engine_service_func = func;
@@ -60,7 +79,7 @@ dconf_engine_get_session_dir (void)
           dcem.interface = "org.freedesktop.DBus.Properties";
           dcem.method = "Get";
           dcem.reply_type = G_VARIANT_TYPE ("(v)");
-          dcem.body = g_variant_new ("(ss)",
+          dcem.body = g_variant_new ("((ss))",
                                      "ca.desrt.dconf.WriterInfo",
                                      "ShmDirectory");
 
@@ -92,7 +111,6 @@ dconf_engine_get_session_dir (void)
 
 struct _DConfEngine
 {
-  gint        ref_count;
   guint64     state;
 
   guint8     *shm;
@@ -288,7 +306,6 @@ dconf_engine_new (const gchar *profile)
   gint i;
 
   engine = g_slice_new (DConfEngine);
-  engine->ref_count = 1;
   engine->shm = NULL;
 
   if (profile == NULL)
@@ -338,42 +355,75 @@ dconf_engine_new (const gchar *profile)
   return engine;
 }
 
-DConfEngine *
-dconf_engine_ref (DConfEngine *engine)
+void
+dconf_engine_free (DConfEngine *engine)
 {
-  g_atomic_int_inc (&engine->ref_count);
+  gint i;
 
-  return engine;
-}
+  for (i = 0; i < engine->n_dbs; i++)
+    {
+      g_free (engine->object_paths[i]);
+      g_free (engine->names[i]);
+
+      if (engine->gvdbs[i])
+        gvdb_table_unref (engine->gvdbs[i]);
+    }
+
+  if (engine->shm)
+    {
+      munmap (engine->shm, 1);
+    }
+
+  g_free (engine->object_paths);
+  g_free (engine->names);
+  g_free (engine->gvdbs);
 
-void
-dconf_engine_unref (DConfEngine *engine)
-{
   g_slice_free (DConfEngine, engine);
 }
 
 GVariant *
-dconf_engine_read (DConfEngine   *engine,
-                   const gchar   *key,
-                   DConfReadType  type)
+dconf_engine_read (DConfEngine  *engine,
+                   const gchar  *key)
 {
   GVariant *value = NULL;
+  gint i;
 
   dconf_engine_refresh (engine);
 
-  if (type != DCONF_READ_RESET)
-    {
-      if (engine->gvdbs[0])
-        value = gvdb_table_get_value (engine->gvdbs[0], key);
-    }
+  if (engine->gvdbs[0])
+    value = gvdb_table_get_value (engine->gvdbs[0], key);
 
-  if (type != DCONF_READ_SET)
-    {
-      gint i;
+  for (i = 1; i < engine->n_dbs && value == NULL; i++)
+    value = gvdb_table_get_value (engine->gvdbs[i], key);
 
-      for (i = 1; i < engine->n_dbs && value == NULL; i++)
-        value = gvdb_table_get_value (engine->gvdbs[i], key);
-    }
+  return value;
+}
+
+GVariant *
+dconf_engine_read_default (DConfEngine  *engine,
+                           const gchar  *key)
+{
+  GVariant *value = NULL;
+  gint i;
+
+  dconf_engine_refresh_system (engine);
+
+  for (i = 1; i < engine->n_dbs && value == NULL; i++)
+    value = gvdb_table_get_value (engine->gvdbs[i], key);
+
+  return value;
+}
+
+GVariant *
+dconf_engine_read_no_default (DConfEngine  *engine,
+                              const gchar  *key)
+{
+  GVariant *value = NULL;
+
+  dconf_engine_refresh_user (engine);
+
+  if (engine->gvdbs[0])
+    value = gvdb_table_get_value (engine->gvdbs[0], key);
 
   return value;
 }
@@ -391,14 +441,14 @@ dconf_engine_make_match_rule (DConfEngine        *engine,
   dcem->destination = "org.freedesktop.DBus";
   dcem->object_path = engine->object_paths[0];
   dcem->interface = "org.freedesktop.DBus";
-  dcem->body = g_variant_ref_sink (g_variant_new ("(s)", rule));
+  dcem->body = g_variant_ref_sink (g_variant_new ("((s))", rule));
   g_free (rule);
 }
 
 void
 dconf_engine_watch (DConfEngine        *engine,
-                    DConfEngineMessage *dcem,
-                    const gchar        *name)
+                    const gchar        *name,
+                    DConfEngineMessage *dcem)
 {
   dconf_engine_make_match_rule (engine, dcem, name);
   dcem->method = "AddMatch";
@@ -406,8 +456,8 @@ dconf_engine_watch (DConfEngine        *engine,
 
 void
 dconf_engine_unwatch (DConfEngine        *engine,
-                      DConfEngineMessage *dcem,
-                      const gchar        *name)
+                      const gchar        *name,
+                      DConfEngineMessage *dcem)
 {
   dconf_engine_make_match_rule (engine, dcem, name);
   dcem->method = "RemoveMatch";
@@ -415,12 +465,12 @@ dconf_engine_unwatch (DConfEngine        *engine,
 
 gboolean
 dconf_engine_is_writable (DConfEngine         *engine,
-                          DConfEngineMessage  *dcem,
                           const gchar         *name,
+                          DConfEngineMessage  *dcem,
                           GError             **error)
 {
   dcem->bus_type = 'e';
-  dcem->body = NULL;
+  dcem->body = g_variant_new ("()");
 
   return TRUE;
 }
@@ -451,20 +501,20 @@ dconf_engine_dcem (DConfEngine        *engine,
   dcem->destination = "ca.desrt.dconf";
   dcem->object_path = engine->object_paths[0];
   dcem->interface = "ca.desrt.dconf.Writer";
-  dcem->reply_type = G_VARIANT_TYPE ("(t)");
+  dcem->reply_type = G_VARIANT_TYPE ("(s)");
   dcem->method = method;
+  dcem->tagged = TRUE;
 
   va_start (ap, format_string);
-  dcem->body = g_variant_ref_sink (g_variant_new_va (format_string,
-                                                     NULL, &ap));
+  dcem->body = g_variant_ref_sink (g_variant_new_variant (g_variant_new_va (format_string, NULL, &ap)));
   va_end (ap);
 }
 
 gboolean
 dconf_engine_write (DConfEngine         *engine,
-                    DConfEngineMessage  *dcem,
                     const gchar         *name,
                     GVariant            *value,
+                    DConfEngineMessage  *dcem,
                     GError             **error)
 {
   dconf_engine_dcem (engine, dcem,
@@ -476,10 +526,10 @@ dconf_engine_write (DConfEngine         *engine,
 
 gboolean
 dconf_engine_write_many (DConfEngine          *engine,
-                         DConfEngineMessage   *dcem,
                          const gchar          *prefix,
                          const gchar * const  *keys,
                          GVariant            **values,
+                         DConfEngineMessage   *dcem,
                          GError              **error)
 {
   GVariantBuilder builder;
@@ -498,9 +548,9 @@ dconf_engine_write_many (DConfEngine          *engine,
 
 void
 dconf_engine_set_lock (DConfEngine        *engine,
-                       DConfEngineMessage *dcem,
                        const gchar        *path,
-                       gboolean            locked)
+                       gboolean            locked,
+                       DConfEngineMessage *dcem)
 {
   dconf_engine_dcem (engine, dcem, "SetLock", "(sb)", path, locked);
 }
@@ -509,7 +559,7 @@ gchar **
 dconf_engine_list (DConfEngine    *engine,
                    const gchar    *dir,
                    DConfResetList *resets,
-                   gsize          *length)
+                   gint           *length)
 {
   gchar **list;
 
diff --git a/engine/dconf-engine.h b/engine/dconf-engine.h
index 83c80ef..90580d3 100644
--- a/engine/dconf-engine.h
+++ b/engine/dconf-engine.h
@@ -35,13 +35,16 @@ typedef struct
   const gchar *object_path;
   const gchar *interface;
   const gchar *method;
+  gboolean     tagged;
   const GVariantType *reply_type;
   GVariant    *body;
 } DConfEngineMessage;
 
 
-
 typedef GVariant *    (*DConfEngineServiceFunc)                         (DConfEngineMessage      *message);
+void                    dconf_engine_message_copy                       (DConfEngineMessage      *orig,
+                                                                         DConfEngineMessage      *copy);
+void                    dconf_engine_message_destroy                    (DConfEngineMessage      *message);
 
 void                    dconf_engine_set_service_func                   (DConfEngineServiceFunc   func);
 DConfEngine *           dconf_engine_new                                (const gchar             *profile);
@@ -49,42 +52,44 @@ DConfEngine *           dconf_engine_new_for_db                         (DConfEn
                                                                          const gchar             *db_name);
 guint64                 dconf_engine_get_state                          (DConfEngine             *engine);
 
-void                    dconf_engine_unref                              (DConfEngine             *engine);
-DConfEngine *           dconf_engine_ref                                (DConfEngine             *engine);
+void                    dconf_engine_free                               (DConfEngine             *engine);
 
 GVariant *              dconf_engine_read                               (DConfEngine             *engine,
-                                                                         const gchar             *key,
-                                                                         DConfReadType            type);
+                                                                         const gchar             *key);
+GVariant *              dconf_engine_read_default                       (DConfEngine             *engine,
+                                                                         const gchar             *key);
+GVariant *              dconf_engine_read_no_default                    (DConfEngine             *engine,
+                                                                         const gchar             *key);
 gchar **                dconf_engine_list                               (DConfEngine             *engine,
                                                                          const gchar             *path,
                                                                          DConfResetList          *resets,
-                                                                         gsize                   *length);
+                                                                         gint                    *length);
 
 void                    dconf_engine_get_service_info                   (DConfEngine             *engine,
                                                                          const gchar            **bus_type,
                                                                          const gchar            **destination,
                                                                          const gchar            **object_path);
 gboolean                dconf_engine_is_writable                        (DConfEngine             *engine,
-                                                                         DConfEngineMessage      *message,
                                                                          const gchar             *name,
+                                                                         DConfEngineMessage      *message,
                                                                          GError                 **error);
 gboolean                dconf_engine_write                              (DConfEngine             *engine,
-                                                                         DConfEngineMessage      *message,
                                                                          const gchar             *key,
                                                                          GVariant                *value,
+                                                                         DConfEngineMessage      *message,
                                                                          GError                 **error);
 gboolean                dconf_engine_write_many                         (DConfEngine             *engine,
-                                                                         DConfEngineMessage      *message,
                                                                          const gchar             *prefix,
                                                                          const gchar * const     *keys,
                                                                          GVariant               **values,
+                                                                         DConfEngineMessage      *message,
                                                                          GError                 **error);
 void                    dconf_engine_watch                              (DConfEngine             *engine,
-                                                                         DConfEngineMessage      *message,
-                                                                         const gchar             *name);
+                                                                         const gchar             *name,
+                                                                         DConfEngineMessage      *message);
 void                    dconf_engine_unwatch                            (DConfEngine             *engine,
-                                                                         DConfEngineMessage      *message,
-                                                                         const gchar             *name);
+                                                                         const gchar             *name,
+                                                                         DConfEngineMessage      *message);
 gboolean                dconf_engine_decode_notify                      (DConfEngine             *engine,
                                                                          const gchar             *anti_expose,
                                                                          const gchar            **prefix,
@@ -95,9 +100,9 @@ gboolean                dconf_engine_decode_notify                      (DConfEn
                                                                          const gchar             *member,
                                                                          GVariant                *body);
 void                    dconf_engine_set_lock                           (DConfEngine             *engine,
-                                                                         DConfEngineMessage      *message,
                                                                          const gchar             *path,
-                                                                         gboolean                 locked);
+                                                                         gboolean                 locked,
+                                                                         DConfEngineMessage      *message);
 
 gboolean                dconf_engine_interpret_reply                    (DConfEngineMessage      *message,
                                                                          const gchar             *sender,
diff --git a/gsettings/dconfsettingsbackend.c b/gsettings/dconfsettingsbackend.c
index 3ed35f3..916f57e 100644
--- a/gsettings/dconfsettingsbackend.c
+++ b/gsettings/dconfsettingsbackend.c
@@ -343,7 +343,6 @@ dconf_settings_backend_read (GSettingsBackend   *backend,
                              gboolean            default_value)
 {
   DConfSettingsBackend *dcsb = (DConfSettingsBackend *) backend;
-  DConfReadType type;
 
   if (!default_value)
     {
@@ -352,12 +351,10 @@ dconf_settings_backend_read (GSettingsBackend   *backend,
       if (dconf_settings_backend_scan_outstanding (dcsb, key, &value))
         return value;
 
-      type = DCONF_READ_NORMAL;
+      return dconf_engine_read (dcsb->engine, key);
     }
   else
-    type = DCONF_READ_RESET;
-
-  return dconf_engine_read (dcsb->engine, key, type);
+    return dconf_engine_read_default (dcsb->engine, key);
 }
 
 static gchar **
@@ -367,11 +364,7 @@ dconf_settings_backend_list (GSettingsBackend  *backend,
                              gsize              n_resets,
                              gsize             *length)
 {
-  DConfSettingsBackend *dcsb = (DConfSettingsBackend *) backend;
-
-  g_assert (n_resets == 0);
-
-  return dconf_engine_list (dcsb->engine, dir, NULL, length);
+  g_assert_not_reached ();
 }
 
 static void
@@ -380,12 +373,15 @@ dconf_settings_backend_send (GDBusConnection    *bus,
                              volatile guint32   *serial)
 {
   GDBusMessage *message;
+  GVariant *body;
 
   message = g_dbus_message_new_method_call (dcem->destination,
                                             dcem->object_path,
                                             dcem->interface,
                                             dcem->method);
-  g_dbus_message_set_body (message, dcem->body);
+  body = g_variant_get_child_value (dcem->body, 0);
+  g_dbus_message_set_body (message, body);
+  g_variant_unref (body);
 
   if (serial)
     g_dbus_connection_send_message (bus, message, serial, NULL);
@@ -462,7 +458,7 @@ dconf_settings_backend_write (GSettingsBackend *backend,
   DConfEngineMessage dcem;
   GDBusConnection *bus;
 
-  if (!dconf_engine_write (dcsb->engine, &dcem, path_or_key, value, NULL))
+  if (!dconf_engine_write (dcsb->engine, path_or_key, value, &dcem, NULL))
     return FALSE;
 
   if (!dconf_settings_backend_get_bus (dcsb, &bus, &dcem))
@@ -499,8 +495,8 @@ dconf_settings_backend_write_tree (GSettingsBackend *backend,
 
   g_settings_backend_flatten_tree (tree, &prefix, &keys, &values);
 
-  if (dconf_engine_write_many (dcsb->engine, &dcem,
-                               prefix, keys, values, NULL))
+  if (dconf_engine_write_many (dcsb->engine,
+                               prefix, keys, values, &dcem, NULL))
     {
       if (dconf_settings_backend_get_bus (dcsb, &bus, &dcem))
         {
@@ -538,7 +534,7 @@ dconf_settings_backend_get_writable (GSettingsBackend *backend,
   DConfEngineMessage dcem;
   GDBusConnection *bus;
 
-  if (!dconf_engine_is_writable (dcsb->engine, &dcem, name, NULL))
+  if (!dconf_engine_is_writable (dcsb->engine, name, &dcem, NULL))
     return FALSE;
 
   return dconf_settings_backend_get_bus (dcsb, &bus, &dcem);
@@ -552,7 +548,7 @@ dconf_settings_backend_subscribe (GSettingsBackend *backend,
   DConfEngineMessage dcem;
   GDBusConnection *bus;
 
-  dconf_engine_watch (dcsb->engine, &dcem, name);
+  dconf_engine_watch (dcsb->engine, name, &dcem);
 
   if (dconf_settings_backend_get_bus (dcsb, &bus, &dcem))
     dconf_settings_backend_send (bus, &dcem, NULL);
@@ -566,7 +562,7 @@ dconf_settings_backend_unsubscribe (GSettingsBackend *backend,
   DConfEngineMessage dcem;
   GDBusConnection *bus;
 
-  dconf_engine_unwatch (dcsb->engine, &dcem, name);
+  dconf_engine_unwatch (dcsb->engine, name, &dcem);
 
   if (dconf_settings_backend_get_bus (dcsb, &bus, &dcem))
     dconf_settings_backend_send (bus, &dcem, NULL);



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