[gdm/wip/gdbus-port: 10/13] Port the gdm-binary daemon to GDBus



commit 9bd405d69948a1ed92419138f1f9ceb9b5243cd7
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Tue May 15 18:16:19 2012 +0200

    Port the gdm-binary daemon to GDBus
    
    Use GDBusObjectManager for enumerating displays, instead of a
    hand rolled interface. Also, fix a bunch of present but not
    really working interfaces (slave bus name watching, display-added/removed
    signals).

 daemon/Makefile.am                 |    8 +-
 daemon/gdm-display-store.c         |   29 ----
 daemon/gdm-display.c               |   30 ++++-
 daemon/gdm-local-display-factory.c |   49 +++++---
 daemon/gdm-manager.c               |  136 +++++++------------
 daemon/gdm-manager.h               |    6 +
 daemon/gdm-session-direct.c        |    6 +-
 daemon/gdm-slave.c                 |    6 +-
 daemon/gdm-xdmcp-chooser-display.c |    6 +-
 daemon/gdm-xdmcp-display-factory.c |    5 +
 daemon/main.c                      |  260 ++++++++++++------------------------
 daemon/test-session.c              |    2 +-
 12 files changed, 215 insertions(+), 328 deletions(-)
---
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index 433f956..9f8012c 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -34,8 +34,6 @@ BUILT_SOURCES =					\
 	gdm-factory-slave-glue.h		\
 	gdm-product-slave-glue.h		\
 	gdm-xdmcp-chooser-slave-glue.h		\
-	gdm-session-direct-glue.h		\
-	gdm-manager-glue.h			\
 	gdm-display-glue.h			\
 	gdm-xdmcp-display-glue.h		\
 	gdm-static-display-glue.h		\
@@ -46,10 +44,8 @@ BUILT_SOURCES =					\
 	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-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-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.c gdm-display-glue.h: gdm-display.xml Makefile.am
 	gdbus-codegen 							\
diff --git a/daemon/gdm-display-store.c b/daemon/gdm-display-store.c
index 62d7e93..fa2015d 100644
--- a/daemon/gdm-display-store.c
+++ b/daemon/gdm-display-store.c
@@ -40,14 +40,6 @@ struct GdmDisplayStorePrivate
         GHashTable *displays;
 };
 
-enum {
-        DISPLAY_ADDED,
-        DISPLAY_REMOVED,
-        LAST_SIGNAL
-};
-
-static guint signals [LAST_SIGNAL] = { 0, };
-
 static void     gdm_display_store_class_init    (GdmDisplayStoreClass *klass);
 static void     gdm_display_store_init          (GdmDisplayStore      *display_store);
 static void     gdm_display_store_finalize      (GObject              *object);
@@ -167,27 +159,6 @@ gdm_display_store_class_init (GdmDisplayStoreClass *klass)
 
         object_class->finalize = gdm_display_store_finalize;
 
-        signals [DISPLAY_ADDED] =
-                g_signal_new ("display-added",
-                              G_TYPE_FROM_CLASS (object_class),
-                              G_SIGNAL_RUN_LAST,
-                              G_STRUCT_OFFSET (GdmDisplayStoreClass, display_added),
-                              NULL,
-                              NULL,
-                              g_cclosure_marshal_VOID__STRING,
-                              G_TYPE_NONE,
-                              1, G_TYPE_STRING);
-        signals [DISPLAY_REMOVED] =
-                g_signal_new ("display-removed",
-                              G_TYPE_FROM_CLASS (object_class),
-                              G_SIGNAL_RUN_LAST,
-                              G_STRUCT_OFFSET (GdmDisplayStoreClass, display_removed),
-                              NULL,
-                              NULL,
-                              g_cclosure_marshal_VOID__STRING,
-                              G_TYPE_NONE,
-                              1, G_TYPE_STRING);
-
         g_type_class_add_private (klass, sizeof (GdmDisplayStorePrivate));
 }
 
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
index 34974cb..cf541f6 100644
--- a/daemon/gdm-display.c
+++ b/daemon/gdm-display.c
@@ -70,6 +70,7 @@ struct GdmDisplayPrivate
 
         GdmSlaveProxy        *slave_proxy;
         char                 *slave_bus_name;
+        int                   slave_name_id;
         GDBusConnection      *connection;
         GdmDisplayAccessFile *user_access_file;
 
