Skip to content

Commit

Permalink
common: Use GDBus for GdmSettings
Browse files Browse the repository at this point in the history
GdmSettings is a system bus service provided by
GDM so that greeters can read custom.conf without
parsing the file themselves.

This commit changes GdmSettings to use gdbus instead
of dbus-glib.

https://bugzilla.gnome.org/show_bug.cgi?id=622888
  • Loading branch information
gcampax authored and halfline committed Jul 17, 2012
1 parent 560e530 commit 20cf9b2
Show file tree
Hide file tree
Showing 9 changed files with 170 additions and 214 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,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
Expand Down
14 changes: 12 additions & 2 deletions common/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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
$(AM_V_GEN)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
Expand Down Expand Up @@ -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) \
Expand Down Expand Up @@ -139,6 +148,7 @@ test_settings_client_LDADD = \
$(NULL)

CLEANFILES = \
gdm-settings-glue.c \
$(BUILT_SOURCES) \
$(NULL)

Expand Down
107 changes: 35 additions & 72 deletions common/gdm-settings-client.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,26 +29,23 @@
#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"
#define SETTINGS_DBUS_INTERFACE "org.gnome.DisplayManager.Settings"

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 {
Expand Down Expand Up @@ -94,65 +91,43 @@ 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
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
Expand Down Expand Up @@ -467,11 +442,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;

Expand Down Expand Up @@ -502,21 +477,16 @@ 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_DO_NOT_LOAD_PROPERTIES,
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;
}

Expand All @@ -532,14 +502,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;
}

Expand Down
87 changes: 72 additions & 15 deletions common/gdm-settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -50,7 +48,8 @@

struct GdmSettingsPrivate
{
DBusGConnection *connection;
GDBusConnection *connection;
GdmDBusSettings *skeleton;
GdmSettingsBackend *backend;
};

Expand Down Expand Up @@ -138,13 +137,59 @@ gdm_settings_set_value (GdmSettings *settings,
return res;
}

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);
Expand All @@ -153,7 +198,22 @@ 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;
}
Expand Down Expand Up @@ -184,8 +244,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
Expand All @@ -196,13 +254,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
Expand Down
Loading

0 comments on commit 20cf9b2

Please sign in to comment.