summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Campagna <gcampagna@src.gnome.org>2012-05-15 17:09:28 +0200
committerGiovanni Campagna <gcampagna@src.gnome.org>2012-05-18 16:12:56 +0200
commit355b5d841ee1eeb05763d5175e1890b3d27ee0f2 (patch)
tree36b8a690324b8b3806546953a9cf96222417ca94
parent31f011ae3c6b14bbc7b59380c676d9869b3fc78b (diff)
downloadgdm-355b5d841ee1eeb05763d5175e1890b3d27ee0f2.tar.gz
Port GdmDisplay, GdmXdmcpSlave and friends 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.
-rw-r--r--daemon/Makefile.am111
-rw-r--r--daemon/gdm-display.c287
-rw-r--r--daemon/gdm-display.h4
-rw-r--r--daemon/gdm-display.xml3
-rw-r--r--daemon/gdm-local-display-factory.c285
-rw-r--r--daemon/gdm-product-display.c32
-rw-r--r--daemon/gdm-product-display.h1
-rw-r--r--daemon/gdm-slave.c683
-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.c75
-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.xml (renamed from daemon/gdm-xdmcp-greeter-display.xml)0
17 files changed, 916 insertions, 649 deletions
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index ca3a5b75..433f9561 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -37,41 +37,33 @@ BUILT_SOURCES = \
gdm-session-direct-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 \
gdm-product-display-glue.h \
- gdm-slave-resources.h \
gdm-greeter-glue.h \
gdm-session-glue.h \
$(NULL)
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-simple-slave-glue.h: gdm-simple-slave.xml Makefile.am
- dbus-binding-tool --prefix=gdm_simple_slave --mode=glib-server --output=gdm-simple-slave-glue.h $(srcdir)/gdm-simple-slave.xml
-gdm-factory-slave-glue.h: gdm-factory-slave.xml Makefile.am
- dbus-binding-tool --prefix=gdm_factory_slave --mode=glib-server --output=gdm-factory-slave-glue.h $(srcdir)/gdm-factory-slave.xml
-gdm-product-slave-glue.h: gdm-product-slave.xml Makefile.am
- dbus-binding-tool --prefix=gdm_product_slave --mode=glib-server --output=gdm-product-slave-glue.h $(srcdir)/gdm-product-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-session-direct-glue.h: gdm-session-direct.xml Makefile.am
dbus-binding-tool --prefix=gdm_session_direct --mode=glib-server --output=gdm-session-direct-glue.h $(srcdir)/gdm-session-direct.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-display-glue.c gdm-display-glue.h: gdm-display.xml Makefile.am
+ 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
+ gdbus-codegen \
+ --c-namespace=GdmDBus \
+ --interface-prefix=org.gnome.DisplayManager \
+ --generate-c-code=gdm-xdmcp-display-glue \
+ $(srcdir)/gdm-xdmcp-display.xml
gdm-product-display-glue.c gdm-product-display-glue.h: gdm-product-display.xml Makefile.am
gdbus-codegen \
@@ -80,6 +72,20 @@ gdm-product-display-glue.c gdm-product-display-glue.h: gdm-product-display.xml M
--generate-c-code=gdm-product-display-glue \
$(srcdir)/gdm-product-display.xml
+gdm-transient-display-glue.c gdm-transient-display-glue.h: gdm-transient-display.xml Makefile.am
+ 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
+ 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
gdbus-codegen \
--c-namespace=GdmDBus \
@@ -101,6 +107,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
+ 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
+ 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)
@@ -178,6 +198,10 @@ nodist_gdm_simple_slave_SOURCES = \
gdm-greeter-glue.h \
gdm-session-glue.c \
gdm-session-glue.h \
+ gdm-display-glue.c \
+ gdm-display-glue.h \
+ gdm-slave-glue.c \
+ gdm-slave-glue.h \
$(NULL)
gdm_simple_slave_LDFLAGS = \
@@ -227,6 +251,10 @@ nodist_gdm_factory_slave_SOURCES = \
gdm-local-display-factory-glue.c \
gdm-session-glue.c \
gdm-session-glue.h \
+ gdm-display-glue.c \
+ gdm-display-glue.h \
+ gdm-slave-glue.c \
+ gdm-slave-glue.h \
$(NULL)
gdm_factory_slave_LDFLAGS = \
@@ -269,6 +297,10 @@ nodist_gdm_product_slave_SOURCES = \
gdm-session-glue.h \
gdm-slave-resources.c \
gdm-slave-resources.h \
+ gdm-display-glue.c \
+ gdm-display-glue.h \
+ gdm-slave-glue.c \
+ gdm-slave-glue.h \
$(NULL)
gdm_product_slave_LDFLAGS = \
@@ -310,6 +342,15 @@ gdm_xdmcp_chooser_slave_SOURCES = \
gdm-dbus-util.h \
$(NULL)
+nodist_gdm_xdmcp_chooser_slave_SOURCES = \
+ gdm-session-glue.c \
+ gdm-session-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) \
@@ -389,6 +430,19 @@ 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-product-display-glue.h \
+ gdm-product-display-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 \
@@ -400,8 +454,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 = \
@@ -454,8 +516,7 @@ EXTRA_DIST = \
gdm-session-direct.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 e885bdfb..34974cb9 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;
}
@@ -431,7 +437,7 @@ gdm_display_get_x11_cookie (GdmDisplay *display,
g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
if (x11_cookie != NULL) {
- *x11_cookie = g_array_new (FALSE, FALSE, sizeof (char));
+ *x11_cookie = g_array_new (TRUE, FALSE, sizeof (char));
g_array_append_vals (*x11_cookie,
display->priv->x11_cookie,
display->priv->x11_cookie_size);
@@ -934,21 +940,268 @@ 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;
+
+ gdm_display_get_seat_id (display, &seat_id, NULL);
+
+ 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;
}
@@ -1113,8 +1366,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
@@ -1147,6 +1398,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);
}
@@ -1161,3 +1416,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 cb69a88b..c62680ec 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>
@@ -56,12 +54,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 {
@@ -437,143 +440,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,
+ (const GVariantType*) "(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);
+ array = g_variant_get_child_value (result, 0);
+ g_variant_iter_init (&iter, array);
- if (dbus_message_iter_get_arg_type (&sub2) != DBUS_TYPE_STRING) {
- g_warning ("GdmLocalDisplayFactory: Failed to parse reply.");
- dbus_message_unref (reply);
- return FALSE;
- }
-
- 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;
-
- 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);
+ const char *seat;
- 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
@@ -640,21 +608,83 @@ gdm_local_display_factory_get_property (GObject *object,
}
static gboolean
+handle_create_product_display (GdmDBusLocalDisplayFactory *skeleton,
+ GDBusMethodInvocation *invocation,
+ const gchar *parent_display_id,
+ const gchar *relay_address,
+ GdmLocalDisplayFactory *factory)
+{
+ GError *error = NULL;
+ gboolean created;
+ char *id = NULL;
+
+ created = gdm_local_display_factory_create_product_display (factory,
+ parent_display_id,
+ relay_address,
+ &id,
+ &error);
+ if (!created) {
+ g_dbus_method_invocation_return_gerror (invocation, error);
+ } else {
+ g_dbus_method_invocation_return_value (invocation,
+ g_variant_new ("(s)", id));
+ }
+
+ g_free (id);
+ return TRUE;
+}
+
+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 {
+ g_dbus_method_invocation_return_value (invocation,
+ g_variant_new ("(s)", 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-product-display",
+ G_CALLBACK (handle_create_product_display), factory);
+ 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;
}
@@ -694,8 +724,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
@@ -718,6 +746,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-product-display.c b/daemon/gdm-product-display.c
index 9b68cb9a..180f63e4 100644
--- a/daemon/gdm-product-display.c
+++ b/daemon/gdm-product-display.c
@@ -44,6 +44,8 @@
struct GdmProductDisplayPrivate
{
+ GdmDBusProductDisplay *skeleton;
+
char *relay_address;
};
@@ -181,6 +183,23 @@ gdm_product_display_get_property (GObject *object,
}
}
+static gboolean
+handle_get_relay_address (GdmDBusProductDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmProductDisplay *display)
+{
+ char *address;
+
+ gdm_product_display_get_relay_address (display, &address, NULL);
+
+ gdm_dbus_product_display_complete_get_relay_address (skeleton,
+ invocation,
+ address);
+
+ g_free (address);
+ return TRUE;
+}
+
static GObject *
gdm_product_display_constructor (GType type,
guint n_construct_properties,
@@ -191,6 +210,15 @@ gdm_product_display_constructor (GType type,
display = GDM_PRODUCT_DISPLAY (G_OBJECT_CLASS (gdm_product_display_parent_class)->constructor (type,
n_construct_properties,
construct_properties));
+
+ display->priv->skeleton = GDM_DBUS_PRODUCT_DISPLAY (gdm_dbus_product_display_skeleton_new ());
+
+ g_signal_connect (display->priv->skeleton, "handle-get-relay-address",
+ G_CALLBACK (handle_get_relay_address), display);
+
+ 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);
}
@@ -221,8 +249,6 @@ gdm_product_display_class_init (GdmProductDisplayClass *klass)
"relay address",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-
- dbus_g_object_type_install_info (GDM_TYPE_PRODUCT_DISPLAY, &dbus_glib_gdm_product_display_object_info);
}
static void
@@ -244,6 +270,8 @@ gdm_product_display_finalize (GObject *object)
g_return_if_fail (product_display->priv != NULL);
+ g_clear_object (&product_display->priv->skeleton);
+
g_free (product_display->priv->relay_address);
G_OBJECT_CLASS (gdm_product_display_parent_class)->finalize (object);
diff --git a/daemon/gdm-product-display.h b/daemon/gdm-product-display.h
index 8806c1f9..1c3aacdd 100644
--- a/daemon/gdm-product-display.h
+++ b/daemon/gdm-product-display.h
@@ -23,7 +23,6 @@
#define __GDM_PRODUCT_DISPLAY_H
#include <glib-object.h>
-#include <dbus/dbus-glib.h>
#include "gdm-display.h"
G_BEGIN_DECLS
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index 53633c0d..fb275cb5 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"
@@ -102,11 +99,12 @@ 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;
+ GDBusObjectSkeleton *object_skeleton;
+ GdmDBusSlave *skeleton;
};
enum {
@@ -697,8 +695,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 +735,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 +742,15 @@ 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,25 @@ 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_NONE,
+ 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 +802,72 @@ 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;
}
@@ -1039,21 +946,14 @@ 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 +1086,14 @@ 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 +1174,64 @@ 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 */
+ (const GVariantType*) "(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 */
+ (const GVariantType*) "(s)",
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL, &error);
+ if (! reply) {
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 +1240,34 @@ 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 */
+ (const GVariantType*) "(s)",
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL, &error);
+ if (! reply) {
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;
}
@@ -1465,96 +1363,74 @@ 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;
+ GVariant *reply;
+ GVariantIter iter;
+ char *ssid;
- manager_proxy = NULL;
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 */
+ (const GVariantType*) "(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),
+ (const GVariantType*) "(ao)",
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL, &error);
+
+ if (! reply) {
+ 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);
-
+ g_variant_iter_init (&iter, reply);
+ 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);
return primary_ssid;
}
#endif
@@ -1588,13 +1464,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
@@ -1605,44 +1476,26 @@ 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
@@ -1652,51 +1505,29 @@ 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
@@ -1724,42 +1555,27 @@ 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");
+ 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;
}
- if (! dbus_message_append_args (message,
- DBUS_TYPE_STRING, &ssid,
- DBUS_TYPE_INVALID)) {
- g_debug ("GdmSlave: couldn't attach the D-Bus message data");
- 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;
}
@@ -1770,34 +1586,27 @@ 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;
}
@@ -1997,16 +1806,18 @@ 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));
+ slave->priv->object_skeleton = g_dbus_object_skeleton_new (slave->priv->id);
+ slave->priv->skeleton = GDM_DBUS_SLAVE (gdm_dbus_slave_skeleton_new ());
+
+ g_dbus_object_skeleton_add_interface (slave->priv->object_skeleton,
+ G_DBUS_INTERFACE_SKELETON (slave->priv->skeleton));
return TRUE;
}
@@ -2120,8 +1931,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
@@ -2156,9 +1965,7 @@ 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);
}
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..9d4deb93 100644
--- a/daemon/gdm-xdmcp-chooser-display.c
+++ b/daemon/gdm-xdmcp-chooser-display.c
@@ -37,7 +37,8 @@
#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"
@@ -51,7 +52,8 @@
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);
@@ -85,7 +87,7 @@ gdm_xdmcp_chooser_display_set_slave_bus_name (GdmDisplay *display,
char *display_id;
const char *slave_num;
char *slave_id;
- DBusGConnection *connection;
+ GDBusConnection *connection;
GError *local_error;
GdmXdmcpChooserDisplay *chooser_display;
@@ -107,33 +109,29 @@ gdm_xdmcp_chooser_display_set_slave_bus_name (GdmDisplay *display,
slave_id = g_strdup_printf ("/org/gnome/DisplayManager/Slave%s", slave_num);
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);
- 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_NONE,
+ name,
+ slave_id,
+ 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);
+
+ g_signal_connect (chooser_display->priv->slave_proxy, "hostname-selected",
+ G_CALLBACK (on_hostname_selected), display);
out:
g_free (display_id);
@@ -152,12 +150,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 +195,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 +216,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-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