@@ -94,6 +95,7 @@ enum {
 static void     gdm_display_class_init  (GdmDisplayClass *klass);
 static void     gdm_display_init        (GdmDisplay      *display);
 static void     gdm_display_finalize    (GObject         *object);
+static void     queue_finish            (GdmDisplay      *display);
 
 G_DEFINE_ABSTRACT_TYPE (GdmDisplay, gdm_display, G_TYPE_OBJECT)
 
@@ -279,6 +281,14 @@ gdm_display_add_user_authorization (GdmDisplay *display,
         return ret;
 }
 
+static void
+on_name_vanished (GDBusConnection *connection,
+                  const char      *name,
+                  gpointer         user_data)
+{
+        queue_finish (GDM_DISPLAY (user_data));
+}
+
 static gboolean
 gdm_display_real_set_slave_bus_name (GdmDisplay *display,
                                      const char *name,
@@ -287,6 +297,16 @@ gdm_display_real_set_slave_bus_name (GdmDisplay *display,
         g_free (display->priv->slave_bus_name);
         display->priv->slave_bus_name = g_strdup (name);
 
+        if (display->priv->slave_name_id > 0)
+                g_bus_unwatch_name (display->priv->slave_name_id);
+
+        g_bus_watch_name_on_connection (display->priv->connection,
+                                        name,
+                                        G_BUS_NAME_WATCHER_FLAGS_NONE,
+                                        NULL, /* name appeared */
+                                        on_name_vanished,
+                                        g_object_ref (display),
+                                        NULL);
         return TRUE;
 }
 
@@ -1207,7 +1227,7 @@ register_display (GdmDisplay *display)
 }
 
 /*
-  dbus-send --system --print-reply --dest=org.gnome.DisplayManager /org/gnome/DisplayManager/Display1 org.freedesktop.DBus.Introspectable.Introspect
+  dbus-send --system --print-reply --dest=org.gnome.DisplayManager /org/gnome/DisplayManager/Displays/1 org.freedesktop.DBus.Introspectable.Introspect
 */
 
 static GObject *
@@ -1223,7 +1243,7 @@ gdm_display_constructor (GType                  type,
                                                                                        construct_properties));
 
         g_free (display->priv->id);
-        display->priv->id = g_strdup_printf ("/org/gnome/DisplayManager/Display%u", get_next_display_serial ());
+        display->priv->id = g_strdup_printf ("/org/gnome/DisplayManager/Displays/%u", get_next_display_serial ());
 
         res = register_display (display);
         if (! res) {
@@ -1264,6 +1284,11 @@ gdm_display_dispose (GObject *object)
                 display->priv->access_file = NULL;
         }
 
+        if (display->priv->slave_name_id > 0) {
+                g_bus_unwatch_name (display->priv->slave_name_id);
+                display->priv->slave_name_id = 0;
+        }
+
         G_OBJECT_CLASS (gdm_display_parent_class)->dispose (object);
 }
 
@@ -1397,6 +1422,7 @@ gdm_display_finalize (GObject *object)
         g_free (display->priv->x11_display_name);
         g_free (display->priv->x11_cookie);
         g_free (display->priv->slave_command);
+        g_free (display->priv->slave_bus_name);
 
         g_clear_object (&display->priv->display_skeleton);
         g_clear_object (&display->priv->object_skeleton);
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index c62680e..dad3b5c 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -32,6 +32,7 @@
 #include <systemd/sd-daemon.h>
 #endif
 
+#include "gdm-manager.h"
 #include "gdm-display-factory.h"
 #include "gdm-local-display-factory.h"
 #include "gdm-local-display-factory-glue.h"
