|
 |
a9c134 |
--- a/meson.build
|
|
 |
a9c134 |
+++ b/meson.build
|
|
 |
a9c134 |
@@ -75,6 +75,7 @@ gio_unix_req_version = '>= 2.25.7'
|
|
 |
a9c134 |
|
|
 |
a9c134 |
glib_dep = dependency('glib-2.0', version: '>= 2.44.0')
|
|
 |
a9c134 |
gio_unix_dep = dependency('gio-unix-2.0', version: gio_unix_req_version)
|
|
 |
a9c134 |
+dbus_1_dep = dependency('dbus-1')
|
|
 |
a9c134 |
|
|
 |
a9c134 |
gio_querymodules = find_program('gio-querymodules', required: false)
|
|
 |
a9c134 |
if gio_querymodules.found()
|
|
 |
a9c134 |
@@ -101,6 +102,7 @@ subdir('gvdb')
|
|
 |
a9c134 |
subdir('common')
|
|
 |
a9c134 |
subdir('engine')
|
|
 |
a9c134 |
subdir('service')
|
|
 |
a9c134 |
+subdir('dbus-1')
|
|
 |
a9c134 |
subdir('gdbus')
|
|
 |
a9c134 |
subdir('gsettings')
|
|
 |
a9c134 |
subdir('client')
|
|
 |
a9c134 |
--- /dev/null
|
|
 |
a9c134 |
+++ b/dbus-1/meson.build
|
|
 |
a9c134 |
@@ -0,0 +1,43 @@
|
|
 |
a9c134 |
+client_inc = include_directories('.')
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+libdbus_1_sources = files('dconf-libdbus-1.c', 'dconf-libdbus-1.h')
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+cflags = '-DG_LOG_DOMAIN="@0@"'.format(meson.project_name())
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+libdconf_libdbus_1_shared = static_library(
|
|
 |
a9c134 |
+ meson.project_name() + '-libdbus-1-shared',
|
|
 |
a9c134 |
+ sources: libdbus_1_sources,
|
|
 |
a9c134 |
+ include_directories: top_inc,
|
|
 |
a9c134 |
+ dependencies: [gio_unix_dep, dbus_1_dep],
|
|
 |
a9c134 |
+ c_args: cflags,
|
|
 |
a9c134 |
+ pic: true
|
|
 |
a9c134 |
+)
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+libdconf_libdbus_1 = static_library(
|
|
 |
a9c134 |
+ meson.project_name() + '-libdbus-1',
|
|
 |
a9c134 |
+ sources: libdbus_1_sources,
|
|
 |
a9c134 |
+ include_directories: top_inc,
|
|
 |
a9c134 |
+ dependencies: [gio_unix_dep, dbus_1_dep],
|
|
 |
a9c134 |
+ c_args: cflags,
|
|
 |
a9c134 |
+)
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+dbus_1_sources = files('dconf-dbus-1.c')
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+libdconf_dbus_1 = shared_library(
|
|
 |
a9c134 |
+ meson.project_name() + '-dbus-1',
|
|
 |
a9c134 |
+ sources: dbus_1_sources,
|
|
 |
a9c134 |
+ version: '0.0.0',
|
|
 |
a9c134 |
+ soversion: '0',
|
|
 |
a9c134 |
+ include_directories: top_inc,
|
|
 |
a9c134 |
+ dependencies: [gio_unix_dep, dbus_1_dep],
|
|
 |
a9c134 |
+ c_args: cflags,
|
|
 |
a9c134 |
+ link_with: [
|
|
 |
a9c134 |
+ libdconf_common_hidden,
|
|
 |
a9c134 |
+ libdconf_engine_shared,
|
|
 |
a9c134 |
+ libdconf_libdbus_1_shared,
|
|
 |
a9c134 |
+ libdconf_shm_shared,
|
|
 |
a9c134 |
+ libgvdb_shared
|
|
 |
a9c134 |
+ ],
|
|
 |
a9c134 |
+ install: true,
|
|
 |
a9c134 |
+ install_dir: dconf_libdir
|
|
 |
a9c134 |
+)
|
|
 |
a9c134 |
--- /dev/null
|
|
 |
a9c134 |
+++ b/dbus-1/dconf-dbus-1.c
|
|
 |
a9c134 |
@@ -0,0 +1,188 @@
|
|
 |
