[gdm/wip/gdbus-port: 3/13] Use GDBus for GdmSettings
- From: Giovanni Campagna <gcampagna src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm/wip/gdbus-port: 3/13] Use GDBus for GdmSettings
- Date: Fri, 18 May 2012 14:19:14 +0000 (UTC)
commit 4484b3a0db9be3323bf85ede04a5491b89f9917f
Author: Giovanni Campagna <gcampagna src gnome org>
Date: Thu May 3 17:54:59 2012 +0200
Use GDBus for GdmSettings
Second patch in the GDBus port, this is primarily to ensure that
everything the slave expose is in what GIO thinks is the system bus.
.gitignore | 1 +
common/Makefile.am | 13 ++++-
common/gdm-settings-client.c | 103 +++++++++++--------------------------
common/gdm-settings.c | 81 ++++++++++++++++++++++++-----
common/test-settings-server.c | 114 +++++++++--------------------------------
configure.ac | 1 +
daemon/factory-slave-main.c | 19 +++----
daemon/product-slave-main.c | 19 +++----
daemon/simple-slave-main.c | 20 +++----
9 files changed, 157 insertions(+), 214 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 35155f2..cb869f5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,6 +39,7 @@ gdm-safe-restart
gdm.schemas
gdm-session-direct-glue.h
gdm-settings-glue.h
+gdm-settings-glue.c
gdm-simple-greeter.desktop.in
gdm-simple-greeter.schemas
gdm-simple-slave-glue.h
diff --git a/common/Makefile.am b/common/Makefile.am
index 3492041..ad5c914 100644
--- a/common/Makefile.am
+++ b/common/Makefile.am
@@ -49,8 +49,12 @@ gdm_crash_logger_CPPFLAGS = \
$(NULL)
gdm_crash_logger_LDADD = $(GTHREAD_LIBS)
-gdm-settings-glue.h: gdm-settings.xml Makefile.am
- dbus-binding-tool --prefix=gdm_settings --mode=glib-server --output=gdm-settings-glue.h $(srcdir)/gdm-settings.xml
+gdm-settings-glue.c gdm-settings-glue.h : gdm-settings.xml Makefile.am
+ gdbus-codegen \
+ --c-namespace=GdmDBus \
+ --interface-prefix=org.gnome.DisplayManager \
+ --generate-c-code=gdm-settings-glue \
+ $(srcdir)/gdm-settings.xml
if MKDTEMP_MISSING
MKDTEMP_FILES = mkdtemp.c mkdtemp.h
@@ -89,6 +93,11 @@ libgdmcommon_la_SOURCES = \
$(MKDTEMP_FILES) \
$(NULL)
+nodist_libgdmcommon_la_SOURCES = \
+ gdm-settings-glue.h \
+ gdm-settings-glue.c \
+ $(NULL)
+
libgdmcommon_la_CPPFLAGS = \
$(AM_CPPFLAGS) \
$(DISABLE_DEPRECATED_CFLAGS) \
diff --git a/common/gdm-settings-client.c b/common/gdm-settings-client.c
index 0b6b1cc..2c13ae0 100644
--- a/common/gdm-settings-client.c
+++ b/common/gdm-settings-client.c
@@ -29,17 +29,15 @@
#include <sys/stat.h>
#include <sys/types.h>
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
-
#include <glib.h>
#include <glib/gi18n.h>
#include <glib/gstdio.h>
#include <glib-object.h>
+#include <gio/gio.h>
#include "gdm-settings-client.h"
#include "gdm-settings-utils.h"
+#include "gdm-settings-glue.h"
#define SETTINGS_DBUS_NAME "org.gnome.DisplayManager"
#define SETTINGS_DBUS_PATH "/org/gnome/DisplayManager/Settings"
@@ -47,8 +45,7 @@
static GHashTable *notifiers = NULL;
static GHashTable *schemas = NULL;
-static DBusGProxy *settings_proxy = NULL;
-static DBusGConnection *connection = NULL;
+static GdmDBusSettings *settings_proxy = NULL;
static guint32 id_serial = 0;
typedef struct {
@@ -94,27 +91,17 @@ set_value (const char *key,
/* FIXME: check cache */
- g_debug ("Setting %s=%s", key, value);
error = NULL;
- res = dbus_g_proxy_call (settings_proxy,
- "SetValue",
- &error,
- G_TYPE_STRING, key,
- G_TYPE_STRING, value,
- G_TYPE_INVALID,
- G_TYPE_INVALID);
- if (! res) {
- if (error != NULL) {
- /*g_debug ("Failed to get value for %s: %s", key, error->message);*/
- g_error_free (error);
- } else {
- /*g_debug ("Failed to get value for %s", key);*/
- }
- return FALSE;
+ res = gdm_dbus_settings_call_set_value_sync (settings_proxy,
+ key, value,
+ NULL, &error);
+ if (! res) {
+ g_debug ("Failed to set value for %s: %s", key, error->message);
+ g_error_free (error);
}
- return TRUE;
+ return res;
}
static gboolean
@@ -122,37 +109,21 @@ get_value (const char *key,
char **value)
{
GError *error;
- char *str;
gboolean res;
/* FIXME: check cache */
error = NULL;
- res = dbus_g_proxy_call (settings_proxy,
- "GetValue",
- &error,
- G_TYPE_STRING, key,
- G_TYPE_INVALID,
- G_TYPE_STRING, &str,
- G_TYPE_INVALID);
- if (! res) {
- if (error != NULL) {
- /*g_debug ("Failed to get value for %s: %s", key, error->message);*/
- g_error_free (error);
- } else {
- /*g_debug ("Failed to get value for %s", key);*/
- }
-
- return FALSE;
- }
- if (value != NULL) {
- *value = g_strdup (str);
+ res = gdm_dbus_settings_call_get_value_sync (settings_proxy,
+ key, value,
+ NULL, &error);
+ if (! res) {
+ g_debug ("Failed to get value for %s: %s", key, error->message);
+ g_error_free (error);
}
- g_free (str);
-
- return TRUE;
+ return res;
}
static void
@@ -467,11 +438,11 @@ send_notification (gpointer key,
}
static void
-on_value_changed (DBusGProxy *proxy,
- const char *key,
- const char *old_value,
- const char *new_value,
- gpointer data)
+on_value_changed (GdmDBusSettings *proxy,
+ const char *key,
+ const char *old_value,
+ const char *new_value,
+ gpointer data)
{
GdmSettingsEntry *entry;
@@ -502,27 +473,22 @@ gdm_settings_client_init (const char *file,
g_assert (schemas == NULL);
error = NULL;
- connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
- if (connection == NULL) {
- if (error != NULL) {
- g_warning ("error getting system bus: %s", error->message);
- g_error_free (error);
- }
- return FALSE;
- }
- settings_proxy = dbus_g_proxy_new_for_name (connection,
- SETTINGS_DBUS_NAME,
- SETTINGS_DBUS_PATH,
- SETTINGS_DBUS_INTERFACE);
+ settings_proxy = GDM_DBUS_SETTINGS (gdm_dbus_settings_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ SETTINGS_DBUS_NAME,
+ SETTINGS_DBUS_PATH,
+ NULL, &error));
if (settings_proxy == NULL) {
- g_warning ("Unable to connect to settings server");
+ g_warning ("Unable to connect to settings server: %s", error->message);
+ g_error_free (error);
return FALSE;
}
list = NULL;
if (! gdm_settings_parse_schemas (file, root, &list)) {
g_warning ("Unable to parse schemas");
+ g_clear_object (&settings_proxy);
return FALSE;
}
@@ -531,14 +497,7 @@ gdm_settings_client_init (const char *file,
schemas = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)gdm_settings_entry_free);
g_slist_foreach (list, (GFunc)hashify_list, NULL);
- dbus_g_proxy_add_signal (settings_proxy, "ValueChanged", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
- dbus_g_proxy_connect_signal (settings_proxy,
- "ValueChanged",
- G_CALLBACK (on_value_changed),
- NULL,
- NULL);
-
-
+ g_signal_connect (settings_proxy, "value-changed", G_CALLBACK (on_value_changed), NULL);
return TRUE;
}
diff --git a/common/gdm-settings.c b/common/gdm-settings.c
index 0395681..0193f39 100644
--- a/common/gdm-settings.c
+++ b/common/gdm-settings.c
@@ -33,9 +33,7 @@
#include <glib/gi18n.h>
#include <glib/gstdio.h>
#include <glib-object.h>
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
+#include <gio/gio.h>
#include "gdm-settings.h"
#include "gdm-settings-glue.h"
@@ -50,7 +48,8 @@
struct GdmSettingsPrivate
{
- DBusGConnection *connection;
+ GDBusConnection *connection;
+ GdmDBusSettings *skeleton;
GdmSettingsBackend *backend;
};
@@ -139,12 +138,58 @@ gdm_settings_set_value (GdmSettings *settings,
}
static gboolean
+handle_get_value (GdmDBusSettings *settings,
+ GDBusMethodInvocation *invocation,
+ const char *key,
+ gpointer user_data)
+{
+ GdmSettings *self = GDM_SETTINGS (user_data);
+ GError *error = NULL;
+ char *value = NULL;
+
+ gdm_settings_get_value (self, key, &value, &error);
+ if (error) {
+ g_dbus_method_invocation_return_gerror (invocation, error);
+ g_error_free (error);
+ return TRUE;
+ }
+
+ gdm_dbus_settings_complete_get_value (settings, invocation,
+ value);
+ g_free (value);
+
+ return TRUE;
+}
+
+static gboolean
+handle_set_value (GdmDBusSettings *settings,
+ GDBusMethodInvocation *invocation,
+ const char *key,
+ const char *value,
+ gpointer user_data)
+{
+ GdmSettings *self = GDM_SETTINGS (user_data);
+ GError *error = NULL;
+
+ gdm_settings_set_value (self, key, value, &error);
+ if (error) {
+ g_dbus_method_invocation_return_gerror (invocation, error);
+ g_error_free (error);
+ return TRUE;
+ }
+
+ gdm_dbus_settings_complete_set_value (settings, invocation);
+
+ return TRUE;
+}
+
+static gboolean
register_settings (GdmSettings *settings)
{
GError *error = NULL;
error = NULL;
- settings->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+ settings->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
if (settings->priv->connection == NULL) {
if (error != NULL) {
g_critical ("error getting system bus: %s", error->message);
@@ -153,7 +198,16 @@ register_settings (GdmSettings *settings)
exit (1);
}
- dbus_g_connection_register_g_object (settings->priv->connection, GDM_SETTINGS_DBUS_PATH, G_OBJECT (settings));
+ settings->priv->skeleton = GDM_DBUS_SETTINGS (gdm_dbus_settings_skeleton_new ());
+ g_signal_connect_object (settings->priv->skeleton, "handle-get-value",
+ G_CALLBACK (handle_get_value), settings, 0);
+ g_signal_connect_object (settings->priv->skeleton, "handle-set-value",
+ G_CALLBACK (handle_set_value), settings, 0);
+
+ g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (settings->priv->skeleton),
+ settings->priv->connection,
+ GDM_SETTINGS_DBUS_PATH,
+ NULL);
return TRUE;
}
@@ -184,8 +238,6 @@ gdm_settings_class_init (GdmSettingsClass *klass)
G_TYPE_STRING);
g_type_class_add_private (klass, sizeof (GdmSettingsPrivate));
-
- dbus_g_object_type_install_info (GDM_TYPE_SETTINGS, &dbus_glib_gdm_settings_object_info);
}
static void
@@ -196,13 +248,12 @@ backend_value_changed (GdmSettingsBackend *backend,
GdmSettings *settings)
{
g_debug ("Emitting value-changed %s %s %s", key, old_value, new_value);
- /* just proxy it */
- g_signal_emit (settings,
- signals [VALUE_CHANGED],
- 0,
- key,
- old_value,
- new_value);
+
+ /* proxy it to internal listeners */
+ g_signal_emit (settings, signals [VALUE_CHANGED], 0, key, old_value, new_value);
+
+ /* and to dbus */
+ gdm_dbus_settings_emit_value_changed (settings->priv->skeleton, key, old_value, new_value);
}
static void
diff --git a/common/test-settings-server.c b/common/test-settings-server.c
index a7fe791..bf7ab0e 100644
--- a/common/test-settings-server.c
+++ b/common/test-settings-server.c
@@ -30,10 +30,7 @@
#include <locale.h>
#include <glib.h>
-
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
+#include <gio/gio.h>
#include "gdm-settings.h"
@@ -41,76 +38,14 @@
static GdmSettings *settings = NULL;
-static gboolean
-acquire_name_on_proxy (DBusGProxy *bus_proxy)
-{
- GError *error;
- guint result;
- gboolean res;
- gboolean ret;
-
- ret = FALSE;
-
- if (bus_proxy == NULL) {
- goto out;
- }
-
- error = NULL;
- res = dbus_g_proxy_call (bus_proxy,
- "RequestName",
- &error,
- G_TYPE_STRING, GDM_DBUS_NAME,
- G_TYPE_UINT, 0,
- G_TYPE_INVALID,
- G_TYPE_UINT, &result,
- G_TYPE_INVALID);
- if (! res) {
- if (error != NULL) {
- g_warning ("Failed to acquire %s: %s", GDM_DBUS_NAME, error->message);
- g_error_free (error);
- } else {
- g_warning ("Failed to acquire %s", GDM_DBUS_NAME);
- }
- goto out;
- }
-
- if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
- if (error != NULL) {
- g_warning ("Failed to acquire %s: %s", GDM_DBUS_NAME, error->message);
- g_error_free (error);
- } else {
- g_warning ("Failed to acquire %s", GDM_DBUS_NAME);
- }
- goto out;
- }
-
- ret = TRUE;
-
- out:
- return ret;
-}
-
-static DBusGProxy *
-get_bus_proxy (DBusGConnection *connection)
-{
- DBusGProxy *bus_proxy;
-
- bus_proxy = dbus_g_proxy_new_for_name (connection,
- DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS);
- return bus_proxy;
-}
-
-static DBusGConnection *
+static GDBusConnection *
get_system_bus (void)
{
GError *error;
- DBusGConnection *bus;
- DBusConnection *connection;
+ GDBusConnection *bus;
error = NULL;
- bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+ bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
if (bus == NULL) {
g_warning ("Couldn't connect to system bus: %s",
error->message);
@@ -118,19 +53,29 @@ get_system_bus (void)
goto out;
}
- connection = dbus_g_connection_get_connection (bus);
- dbus_connection_set_exit_on_disconnect (connection, FALSE);
+ g_dbus_connection_set_exit_on_close (bus, FALSE);
out:
return bus;
}
+static void
+on_name_acquired (GDBusConnection *connection,
+ const char *name,
+ gpointer user_data)
+{
+ settings = gdm_settings_new ();
+ if (settings == NULL) {
+ g_warning ("Unable to initialize settings");
+ exit (1);
+ }
+}
+
int
main (int argc, char **argv)
{
GMainLoop *main_loop;
- DBusGConnection *connection;
- DBusGProxy *bus_proxy;
+ GDBusConnection *connection;
g_type_init ();
@@ -139,22 +84,13 @@ main (int argc, char **argv)
goto out;
}
- bus_proxy = get_bus_proxy (connection);
- if (bus_proxy == NULL) {
- g_warning ("Could not construct bus_proxy object; bailing out");
- goto out;
- }
-
- if (! acquire_name_on_proxy (bus_proxy) ) {
- g_warning ("Could not acquire name; bailing out");
- goto out;
- }
-
- settings = gdm_settings_new ();
- if (settings == NULL) {
- g_warning ("Unable to initialize settings");
- exit (1);
- }
+ g_bus_own_name (G_BUS_TYPE_SYSTEM,
+ GDM_DBUS_NAME,
+ G_BUS_NAME_OWNER_FLAGS_NONE,
+ NULL, /* bus acquired */
+ on_name_acquired,
+ NULL, /* name lost */
+ NULL, NULL);
main_loop = g_main_loop_new (NULL, FALSE);
g_main_loop_run (main_loop);
diff --git a/configure.ac b/configure.ac
index 81ea23e..56bbed3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -83,6 +83,7 @@ PKG_CHECK_MODULES(COMMON,
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
gobject-2.0 >= $GLIB_REQUIRED_VERSION
gio-2.0 >= $GLIB_REQUIRED_VERSION
+ gio-unix-2.0 >= $GLIB_REQUIRED_VERSION
)
AC_SUBST(COMMON_CFLAGS)
AC_SUBST(COMMON_LIBS)
diff --git a/daemon/factory-slave-main.c b/daemon/factory-slave-main.c
index 2441260..9ea93ab 100644
--- a/daemon/factory-slave-main.c
+++ b/daemon/factory-slave-main.c
@@ -35,10 +35,6 @@
#include <glib/gi18n.h>
#include <glib-object.h>
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
-
#include "gdm-xerrors.h"
#include "gdm-signal-handler.h"
#include "gdm-log.h"
@@ -52,15 +48,14 @@
static GdmSettings *settings = NULL;
static int gdm_return_code = 0;
-static DBusGConnection *
+static GDBusConnection *
get_system_bus (void)
{
GError *error;
- DBusGConnection *bus;
- DBusConnection *connection;
+ GDBusConnection *bus;
error = NULL;
- bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+ bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
if (bus == NULL) {
g_warning ("Couldn't connect to system bus: %s",
error->message);
@@ -68,8 +63,7 @@ get_system_bus (void)
goto out;
}
- connection = dbus_g_connection_get_connection (bus);
- dbus_connection_set_exit_on_disconnect (connection, FALSE);
+ g_dbus_connection_set_exit_on_close (bus, FALSE);
out:
return bus;
@@ -170,7 +164,7 @@ main (int argc,
{
GMainLoop *main_loop;
GOptionContext *context;
- DBusGConnection *connection;
+ GDBusConnection *connection;
GdmSlave *slave;
static char *display_id = NULL;
GdmSignalHandler *signal_handler;
@@ -259,8 +253,9 @@ main (int argc,
}
out:
-
g_debug ("Slave finished");
+ g_object_unref (connection);
+
return gdm_return_code;
}
diff --git a/daemon/product-slave-main.c b/daemon/product-slave-main.c
index b8e4755..709e5fb 100644
--- a/daemon/product-slave-main.c
+++ b/daemon/product-slave-main.c
@@ -35,10 +35,6 @@
#include <glib/gi18n.h>
#include <glib-object.h>
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
-
#include "gdm-xerrors.h"
#include "gdm-signal-handler.h"
#include "gdm-log.h"
@@ -52,15 +48,14 @@
static GdmSettings *settings = NULL;
static int gdm_return_code = 0;
-static DBusGConnection *
+static GDBusConnection *
get_system_bus (void)
{
GError *error;
- DBusGConnection *bus;
- DBusConnection *connection;
+ GDBusConnection *bus;
error = NULL;
- bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+ bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
if (bus == NULL) {
g_warning ("Couldn't connect to system bus: %s",
error->message);
@@ -68,8 +63,7 @@ get_system_bus (void)
goto out;
}
- connection = dbus_g_connection_get_connection (bus);
- dbus_connection_set_exit_on_disconnect (connection, FALSE);
+ g_dbus_connection_set_exit_on_close (bus, FALSE);
out:
return bus;
@@ -174,7 +168,7 @@ main (int argc,
{
GMainLoop *main_loop;
GOptionContext *context;
- DBusGConnection *connection;
+ GDBusConnection *connection;
GdmSlave *slave;
static char *display_id = NULL;
GdmSignalHandler *signal_handler;
@@ -263,8 +257,9 @@ main (int argc,
}
out:
-
g_debug ("Slave finished");
+ g_object_unref (connection);
+
return gdm_return_code;
}
diff --git a/daemon/simple-slave-main.c b/daemon/simple-slave-main.c
index 057492b..a1f5626 100644
--- a/daemon/simple-slave-main.c
+++ b/daemon/simple-slave-main.c
@@ -34,10 +34,7 @@
#include <glib.h>
#include <glib/gi18n.h>
#include <glib-object.h>
-
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
+#include <gio/gio.h>
#include "gdm-xerrors.h"
#include "gdm-signal-handler.h"
@@ -52,15 +49,14 @@
static GdmSettings *settings = NULL;
static int gdm_return_code = 0;
-static DBusGConnection *
+static GDBusConnection *
get_system_bus (void)
{
GError *error;
- DBusGConnection *bus;
- DBusConnection *connection;
+ GDBusConnection *bus;
error = NULL;
- bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+ bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
if (bus == NULL) {
g_warning ("Couldn't connect to system bus: %s",
error->message);
@@ -68,8 +64,7 @@ get_system_bus (void)
goto out;
}
- connection = dbus_g_connection_get_connection (bus);
- dbus_connection_set_exit_on_disconnect (connection, FALSE);
+ g_dbus_connection_set_exit_on_close (bus, FALSE);
out:
return bus;
@@ -174,7 +169,7 @@ main (int argc,
{
GMainLoop *main_loop;
GOptionContext *context;
- DBusGConnection *connection;
+ GDBusConnection *connection;
GdmSlave *slave;
static char *display_id = NULL;
GdmSignalHandler *signal_handler;
@@ -269,8 +264,9 @@ main (int argc,
g_main_loop_unref (main_loop);
out:
-
g_debug ("Slave finished");
+ g_object_unref (connection);
+
return gdm_return_code;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]