@@ -78,6 +79,10 @@ static void     gdm_local_display_factory_finalize      (GObject
 static GdmDisplay *create_display                       (GdmLocalDisplayFactory      *factory,
                                                          const char                  *seat_id);
 
+static void     on_display_status_changed               (GdmDisplay                  *display,
+                                                         GParamSpec                  *arg1,
+                                                         GdmLocalDisplayFactory      *factory);
+
 static gpointer local_display_factory_object = NULL;
 
 G_DEFINE_TYPE (GdmLocalDisplayFactory, gdm_local_display_factory, GDM_TYPE_DISPLAY_FACTORY)
@@ -172,6 +177,8 @@ on_display_disposed (GdmLocalDisplayFactory *factory,
                      GdmDisplay             *display)
 {
         g_debug ("GdmLocalDisplayFactory: Display %p disposed", display);
+
+        gdm_manager_display_removed (gdm_manager_new (), display);
 }
 
 static void
@@ -181,6 +188,9 @@ store_display (GdmLocalDisplayFactory *factory,
 {
         GdmDisplayStore *store;
 
+        g_signal_connect (display, "notify::status",
+                          G_CALLBACK (on_display_status_changed), factory);
+
         g_object_weak_ref (G_OBJECT (display), (GWeakNotify)on_display_disposed, factory);
 
         store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
@@ -188,6 +198,9 @@ store_display (GdmLocalDisplayFactory *factory,
 
         /* now fill our reserved spot */
         g_hash_table_insert (factory->priv->displays, GUINT_TO_POINTER (num), NULL);
+
+        /* finally, signal dbus */
+        gdm_manager_display_added (gdm_manager_new (), display);
 }
 
 static const char *
@@ -304,9 +317,9 @@ gdm_local_display_factory_create_product_display (GdmLocalDisplayFactory *factor
 }
 
 static void
-on_static_display_status_changed (GdmDisplay             *display,
-                                  GParamSpec             *arg1,
-                                  GdmLocalDisplayFactory *factory)
+on_display_status_changed (GdmDisplay             *display,
+                           GParamSpec             *arg1,
+                           GdmLocalDisplayFactory *factory)
 {
         int              status;
         GdmDisplayStore *store;
@@ -323,7 +336,7 @@ on_static_display_status_changed (GdmDisplay             *display,
 
         status = gdm_display_get_status (display);
 
-        g_debug ("GdmLocalDisplayFactory: static display status changed: %d", status);
+        g_debug ("GdmLocalDisplayFactory: display status changed: %d", status);
         switch (status) {
         case GDM_DISPLAY_FINISHED:
                 /* remove the display number from factory->priv->displays
@@ -332,20 +345,27 @@ on_static_display_status_changed (GdmDisplay             *display,
                 gdm_display_store_remove (store, display);
                 /* reset num failures */
                 factory->priv->num_failures = 0;
-                create_display (factory, seat_id);
+
+                /* Create a new equivalent display if it was static */
+                if (GDM_IS_STATIC_DISPLAY (display))
+                        create_display (factory, seat_id);
                 break;
         case GDM_DISPLAY_FAILED:
                 /* leave the display number in factory->priv->displays
                    so that it doesn't get reused */
                 gdm_display_store_remove (store, display);
                 factory->priv->num_failures++;
-                if (factory->priv->num_failures > MAX_DISPLAY_FAILURES) {
-                        /* oh shit */
-                        g_warning ("GdmLocalDisplayFactory: maximum number of X display failures reached: check X server log for errors");
-                        /* FIXME: should monitor hardware changes to
-                           try again when seats change */
-                } else {
-                        create_display (factory, seat_id);
+
+                /* Create a new equivalent display if it was static */
+                if (GDM_IS_STATIC_DISPLAY (display)) {
+                        if (factory->priv->num_failures > MAX_DISPLAY_FAILURES) {
+                                /* oh shit */
+                                g_warning ("GdmLocalDisplayFactory: maximum number of X display failures reached: check X server log for errors");
+                                /* FIXME: should monitor hardware changes to
+                                   try again when seats change */
+                        } else {
+                                create_display (factory, seat_id);
+                        }
                 }
                 break;
         case GDM_DISPLAY_UNMANAGED:
@@ -407,11 +427,6 @@ create_display (GdmLocalDisplayFactory *factory,
 
         g_object_set (display, "seat-id", seat_id, NULL);
 
-        g_signal_connect (display,
-                          "notify::status",
-                          G_CALLBACK (on_static_display_status_changed),
-                          factory);
-
         store_display (factory, num, display);
 
         /* let store own the ref */
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index ab0c9c1..07f44cc 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -33,14 +33,10 @@
 #include <glib/gi18n.h>
 #include <glib/gstdio.h>
 #include <glib-object.h>
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
 
 #include "gdm-common.h"
 
 #include "gdm-manager.h"
-#include "gdm-manager-glue.h"
 #include "gdm-display-store.h"
 #include "gdm-display-factory.h"
 #include "gdm-local-display-factory.h"
@@ -49,7 +45,7 @@
 #define GDM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_MANAGER, GdmManagerPrivate))
 
 #define GDM_DBUS_PATH         "/org/gnome/DisplayManager"
-#define GDM_MANAGER_DBUS_PATH GDM_DBUS_PATH "/Manager"
+#define GDM_MANAGER_DBUS_PATH GDM_DBUS_PATH "/Displays"
 #define GDM_MANAGER_DBUS_NAME "org.gnome.DisplayManager.Manager"
 
 struct GdmManagerPrivate
@@ -65,8 +61,9 @@ struct GdmManagerPrivate
         gboolean                wait_for_go;
         gboolean                no_console;
 
-        DBusGProxy             *bus_proxy;
-        DBusGConnection        *connection;
+        GDBusProxy             *bus_proxy;
+        GDBusConnection        *connection;
+        GDBusObjectManagerServer *object_manager;
 };
 
 enum {
@@ -116,8 +113,8 @@ listify_display_ids (const char *id,
   Example:
   dbus-send --system --dest=org.gnome.DisplayManager \
   --type=method_call --print-reply --reply-timeout=2000 \
-  /org/gnome/DisplayManager/Manager \
-  org.gnome.DisplayManager.Manager.GetDisplays
+  /org/gnome/DisplayManager/Displays \
+  org.freedesktop.ObjectManager.GetAll
 */
 gboolean
 gdm_manager_get_displays (GdmManager *manager,
@@ -199,89 +196,23 @@ gdm_manager_set_wait_for_go (GdmManager *manager,
         }
 }
 
-typedef struct {
-        const char *service_name;
-        GdmManager *manager;
-} RemoveDisplayData;
-
-static gboolean
-remove_display_for_connection (char              *id,
-                               GdmDisplay        *display,
-                               RemoveDisplayData *data)
-{
-        g_assert (display != NULL);
-        g_assert (data->service_name != NULL);
-
-        /* FIXME: compare service name to that of display */
-#if 0
-        if (strcmp (info->service_name, data->service_name) == 0) {
-                remove_session_for_cookie (data->manager, cookie, NULL);
-                leader_info_cancel (info);
-                return TRUE;
-        }
-#endif
-
-        return FALSE;
-}
-
-static void
-remove_displays_for_connection (GdmManager *manager,
-                                const char *service_name)
-{
-        RemoveDisplayData data;
-
-        data.service_name = service_name;
-        data.manager = manager;
-
-        gdm_display_store_foreach_remove (manager->priv->display_store,
-                                          (GdmDisplayStoreFunc)remove_display_for_connection,
-                                          &data);
-}
-
-static void
-bus_name_owner_changed (DBusGProxy  *bus_proxy,
-                        const char  *service_name,
-                        const char  *old_service_name,
-                        const char  *new_service_name,
-                        GdmManager  *manager)
-{
-        if (strlen (new_service_name) == 0) {
-                remove_displays_for_connection (manager, old_service_name);
-        }
-}
-
 static gboolean
 register_manager (GdmManager *manager)
 {
         GError *error = NULL;
+        GDBusObjectManagerServer *object_server;
 
         error = NULL;
-        manager->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+        manager->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
         if (manager->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);
         }
 
-        manager->priv->bus_proxy = dbus_g_proxy_new_for_name (manager->priv->connection,
-                                                              DBUS_SERVICE_DBUS,
-                                                              DBUS_PATH_DBUS,
-                                                              DBUS_INTERFACE_DBUS);
-        dbus_g_proxy_add_signal (manager->priv->bus_proxy,
-                                 "NameOwnerChanged",
-                                 G_TYPE_STRING,
-                                 G_TYPE_STRING,
-                                 G_TYPE_STRING,
-                                 G_TYPE_INVALID);
-        dbus_g_proxy_connect_signal (manager->priv->bus_proxy,
-                                     "NameOwnerChanged",
-                                     G_CALLBACK (bus_name_owner_changed),
-                                     manager,
-                                     NULL);
-
-        dbus_g_connection_register_g_object (manager->priv->connection, GDM_MANAGER_DBUS_PATH, G_OBJECT (manager));
+        object_server = g_dbus_object_manager_server_new (GDM_MANAGER_DBUS_PATH);
+        g_dbus_object_manager_server_set_connection (object_server, manager->priv->connection);
+        manager->priv->object_manager = object_server;
 
         return TRUE;
 }
@@ -415,8 +346,6 @@ gdm_manager_class_init (GdmManagerClass *klass)
                                                                G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 
         g_type_class_add_private (klass, sizeof (GdmManagerPrivate));
-
-        dbus_g_object_type_install_info (GDM_TYPE_MANAGER, &dbus_glib_gdm_manager_object_info);
 }
 
 static void
@@ -441,10 +370,12 @@ gdm_manager_finalize (GObject *object)
         g_return_if_fail (manager->priv != NULL);
 
 #ifdef HAVE_LIBXDMCP
-        if (manager->priv->xdmcp_factory != NULL) {
-                g_object_unref (manager->priv->xdmcp_factory);
-        }
+        g_clear_object (&manager->priv->xdmcp_factory);
 #endif
+        g_clear_object (&manager->priv->local_factory);
+
+        g_clear_object (&manager->priv->connection);
+        g_clear_object (&manager->priv->object_manager);
 
         gdm_display_store_clear (manager->priv->display_store);
         g_object_unref (manager->priv->display_store);
@@ -452,6 +383,37 @@ gdm_manager_finalize (GObject *object)
         G_OBJECT_CLASS (gdm_manager_parent_class)->finalize (object);
 }
 
+void
+gdm_manager_display_removed (GdmManager *manager,
+                             GdmDisplay *display)
+{
+        char *id;
+
+        g_object_get (display, "id", &id, NULL);
+
+        g_dbus_object_manager_server_unexport (manager->priv->object_manager, id);
+
+        g_signal_emit (manager, signals[DISPLAY_REMOVED], 0, id);
+
+        g_free (id);
+}
+
+void
+gdm_manager_display_added (GdmManager *manager,
+                           GdmDisplay *display)
+{
+        char *id;
+
+        g_object_get (display, "id", &id, NULL);
+
+        g_dbus_object_manager_server_export (manager->priv->object_manager,
+                                             gdm_display_get_object_skeleton (display));
+
+        g_signal_emit (manager, signals[DISPLAY_ADDED], 0, id);
+
+        g_free (id);
+}
+
 GdmManager *
 gdm_manager_new (void)
 {
diff --git a/daemon/gdm-manager.h b/daemon/gdm-manager.h
index c479d93..7b68b0e 100644
--- a/daemon/gdm-manager.h
+++ b/daemon/gdm-manager.h
@@ -23,6 +23,7 @@
 #define __GDM_MANAGER_H
 
 #include <glib-object.h>
+#include "gdm-display.h"
 
 G_BEGIN_DECLS
 
@@ -73,6 +74,11 @@ gboolean            gdm_manager_get_displays                   (GdmManager *mana
                                                                 GPtrArray **displays,
                                                                 GError    **error);
 
+void                gdm_manager_display_added                  (GdmManager *manager,
+                                                                GdmDisplay *display);
+void                gdm_manager_display_removed                (GdmManager *manager,
+                                                                GdmDisplay *display);
+
 
 G_END_DECLS
 
diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c
index fe1f721..db38399 100644
--- a/daemon/gdm-session-direct.c
+++ b/daemon/gdm-session-direct.c
@@ -2251,13 +2251,13 @@ gdm_session_direct_constructor (GType                  type,
         if (session->priv->display_id != NULL) {
                 /* Always match the session id with the master */
                 id = NULL;
-                if (g_str_has_prefix (session->priv->display_id, "/org/gnome/DisplayManager/Display")) {
-                        id = session->priv->display_id + strlen ("/org/gnome/DisplayManager/Display");
+                if (g_str_has_prefix (session->priv->display_id, "/org/gnome/DisplayManager/Displays/")) {
+                        id = session->priv->display_id + strlen ("/org/gnome/DisplayManager/Displays/");
                 }
 
                 g_assert (id != NULL);
 
-                session->priv->id = g_strdup_printf ("/org/gnome/DisplayManager/Session%s", id);
+                session->priv->id = g_strdup_printf ("/org/gnome/DisplayManager/Sessions/%s", id);
                 g_debug ("GdmSessionDirect: Registering %s", session->priv->id);
 
 #if 0
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index fb275cb..da66074 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -1837,13 +1837,13 @@ gdm_slave_constructor (GType                  type,
         /* 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");
+        if (g_str_has_prefix (slave->priv->display_id, "/org/gnome/DisplayManager/Displays/")) {
+                id = slave->priv->display_id + strlen ("/org/gnome/DisplayManager/Displays/");
         }
 
         g_assert (id != NULL);
 
-        slave->priv->id = g_strdup_printf ("/org/gnome/DisplayManager/Slave%s", id);
+        slave->priv->id = g_strdup_printf ("/org/gnome/DisplayManager/Slaves/%s", id);
         g_debug ("GdmSlave: Registering %s", slave->priv->id);
 
         res = register_slave (slave);
diff --git a/daemon/gdm-xdmcp-chooser-display.c b/daemon/gdm-xdmcp-chooser-display.c
index 9d4deb9..e5f1279 100644
--- a/daemon/gdm-xdmcp-chooser-display.c
+++ b/daemon/gdm-xdmcp-chooser-display.c
@@ -102,11 +102,11 @@ gdm_xdmcp_chooser_display_set_slave_bus_name (GdmDisplay *display,
 
         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");
+        if (g_str_has_prefix (display_id, "/org/gnome/DisplayManager/Displays/")) {
+                slave_num = display_id + strlen ("/org/gnome/DisplayManager/Displays/");
         }
 
-        slave_id = g_strdup_printf ("/org/gnome/DisplayManager/Slave%s", slave_num);
+        slave_id = g_strdup_printf ("/org/gnome/DisplayManager/Slaves/%s", slave_num);
 
         local_error = NULL;
         connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &local_error);
diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c
index 7123536..9e2f7f4 100644
--- a/daemon/gdm-xdmcp-display-factory.c
+++ b/daemon/gdm-xdmcp-display-factory.c
@@ -52,6 +52,7 @@
 #include <X11/Xdmcp.h>
 
 #include "gdm-common.h"
+#include "gdm-manager.h"
 #include "gdm-xdmcp-greeter-display.h"
 #include "gdm-xdmcp-chooser-display.h"
 #include "gdm-display-factory.h"
@@ -2049,9 +2050,11 @@ on_display_status_changed (GdmDisplay             *display,
         switch (status) {
         case GDM_DISPLAY_FINISHED:
                 gdm_display_store_remove (store, display);
+                gdm_manager_display_removed (gdm_manager_new (), display);
                 break;
         case GDM_DISPLAY_FAILED:
                 gdm_display_store_remove (store, display);
+                gdm_manager_display_removed (gdm_manager_new (), display);
                 break;
         case GDM_DISPLAY_UNMANAGED:
                 break;
@@ -2123,6 +2126,8 @@ gdm_xdmcp_display_create (GdmXdmcpDisplayFactory *factory,
         store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
         gdm_display_store_add (store, display);
 
+        gdm_manager_display_added (gdm_manager_new (), display);
+
         factory->priv->num_pending_sessions++;
  out:
 
diff --git a/daemon/main.c b/daemon/main.c
index 2ffb779..3bd5107 100644
--- a/daemon/main.c
+++ b/daemon/main.c
@@ -38,10 +38,7 @@
 #include <glib/gi18n.h>
 #include <glib/gstdio.h>
 #include <glib-object.h>
-
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
+#include <gio/gio.h>
 
 #include "gdm-manager.h"
 #include "gdm-log.h"
@@ -54,12 +51,13 @@
 
 #define GDM_DBUS_NAME "org.gnome.DisplayManager"
 
-static void bus_proxy_destroyed_cb (DBusGProxy  *bus_proxy,
-                                    GdmManager **managerp);
+static GDBusConnection *get_system_bus (void);
+static gboolean         bus_reconnect (void);
 
 extern char **environ;
 
 static GdmManager      *manager       = NULL;
+static int              name_id       = -1;
 static GdmSettings     *settings      = NULL;
 static uid_t            gdm_uid       = -1;
 static gid_t            gdm_gid       = -1;
@@ -71,76 +69,29 @@ timed_exit_cb (GMainLoop *loop)
         return FALSE;
 }
 
-static DBusGProxy *
-get_bus_proxy (DBusGConnection *connection)
-{
-        DBusGProxy *bus_proxy;
-
-        bus_proxy = dbus_g_proxy_new_for_name (connection,
-                                               DBUS_SERVICE_DBUS,
-                                               DBUS_PATH_DBUS,
-                                               DBUS_INTERFACE_DBUS);
-        return bus_proxy;
-}
-
-static gboolean
-acquire_name_on_proxy (DBusGProxy *bus_proxy)
+static void
+bus_connection_closed (void)
 {
-        GError     *error;
-        guint       result;
-        gboolean    res;
-        gboolean    ret;
-
-        ret = FALSE;
-
-        if (bus_proxy == NULL) {
-                goto out;
-        }
-
-        error = NULL;
-        res = dbus_g_proxy_call (bus_proxy,
-                                 "RequestName",
-                                 &error,
-                                 G_TYPE_STRING, GDM_DBUS_NAME,
-                                 G_TYPE_UINT, 0,
-                                 G_TYPE_INVALID,
-                                 G_TYPE_UINT, &result,
-                                 G_TYPE_INVALID);
-        if (! res) {
-                if (error != NULL) {
-                        g_warning ("Failed to acquire %s: %s", GDM_DBUS_NAME, error->message);
-                        g_error_free (error);
-                } else {
-                        g_warning ("Failed to acquire %s", GDM_DBUS_NAME);
-                }
-                goto out;
-        }
+        g_debug ("Disconnected from D-Bus");
 
-        if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
-                if (error != NULL) {
-                        g_warning ("Failed to acquire %s: %s", GDM_DBUS_NAME, error->message);
-                        g_error_free (error);
-                } else {
-                        g_warning ("Failed to acquire %s", GDM_DBUS_NAME);
-                }
-                goto out;
+        if (manager == NULL) {
+                /* probably shutting down or something */
+                return;
         }
 
-        ret = TRUE;
+        g_clear_object (&manager);
 
- out:
-        return ret;
+        g_timeout_add_seconds (3, (GSourceFunc)bus_reconnect, NULL);
 }
 
-static DBusGConnection *
+static GDBusConnection *
 get_system_bus (void)
 {
         GError          *error;
-        DBusGConnection *bus;
-        DBusConnection  *connection;
+        GDBusConnection *bus;
 
         error = NULL;
-        bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+        bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
         if (bus == NULL) {
                 g_warning ("Couldn't connect to system bus: %s",
                            error->message);
@@ -148,76 +99,14 @@ get_system_bus (void)
                 goto out;
         }
 
-        connection = dbus_g_connection_get_connection (bus);
-        dbus_connection_set_exit_on_disconnect (connection, FALSE);
+        g_signal_connect (bus, "closed",
+                          G_CALLBACK (bus_connection_closed), NULL);
+        g_dbus_connection_set_exit_on_close (bus, FALSE);
 
  out:
         return bus;
 }
 
-static gboolean
-bus_reconnect (GdmManager *manager)
-{
-        DBusGConnection *bus;
-        DBusGProxy      *bus_proxy;
-        gboolean         ret;
-
-        ret = TRUE;
-
-        bus = get_system_bus ();
-        if (bus == NULL) {
-                goto out;
-        }
-
-        bus_proxy = get_bus_proxy (bus);
-        if (bus_proxy == NULL) {
-                g_warning ("Could not construct bus_proxy object; will retry");
-                goto out;
-        }
-
-        if (! acquire_name_on_proxy (bus_proxy) ) {
-                g_warning ("Could not acquire name; will retry");
-                goto out;
-        }
-
-        manager = gdm_manager_new ();
-        if (manager == NULL) {
-                g_warning ("Could not construct manager object");
-                exit (1);
-        }
-
-        g_signal_connect (bus_proxy,
-                          "destroy",
-                          G_CALLBACK (bus_proxy_destroyed_cb),
-                          &manager);
-
-        g_debug ("Successfully reconnected to D-Bus");
-
-        gdm_manager_start (manager);
-
-        ret = FALSE;
-
- out:
-        return ret;
-}
-
-static void
-bus_proxy_destroyed_cb (DBusGProxy  *bus_proxy,
-                        GdmManager **managerp)
-{
-        g_debug ("Disconnected from D-Bus");
-
-        if (managerp == NULL || *managerp == NULL) {
-                /* probably shutting down or something */
-                return;
-        }
-
-        g_object_unref (*managerp);
-        *managerp = NULL;
-
-        g_timeout_add_seconds (3, (GSourceFunc)bus_reconnect, managerp);
-}
-
 static void
 delete_pid (void)
 {
@@ -253,7 +142,7 @@ write_pid (void)
                 return;
         }
 
-        g_atexit (delete_pid);
+        atexit (delete_pid);
 }
 
 static void
@@ -519,12 +408,9 @@ main (int    argc,
 {
         GMainLoop          *main_loop;
         GOptionContext     *context;
-        DBusGProxy         *bus_proxy;
-        DBusGConnection    *connection;
         GError             *error;
         int                 ret;
         gboolean            res;
-        gboolean            xdmcp_enabled;
         GdmSignalHandler   *signal_handler;
         static gboolean     do_timed_exit    = FALSE;
         static gboolean     print_version    = FALSE;
@@ -571,22 +457,6 @@ main (int    argc,
                 g_log_set_always_fatal (fatal_mask);
         }
 
-        connection = get_system_bus ();
-        if (connection == NULL) {
-                goto out;
-        }
-
-        bus_proxy = get_bus_proxy (connection);
-        if (bus_proxy == NULL) {
-                g_warning ("Could not construct bus_proxy object; bailing out");
-                goto out;
-        }
-
-        if (! acquire_name_on_proxy (bus_proxy) ) {
-                g_warning ("Could not acquire name; bailing out");
-                goto out;
-        }
-
         gdm_log_init ();
 
         settings = gdm_settings_new ();
@@ -615,27 +485,15 @@ main (int    argc,
                 exit (-1);
         }
 
+        /* Connect to the bus, own the name and start the manager */
+        bus_reconnect ();
+
         /* pid file */
         delete_pid ();
         write_pid ();
 
         g_chdir (AUTHDIR);
 
-        manager = gdm_manager_new ();
-
-        if (manager == NULL) {
-                goto out;
-        }
-
-        xdmcp_enabled = FALSE;
-        gdm_settings_direct_get_boolean (GDM_KEY_XDMCP_ENABLE, &xdmcp_enabled);
-        gdm_manager_set_xdmcp_enabled (manager, xdmcp_enabled);
-
-        g_signal_connect (bus_proxy,
-                          "destroy",
-                          G_CALLBACK (bus_proxy_destroyed_cb),
-                          &manager);
-
         main_loop = g_main_loop_new (NULL, FALSE);
 
         signal_handler = gdm_signal_handler_new ();
@@ -653,23 +511,13 @@ main (int    argc,
                 g_timeout_add_seconds (30, (GSourceFunc) timed_exit_cb, main_loop);
         }
 
-        gdm_manager_start (manager);
-
         g_main_loop_run (main_loop);
 
         g_debug ("GDM finished, cleaning up...");
 
-        if (manager != NULL) {
-                g_object_unref (manager);
-        }
-
-        if (settings != NULL) {
-                g_object_unref (settings);
-        }
-
-        if (signal_handler != NULL) {
-                g_object_unref (signal_handler);
-        }
+        g_clear_object (&manager);
+        g_clear_object (&settings);
+        g_clear_object (&signal_handler);
 
         gdm_settings_direct_shutdown ();
         gdm_log_shutdown ();
@@ -682,3 +530,61 @@ main (int    argc,
 
         return ret;
 }
+
+static void
+on_name_acquired (GDBusConnection *bus,
+                  const char      *name,
+                  gpointer         user_data)
+{
+        gboolean xdmcp_enabled;
+
+        manager = gdm_manager_new ();
+        if (manager == NULL) {
+                g_warning ("Could not construct manager object");
+                exit (1);
+        }
+
+        g_debug ("Successfully connected to D-Bus");
+
+        gdm_manager_start (manager);
+
+        xdmcp_enabled = FALSE;
+        gdm_settings_direct_get_boolean (GDM_KEY_XDMCP_ENABLE, &xdmcp_enabled);
+        gdm_manager_set_xdmcp_enabled (manager, xdmcp_enabled);
+}
+
+static void
+on_name_lost (GDBusConnection *bus,
+              const char      *name,
+              gpointer         user_data)
+{
+        g_debug ("Lost GDM name on bus");
+
+        bus_connection_closed ();
+}
+
+static gboolean
+bus_reconnect ()
+{
+        GDBusConnection *bus;
+        gboolean         ret;
+
+        ret = TRUE;
+
+        bus = get_system_bus ();
+        if (bus == NULL) {
+                goto out;
+        }
+
+        name_id = g_bus_own_name_on_connection (bus,
+                                                GDM_DBUS_NAME,
+                                                G_BUS_NAME_OWNER_FLAGS_NONE,
+                                                on_name_acquired,
+                                                on_name_lost,
+                                                NULL,
+                                                NULL);
+
+        ret = FALSE;
+ out:
+        return ret;
+}
diff --git a/daemon/test-session.c b/daemon/test-session.c
index 0bba0bd..34d3485 100644
--- a/daemon/test-session.c
+++ b/daemon/test-session.c
@@ -247,7 +247,7 @@ main (int   argc,
 
         do {
                 g_debug ("creating instance of GdmSessionDirect object...");
-                session = gdm_session_direct_new ("/org/gnome/DisplayManager/Display1",
+                session = gdm_session_direct_new ("/org/gnome/DisplayManager/Displays/1",
                                                   ":0",
                                                   g_get_host_name (),
                                                   ttyname (STDIN_FILENO),



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]