a9c134 |
+/**
|
|
 |
a9c134 |
+ * Copyright © 2010 Canonical Limited
|
|
 |
a9c134 |
+ *
|
|
 |
a9c134 |
+ * This program is free software: you can redistribute it and/or modify
|
|
 |
a9c134 |
+ * it under the terms of the GNU General Public License as published by
|
|
 |
a9c134 |
+ * the Free Software Foundation, either version 3 of the licence, or (at
|
|
 |
a9c134 |
+ * your option) any later version.
|
|
 |
a9c134 |
+ *
|
|
 |
a9c134 |
+ * This program is distributed in the hope that it will be useful, but
|
|
 |
a9c134 |
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
 |
a9c134 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
 |
a9c134 |
+ * General Public License for more details.
|
|
 |
a9c134 |
+ *
|
|
 |
a9c134 |
+ * You should have received a copy of the GNU General Public License
|
|
 |
a9c134 |
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
 |
a9c134 |
+ *
|
|
 |
a9c134 |
+ * Author: Ryan Lortie <desrt@desrt.ca>
|
|
 |
a9c134 |
+ **/
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#include "config.h"
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#include "dconf-dbus-1.h"
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#include "../engine/dconf-engine.h"
|
|
 |
a9c134 |
+#include "dconf-libdbus-1.h"
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#include <string.h>
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+struct _DConfDBusClient
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ DConfEngine *engine;
|
|
 |
a9c134 |
+ GSList *watches;
|
|
 |
a9c134 |
+ gint ref_count;
|
|
 |
a9c134 |
+};
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+typedef struct
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ gchar *path;
|
|
 |
a9c134 |
+ DConfDBusNotify notify;
|
|
 |
a9c134 |
+ gpointer user_data;
|
|
 |
a9c134 |
+} Watch;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+void
|
|
 |
a9c134 |
+dconf_engine_change_notify (DConfEngine *engine,
|
|
 |
a9c134 |
+ const gchar *prefix,
|
|
 |
a9c134 |
+ const gchar * const *changes,
|
|
 |
a9c134 |
+ const gchar *tag,
|
|
 |
a9c134 |
+ gboolean is_writability,
|
|
 |
a9c134 |
+ gpointer origin_tag,
|
|
 |
a9c134 |
+ gpointer user_data)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ DConfDBusClient *dcdbc = user_data;
|
|
 |
a9c134 |
+ gchar **my_changes;
|
|
 |
a9c134 |
+ gint n_changes;
|
|
 |
a9c134 |
+ GSList *iter;
|
|
 |
a9c134 |
+ gint i;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ n_changes = g_strv_length ((gchar **) changes);
|
|
 |
a9c134 |
+ my_changes = g_new (gchar *, n_changes + 1);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ for (i = 0; i < n_changes; i++)
|
|
 |
a9c134 |
+ my_changes[i] = g_strconcat (prefix, changes[i], NULL);
|
|
 |
a9c134 |
+ my_changes[i] = NULL;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ for (iter = dcdbc->watches; iter; iter = iter->next)
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ Watch *watch = iter->data;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ for (i = 0; i < n_changes; i++)
|
|
 |
a9c134 |
+ if (g_str_has_prefix (my_changes[i], watch->path))
|
|
 |
a9c134 |
+ watch->notify (dcdbc, my_changes[i], watch->user_data);
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_strfreev (my_changes);
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+GVariant *
|
|
 |
a9c134 |
+dconf_dbus_client_read (DConfDBusClient *dcdbc,
|
|
 |
a9c134 |
+ const gchar *key)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ return dconf_engine_read (dcdbc->engine, DCONF_READ_FLAGS_NONE, NULL, key);
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+gboolean
|
|
 |
a9c134 |
+dconf_dbus_client_write (DConfDBusClient *dcdbc,
|
|
 |
a9c134 |
+ const gchar *key,
|
|
 |
a9c134 |
+ GVariant *value)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ DConfChangeset *changeset;
|
|
 |
a9c134 |
+ gboolean success;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ changeset = dconf_changeset_new_write (key, value);
|
|
 |
a9c134 |
+ success = dconf_engine_change_fast (dcdbc->engine, changeset, NULL, NULL);
|
|
 |
a9c134 |
+ dconf_changeset_unref (changeset);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ return success;
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+void
|
|
 |
