summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Campagna <gcampagna@src.gnome.org>2012-05-03 18:29:00 +0200
committerRay Strode <rstrode@redhat.com>2012-07-17 03:29:07 -0400
commit03bf6cb6a38cf686329a4927aaf0d8ea503ae937 (patch)
tree818663d72b652a97f6db6041fad12d8259ebc448
parentc06ef826167298b56d29e77bf37194ecb6983ff5 (diff)
downloadgdm-03bf6cb6a38cf686329a4927aaf0d8ea503ae937.tar.gz
daemon: Port display handling to GDBus
This is one big commit because it uses generated code both in the daemon and in the slaves, so we need to port both at the same time. https://bugzilla.gnome.org/show_bug.cgi?id=622888
-rw-r--r--.gitignore8
-rw-r--r--daemon/Makefile.am117
-rw-r--r--daemon/gdm-display.c289
-rw-r--r--daemon/gdm-display.h4
-rw-r--r--daemon/gdm-display.xml3
-rw-r--r--daemon/gdm-local-display-factory.c257
-rw-r--r--daemon/gdm-slave.c744
-rw-r--r--daemon/gdm-slave.h4
-rw-r--r--daemon/gdm-static-display.c36
-rw-r--r--daemon/gdm-static-display.h1
-rw-r--r--daemon/gdm-transient-display.c38
-rw-r--r--daemon/gdm-transient-display.h1
-rw-r--r--daemon/gdm-xdmcp-chooser-display.c106
-rw-r--r--daemon/gdm-xdmcp-chooser-display.h1
-rw-r--r--daemon/gdm-xdmcp-chooser-display.xml5
-rw-r--r--daemon/gdm-xdmcp-chooser-slave.c2
-rw-r--r--daemon/gdm-xdmcp-display.h1
-rw-r--r--daemon/gdm-xdmcp-display.xml (renamed from daemon/gdm-xdmcp-greeter-display.xml)0
-rw-r--r--daemon/gdm-xdmcp-greeter-display.h1
-rw-r--r--data/gdm.conf.in8
20 files changed, 926 insertions, 700 deletions
diff --git a/.gitignore b/.gitignore
index 8692d11a..c6775af8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,7 +28,9 @@ configure.lineno
gdm.conf
gdm.conf-custom
gdm-display-glue.h
+gdm-display-glue.c
gdm-local-display-factory-glue.h
+gdm-local-display-factory-glue.c
gdm-manager-glue.h
gdm.pot
gdm-restart
@@ -41,12 +43,18 @@ gdm-simple-greeter.desktop.in
gdm-simple-greeter.schemas
gdm-simple-slave-glue.h
gdm-slave-glue.h
+gdm-slave-glue.c
gdm-static-display-glue.h
+gdm-static-display-glue.c
gdm-static-factory-display-glue.h
gdm-stop
gdm-transient-display-glue.h
+gdm-transient-display-glue.c
+gdm-xdmcp-display-glue.h
+gdm-xdmcp-display-glue.c
gdm-xdmcp-chooser-display-glue.h
gdm-xdmcp-chooser-slave-glue.h
+gdm-xdmcp-chooser-slave-glue.c
gdm-xdmcp-greeter-display-glue.h
gdm-greeter-glue.h
gdm-greeter-glue.c
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index 58351a14..0ad4ea24 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -33,8 +33,7 @@ BUILT_SOURCES = \
gdm-xdmcp-chooser-slave-glue.h \
gdm-manager-glue.h \
gdm-display-glue.h \
- gdm-xdmcp-greeter-display-glue.h \
- gdm-xdmcp-chooser-display-glue.h \
+ gdm-xdmcp-display-glue.h \
gdm-static-display-glue.h \
gdm-transient-display-glue.h \
gdm-local-display-factory-glue.h \
@@ -43,22 +42,41 @@ BUILT_SOURCES = \
gdm-manager-glue.h: gdm-manager.xml Makefile.am
dbus-binding-tool --prefix=gdm_manager --mode=glib-server --output=gdm-manager-glue.h $(srcdir)/gdm-manager.xml
-gdm-slave-glue.h: gdm-slave.xml Makefile.am
- dbus-binding-tool --prefix=gdm_slave --mode=glib-server --output=gdm-slave-glue.h $(srcdir)/gdm-slave.xml
-gdm-xdmcp-chooser-slave-glue.h: gdm-xdmcp-chooser-slave.xml Makefile.am
- dbus-binding-tool --prefix=gdm_xdmcp_chooser_slave --mode=glib-server --output=gdm-xdmcp-chooser-slave-glue.h $(srcdir)/gdm-xdmcp-chooser-slave.xml
-gdm-display-glue.h: gdm-display.xml Makefile.am
- dbus-binding-tool --prefix=gdm_display --mode=glib-server --output=gdm-display-glue.h $(srcdir)/gdm-display.xml
-gdm-xdmcp-greeter-display-glue.h: gdm-xdmcp-greeter-display.xml Makefile.am
- dbus-binding-tool --prefix=gdm_xdmcp_greeter_display --mode=glib-server --output=gdm-xdmcp-greeter-display-glue.h $(srcdir)/gdm-xdmcp-greeter-display.xml
-gdm-xdmcp-chooser-display-glue.h: gdm-xdmcp-chooser-display.xml Makefile.am
- dbus-binding-tool --prefix=gdm_xdmcp_chooser_display --mode=glib-server --output=gdm-xdmcp-chooser-display-glue.h $(srcdir)/gdm-xdmcp-chooser-display.xml
-gdm-static-display-glue.h: gdm-static-display.xml Makefile.am
- dbus-binding-tool --prefix=gdm_static_display --mode=glib-server --output=gdm-static-display-glue.h $(srcdir)/gdm-static-display.xml
-gdm-transient-display-glue.h: gdm-transient-display.xml Makefile.am
- dbus-binding-tool --prefix=gdm_transient_display --mode=glib-server --output=gdm-transient-display-glue.h $(srcdir)/gdm-transient-display.xml
-gdm-local-display-factory-glue.h: gdm-local-display-factory.xml Makefile.am
- dbus-binding-tool --prefix=gdm_local_display_factory --mode=glib-server --output=gdm-local-display-factory-glue.h $(srcdir)/gdm-local-display-factory.xml
+
+gdm-display-glue.c gdm-display-glue.h: gdm-display.xml Makefile.am
+ $(AM_V_GEN)gdbus-codegen \
+ --c-namespace=GdmDBus \
+ --interface-prefix=org.gnome.DisplayManager \
+ --generate-c-code=gdm-display-glue \
+ $(srcdir)/gdm-display.xml
+
+gdm-xdmcp-display-glue.c gdm-xdmcp-display-glue.h: gdm-xdmcp-display.xml Makefile.am
+ $(AM_V_GEN)gdbus-codegen \
+ --c-namespace=GdmDBus \
+ --interface-prefix=org.gnome.DisplayManager \
+ --generate-c-code=gdm-xdmcp-display-glue \
+ $(srcdir)/gdm-xdmcp-display.xml
+
+gdm-transient-display-glue.c gdm-transient-display-glue.h: gdm-transient-display.xml Makefile.am
+ $(AM_V_GEN)gdbus-codegen \
+ --c-namespace=GdmDBus \
+ --interface-prefix=org.gnome.DisplayManager \
+ --generate-c-code=gdm-transient-display-glue \
+ $(srcdir)/gdm-transient-display.xml
+
+gdm-static-display-glue.c gdm-static-display-glue.h: gdm-static-display.xml Makefile.am
+ $(AM_V_GEN)gdbus-codegen \
+ --c-namespace=GdmDBus \
+ --interface-prefix=org.gnome.DisplayManager \
+ --generate-c-code=gdm-static-display-glue \
+ $(srcdir)/gdm-static-display.xml
+
+gdm-local-display-factory-glue.c gdm-local-display-factory-glue.h : gdm-local-display-factory.xml Makefile.am
+ $(AM_V_GEN)gdbus-codegen \
+ --c-namespace=GdmDBus \
+ --interface-prefix=org.gnome.DisplayManager \
+ --generate-c-code=gdm-local-display-factory-glue \
+ $(srcdir)/gdm-local-display-factory.xml
gdm-greeter-glue.c gdm-greeter-glue.h : gdm-greeter-server.xml Makefile.am
$(AM_V_GEN)gdbus-codegen \
@@ -67,6 +85,20 @@ gdm-greeter-glue.c gdm-greeter-glue.h : gdm-greeter-server.xml Makefile.am
--generate-c-code=gdm-greeter-glue \
$(srcdir)/gdm-greeter-server.xml
+gdm-slave-glue.c gdm-slave-glue.h: gdm-slave.xml Makefile.am
+ $(AM_V_GEN)gdbus-codegen \
+ --c-namespace=GdmDBus \
+ --interface-prefix=org.gnome.DisplayManager \
+ --generate-c-code=gdm-slave-glue \
+ $(srcdir)/gdm-slave.xml
+
+gdm-xdmcp-chooser-slave-glue.c gdm-xdmcp-chooser-slave-glue.h: gdm-xdmcp-chooser-slave.xml Makefile.am
+ $(AM_V_GEN)gdbus-codegen \
+ --c-namespace=GdmDBus \
+ --interface-prefix=org.gnome.DisplayManager \
+ --generate-c-code=gdm-xdmcp-chooser-slave-glue \
+ $(srcdir)/gdm-xdmcp-chooser-slave.xml
+
noinst_PROGRAMS = \
test-session \
$(NULL)
@@ -129,6 +161,10 @@ gdm_simple_slave_SOURCES = \
nodist_gdm_simple_slave_SOURCES = \
gdm-greeter-glue.c \
gdm-greeter-glue.h \
+ gdm-display-glue.c \
+ gdm-display-glue.h \
+ gdm-slave-glue.c \
+ gdm-slave-glue.h \
$(NULL)
gdm_simple_slave_LDFLAGS = \
@@ -168,6 +204,15 @@ gdm_xdmcp_chooser_slave_SOURCES = \
gdm-dbus-util.h \
$(NULL)
+nodist_gdm_xdmcp_chooser_slave_SOURCES = \
+ gdm-greeter-glue.c \
+ gdm-greeter-glue.h \
+ gdm-display-glue.c \
+ gdm-display-glue.h \
+ gdm-slave-glue.c \
+ gdm-slave-glue.h \
+ $(NULL)
+
gdm_xdmcp_chooser_slave_LDADD = \
$(XLIB_LIBS) \
$(DAEMON_LIBS) \
@@ -234,6 +279,17 @@ gdm_binary_SOURCES = \
gdm-slave-proxy.h \
$(NULL)
+nodist_gdm_binary_SOURCES = \
+ gdm-display-glue.h \
+ gdm-display-glue.c \
+ gdm-local-display-factory-glue.h \
+ gdm-local-display-factory-glue.c \
+ gdm-transient-display-glue.h \
+ gdm-transient-display-glue.c \
+ gdm-static-display-glue.h \
+ gdm-static-display-glue.c \
+ $(NULL)
+
XDMCP_SOURCES = \
gdm-xdmcp-display-factory.c \
gdm-xdmcp-display-factory.h \
@@ -245,8 +301,16 @@ XDMCP_SOURCES = \
gdm-xdmcp-chooser-display.h \
$(NULL)
+XDMCP_nodist_SOURCES = \
+ gdm-xdmcp-display-glue.c \
+ gdm-xdmcp-display-glue.h \
+ gdm-xdmcp-chooser-slave-glue.c \
+ gdm-xdmcp-chooser-slave-glue.h \
+ $(NULL)
+
if XDMCP_SUPPORT
gdm_binary_SOURCES += $(XDMCP_SOURCES)
+nodist_gdm_binary_SOURCES += $(XDMCP_nodist_SOURCES)
endif
EXTRA_gdm_binary_SOURCES = \
@@ -284,9 +348,17 @@ sbin_SCRIPTS = \
gdm: $(srcdir)/gdm.in
sed -e 's,[@]sbindir[@],$(sbindir),g' <$(srcdir)/gdm.in >gdm
-CLEANFILES = \
- gdm \
- $(BUILT_SOURCES) \
+CLEANFILES = \
+ gdm \
+ gdm-display-glue.c \
+ gdm-greeter-glue.c \
+ gdm-local-display-factory-glue.c \
+ gdm-slave-glue.c \
+ gdm-static-display-glue.c \
+ gdm-transient-display-glue.c \
+ gdm-xdmcp-chooser-slave-glue.c \
+ gdm-xdmcp-display-glue.c \
+ $(BUILT_SOURCES) \
$(NULL)
EXTRA_DIST = \
@@ -298,8 +370,7 @@ EXTRA_DIST = \
gdm-session.xml \
gdm-manager.xml \
gdm-display.xml \
- gdm-xdmcp-greeter-display.xml \
- gdm-xdmcp-chooser-display.xml \
+ gdm-xdmcp-display.xml \
gdm-static-display.xml \
gdm-transient-display.xml \
gdm-local-display-factory.xml \
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
index 7a6b4b38..1cadc767 100644
--- a/daemon/gdm-display.c
+++ b/daemon/gdm-display.c
@@ -69,8 +69,12 @@ struct GdmDisplayPrivate
guint finish_idle_id;
GdmSlaveProxy *slave_proxy;
- DBusGConnection *connection;
+ char *slave_bus_name;
+ GDBusConnection *connection;
GdmDisplayAccessFile *user_access_file;
+
+ GdmDBusDisplay *display_skeleton;
+ GDBusObjectSkeleton *object_skeleton;
};
enum {
@@ -280,6 +284,8 @@ gdm_display_real_set_slave_bus_name (GdmDisplay *display,
const char *name,
GError **error)
{
+ g_free (display->priv->slave_bus_name);
+ display->priv->slave_bus_name = g_strdup (name);
return TRUE;
}
@@ -934,21 +940,272 @@ gdm_display_get_property (GObject *object,
}
static gboolean
+handle_get_id (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmDisplay *display)
+{
+ char *id;
+
+ gdm_display_get_id (display, &id, NULL);
+
+ gdm_dbus_display_complete_get_id (skeleton, invocation, id);
+
+ g_free (id);
+ return TRUE;
+}
+
+static gboolean
+handle_get_remote_hostname (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmDisplay *display)
+{
+ char *hostname;
+
+ gdm_display_get_remote_hostname (display, &hostname, NULL);
+
+ gdm_dbus_display_complete_get_remote_hostname (skeleton,
+ invocation,
+ hostname ? hostname : "");
+
+ g_free (hostname);
+ return TRUE;
+}
+
+static gboolean
+handle_get_seat_id (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmDisplay *display)
+{
+ char *seat_id;
+
+ seat_id = NULL;
+ gdm_display_get_seat_id (display, &seat_id, NULL);
+
+ if (seat_id == NULL) {
+ seat_id = g_strdup ("");
+ }
+ gdm_dbus_display_complete_get_seat_id (skeleton, invocation, seat_id);
+
+ g_free (seat_id);
+ return TRUE;
+}
+
+static gboolean
+handle_get_timed_login_details (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmDisplay *display)
+{
+ gboolean enabled;
+ char *username;
+ int delay;
+
+ gdm_display_get_timed_login_details (display, &enabled, &username, &delay, NULL);
+
+ gdm_dbus_display_complete_get_timed_login_details (skeleton,
+ invocation,
+ enabled,
+ username ? username : "",
+ delay);
+
+ g_free (username);
+ return TRUE;
+}
+
+static gboolean
+handle_get_x11_authority_file (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmDisplay *display)
+{
+ char *file;
+
+ gdm_display_get_x11_authority_file (display, &file, NULL);
+
+ gdm_dbus_display_complete_get_x11_authority_file (skeleton, invocation, file);
+
+ g_free (file);
+ return TRUE;
+}
+
+static gboolean
+handle_get_x11_cookie (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmDisplay *display)
+{
+ GArray *cookie = NULL;
+
+ gdm_display_get_x11_cookie (display, &cookie, NULL);
+
+ gdm_dbus_display_complete_get_x11_cookie (skeleton, invocation, cookie->data);
+
+ g_array_unref (cookie);
+ return TRUE;
+}
+
+static gboolean
+handle_get_x11_display_name (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmDisplay *display)
+{
+ char *name;
+
+ gdm_display_get_x11_display_name (display, &name, NULL);
+
+ gdm_dbus_display_complete_get_x11_display_name (skeleton, invocation, name);
+
+ g_free (name);
+ return TRUE;
+}
+
+static gboolean
+handle_get_x11_display_number (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmDisplay *display)
+{
+ int name;
+
+ gdm_display_get_x11_display_number (display, &name, NULL);
+
+ gdm_dbus_display_complete_get_x11_display_number (skeleton, invocation, name);
+
+ return TRUE;
+}
+
+static gboolean
+handle_is_local (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmDisplay *display)
+{
+ gboolean is_local;
+
+ gdm_display_is_local (display, &is_local, NULL);
+
+ gdm_dbus_display_complete_is_local (skeleton, invocation, is_local);
+
+ return TRUE;
+}
+
+static gboolean
+handle_get_slave_bus_name (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmDisplay *display)
+{
+ if (display->priv->slave_bus_name != NULL) {
+ gdm_dbus_display_complete_get_slave_bus_name (skeleton, invocation,
+ display->priv->slave_bus_name);
+ } else {
+ g_dbus_method_invocation_return_dbus_error (invocation,
+ "org.gnome.DisplayManager.NotReady",
+ "Slave is not yet registered");
+ }
+
+ return TRUE;
+}
+
+static gboolean
+handle_set_slave_bus_name (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ const char *bus_name,
+ GdmDisplay *display)
+{
+ GError *error;
+
+ if (gdm_display_set_slave_bus_name (display, bus_name, &error)) {
+ gdm_dbus_display_complete_set_slave_bus_name (skeleton, invocation);
+ } else {
+ g_dbus_method_invocation_return_gerror (invocation, error);
+ g_error_free (error);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+handle_add_user_authorization (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ const char *username,
+ GdmDisplay *display)
+{
+ char *filename;
+ GError *error;
+
+ if (gdm_display_add_user_authorization (display, username, &filename, &error)) {
+ gdm_dbus_display_complete_add_user_authorization (skeleton,
+ invocation,
+ filename);
+ g_free (filename);
+ } else {
+ g_dbus_method_invocation_return_gerror (invocation, error);
+ g_error_free (error);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+handle_remove_user_authorization (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ const char *username,
+ GdmDisplay *display)
+{
+ GError *error;
+
+ if (gdm_display_remove_user_authorization (display, username, &error)) {
+ gdm_dbus_display_complete_remove_user_authorization (skeleton, invocation);
+ } else {
+ g_dbus_method_invocation_return_gerror (invocation, error);
+ g_error_free (error);
+ }
+
+ return TRUE;
+}
+
+
+
+static gboolean
register_display (GdmDisplay *display)
{
GError *error = NULL;
error = NULL;
- display->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+ display->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
if (display->priv->connection == NULL) {
- if (error != NULL) {
- g_critical ("error getting system bus: %s", error->message);
- g_error_free (error);
- }
+ g_critical ("error getting system bus: %s", error->message);
+ g_error_free (error);
exit (1);
}
- dbus_g_connection_register_g_object (display->priv->connection, display->priv->id, G_OBJECT (display));
+ display->priv->object_skeleton = g_dbus_object_skeleton_new (display->priv->id);
+ display->priv->display_skeleton = GDM_DBUS_DISPLAY (gdm_dbus_display_skeleton_new ());
+
+ g_signal_connect (display->priv->display_skeleton, "handle-get-id",
+ G_CALLBACK (handle_get_id), display);
+ g_signal_connect (display->priv->display_skeleton, "handle-get-remote-hostname",
+ G_CALLBACK (handle_get_remote_hostname), display);
+ g_signal_connect (display->priv->display_skeleton, "handle-get-seat-id",
+ G_CALLBACK (handle_get_seat_id), display);
+ g_signal_connect (display->priv->display_skeleton, "handle-get-timed-login-details",
+ G_CALLBACK (handle_get_timed_login_details), display);
+ g_signal_connect (display->priv->display_skeleton, "handle-get-x11-authority-file",
+ G_CALLBACK (handle_get_x11_authority_file), display);
+ g_signal_connect (display->priv->display_skeleton, "handle-get-x11-cookie",
+ G_CALLBACK (handle_get_x11_cookie), display);
+ g_signal_connect (display->priv->display_skeleton, "handle-get-x11-display-name",
+ G_CALLBACK (handle_get_x11_display_name), display);
+ g_signal_connect (display->priv->display_skeleton, "handle-get-x11-display-number",
+ G_CALLBACK (handle_get_x11_display_number), display);
+ g_signal_connect (display->priv->display_skeleton, "handle-is-local",
+ G_CALLBACK (handle_is_local), display);
+ g_signal_connect (display->priv->display_skeleton, "handle-get-slave-bus-name",
+ G_CALLBACK (handle_get_slave_bus_name), display);
+ g_signal_connect (display->priv->display_skeleton, "handle-set-slave-bus-name",
+ G_CALLBACK (handle_set_slave_bus_name), display);
+ g_signal_connect (display->priv->display_skeleton, "handle-add-user-authorization",
+ G_CALLBACK (handle_add_user_authorization), display);
+ g_signal_connect (display->priv->display_skeleton, "handle-remove-user-authorization",
+ G_CALLBACK (handle_remove_user_authorization), display);
+
+ g_dbus_object_skeleton_add_interface (display->priv->object_skeleton,
+ G_DBUS_INTERFACE_SKELETON (display->priv->display_skeleton));
return TRUE;
}
@@ -1115,8 +1372,6 @@ gdm_display_class_init (GdmDisplayClass *klass)
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
g_type_class_add_private (klass, sizeof (GdmDisplayPrivate));
-
- dbus_g_object_type_install_info (GDM_TYPE_DISPLAY, &dbus_glib_gdm_display_object_info);
}
static void
@@ -1149,6 +1404,10 @@ gdm_display_finalize (GObject *object)
g_free (display->priv->x11_cookie);
g_free (display->priv->slave_command);
+ g_clear_object (&display->priv->display_skeleton);
+ g_clear_object (&display->priv->object_skeleton);
+ g_clear_object (&display->priv->connection);
+
if (display->priv->access_file != NULL) {
g_object_unref (display->priv->access_file);
}
@@ -1163,3 +1422,15 @@ gdm_display_finalize (GObject *object)
G_OBJECT_CLASS (gdm_display_parent_class)->finalize (object);
}
+
+GDBusConnection *
+gdm_display_get_bus_connection (GdmDisplay *display)
+{
+ return display->priv->connection;
+}
+
+GDBusObjectSkeleton *
+gdm_display_get_object_skeleton (GdmDisplay *display)
+{
+ return display->priv->object_skeleton;
+}
diff --git a/daemon/gdm-display.h b/daemon/gdm-display.h
index 607ea1d4..6cbcca26 100644
--- a/daemon/gdm-display.h
+++ b/daemon/gdm-display.h
@@ -23,7 +23,7 @@
#define __GDM_DISPLAY_H
#include <glib-object.h>
-#include <dbus/dbus-glib.h>
+#include <gio/gio.h>
G_BEGIN_DECLS
@@ -97,6 +97,8 @@ gboolean gdm_display_manage (GdmDisplay *disp
gboolean gdm_display_finish (GdmDisplay *display);
gboolean gdm_display_unmanage (GdmDisplay *display);
+GDBusConnection *gdm_display_get_bus_connection (GdmDisplay *display);
+GDBusObjectSkeleton *gdm_display_get_object_skeleton (GdmDisplay *display);
/* exported to bus */
gboolean gdm_display_get_id (GdmDisplay *display,
diff --git a/daemon/gdm-display.xml b/daemon/gdm-display.xml
index a92e37fc..13c734d2 100644
--- a/daemon/gdm-display.xml
+++ b/daemon/gdm-display.xml
@@ -32,6 +32,9 @@
<method name="RemoveUserAuthorization">
<arg name="username" direction="in" type="s"/>
</method>
+ <method name="GetSlaveBusName">
+ <arg name="name" direction="out" type="s"/>
+ </method>
<method name="SetSlaveBusName">
<arg name="name" direction="in" type="s"/>
</method>
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index 9cdf1985..a533d558 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -26,9 +26,7 @@
#include <glib.h>
#include <glib/gi18n.h>
#include <glib-object.h>
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib-lowlevel.h>
+#include <gio/gio.h>
#ifdef WITH_SYSTEMD
#include <systemd/sd-daemon.h>
@@ -55,12 +53,17 @@
struct GdmLocalDisplayFactoryPrivate
{
- DBusGConnection *connection;
- DBusGProxy *proxy;
+ GdmDBusLocalDisplayFactory *skeleton;
+ GDBusConnection *connection;
GHashTable *displays;
/* FIXME: this needs to be per seat? */
guint num_failures;
+
+#ifdef WITH_SYSTEMD
+ guint seat_new_id;
+ guint seat_removed_id;
+#endif
};
enum {
@@ -384,143 +387,108 @@ delete_display (GdmLocalDisplayFactory *factory,
static gboolean gdm_local_display_factory_sync_seats (GdmLocalDisplayFactory *factory)
{
- DBusError error;
- DBusMessage *message, *reply;
- DBusMessageIter iter, sub, sub2;
-
- dbus_error_init (&error);
-
- message = dbus_message_new_method_call (
- "org.freedesktop.login1",
- "/org/freedesktop/login1",
- "org.freedesktop.login1.Manager",
- "ListSeats");
- if (message == NULL) {
- g_warning ("GdmLocalDisplayFactory: Failed to allocate message");
- return FALSE;
- }
-
- reply = dbus_connection_send_with_reply_and_block (dbus_g_connection_get_connection (factory->priv->connection), message, -1, &error);
- dbus_message_unref (message);
-
- if (reply == NULL) {
- g_warning ("GdmLocalDisplayFactory: Failed to issue method call: %s", error.message);
- dbus_error_free (&error);
- return FALSE;
- }
-
- if (!dbus_message_iter_init (reply, &iter) ||
- dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_ARRAY ||
- dbus_message_iter_get_element_type (&iter) != DBUS_TYPE_STRUCT) {
- g_warning ("GdmLocalDisplayFactory: Failed to parse reply.");
- dbus_message_unref (reply);
+ GError *error = NULL;
+ GVariant *result;
+ GVariant *array;
+ GVariantIter iter;
+ const char *seat;
+
+ result = g_dbus_connection_call_sync (factory->priv->connection,
+ "org.freedesktop.login1",
+ "/org/freedesktop/login1",
+ "org.freedesktop.login1.Manager",
+ "ListSeats",
+ NULL,
+ G_VARIANT_TYPE ("(a(so))"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL, &error);
+
+ if (!result) {
+ g_warning ("GdmLocalDisplayFactory: Failed to issue method call: %s", error->message);
+ g_clear_error (&error);
return FALSE;
}
- dbus_message_iter_recurse (&iter, &sub);
-
- while (dbus_message_iter_get_arg_type (&sub) != DBUS_TYPE_INVALID) {
- const char *seat;
-
- if (dbus_message_iter_get_arg_type (&sub) != DBUS_TYPE_STRUCT) {
- g_warning ("GdmLocalDisplayFactory: Failed to parse reply.");
- dbus_message_unref (reply);
- return FALSE;
- }
-
- dbus_message_iter_recurse (&sub, &sub2);
-
- if (dbus_message_iter_get_arg_type (&sub2) != DBUS_TYPE_STRING) {
- g_warning ("GdmLocalDisplayFactory: Failed to parse reply.");
- dbus_message_unref (reply);
- return FALSE;
- }
+ array = g_variant_get_child_value (result, 0);
+ g_variant_iter_init (&iter, array);
- dbus_message_iter_get_basic (&sub2, &seat);
+ while (g_variant_iter_loop (&iter, "(&so)", &seat, NULL))
create_display (factory, seat);
- dbus_message_iter_next (&sub);
- }
-
- dbus_message_unref (reply);
+ g_variant_unref (result);
+ g_variant_unref (array);
return TRUE;
}
-static DBusHandlerResult
-on_seat_signal (DBusConnection *connection,
- DBusMessage *message,
- void *user_data)
+static void
+on_seat_new (GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
{
- GdmLocalDisplayFactory *factory = user_data;
- DBusError error;
+ const char *seat;
- dbus_error_init (&error);
-
- if (dbus_message_is_signal (message, "org.freedesktop.login1.Manager", "SeatNew") ||
- dbus_message_is_signal (message, "org.freedesktop.login1.Manager", "SeatRemoved")) {
- const char *seat;
-
- dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &seat,
- DBUS_TYPE_INVALID);
-
- if (dbus_error_is_set (&error)) {
- g_warning ("GdmLocalDisplayFactory: Failed to decode seat message: %s", error.message);
- dbus_error_free (&error);
- } else {
+ g_variant_get (parameters, "(&s)", &seat);
+ create_display (GDM_LOCAL_DISPLAY_FACTORY (user_data), seat);
+}
- if (strcmp (dbus_message_get_member (message), "SeatNew") == 0) {
- create_display (factory, seat);
- } else {
- delete_display (factory, seat);
- }
- }
- }
+static void
+on_seat_removed (GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ const char *seat;
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ g_variant_get (parameters, "(&s)", &seat);
+ delete_display (GDM_LOCAL_DISPLAY_FACTORY (user_data), seat);
}
static void
gdm_local_display_factory_start_monitor (GdmLocalDisplayFactory *factory)
{
- DBusError error;
-
- dbus_error_init (&error);
-
- dbus_bus_add_match (dbus_g_connection_get_connection (factory->priv->connection),
- "type='signal',"
- "sender='org.freedesktop.login1',"
- "path='/org/freedesktop/login1',"
- "interface='org.freedesktop.login1.Manager',"
- "member='SeatNew'",
- &error);
-
- if (dbus_error_is_set (&error)) {
- g_warning ("GdmLocalDisplayFactory: Failed to add match for SeatNew: %s", error.message);
- dbus_error_free (&error);
- }
-
- dbus_bus_add_match (dbus_g_connection_get_connection (factory->priv->connection),
- "type='signal',"
- "sender='org.freedesktop.login1',"
- "path='/org/freedesktop/login1',"
- "interface='org.freedesktop.login1.Manager',"
- "member='SeatRemoved'",
- &error);
-
- if (dbus_error_is_set (&error)) {
- g_warning ("GdmLocalDisplayFactory: Failed to add match for SeatNew: %s", error.message);
- dbus_error_free (&error);
- }
-
- dbus_connection_add_filter (dbus_g_connection_get_connection (factory->priv->connection), on_seat_signal, factory, NULL);
+ factory->priv->seat_new_id = g_dbus_connection_signal_subscribe (factory->priv->connection,
+ "org.freedesktop.login1",
+ "org.freedesktop.login1.Manager",
+ "SeatNew",
+ "/org/freedesktop/login1",
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ on_seat_new,
+ g_object_ref (factory),
+ g_object_unref);
+ factory->priv->seat_removed_id = g_dbus_connection_signal_subscribe (factory->priv->connection,
+ "org.freedesktop.login1",
+ "org.freedesktop.login1.Manager",
+ "SeatRemoved",
+ "/org/freedesktop/login1",
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ on_seat_removed,
+ g_object_ref (factory),
+ g_object_unref);
}
static void
gdm_local_display_factory_stop_monitor (GdmLocalDisplayFactory *factory)
{
- dbus_connection_remove_filter (dbus_g_connection_get_connection (factory->priv->connection), on_seat_signal, factory);
+ if (factory->priv->seat_new_id) {
+ g_dbus_connection_signal_unsubscribe (factory->priv->connection,
+ factory->priv->seat_new_id);
+ factory->priv->seat_new_id = 0;
+ }
+ if (factory->priv->seat_removed_id) {
+ g_dbus_connection_signal_unsubscribe (factory->priv->connection,
+ factory->priv->seat_removed_id);
+ factory->priv->seat_removed_id = 0;
+ }
}
#endif
@@ -587,21 +555,55 @@ gdm_local_display_factory_get_property (GObject *object,
}
static gboolean
+handle_create_transient_display (GdmDBusLocalDisplayFactory *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmLocalDisplayFactory *factory)
+{
+ GError *error = NULL;
+ gboolean created;
+ char *id = NULL;
+
+ created = gdm_local_display_factory_create_transient_display (factory,
+ &id,
+ &error);
+ if (!created) {
+ g_dbus_method_invocation_return_gerror (invocation, error);
+ } else {
+ gdm_dbus_local_display_factory_complete_create_transient_display (skeleton, invocation, id);
+ }
+
+ g_free (id);
+ return TRUE;
+}
+
+static gboolean
register_factory (GdmLocalDisplayFactory *factory)
{
GError *error = NULL;
error = NULL;
- factory->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+ factory->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
if (factory->priv->connection == NULL) {
- if (error != NULL) {
- g_critical ("error getting system bus: %s", error->message);
- g_error_free (error);
- }
+ g_critical ("error getting system bus: %s", error->message);
+ g_error_free (error);
exit (1);
}
- dbus_g_connection_register_g_object (factory->priv->connection, GDM_LOCAL_DISPLAY_FACTORY_DBUS_PATH, G_OBJECT (factory));
+ factory->priv->skeleton = GDM_DBUS_LOCAL_DISPLAY_FACTORY (gdm_dbus_local_display_factory_skeleton_new ());
+
+ g_signal_connect (factory->priv->skeleton,
+ "handle-create-transient-display",
+ G_CALLBACK (handle_create_transient_display),
+ factory);
+
+ if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (factory->priv->skeleton),
+ factory->priv->connection,
+ GDM_LOCAL_DISPLAY_FACTORY_DBUS_PATH,
+ &error)) {
+ g_critical ("error exporting LocalDisplayFactory object: %s", error->message);
+ g_error_free (error);
+ exit (1);
+ }
return TRUE;
}
@@ -641,8 +643,6 @@ gdm_local_display_factory_class_init (GdmLocalDisplayFactoryClass *klass)
factory_class->stop = gdm_local_display_factory_stop;
g_type_class_add_private (klass, sizeof (GdmLocalDisplayFactoryPrivate));
-
- dbus_g_object_type_install_info (GDM_TYPE_LOCAL_DISPLAY_FACTORY, &dbus_glib_gdm_local_display_factory_object_info);
}
static void
@@ -665,6 +665,9 @@ gdm_local_display_factory_finalize (GObject *object)
g_return_if_fail (factory->priv != NULL);
+ g_clear_object (&factory->priv->connection);
+ g_clear_object (&factory->priv->skeleton);
+
g_hash_table_destroy (factory->priv->displays);
#ifdef WITH_SYSTEMD
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index c1c4a97a..97a55444 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -38,10 +38,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 <X11/Xlib.h> /* for Display */
#include <X11/Xatom.h> /* for XA_PIXMAP */
#include <X11/cursorfont.h> /* for watch cursor */
@@ -62,6 +58,7 @@
#include "gdm-slave.h"
#include "gdm-slave-glue.h"
+#include "gdm-display-glue.h"
#include "gdm-server.h"
@@ -79,11 +76,12 @@
#define GDM_DBUS_NAME "org.gnome.DisplayManager"
#define GDM_DBUS_DISPLAY_INTERFACE "org.gnome.DisplayManager.Display"
+#define GDM_SLAVE_PATH "/org/gnome/DisplayManager/Slave"
+
#define MAX_CONNECT_ATTEMPTS 10
struct GdmSlavePrivate
{
- char *id;
GPid pid;
guint output_watch_id;
guint error_watch_id;
@@ -102,11 +100,10 @@ struct GdmSlavePrivate
char *parent_display_name;
char *parent_display_x11_authority_file;
char *windowpath;
+ char *display_x11_cookie;
- GArray *display_x11_cookie;
-
- DBusGProxy *display_proxy;
- DBusGConnection *connection;
+ GdmDBusDisplay *display_proxy;
+ GDBusConnection *connection;
};
enum {
@@ -697,8 +694,8 @@ gdm_slave_connect_to_x11_display (GdmSlave *slave)
/* Give slave access to the display independent of current hostname */
XSetAuthorization ("MIT-MAGIC-COOKIE-1",
strlen ("MIT-MAGIC-COOKIE-1"),
- slave->priv->display_x11_cookie->data,
- slave->priv->display_x11_cookie->len);
+ slave->priv->display_x11_cookie,
+ strlen (slave->priv->display_x11_cookie));
slave->priv->server_display = XOpenDisplay (slave->priv->display_name);
@@ -737,15 +734,6 @@ gdm_slave_connect_to_x11_display (GdmSlave *slave)
return ret;
}
-static void
-display_proxy_destroyed_cb (DBusGProxy *display_proxy,
- GdmSlave *slave)
-{
- g_debug ("GdmSlave: Disconnected from display");
-
- slave->priv->display_proxy = NULL;
-}
-
static gboolean
gdm_slave_set_slave_bus_name (GdmSlave *slave)
{
@@ -753,23 +741,16 @@ gdm_slave_set_slave_bus_name (GdmSlave *slave)
GError *error;
const char *name;
- name = dbus_bus_get_unique_name (dbus_g_connection_get_connection (slave->priv->connection));
+ name = g_dbus_connection_get_unique_name (slave->priv->connection);
error = NULL;
- res = dbus_g_proxy_call (slave->priv->display_proxy,
- "SetSlaveBusName",
- &error,
- G_TYPE_STRING, name,
- G_TYPE_INVALID,
- G_TYPE_INVALID);
-
+ res = gdm_dbus_display_call_set_slave_bus_name_sync (slave->priv->display_proxy,
+ name,
+ NULL,
+ &error);
if (! res) {
- if (error != NULL) {
- g_warning ("Failed to set slave bus name on parent: %s", error->message);
- g_error_free (error);
- } else {
- g_warning ("Failed to set slave bus name on parent");
- }
+ g_warning ("Failed to set slave bus name on parent: %s", error->message);
+ g_error_free (error);
}
return res;
@@ -788,42 +769,27 @@ gdm_slave_real_start (GdmSlave *slave)
g_debug ("GdmSlave: Creating proxy for %s", slave->priv->display_id);
error = NULL;
- slave->priv->display_proxy = dbus_g_proxy_new_for_name_owner (slave->priv->connection,
- GDM_DBUS_NAME,
- slave->priv->display_id,
- GDM_DBUS_DISPLAY_INTERFACE,
- &error);
- g_signal_connect (slave->priv->display_proxy,
- "destroy",
- G_CALLBACK (display_proxy_destroyed_cb),
- slave);
+ slave->priv->display_proxy = GDM_DBUS_DISPLAY (gdm_dbus_display_proxy_new_sync (slave->priv->connection,
+ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+ GDM_DBUS_NAME,
+ slave->priv->display_id,
+ NULL,
+ &error));
if (slave->priv->display_proxy == NULL) {
- if (error != NULL) {
- g_warning ("Failed to create display proxy %s: %s", slave->priv->display_id, error->message);
- g_error_free (error);
- } else {
- g_warning ("Unable to create display proxy");
- }
+ g_warning ("Failed to create display proxy %s: %s", slave->priv->display_id, error->message);
+ g_error_free (error);
return FALSE;
}
- /* Make sure display ID works */
error = NULL;
- res = dbus_g_proxy_call (slave->priv->display_proxy,
- "GetId",
- &error,
- G_TYPE_INVALID,
- DBUS_TYPE_G_OBJECT_PATH, &id,
- G_TYPE_INVALID);
+ res = gdm_dbus_display_call_get_id_sync (slave->priv->display_proxy,
+ &id,
+ NULL,
+ &error);
if (! res) {
- if (error != NULL) {
- g_warning ("Failed to get display ID %s: %s", slave->priv->display_id, error->message);
- g_error_free (error);
- } else {
- g_warning ("Failed to get display ID %s", slave->priv->display_id);
- }
-
+ g_warning ("Failed to get display ID %s: %s", slave->priv->display_id, error->message);
+ g_error_free (error);
return FALSE;
}
@@ -838,129 +804,79 @@ gdm_slave_real_start (GdmSlave *slave)
/* cache some values up front */
error = NULL;
- res = dbus_g_proxy_call (slave->priv->display_proxy,
- "IsLocal",
- &error,
- G_TYPE_INVALID,
- G_TYPE_BOOLEAN, &slave->priv->display_is_local,
- G_TYPE_INVALID);
+ res = gdm_dbus_display_call_is_local_sync (slave->priv->display_proxy,
+ &slave->priv->display_is_local,
+ NULL,
+ &error);
if (! res) {
- if (error != NULL) {
- g_warning ("Failed to get value: %s", error->message);
- g_error_free (error);
- } else {
- g_warning ("Failed to get value");
- }
-
+ g_warning ("Failed to get value: %s", error->message);
+ g_error_free (error);
return FALSE;
}
error = NULL;
- res = dbus_g_proxy_call (slave->priv->display_proxy,
- "GetX11DisplayName",
- &error,
- G_TYPE_INVALID,
- G_TYPE_STRING, &slave->priv->display_name,
- G_TYPE_INVALID);
+ res = gdm_dbus_display_call_get_x11_display_name_sync (slave->priv->display_proxy,
+ &slave->priv->display_name,
+ NULL,
+ &error);
if (! res) {
- if (error != NULL) {
- g_warning ("Failed to get value: %s", error->message);
- g_error_free (error);
- } else {
- g_warning ("Failed to get value");
- }
-
+ g_warning ("Failed to get value: %s", error->message);
+ g_error_free (error);
return FALSE;
}
error = NULL;
- res = dbus_g_proxy_call (slave->priv->display_proxy,
- "GetX11DisplayNumber",
- &error,
- G_TYPE_INVALID,
- G_TYPE_INT, &slave->priv->display_number,
- G_TYPE_INVALID);
+ res = gdm_dbus_display_call_get_x11_display_number_sync (slave->priv->display_proxy,
+ &slave->priv->display_number,
+ NULL,
+ &error);
if (! res) {
- if (error != NULL) {
- g_warning ("Failed to get value: %s", error->message);
- g_error_free (error);
- } else {
- g_warning ("Failed to get value");
- }
-
+ g_warning ("Failed to get value: %s", error->message);
+ g_error_free (error);
return FALSE;
}
error = NULL;
- res = dbus_g_proxy_call (slave->priv->display_proxy,
- "GetRemoteHostname",
- &error,
- G_TYPE_INVALID,
- G_TYPE_STRING, &slave->priv->display_hostname,
- G_TYPE_INVALID);
+ res = gdm_dbus_display_call_get_remote_hostname_sync (slave->priv->display_proxy,
+ &slave->priv->display_hostname,
+ NULL,
+ &error);
if (! res) {
- if (error != NULL) {
- g_warning ("Failed to get value: %s", error->message);
- g_error_free (error);
- } else {
- g_warning ("Failed to get value");
- }
-
+ g_warning ("Failed to get value: %s", error->message);
+ g_error_free (error);
return FALSE;
}
error = NULL;
- res = dbus_g_proxy_call (slave->priv->display_proxy,
- "GetX11Cookie",
- &error,
- G_TYPE_INVALID,
- dbus_g_type_get_collection ("GArray", G_TYPE_CHAR),
- &slave->priv->display_x11_cookie,
- G_TYPE_INVALID);
+ res = gdm_dbus_display_call_get_x11_cookie_sync (slave->priv->display_proxy,
+ &slave->priv->display_x11_cookie,
+ NULL,
+ &error);
if (! res) {
- if (error != NULL) {
- g_warning ("Failed to get value: %s", error->message);
- g_error_free (error);
- } else {
- g_warning ("Failed to get value");
- }
-
+ g_warning ("Failed to get value: %s", error->message);
+ g_error_free (error);
return FALSE;
}
error = NULL;
- res = dbus_g_proxy_call (slave->priv->display_proxy,
- "GetX11AuthorityFile",
- &error,
- G_TYPE_INVALID,
- G_TYPE_STRING, &slave->priv->display_x11_authority_file,
- G_TYPE_INVALID);
+ res = gdm_dbus_display_call_get_x11_authority_file_sync (slave->priv->display_proxy,
+ &slave->priv->display_x11_authority_file,
+ NULL,
+ &error);
if (! res) {
- if (error != NULL) {
- g_warning ("Failed to get value: %s", error->message);
- g_error_free (error);
- } else {
- g_warning ("Failed to get value");
- }
-
+ g_warning ("Failed to get value: %s", error->message);
+ g_error_free (error);
return FALSE;
}
error = NULL;
- res = dbus_g_proxy_call (slave->priv->display_proxy,
- "GetSeatId",
- &error,
- G_TYPE_INVALID,
- G_TYPE_STRING, &slave->priv->display_seat_id,
- G_TYPE_INVALID);
+ res = gdm_dbus_display_call_get_seat_id_sync (slave->priv->display_proxy,
+ &slave->priv->display_seat_id,
+ NULL,
+ &error);
if (! res) {
- if (error != NULL) {
- g_warning ("Failed to get value: %s", error->message);
- g_error_free (error);
- } else {
- g_warning ("Failed to get value");
- }
-
+ g_warning ("Failed to get value: %s", error->message);
+ g_error_free (error);
return FALSE;
}
@@ -972,9 +888,7 @@ gdm_slave_real_stop (GdmSlave *slave)
{
g_debug ("GdmSlave: Stopping slave");
- if (slave->priv->display_proxy != NULL) {
- g_object_unref (slave->priv->display_proxy);
- }
+ g_clear_object (&slave->priv->display_proxy);
return TRUE;
}
@@ -1039,21 +953,15 @@ gdm_slave_add_user_authorization (GdmSlave *slave,
g_debug ("GdmSlave: Requesting user authorization");
error = NULL;
- res = dbus_g_proxy_call (slave->priv->display_proxy,
- "AddUserAuthorization",
- &error,
- G_TYPE_STRING, username,
- G_TYPE_INVALID,
- G_TYPE_STRING, &filename,
- G_TYPE_INVALID);
+ res = gdm_dbus_display_call_add_user_authorization_sync (slave->priv->display_proxy,
+ username,
+ &filename,
+ NULL,
+ &error);
if (! res) {
- if (error != NULL) {
- g_warning ("Failed to add user authorization: %s", error->message);
- g_error_free (error);
- } else {
- g_warning ("Failed to add user authorization");
- }
+ g_warning ("Failed to add user authorization: %s", error->message);
+ g_error_free (error);
} else {
g_debug ("GdmSlave: Got user authorization: %s", filename);
}
@@ -1186,22 +1094,15 @@ gdm_slave_get_timed_login_details (GdmSlave *slave,
g_debug ("GdmSlave: Requesting timed login details");
error = NULL;
- res = dbus_g_proxy_call (slave->priv->display_proxy,
- "GetTimedLoginDetails",
- &error,
- G_TYPE_INVALID,
- G_TYPE_BOOLEAN, &enabled,
- G_TYPE_STRING, &username,
- G_TYPE_INT, &delay,
- G_TYPE_INVALID);
-
+ res = gdm_dbus_display_call_get_timed_login_details_sync (slave->priv->display_proxy,
+ &enabled,
+ &username,
+ &delay,
+ NULL,
+ &error);
if (! res) {
- if (error != NULL) {
- g_warning ("Failed to get timed login details: %s", error->message);
- g_error_free (error);
- } else {
- g_warning ("Failed to get timed login details");
- }
+ g_warning ("Failed to get timed login details: %s", error->message);
+ g_error_free (error);
} else {
g_debug ("GdmSlave: Got timed login details: %d %s %d", enabled, username, delay);
}
@@ -1282,61 +1183,66 @@ x11_session_is_on_seat (GdmSlave *slave,
const char *session_id,
const char *seat_id)
{
- DBusGProxy *proxy;
GError *error;
+ GVariant *reply;
char *sid;
- gboolean res;
gboolean ret;
char *x11_display_device;
char *x11_display;
ret = FALSE;
+ sid = NULL;
+ x11_display = NULL;
+ x11_display_device = NULL;
if (seat_id == NULL || seat_id[0] == '\0' || session_id == NULL || session_id[0] == '\0') {
return FALSE;
}
- proxy = dbus_g_proxy_new_for_name (slave->priv->connection,
- CK_NAME,
- session_id,
- CK_SESSION_INTERFACE);
- if (proxy == NULL) {
- g_warning ("Failed to connect to the ConsoleKit seat object");
- goto out;
- }
-
- sid = NULL;
- error = NULL;
- res = dbus_g_proxy_call (proxy,
- "GetSeatId",
- &error,
- G_TYPE_INVALID,
- DBUS_TYPE_G_OBJECT_PATH, &sid,
- G_TYPE_INVALID);
- if (! res) {
+ reply = g_dbus_connection_call_sync (slave->priv->connection,
+ CK_NAME,
+ session_id,
+ CK_SESSION_INTERFACE,
+ "GetSeatId",
+ NULL, /* parameters */
+ G_VARIANT_TYPE ("(o)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (reply == NULL) {
g_debug ("Failed to identify the current seat: %s", error->message);
g_error_free (error);
- goto out;
+ return FALSE;
}
+ g_variant_get (reply, "(o)", &sid);
+ g_variant_unref (reply);
+
if (sid == NULL || sid[0] == '\0' || strcmp (sid, seat_id) != 0) {
g_debug ("GdmSlave: session not on current seat: %s", seat_id);
goto out;
}
- x11_display = NULL;
- error = NULL;
- res = dbus_g_proxy_call (proxy,
- "GetX11Display",
- &error,
- G_TYPE_INVALID,
- G_TYPE_STRING, &x11_display,
- G_TYPE_INVALID);
- if (! res) {
+ reply = g_dbus_connection_call_sync (slave->priv->connection,
+ CK_NAME,
+ session_id,
+ CK_SESSION_INTERFACE,
+ "GetX11Display",
+ NULL, /* parameters */
+ G_VARIANT_TYPE ("(s)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (reply == NULL) {
g_error_free (error);
goto out;
}
+ g_variant_get (reply, "(s)", &x11_display);
+ g_variant_unref (reply);
+
/* don't try to switch to our own session */
if (x11_display == NULL || x11_display[0] == '\0'
|| strcmp (slave->priv->display_name, x11_display) == 0) {
@@ -1345,31 +1251,35 @@ x11_session_is_on_seat (GdmSlave *slave,
}
g_free (x11_display);
- x11_display_device = NULL;
- error = NULL;
- res = dbus_g_proxy_call (proxy,
- "GetX11DisplayDevice",
- &error,
- G_TYPE_INVALID,
- G_TYPE_STRING, &x11_display_device,
- G_TYPE_INVALID);
- if (! res) {
+ reply = g_dbus_connection_call_sync (slave->priv->connection,
+ CK_NAME,
+ session_id,
+ CK_SESSION_INTERFACE,
+ "GetX11DisplayDevice",
+ NULL, /* parameters */
+ G_VARIANT_TYPE ("(s)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (reply == NULL) {
g_error_free (error);
goto out;
}
+ g_variant_get (reply, "(s)", &x11_display_device);
+ g_variant_unref (reply);
+
if (x11_display_device == NULL || x11_display_device[0] == '\0') {
g_free (x11_display_device);
goto out;
}
- g_free (x11_display_device);
ret = TRUE;
-
out:
- if (proxy != NULL) {
- g_object_unref (proxy);
- }
+ g_free (x11_display_device);
+ g_free (x11_display);
+ g_free (sid);
return ret;
}
@@ -1482,96 +1392,79 @@ static char *
gdm_slave_get_primary_session_id_for_user_from_ck (GdmSlave *slave,
const char *username)
{
- gboolean res;
- gboolean can_activate_sessions;
- GError *error;
- DBusGProxy *manager_proxy;
- DBusGProxy *seat_proxy;
- GPtrArray *sessions;
- char *primary_ssid;
- int i;
- uid_t uid;
-
- manager_proxy = NULL;
+ gboolean can_activate_sessions;
+ GError *error;
+ char *primary_ssid;
+ uid_t uid;
+ GVariant *reply;
+ GVariant *array;
+ GVariantIter iter;
+ char *ssid;
+
primary_ssid = NULL;
- sessions = NULL;
g_debug ("GdmSlave: getting proxy for seat: %s", slave->priv->display_seat_id);
-
- seat_proxy = dbus_g_proxy_new_for_name (slave->priv->connection,
- CK_NAME,
- slave->priv->display_seat_id,
- CK_SEAT_INTERFACE);
-
g_debug ("GdmSlave: checking if seat can activate sessions");
- error = NULL;
- res = dbus_g_proxy_call (seat_proxy,
- "CanActivateSessions",
- &error,
- G_TYPE_INVALID,
- G_TYPE_BOOLEAN, &can_activate_sessions,
- G_TYPE_INVALID);
- if (! res) {
- g_warning ("unable to determine if seat can activate sessions: %s",
- error->message);
+ reply = g_dbus_connection_call_sync (slave->priv->connection,
+ CK_NAME,
+ slave->priv->display_seat_id,
+ CK_SEAT_INTERFACE,
+ "CanActivateSessions",
+ NULL, /* parameters */
+ G_VARIANT_TYPE ("(b)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (reply == NULL) {
+ g_warning ("unable to determine if seat can activate sessions: %s", error->message);
g_error_free (error);
- goto out;
+ return NULL;
}
+ g_variant_get (reply, "(b)", &can_activate_sessions);
+ g_variant_unref (reply);
+
if (! can_activate_sessions) {
g_debug ("GdmSlave: seat is unable to activate sessions");
- goto out;
+ return NULL;
}
- manager_proxy = dbus_g_proxy_new_for_name (slave->priv->connection,
- CK_NAME,
- CK_MANAGER_PATH,
- CK_MANAGER_INTERFACE);
-
if (! _get_uid_and_gid_for_user (username, &uid, NULL)) {
g_debug ("GdmSlave: unable to determine uid for user: %s", username);
- goto out;
+ return NULL;
}
- error = NULL;
- res = dbus_g_proxy_call (manager_proxy,
- "GetSessionsForUnixUser",
- &error,
- G_TYPE_UINT, uid,
- G_TYPE_INVALID,
- dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &sessions,
- G_TYPE_INVALID);
- if (! res) {
- g_warning ("unable to determine sessions for user: %s",
- error->message);
+ reply = g_dbus_connection_call_sync (slave->priv->connection,
+ CK_NAME,
+ CK_MANAGER_PATH,
+ CK_MANAGER_INTERFACE,
+ "CanSessionsForUnixUser",
+ g_variant_new ("(u)", uid),
+ G_VARIANT_TYPE ("(ao)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (reply == NULL) {
+ g_warning ("unable to determine sessions for user: %s", error->message);
g_error_free (error);
- goto out;
+ return NULL;
}
- for (i = 0; i < sessions->len; i++) {
- char *ssid;
-
- ssid = g_ptr_array_index (sessions, i);
-
+ array = g_variant_get_child_value (reply, 0);
+ g_variant_iter_init (&iter, array);
+ while (g_variant_iter_loop (&iter, "(&s)", &ssid)) {
if (x11_session_is_on_seat (slave, ssid, slave->priv->display_seat_id)) {
primary_ssid = g_strdup (ssid);
break;
}
}
- g_ptr_array_foreach (sessions, (GFunc)g_free, NULL);
- g_ptr_array_free (sessions, TRUE);
-
- out:
-
- if (seat_proxy != NULL) {
- g_object_unref (seat_proxy);
- }
- if (manager_proxy != NULL) {
- g_object_unref (manager_proxy);
- }
-
+ g_variant_unref (reply);
+ g_variant_unref (array);
return primary_ssid;
}
#endif
@@ -1605,13 +1498,8 @@ activate_session_id_for_systemd (GdmSlave *slave,
const char *seat_id,
const char *session_id)
{
- DBusError local_error;
- DBusMessage *message;
- DBusMessage *reply;
- gboolean ret;
-
- ret = FALSE;
- reply = NULL;
+ GError *error = NULL;
+ GVariant *reply;
/* Can't activate what's already active. We want this
* to fail, because we don't want migration to succeed
@@ -1622,44 +1510,27 @@ activate_session_id_for_systemd (GdmSlave *slave,
return FALSE;
}
- dbus_error_init (&local_error);
-
- message = dbus_message_new_method_call ("org.freedesktop.login1",
- "/org/freedesktop/login1",
- "org.freedesktop.login1.Manager",
- "ActivateSessionOnSeat");
- if (message == NULL) {
- goto out;
- }
-
- if (! dbus_message_append_args (message,
- DBUS_TYPE_STRING, &session_id,
- DBUS_TYPE_STRING, &seat_id,
- DBUS_TYPE_INVALID)) {
- goto out;
- }
-
- reply = dbus_connection_send_with_reply_and_block (dbus_g_connection_get_connection (slave->priv->connection),
- message,
- -1,
- &local_error);
- if (dbus_error_is_set (&local_error)) {
- g_warning ("GdmSlave: Unable to activate session: %s", local_error.message);
- dbus_error_free (&local_error);
- goto out;
+ reply = g_dbus_connection_call_sync (slave->priv->connection,
+ "org.freedesktop.login1",
+ "/org/freedesktop/login1",
+ "org.freedesktop.login1.Manager",
+ "ActivateSessionOnSeat",
+ g_variant_new ("(ss)", session_id, seat_id),
+ NULL, /* expected reply */
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (reply == NULL) {
+ g_debug ("GdmSlave: logind %s raised:\n %s\n\n",
+ g_dbus_error_get_remote_error (error), error->message);
+ g_error_free (error);
+ return FALSE;
}
- ret = TRUE;
-
- out:
- if (message != NULL) {
- dbus_message_unref (message);
- }
- if (reply != NULL) {
- dbus_message_unref (reply);
- }
+ g_variant_unref (reply);
- return ret;
+ return TRUE;
}
#endif
@@ -1669,51 +1540,30 @@ activate_session_id_for_ck (GdmSlave *slave,
const char *seat_id,
const char *session_id)
{
- DBusError local_error;
- DBusMessage *message;
- DBusMessage *reply;
- gboolean ret;
-
- ret = FALSE;
- reply = NULL;
-
- dbus_error_init (&local_error);
- message = dbus_message_new_method_call ("org.freedesktop.ConsoleKit",
- seat_id,
- "org.freedesktop.ConsoleKit.Seat",
- "ActivateSession");
- if (message == NULL) {
- goto out;
- }
-
- if (! dbus_message_append_args (message,
- DBUS_TYPE_OBJECT_PATH, &session_id,
- DBUS_TYPE_INVALID)) {
- goto out;
- }
-
- reply = dbus_connection_send_with_reply_and_block (dbus_g_connection_get_connection (slave->priv->connection),
- message,
- -1,
- &local_error);
+ GError *error = NULL;
+ GVariant *reply;
+
+ reply = g_dbus_connection_call_sync (slave->priv->connection,
+ CK_NAME,
+ seat_id,
+ "org.freedesktop.ConsoleKit.Seat",
+ "ActivateSession",
+ g_variant_new ("(o)", session_id),
+ NULL, /* expected reply */
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
if (reply == NULL) {
- if (dbus_error_is_set (&local_error)) {
- g_warning ("Unable to activate session: %s", local_error.message);
- dbus_error_free (&local_error);
- goto out;
- }
+ g_debug ("GdmSlave: ConsoleKit %s raised:\n %s\n\n",
+ g_dbus_error_get_remote_error (error), error->message);
+ g_error_free (error);
+ return FALSE;
}
- ret = TRUE;
- out:
- if (message != NULL) {
- dbus_message_unref (message);
- }
- if (reply != NULL) {
- dbus_message_unref (reply);
- }
+ g_variant_unref (reply);
- return ret;
+ return TRUE;
}
#endif
@@ -1741,42 +1591,28 @@ static gboolean
session_unlock_for_systemd (GdmSlave *slave,
const char *ssid)
{
- DBusError error;
- DBusMessage *message;
- DBusMessage *reply;
-
- dbus_error_init (&error);
-
- message = dbus_message_new_method_call ("org.freedesktop.login1",
- "/org/freedesktop/login1",
- "org.freedesktop.login1.Manager",
- "UnlockSession");
-
- if (message == NULL) {
- g_debug ("GdmSlave: couldn't allocate the D-Bus message");
- return FALSE;
- }
-
- if (! dbus_message_append_args (message,
- DBUS_TYPE_STRING, &ssid,
- DBUS_TYPE_INVALID)) {
- g_debug ("GdmSlave: couldn't attach the D-Bus message data");
+ GError *error = NULL;
+ GVariant *reply;
+
+ reply = g_dbus_connection_call_sync (slave->priv->connection,
+ "org.freedesktop.login1",
+ "/org/freedesktop/login1",
+ "org.freedesktop.login1.Manager",
+ "UnlockSession",
+ g_variant_new ("(s)", ssid),
+ NULL, /* expected reply */
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (reply == NULL) {
+ g_debug ("GdmSlave: logind %s raised:\n %s\n\n",
+ g_dbus_error_get_remote_error (error), error->message);
+ g_error_free (error);
return FALSE;
}
- reply = dbus_connection_send_with_reply_and_block (dbus_g_connection_get_connection (slave->priv->connection),
- message,
- -1, &error);
- dbus_message_unref(message);
- if (reply != NULL) {
- dbus_message_unref(reply);
- }
-
- if (dbus_error_is_set (&error)) {
- g_warning ("GdmSlave: Unable to unlock session: %s", error.message);
- dbus_error_free (&error);
- return FALSE;
- }
+ g_variant_unref (reply);
return TRUE;
}
@@ -1787,34 +1623,28 @@ static gboolean
session_unlock_for_ck (GdmSlave *slave,
const char *ssid)
{
- DBusError error;
- DBusMessage *message;
- DBusMessage *reply;
-
- message = dbus_message_new_method_call (CK_NAME,
- ssid,
- CK_SESSION_INTERFACE,
- "Unlock");
- if (message == NULL) {
- g_debug ("GdmSlave: ConsoleKit couldn't allocate the D-Bus message");
+ GError *error = NULL;
+ GVariant *reply;
+
+ reply = g_dbus_connection_call_sync (slave->priv->connection,
+ CK_NAME,
+ ssid,
+ CK_SESSION_INTERFACE,
+ "Unlock",
+ NULL, /* parameters */
+ NULL, /* expected reply */
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (reply == NULL) {
+ g_debug ("GdmSlave: ConsoleKit %s raised:\n %s\n\n",
+ g_dbus_error_get_remote_error (error), error->message);
+ g_error_free (error);
return FALSE;
}
- dbus_error_init (&error);
- reply = dbus_connection_send_with_reply_and_block (dbus_g_connection_get_connection (slave->priv->connection),
- message,
- -1, &error);
- dbus_message_unref (message);
- if (reply != NULL) {
- dbus_message_unref (reply);
- }
- dbus_connection_flush (dbus_g_connection_get_connection (slave->priv->connection));
-
- if (dbus_error_is_set (&error)) {
- g_debug ("GdmSlave: ConsoleKit %s raised:\n %s\n\n", error.name, error.message);
- dbus_error_free (&error);
- return FALSE;
- }
+ g_variant_unref (reply);
return TRUE;
}
@@ -2014,17 +1844,15 @@ register_slave (GdmSlave *slave)
GError *error;
error = NULL;
- slave->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+ slave->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM,
+ NULL,
+ &error);
if (slave->priv->connection == NULL) {
- if (error != NULL) {
- g_critical ("error getting system bus: %s", error->message);
- g_error_free (error);
- }
+ g_critical ("error getting system bus: %s", error->message);
+ g_error_free (error);
exit (1);
}
- dbus_g_connection_register_g_object (slave->priv->connection, slave->priv->id, G_OBJECT (slave));
-
return TRUE;
}
@@ -2035,22 +1863,11 @@ gdm_slave_constructor (GType type,
{
GdmSlave *slave;
gboolean res;
- const char *id;
slave = GDM_SLAVE (G_OBJECT_CLASS (gdm_slave_parent_class)->constructor (type,
n_construct_properties,
construct_properties));
- /* Always match the slave id with the master */
-
- id = NULL;
- if (g_str_has_prefix (slave->priv->display_id, "/org/gnome/DisplayManager/Display")) {
- id = slave->priv->display_id + strlen ("/org/gnome/DisplayManager/Display");
- }
-
- g_assert (id != NULL);
-
- slave->priv->id = g_strdup_printf ("/org/gnome/DisplayManager/Slave%s", id);
- g_debug ("GdmSlave: Registering %s", slave->priv->id);
+ g_debug ("GdmSlave: Registering");
res = register_slave (slave);
if (! res) {
@@ -2137,8 +1954,6 @@ gdm_slave_class_init (GdmSlaveClass *klass)
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE,
0);
-
- dbus_g_object_type_install_info (GDM_TYPE_SLAVE, &dbus_glib_gdm_slave_object_info);
}
static void
@@ -2164,7 +1979,6 @@ gdm_slave_finalize (GObject *object)
gdm_slave_real_stop (slave);
- g_free (slave->priv->id);
g_free (slave->priv->display_id);
g_free (slave->priv->display_name);
g_free (slave->priv->display_hostname);
@@ -2173,9 +1987,17 @@ gdm_slave_finalize (GObject *object)
g_free (slave->priv->parent_display_name);
g_free (slave->priv->parent_display_x11_authority_file);
g_free (slave->priv->windowpath);
- if (slave->priv->display_x11_cookie != NULL) {
- g_array_free (slave->priv->display_x11_cookie, TRUE);
- }
+ g_free (slave->priv->display_x11_cookie);
G_OBJECT_CLASS (gdm_slave_parent_class)->finalize (object);
}
+
+void
+gdm_slave_export_interface (GdmSlave *slave,
+ GDBusInterfaceSkeleton *interface)
+{
+ g_dbus_interface_skeleton_export (interface,
+ slave->priv->connection,
+ GDM_SLAVE_PATH,
+ NULL);
+}
diff --git a/daemon/gdm-slave.h b/daemon/gdm-slave.h
index aaaa8f23..79ef064c 100644
--- a/daemon/gdm-slave.h
+++ b/daemon/gdm-slave.h
@@ -23,6 +23,7 @@
#define __GDM_SLAVE_H
#include <glib-object.h>
+#include <gio/gio.h>
G_BEGIN_DECLS
@@ -84,6 +85,9 @@ gboolean gdm_slave_run_script (GdmSlave *slave,
const char *username);
void gdm_slave_stopped (GdmSlave *slave);
+void gdm_slave_export_interface (GdmSlave *slave,
+ GDBusInterfaceSkeleton *interface);
+
G_END_DECLS
#endif /* __GDM_SLAVE_H */
diff --git a/daemon/gdm-static-display.c b/daemon/gdm-static-display.c
index 16953f95..3065ce6f 100644
--- a/daemon/gdm-static-display.c
+++ b/daemon/gdm-static-display.c
@@ -45,6 +45,7 @@
struct GdmStaticDisplayPrivate
{
+ GdmDBusStaticDisplay *skeleton;
gboolean first_login;
};
@@ -140,11 +141,44 @@ gdm_static_display_get_timed_login_details (GdmDisplay *display,
}
}
+static GObject *
+gdm_static_display_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ GdmStaticDisplay *display;
+
+ display = GDM_STATIC_DISPLAY (G_OBJECT_CLASS (gdm_static_display_parent_class)->constructor (type,
+ n_construct_properties,
+ construct_properties));
+
+ display->priv->skeleton = GDM_DBUS_STATIC_DISPLAY (gdm_dbus_static_display_skeleton_new ());
+
+ g_dbus_object_skeleton_add_interface (gdm_display_get_object_skeleton (GDM_DISPLAY (display)),
+ G_DBUS_INTERFACE_SKELETON (display->priv->skeleton));
+
+ return G_OBJECT (display);
+}
+
+static void
+gdm_static_display_finalize (GObject *object)
+{
+ GdmStaticDisplay *display = GDM_STATIC_DISPLAY (object);
+
+ g_clear_object (&display->priv->skeleton);
+
+ G_OBJECT_CLASS (gdm_static_display_parent_class)->finalize (object);
+}
+
static void
gdm_static_display_class_init (GdmStaticDisplayClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
GdmDisplayClass *display_class = GDM_DISPLAY_CLASS (klass);
+ object_class->constructor = gdm_static_display_constructor;
+ object_class->finalize = gdm_static_display_finalize;
+
display_class->create_authority = gdm_static_display_create_authority;
display_class->add_user_authorization = gdm_static_display_add_user_authorization;
display_class->remove_user_authorization = gdm_static_display_remove_user_authorization;
@@ -154,8 +188,6 @@ gdm_static_display_class_init (GdmStaticDisplayClass *klass)
display_class->get_timed_login_details = gdm_static_display_get_timed_login_details;
g_type_class_add_private (klass, sizeof (GdmStaticDisplayPrivate));
-
- dbus_g_object_type_install_info (GDM_TYPE_STATIC_DISPLAY, &dbus_glib_gdm_static_display_object_info);
}
static void
diff --git a/daemon/gdm-static-display.h b/daemon/gdm-static-display.h
index f5fd4247..6c9356a1 100644
--- a/daemon/gdm-static-display.h
+++ b/daemon/gdm-static-display.h
@@ -23,7 +23,6 @@
#define __GDM_STATIC_DISPLAY_H
#include <glib-object.h>
-#include <dbus/dbus-glib.h>
#include "gdm-display.h"
G_BEGIN_DECLS
diff --git a/daemon/gdm-transient-display.c b/daemon/gdm-transient-display.c
index 13d7bfe0..2615440e 100644
--- a/daemon/gdm-transient-display.c
+++ b/daemon/gdm-transient-display.c
@@ -35,6 +35,7 @@
#include <glib.h>
#include <glib/gi18n.h>
#include <glib-object.h>
+#include <gio/gio.h>
#include "gdm-common.h"
#include "gdm-display.h"
@@ -45,7 +46,7 @@
struct GdmTransientDisplayPrivate
{
- gpointer dummy;
+ GdmDBusTransientDisplay *skeleton;
};
static void gdm_transient_display_class_init (GdmTransientDisplayClass *klass);
@@ -124,11 +125,44 @@ gdm_transient_display_get_timed_login_details (GdmDisplay *display,
*delayp = 0;
}
+static GObject *
+gdm_transient_display_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ GdmTransientDisplay *display;
+
+ display = GDM_TRANSIENT_DISPLAY (G_OBJECT_CLASS (gdm_transient_display_parent_class)->constructor (type,
+ n_construct_properties,
+ construct_properties));
+
+ display->priv->skeleton = GDM_DBUS_TRANSIENT_DISPLAY (gdm_dbus_transient_display_skeleton_new ());
+
+ g_dbus_object_skeleton_add_interface (gdm_display_get_object_skeleton (GDM_DISPLAY (display)),
+ G_DBUS_INTERFACE_SKELETON (display->priv->skeleton));
+
+ return G_OBJECT (display);
+}
+
+static void
+gdm_transient_display_finalize (GObject *object)
+{
+ GdmTransientDisplay *display = GDM_TRANSIENT_DISPLAY (object);
+
+ g_clear_object (&display->priv->skeleton);
+
+ G_OBJECT_CLASS (gdm_transient_display_parent_class)->finalize (object);
+}
+
static void
gdm_transient_display_class_init (GdmTransientDisplayClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
GdmDisplayClass *display_class = GDM_DISPLAY_CLASS (klass);
+ object_class->constructor = gdm_transient_display_constructor;
+ object_class->finalize = gdm_transient_display_finalize;
+
display_class->create_authority = gdm_transient_display_create_authority;
display_class->add_user_authorization = gdm_transient_display_add_user_authorization;
display_class->remove_user_authorization = gdm_transient_display_remove_user_authorization;
@@ -138,8 +172,6 @@ gdm_transient_display_class_init (GdmTransientDisplayClass *klass)
display_class->get_timed_login_details = gdm_transient_display_get_timed_login_details;
g_type_class_add_private (klass, sizeof (GdmTransientDisplayPrivate));
-
- dbus_g_object_type_install_info (GDM_TYPE_TRANSIENT_DISPLAY, &dbus_glib_gdm_transient_display_object_info);
}
static void
diff --git a/daemon/gdm-transient-display.h b/daemon/gdm-transient-display.h
index 36ef7196..2e0dc1be 100644
--- a/daemon/gdm-transient-display.h
+++ b/daemon/gdm-transient-display.h
@@ -23,7 +23,6 @@
#define __GDM_TRANSIENT_DISPLAY_H
#include <glib-object.h>
-#include <dbus/dbus-glib.h>
#include "gdm-display.h"
G_BEGIN_DECLS
diff --git a/daemon/gdm-xdmcp-chooser-display.c b/daemon/gdm-xdmcp-chooser-display.c
index ba6c48bc..efdcdf18 100644
--- a/daemon/gdm-xdmcp-chooser-display.c
+++ b/daemon/gdm-xdmcp-chooser-display.c
@@ -37,21 +37,23 @@
#include "gdm-display.h"
#include "gdm-xdmcp-chooser-display.h"
-#include "gdm-xdmcp-chooser-display-glue.h"
+#include "gdm-xdmcp-display-glue.h"
+#include "gdm-xdmcp-chooser-slave-glue.h"
#include "gdm-common.h"
#include "gdm-address.h"
#define DEFAULT_SLAVE_COMMAND LIBEXECDIR"/gdm-xdmcp-chooser-slave"
-#define GDM_DBUS_NAME "/org/gnome/DisplayManager"
-#define GDM_XDMCP_CHOOSER_SLAVE_DBUS_INTERFACE "org.gnome.DisplayManager.XdmcpChooserSlave"
+
+#define GDM_SLAVE_PATH "/org/gnome/DisplayManager/Slave"
#define GDM_XDMCP_CHOOSER_DISPLAY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_XDMCP_CHOOSER_DISPLAY, GdmXdmcpChooserDisplayPrivate))
struct GdmXdmcpChooserDisplayPrivate
{
- DBusGProxy *slave_proxy;
+ GdmDBusXdmcpDisplay *skeleton;
+ GdmDBusXdmcpChooserSlave *slave_proxy;
};
enum {
@@ -69,9 +71,9 @@ static gboolean gdm_xdmcp_chooser_display_finish (GdmDisplay *display);
G_DEFINE_TYPE (GdmXdmcpChooserDisplay, gdm_xdmcp_chooser_display, GDM_TYPE_XDMCP_DISPLAY)
static void
-on_hostname_selected (DBusGProxy *proxy,
- const char *hostname,
- GdmXdmcpChooserDisplay *display)
+on_hostname_selected (GdmDBusXdmcpChooserSlave *proxy,
+ const char *hostname,
+ GdmXdmcpChooserDisplay *display)
{
g_debug ("GdmXdmcpChooserDisplay: hostname selected: %s", hostname);
g_signal_emit (display, signals [HOSTNAME_SELECTED], 0, hostname);
@@ -82,63 +84,40 @@ gdm_xdmcp_chooser_display_set_slave_bus_name (GdmDisplay *display,
const char *name,
GError **error)
{
- char *display_id;
- const char *slave_num;
- char *slave_id;
- DBusGConnection *connection;
+ GDBusConnection *connection;
GError *local_error;
GdmXdmcpChooserDisplay *chooser_display;
- display_id = NULL;
- slave_id = NULL;
- slave_num = NULL;
-
chooser_display = GDM_XDMCP_CHOOSER_DISPLAY (display);
- if (chooser_display->priv->slave_proxy != NULL) {
- g_object_unref (chooser_display->priv->slave_proxy);
- }
-
- g_object_get (display, "id", &display_id, NULL);
-
- if (g_str_has_prefix (display_id, "/org/gnome/DisplayManager/Display")) {
- slave_num = display_id + strlen ("/org/gnome/DisplayManager/Display");
- }
-
- slave_id = g_strdup_printf ("/org/gnome/DisplayManager/Slave%s", slave_num);
+ g_clear_object (&chooser_display->priv->slave_proxy);
local_error = NULL;
- connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &local_error);
+ connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &local_error);
if (connection == NULL) {
- if (local_error != NULL) {
- g_critical ("error getting system bus: %s", local_error->message);
- g_error_free (local_error);
- }
+ g_critical ("error getting system bus: %s", local_error->message);
+ g_error_free (local_error);
}
- g_debug ("GdmXdmcpChooserDisplay: creating proxy for %s on %s", slave_id, name);
+ g_debug ("GdmXdmcpChooserDisplay: creating proxy for slave on %s" , name);
- chooser_display->priv->slave_proxy = dbus_g_proxy_new_for_name (connection,
- name,
- slave_id,
- GDM_XDMCP_CHOOSER_SLAVE_DBUS_INTERFACE);
+ chooser_display->priv->slave_proxy = GDM_DBUS_XDMCP_CHOOSER_SLAVE (
+ gdm_dbus_xdmcp_chooser_slave_proxy_new_sync (connection,
+ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+ name,
+ GDM_SLAVE_PATH,
+ NULL,
+ &local_error));
if (chooser_display->priv->slave_proxy == NULL) {
- g_warning ("Failed to connect to the slave object");
+ g_warning ("Failed to connect to the slave object: %s", local_error->message);
+ g_error_free (local_error);
goto out;
}
- dbus_g_proxy_add_signal (chooser_display->priv->slave_proxy,
- "HostnameSelected",
- G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_proxy_connect_signal (chooser_display->priv->slave_proxy,
- "HostnameSelected",
- G_CALLBACK (on_hostname_selected),
- display,
- NULL);
- out:
-
- g_free (display_id);
- g_free (slave_id);
+ g_signal_connect (chooser_display->priv->slave_proxy,
+ "hostname-selected",
+ G_CALLBACK (on_hostname_selected),
+ display);
+ out:
return GDM_DISPLAY_CLASS (gdm_xdmcp_chooser_display_parent_class)->set_slave_bus_name (display, name, error);
}
@@ -152,12 +131,32 @@ gdm_xdmcp_chooser_display_manage (GdmDisplay *display)
return TRUE;
}
+static GObject *
+gdm_xdmcp_chooser_display_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ GdmXdmcpChooserDisplay *display;
+
+ display = GDM_XDMCP_CHOOSER_DISPLAY (G_OBJECT_CLASS (gdm_xdmcp_chooser_display_parent_class)->constructor (type,
+ n_construct_properties,
+ construct_properties));
+
+ display->priv->skeleton = GDM_DBUS_XDMCP_DISPLAY (gdm_dbus_xdmcp_display_skeleton_new ());
+
+ g_dbus_object_skeleton_add_interface (gdm_display_get_object_skeleton (GDM_DISPLAY (display)),
+ G_DBUS_INTERFACE_SKELETON (display->priv->skeleton));
+
+ return G_OBJECT (display);
+}
+
static void
gdm_xdmcp_chooser_display_class_init (GdmXdmcpChooserDisplayClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GdmDisplayClass *display_class = GDM_DISPLAY_CLASS (klass);
+ object_class->constructor = gdm_xdmcp_chooser_display_constructor;
object_class->finalize = gdm_xdmcp_chooser_display_finalize;
display_class->manage = gdm_xdmcp_chooser_display_manage;
@@ -177,8 +176,6 @@ gdm_xdmcp_chooser_display_class_init (GdmXdmcpChooserDisplayClass *klass)
G_TYPE_STRING);
g_type_class_add_private (klass, sizeof (GdmXdmcpChooserDisplayPrivate));
-
- dbus_g_object_type_install_info (GDM_TYPE_XDMCP_CHOOSER_DISPLAY, &dbus_glib_gdm_xdmcp_chooser_display_object_info);
}
static void
@@ -200,9 +197,8 @@ gdm_xdmcp_chooser_display_finalize (GObject *object)
g_return_if_fail (chooser_display->priv != NULL);
- if (chooser_display->priv->slave_proxy != NULL) {
- g_object_unref (chooser_display->priv->slave_proxy);
- }
+ g_clear_object (&chooser_display->priv->slave_proxy);
+ g_clear_object (&chooser_display->priv->skeleton);
G_OBJECT_CLASS (gdm_xdmcp_chooser_display_parent_class)->finalize (object);
}
diff --git a/daemon/gdm-xdmcp-chooser-display.h b/daemon/gdm-xdmcp-chooser-display.h
index 8ab17b8d..e0612637 100644
--- a/daemon/gdm-xdmcp-chooser-display.h
+++ b/daemon/gdm-xdmcp-chooser-display.h
@@ -25,7 +25,6 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <glib-object.h>
-#include <dbus/dbus-glib.h>
#include "gdm-xdmcp-display.h"
#include "gdm-address.h"
diff --git a/daemon/gdm-xdmcp-chooser-display.xml b/daemon/gdm-xdmcp-chooser-display.xml
deleted file mode 100644
index 194168f8..00000000
--- a/daemon/gdm-xdmcp-chooser-display.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
-<node>
- <interface name="org.gnome.DisplayManager.XdmcpChooserDisplay">
- </interface>
-</node>
diff --git a/daemon/gdm-xdmcp-chooser-slave.c b/daemon/gdm-xdmcp-chooser-slave.c
index fee36303..2dd6edce 100644
--- a/daemon/gdm-xdmcp-chooser-slave.c
+++ b/daemon/gdm-xdmcp-chooser-slave.c
@@ -340,8 +340,6 @@ gdm_xdmcp_chooser_slave_class_init (GdmXdmcpChooserSlaveClass *klass)
G_TYPE_STRING);
g_type_class_add_private (klass, sizeof (GdmXdmcpChooserSlavePrivate));
-
- dbus_g_object_type_install_info (GDM_TYPE_XDMCP_CHOOSER_SLAVE, &dbus_glib_gdm_xdmcp_chooser_slave_object_info);
}
static void
diff --git a/daemon/gdm-xdmcp-display.h b/daemon/gdm-xdmcp-display.h
index db9b4014..8802a868 100644
--- a/daemon/gdm-xdmcp-display.h
+++ b/daemon/gdm-xdmcp-display.h
@@ -25,7 +25,6 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <glib-object.h>
-#include <dbus/dbus-glib.h>
#include "gdm-display.h"
#include "gdm-address.h"
diff --git a/daemon/gdm-xdmcp-greeter-display.xml b/daemon/gdm-xdmcp-display.xml
index 512019ce..512019ce 100644
--- a/daemon/gdm-xdmcp-greeter-display.xml
+++ b/daemon/gdm-xdmcp-display.xml
diff --git a/daemon/gdm-xdmcp-greeter-display.h b/daemon/gdm-xdmcp-greeter-display.h
index c4c82a50..b99cd994 100644
--- a/daemon/gdm-xdmcp-greeter-display.h
+++ b/daemon/gdm-xdmcp-greeter-display.h
@@ -24,7 +24,6 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <glib-object.h>
-#include <dbus/dbus-glib.h>
#include "gdm-xdmcp-display.h"
#include "gdm-address.h"
diff --git a/data/gdm.conf.in b/data/gdm.conf.in
index 23e5fcc8..c3e28f50 100644
--- a/data/gdm.conf.in
+++ b/data/gdm.conf.in
@@ -16,11 +16,8 @@
<allow send_destination="org.gnome.DisplayManager"
send_interface="org.gnome.DisplayManager.Settings"/>
<allow send_destination="org.gnome.DisplayManager"
- send_interface="org.gnome.DisplayManager.Slave"/>
- <allow send_destination="org.gnome.DisplayManager"
- send_interface="org.gnome.DisplayManager.Session"/>
- <allow send_destination="org.gnome.DisplayManager"
send_interface="org.freedesktop.DBus.Properties" />
+ <allow send_interface="org.gnome.DisplayManager.Slave"/>
<allow send_destination="org.gnome.DisplayManager"
send_interface="org.freedesktop.DBus.Introspectable"/>
@@ -39,11 +36,8 @@
send_interface="org.gnome.DisplayManager.Slave"/>
<deny send_destination="org.gnome.DisplayManager"
send_interface="org.gnome.DisplayManager.Session"/>
- <deny send_destination="org.gnome.DisplayManager"
- send_interface="org.freedesktop.DBus.Properties" />
<allow send_destination="org.gnome.DisplayManager"
send_interface="org.freedesktop.DBus.Introspectable"/>
-
<allow send_destination="org.gnome.DisplayManager"
send_interface="org.gnome.DisplayManager.Display"
send_member="GetId"/>