diff options
-rw-r--r-- | .gitignore | 8 | ||||
-rw-r--r-- | daemon/Makefile.am | 117 | ||||
-rw-r--r-- | daemon/gdm-display.c | 289 | ||||
-rw-r--r-- | daemon/gdm-display.h | 4 | ||||
-rw-r--r-- | daemon/gdm-display.xml | 3 | ||||
-rw-r--r-- | daemon/gdm-local-display-factory.c | 257 | ||||
-rw-r--r-- | daemon/gdm-slave.c | 744 | ||||
-rw-r--r-- | daemon/gdm-slave.h | 4 | ||||
-rw-r--r-- | daemon/gdm-static-display.c | 36 | ||||
-rw-r--r-- | daemon/gdm-static-display.h | 1 | ||||
-rw-r--r-- | daemon/gdm-transient-display.c | 38 | ||||
-rw-r--r-- | daemon/gdm-transient-display.h | 1 | ||||
-rw-r--r-- | daemon/gdm-xdmcp-chooser-display.c | 106 | ||||
-rw-r--r-- | daemon/gdm-xdmcp-chooser-display.h | 1 | ||||
-rw-r--r-- | daemon/gdm-xdmcp-chooser-display.xml | 5 | ||||
-rw-r--r-- | daemon/gdm-xdmcp-chooser-slave.c | 2 | ||||
-rw-r--r-- | daemon/gdm-xdmcp-display.h | 1 | ||||
-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.h | 1 | ||||
-rw-r--r-- | data/gdm.conf.in | 8 |
20 files changed, 926 insertions, 700 deletions
@@ -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"/> |