a9c134 |
+dconf_dbus_client_subscribe (DConfDBusClient *dcdbc,
|
|
 |
a9c134 |
+ const gchar *path,
|
|
 |
a9c134 |
+ DConfDBusNotify notify,
|
|
 |
a9c134 |
+ gpointer user_data)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ Watch *watch;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ watch = g_slice_new (Watch);
|
|
 |
a9c134 |
+ watch->path = g_strdup (path);
|
|
 |
a9c134 |
+ watch->notify = notify;
|
|
 |
a9c134 |
+ watch->user_data = user_data;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ dcdbc->watches = g_slist_prepend (dcdbc->watches, watch);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ dconf_engine_watch_fast (dcdbc->engine, path);
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+void
|
|
 |
a9c134 |
+dconf_dbus_client_unsubscribe (DConfDBusClient *dcdbc,
|
|
 |
a9c134 |
+ DConfDBusNotify notify,
|
|
 |
a9c134 |
+ gpointer user_data)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ GSList **ptr;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ for (ptr = &dcdbc->watches; *ptr; ptr = &(*ptr)->next)
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ Watch *watch = (*ptr)->data;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ if (watch->notify == notify && watch->user_data == user_data)
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ *ptr = g_slist_remove_link (*ptr, *ptr);
|
|
 |
a9c134 |
+ dconf_engine_unwatch_fast (dcdbc->engine, watch->path);
|
|
 |
a9c134 |
+ g_free (watch->path);
|
|
 |
a9c134 |
+ g_slice_free (Watch, watch);
|
|
 |
a9c134 |
+ return;
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_warning ("No matching watch found to unsubscribe");
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+gboolean
|
|
 |
a9c134 |
+dconf_dbus_client_has_pending (DConfDBusClient *dcdbc)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ return dconf_engine_has_outstanding (dcdbc->engine);
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+DConfDBusClient *
|
|
 |
a9c134 |
+dconf_dbus_client_new (const gchar *profile,
|
|
 |
a9c134 |
+ DBusConnection *session,
|
|
 |
a9c134 |
+ DBusConnection *system)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ DConfDBusClient *dcdbc;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ if (session == NULL)
|
|
 |
a9c134 |
+ session = dbus_bus_get (DBUS_BUS_SESSION, NULL);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ if (system == NULL)
|
|
 |
a9c134 |
+ system = dbus_bus_get (DBUS_BUS_SYSTEM, NULL);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ dconf_libdbus_1_provide_bus (G_BUS_TYPE_SESSION, session);
|
|
 |
a9c134 |
+ dconf_libdbus_1_provide_bus (G_BUS_TYPE_SYSTEM, system);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ dcdbc = g_slice_new (DConfDBusClient);
|
|
 |
a9c134 |
+ dcdbc->engine = dconf_engine_new (NULL, dcdbc, NULL);
|
|
 |
a9c134 |
+ dcdbc->watches = NULL;
|
|
 |
a9c134 |
+ dcdbc->ref_count = 1;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ return dcdbc;
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+void
|
|
 |
a9c134 |
+dconf_dbus_client_unref (DConfDBusClient *dcdbc)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ if (--dcdbc->ref_count == 0)
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ g_return_if_fail (dcdbc->watches == NULL);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_slice_free (DConfDBusClient, dcdbc);
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+DConfDBusClient *
|
|
 |
a9c134 |
+dconf_dbus_client_ref (DConfDBusClient *dcdbc)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ dcdbc->ref_count++;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ return dcdbc;
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
--- /dev/null
|
|
 |
a9c134 |
+++ b/dbus-1/dconf-dbus-1.h
|
|
 |
a9c134 |
@@ -0,0 +1,56 @@
|
|
 |
a9c134 |
+/**
|
|
 |
a9c134 |
+ * Copyright © 2010 Canonical Limited
|
|
 |
a9c134 |
+ *
|
|
 |
a9c134 |
+ * This program is free software: you can redistribute it and/or modify
|
|
 |
a9c134 |
+ * it under the terms of the GNU General Public License as published by
|
|
 |
a9c134 |
+ * the Free Software Foundation, either version 3 of the licence, or (at
|
|
 |
a9c134 |
+ * your option) any later version.
|
|
 |
a9c134 |
+ *
|
|
 |
a9c134 |
+ * This program is distributed in the hope that it will be useful, but
|
|
 |
a9c134 |
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
 |
a9c134 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
 |
a9c134 |
+ * General Public License for more details.
|
|
 |
a9c134 |
+ *
|
|
 |
a9c134 |
+ * You should have received a copy of the GNU General Public License
|
|
 |
a9c134 |
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
 |
a9c134 |
+ *
|
|
 |
a9c134 |
+ * Author: Ryan Lortie <desrt@desrt.ca>
|
|
 |
a9c134 |
+ **/
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#ifndef _dconf_dbus_1_h_
|
|
 |
a9c134 |
+#define _dconf_dbus_1_h_
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#include <dbus/dbus.h>
|
|
 |
a9c134 |
+#include <glib.h>
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+G_BEGIN_DECLS
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+typedef struct _DConfDBusClient DConfDBusClient;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+typedef void (* DConfDBusNotify) (DConfDBusClient *dcdbc,
|
|
 |
a9c134 |
+ const gchar *key,
|
|
 |
a9c134 |
+ gpointer user_data);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+DConfDBusClient * dconf_dbus_client_new (const gchar *profile,
|
|
 |
a9c134 |
+ DBusConnection *session,
|
|
 |
a9c134 |
+ DBusConnection *system);
|
|
 |
a9c134 |
+void dconf_dbus_client_unref (DConfDBusClient *dcdbc);
|
|
 |
a9c134 |
+DConfDBusClient * dconf_dbus_client_ref (DConfDBusClient *dcdbc);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+GVariant * dconf_dbus_client_read (DConfDBusClient *dcdbc,
|
|
 |
a9c134 |
+ const gchar *key);
|
|
 |
a9c134 |
+gboolean dconf_dbus_client_write (DConfDBusClient *dcdbc,
|
|
 |
a9c134 |
+ const gchar *key,
|
|
 |
a9c134 |
+ GVariant *value);
|
|
 |
a9c134 |
+void dconf_dbus_client_subscribe (DConfDBusClient *dcdbc,
|
|
 |
a9c134 |
+ const gchar *name,
|
|
 |
a9c134 |
+ DConfDBusNotify notify,
|
|
 |
a9c134 |
+ gpointer user_data);
|
|
 |
a9c134 |
+void dconf_dbus_client_unsubscribe (DConfDBusClient *dcdbc,
|
|
 |
a9c134 |
+ DConfDBusNotify notify,
|
|
 |
a9c134 |
+ gpointer user_data);
|
|
 |
a9c134 |
+gboolean dconf_dbus_client_has_pending (DConfDBusClient *dcdbc);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+G_END_DECLS
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#endif /* _dconf_dbus_1_h_ */
|
|
 |
a9c134 |
--- /dev/null
|
|
 |
a9c134 |
+++ b/dbus-1/dconf-libdbus-1.c
|
|
 |
a9c134 |
@@ -0,0 +1,365 @@
|
|
 |
a9c134 |
+/**
|
|
 |
a9c134 |
+ * Copyright © 2010 Canonical Limited
|
|
 |
a9c134 |
+ *
|
|
 |
a9c134 |
+ * This program is free software: you can redistribute it and/or modify
|
|
 |
a9c134 |
+ * it under the terms of the GNU General Public License as published by
|
|
 |
a9c134 |
+ * the Free Software Foundation, either version 3 of the licence, or (at
|
|
 |
a9c134 |
+ * your option) any later version.
|
|
 |
a9c134 |
+ *
|
|
 |
a9c134 |
+ * This program is distributed in the hope that it will be useful, but
|
|
 |
a9c134 |
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
 |
a9c134 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
 |
a9c134 |
+ * General Public License for more details.
|
|
 |
a9c134 |
+ *
|
|
 |
a9c134 |
+ * You should have received a copy of the GNU General Public License
|
|
 |
a9c134 |
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
 |
a9c134 |
+ *
|
|
 |
a9c134 |
+ * Author: Ryan Lortie <desrt@desrt.ca>
|
|
 |
a9c134 |
+ **/
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#include "config.h"
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#include "dconf-libdbus-1.h"
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#include "../engine/dconf-engine.h"
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#include <string.h>
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+static DBusConnection *dconf_libdbus_1_buses[5];
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+struct _DConfDBusClient
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ DConfEngine *engine;
|
|
 |
a9c134 |
+ GSList *watches;
|
|
 |
a9c134 |
+ gint ref_count;
|
|
 |
a9c134 |
+};
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#define DCONF_LIBDBUS_1_ERROR (g_quark_from_static_string("DCONF_LIBDBUS_1_ERROR"))
|
|
 |
a9c134 |
+#define DCONF_LIBDBUS_1_ERROR_FAILED 0
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+static DBusMessage *
|
|
 |
a9c134 |
+dconf_libdbus_1_new_method_call (const gchar *bus_name,
|
|
 |
a9c134 |
+ const gchar *object_path,
|
|
 |
a9c134 |
+ const gchar *interface_name,
|
|
 |
a9c134 |
+ const gchar *method_name,
|
|
 |
a9c134 |
+ GVariant *parameters)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ DBusMessageIter dbus_iter;
|
|
 |
a9c134 |
+ DBusMessage *message;
|
|
 |
a9c134 |
+ GVariantIter iter;
|
|
 |
a9c134 |
+ GVariant *child;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_variant_ref_sink (parameters);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ message = dbus_message_new_method_call (bus_name, object_path, interface_name, method_name);
|
|
 |
a9c134 |
+ dbus_message_iter_init_append (message, &dbus_iter);
|
|
 |
a9c134 |
+ g_variant_iter_init (&iter, parameters);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ while ((child = g_variant_iter_next_value (&iter)))
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ if (g_variant_is_of_type (child, G_VARIANT_TYPE_STRING))
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ const gchar *str;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ str = g_variant_get_string (child, NULL);
|
|
 |
a9c134 |
+ dbus_message_iter_append_basic (&dbus_iter, DBUS_TYPE_STRING, &str);
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ else if (g_variant_is_of_type (child, G_VARIANT_TYPE_UINT32))
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ guint32 uint;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ uint = g_variant_get_uint32 (child);
|
|
 |
a9c134 |
+ dbus_message_iter_append_basic (&dbus_iter, DBUS_TYPE_UINT32, &uint);
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ else
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ DBusMessageIter subiter;
|
|
 |
a9c134 |
+ const guint8 *bytes;
|
|
 |
a9c134 |
+ gsize n_elements;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_assert (g_variant_is_of_type (child, G_VARIANT_TYPE_BYTESTRING));
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ bytes = g_variant_get_fixed_array (child, &n_elements, sizeof (guint8));
|
|
 |
a9c134 |
+ dbus_message_iter_open_container (&dbus_iter, DBUS_TYPE_ARRAY, "y", &subiter);
|
|
 |
a9c134 |
+ dbus_message_iter_append_fixed_array (&subiter, DBUS_TYPE_BYTE, &bytes, n_elements);
|
|
 |
a9c134 |
+ dbus_message_iter_close_container (&dbus_iter, &subiter);
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_variant_unref (child);
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_variant_unref (parameters);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ return message;
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+static GVariant *
|
|
 |
a9c134 |
+dconf_libdbus_1_get_message_body (DBusMessage *message,
|
|
 |
a9c134 |
+ GError **error)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ GVariantBuilder builder;
|
|
 |
a9c134 |
+ const gchar *signature;
|
|
 |
a9c134 |
+ DBusMessageIter iter;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ /* We support two types: strings and arrays of strings.
|
|
 |
a9c134 |
+ *
|
|
 |
a9c134 |
+ * It's very simple to detect if the message contains only these
|
|
 |
a9c134 |
+ * types: check that the signature contains only the letters "a" and
|
|
 |
a9c134 |
+ * "s" and that it does not contain "aa".
|
|
 |
a9c134 |
+ */
|
|
 |
a9c134 |
+ signature = dbus_message_get_signature (message);
|
|
 |
a9c134 |
+ if (signature[strspn(signature, "as")] != '\0' || strstr (signature, "aa"))
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ g_set_error (error, DCONF_LIBDBUS_1_ERROR, DCONF_LIBDBUS_1_ERROR_FAILED,
|
|
 |
a9c134 |
+ "unable to handle message type '(%s)'", signature);
|
|
 |
a9c134 |
+ return NULL;
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE);
|
|
 |
a9c134 |
+ dbus_message_iter_init (message, &iter);
|
|
 |
a9c134 |
+ while (dbus_message_iter_get_arg_type (&iter))
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ const gchar *string;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_STRING)
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ dbus_message_iter_get_basic (&iter, &string);
|
|
 |
a9c134 |
+ g_variant_builder_add (&builder, "s", string);
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+ else
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ DBusMessageIter sub;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_assert (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_ARRAY &&
|
|
 |
a9c134 |
+ dbus_message_iter_get_element_type (&iter) == DBUS_TYPE_STRING);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_variant_builder_open (&builder, G_VARIANT_TYPE_STRING_ARRAY);
|
|
 |
a9c134 |
+ dbus_message_iter_recurse (&iter, &sub);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ while (dbus_message_iter_get_arg_type (&sub))
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ const gchar *string;
|
|
 |
a9c134 |
+ dbus_message_iter_get_basic (&sub, &string);
|
|
 |
a9c134 |
+ g_variant_builder_add (&builder, "s", string);
|
|
 |
a9c134 |
+ dbus_message_iter_next (&sub);
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_variant_builder_close (&builder);
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+ dbus_message_iter_next (&iter);
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ return g_variant_ref_sink (g_variant_builder_end (&builder));
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+static GVariant *
|
|
 |
a9c134 |
+dconf_libdbus_1_interpret_result (DBusMessage *result,
|
|
 |
a9c134 |
+ const GVariantType *expected_type,
|
|
 |
a9c134 |
+ GError **error)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ GVariant *reply;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ if (dbus_message_get_type (result) == DBUS_MESSAGE_TYPE_ERROR)
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ const gchar *errstr = "(no message)";
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ dbus_message_get_args (result, NULL, DBUS_TYPE_STRING, &errstr, DBUS_TYPE_INVALID);
|
|
 |
a9c134 |
+ g_set_error (error, DCONF_LIBDBUS_1_ERROR, DCONF_LIBDBUS_1_ERROR_FAILED,
|
|
 |
a9c134 |
+ "%s: %s", dbus_message_get_error_name (result), errstr);
|
|
 |
a9c134 |
+ return NULL;
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ reply = dconf_libdbus_1_get_message_body (result, error);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ if (reply && expected_type && !g_variant_is_of_type (reply, expected_type))
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ gchar *expected_string;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ expected_string = g_variant_type_dup_string (expected_type);
|
|
 |
a9c134 |
+ g_set_error (error, DCONF_LIBDBUS_1_ERROR, DCONF_LIBDBUS_1_ERROR_FAILED,
|
|
 |
a9c134 |
+ "received reply '%s' is not of the expected type %s",
|
|
 |
a9c134 |
+ g_variant_get_type_string (reply), expected_string);
|
|
 |
a9c134 |
+ g_free (expected_string);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_variant_unref (reply);
|
|
 |
a9c134 |
+ reply = NULL;
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ return reply;
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+static void
|
|
 |
a9c134 |
+dconf_libdbus_1_method_call_done (DBusPendingCall *pending,
|
|
 |
a9c134 |
+ gpointer user_data)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ DConfEngineCallHandle *handle = user_data;
|
|
 |
a9c134 |
+ const GVariantType *expected_type;
|
|
 |
a9c134 |
+ DBusMessage *message;
|
|
 |
a9c134 |
+ GError *error = NULL;
|
|
 |
a9c134 |
+ GVariant *reply;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ if (pending == NULL)
|
|
 |
a9c134 |
+ return;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ message = dbus_pending_call_steal_reply (pending);
|
|
 |
a9c134 |
+ dbus_pending_call_unref (pending);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ expected_type = dconf_engine_call_handle_get_expected_type (handle);
|
|
 |
a9c134 |
+ reply = dconf_libdbus_1_interpret_result (message, expected_type, &error);
|
|
 |
a9c134 |
+ dbus_message_unref (message);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ dconf_engine_call_handle_reply (handle, reply, error);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ if (reply)
|
|
 |
a9c134 |
+ g_variant_unref (reply);
|
|
 |
a9c134 |
+ if (error)
|
|
 |
a9c134 |
+ g_error_free (error);
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+gboolean
|
|
 |
a9c134 |
+dconf_engine_dbus_call_async_func (GBusType bus_type,
|
|
 |
a9c134 |
+ const gchar *bus_name,
|
|
 |
a9c134 |
+ const gchar *object_path,
|
|
 |
a9c134 |
+ const gchar *interface_name,
|
|
 |
a9c134 |
+ const gchar *method_name,
|
|
 |
a9c134 |
+ GVariant *parameters,
|
|
 |
a9c134 |
+ DConfEngineCallHandle *handle,
|
|
 |
a9c134 |
+ GError **error)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ DBusConnection *connection;
|
|
 |
a9c134 |
+ DBusPendingCall *pending;
|
|
 |
a9c134 |
+ DBusMessage *message;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_assert_cmpint (bus_type, <, G_N_ELEMENTS (dconf_libdbus_1_buses));
|
|
 |
a9c134 |
+ connection = dconf_libdbus_1_buses[bus_type];
|
|
 |
a9c134 |
+ g_assert (connection != NULL);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ message = dconf_libdbus_1_new_method_call (bus_name, object_path, interface_name, method_name, parameters);
|
|
 |
a9c134 |
+ dbus_connection_send_with_reply (connection, message, &pending, -1);
|
|
 |
a9c134 |
+ dbus_pending_call_set_notify (pending, dconf_libdbus_1_method_call_done, handle, NULL);
|
|
 |
a9c134 |
+ dbus_message_unref (message);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ return TRUE;
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+static void
|
|
 |
a9c134 |
+dconf_libdbus_1_convert_error (DBusError *dbus_error,
|
|
 |
a9c134 |
+ GError **error)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ g_set_error (error, DCONF_LIBDBUS_1_ERROR, DCONF_LIBDBUS_1_ERROR_FAILED,
|
|
 |
a9c134 |
+ "%s: %s", dbus_error->name, dbus_error->message);
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+GVariant *
|
|
 |
a9c134 |
+dconf_engine_dbus_call_sync_func (GBusType bus_type,
|
|
 |
a9c134 |
+ const gchar *bus_name,
|
|
 |
a9c134 |
+ const gchar *object_path,
|
|
 |
a9c134 |
+ const gchar *interface_name,
|
|
 |
a9c134 |
+ const gchar *method_name,
|
|
 |
a9c134 |
+ GVariant *parameters,
|
|
 |
a9c134 |
+ const GVariantType *expected_type,
|
|
 |
a9c134 |
+ GError **error)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ DBusConnection *connection;
|
|
 |
a9c134 |
+ DBusMessage *message;
|
|
 |
a9c134 |
+ DBusError dbus_error;
|
|
 |
a9c134 |
+ DBusMessage *result;
|
|
 |
a9c134 |
+ GVariant *reply;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ g_assert_cmpint (bus_type, <, G_N_ELEMENTS (dconf_libdbus_1_buses));
|
|
 |
a9c134 |
+ connection = dconf_libdbus_1_buses[bus_type];
|
|
 |
a9c134 |
+ g_assert (connection != NULL);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ dbus_error_init (&dbus_error);
|
|
 |
a9c134 |
+ message = dconf_libdbus_1_new_method_call (bus_name, object_path, interface_name, method_name, parameters);
|
|
 |
a9c134 |
+ result = dbus_connection_send_with_reply_and_block (connection, message, -1, &dbus_error);
|
|
 |
a9c134 |
+ dbus_message_unref (message);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ if (result == NULL)
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ dconf_libdbus_1_convert_error (&dbus_error, error);
|
|
 |
a9c134 |
+ dbus_error_free (&dbus_error);
|
|
 |
a9c134 |
+ return NULL;
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ reply = dconf_libdbus_1_interpret_result (result, expected_type, error);
|
|
 |
a9c134 |
+ dbus_message_unref (result);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ return reply;
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+static DBusHandlerResult
|
|
 |
a9c134 |
+dconf_libdbus_1_filter (DBusConnection *connection,
|
|
 |
a9c134 |
+ DBusMessage *message,
|
|
 |
a9c134 |
+ gpointer user_data)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ GBusType bus_type = GPOINTER_TO_INT (user_data);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_SIGNAL)
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ const gchar *interface;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ interface = dbus_message_get_interface (message);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ if (interface && g_str_equal (interface, "ca.desrt.dconf.Writer"))
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ GVariant *parameters;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ parameters = dconf_libdbus_1_get_message_body (message, NULL);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ if (parameters != NULL)
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ dconf_engine_handle_dbus_signal (bus_type,
|
|
 |
a9c134 |
+ dbus_message_get_sender (message),
|
|
 |
a9c134 |
+ dbus_message_get_path (message),
|
|
 |
a9c134 |
+ dbus_message_get_member (message),
|
|
 |
a9c134 |
+ parameters);
|
|
 |
a9c134 |
+ g_variant_unref (parameters);
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+void
|
|
 |
a9c134 |
+dconf_libdbus_1_provide_bus (GBusType bus_type,
|
|
 |
a9c134 |
+ DBusConnection *connection)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ g_assert_cmpint (bus_type, <, G_N_ELEMENTS (dconf_libdbus_1_buses));
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ if (!dconf_libdbus_1_buses[bus_type])
|
|
 |
a9c134 |
+ {
|
|
 |
a9c134 |
+ dconf_libdbus_1_buses[bus_type] = dbus_connection_ref (connection);
|
|
 |
a9c134 |
+ dbus_connection_add_filter (connection, dconf_libdbus_1_filter, GINT_TO_POINTER (bus_type), NULL);
|
|
 |
a9c134 |
+ }
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#ifndef PIC
|
|
 |
a9c134 |
+static gboolean
|
|
 |
a9c134 |
+dconf_libdbus_1_check_connection (gpointer user_data)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ DBusConnection *connection = user_data;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ dbus_connection_read_write (connection, 0);
|
|
 |
a9c134 |
+ dbus_connection_dispatch (connection);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ return G_SOURCE_CONTINUE;
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+void
|
|
 |
a9c134 |
+dconf_engine_dbus_init_for_testing (void)
|
|
 |
a9c134 |
+{
|
|
 |
a9c134 |
+ DBusConnection *session;
|
|
 |
a9c134 |
+ DBusConnection *system;
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ dconf_libdbus_1_provide_bus (G_BUS_TYPE_SESSION, session = dbus_bus_get (DBUS_BUS_SESSION, NULL));
|
|
 |
a9c134 |
+ dconf_libdbus_1_provide_bus (G_BUS_TYPE_SYSTEM, system = dbus_bus_get (DBUS_BUS_SYSTEM, NULL));
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+ /* "mainloop integration" */
|
|
 |
a9c134 |
+ g_timeout_add (1, dconf_libdbus_1_check_connection, session);
|
|
 |
a9c134 |
+ g_timeout_add (1, dconf_libdbus_1_check_connection, system);
|
|
 |
a9c134 |
+}
|
|
 |
a9c134 |
+#endif
|
|
 |
a9c134 |
--- /dev/null
|
|
 |
a9c134 |
+++ b/dbus-1/dconf-libdbus-1.h
|
|
 |
a9c134 |
@@ -0,0 +1,11 @@
|
|
 |
a9c134 |
+#ifndef __dconf_libdbus_1_h__
|
|
 |
a9c134 |
+#define __dconf_libdbus_1_h__
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#include <dbus/dbus.h>
|
|
 |
a9c134 |
+#include <gio/gio.h>
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+G_GNUC_INTERNAL
|
|
 |
a9c134 |
+void dconf_libdbus_1_provide_bus (GBusType bus_type,
|
|
 |
a9c134 |
+ DBusConnection *connection);
|
|
 |
a9c134 |
+
|
|
 |
a9c134 |
+#endif /* __dconf_libdbus_1_h__ */
|
|
 |
a9c134 |
--- a/tests/meson.build
|
|
 |
a9c134 |
+++ b/tests/meson.build
|
|
 |
a9c134 |
@@ -23,6 +23,7 @@ unit_tests = [
|
|
 |
a9c134 |
['gvdb', 'gvdb.c', '-DSRCDIR="@0@"'.format(test_dir), glib_dep, libgvdb],
|
|
 |
a9c134 |
['gdbus-thread', 'dbus.c', '-DDBUS_BACKEND="/gdbus/thread"', gio_unix_dep, libdconf_gdbus_thread],
|
|
 |
a9c134 |
['gdbus-filter', 'dbus.c', '-DDBUS_BACKEND="/gdbus/filter"', gio_unix_dep, libdconf_gdbus_filter],
|
|
 |
a9c134 |
+ ['libdbus-1', 'dbus.c', '-DDBUS_BACKEND="/libdbus-1"', gio_unix_dep, libdconf_libdbus_1],
|
|
 |
a9c134 |
['engine', 'engine.c', '-DSRCDIR="@0@"'.format(test_dir), [glib_dep, dl_dep, m_dep], [libdconf_engine, libdconf_common, libdconf_mock]],
|
|
 |
a9c134 |
['client', 'client.c', '-DSRCDIR="@0@"'.format(test_dir), gio_unix_dep, [libdconf_client, libdconf_engine, libdconf_common, libdconf_mock]]
|
|
 |
a9c134 |
]
|