gnome-session r4762 - in branches/dbus_based: . gnome-session



Author: mccann
Date: Thu Jun 19 00:39:22 2008
New Revision: 4762
URL: http://svn.gnome.org/viewvc/gnome-session?rev=4762&view=rev

Log:
2008-06-18  William Jon McCann  <jmccann redhat com>

	* gnome-session/gsm-app.c (gsm_app_error_quark), (gsm_app_set_id),
	(gsm_app_set_client_id), (gsm_app_set_property),
	(gsm_app_get_property), (gsm_app_dispose), (gsm_app_class_init):
	* gnome-session/gsm-app.h:
	* gnome-session/gsm-autostart-app.c (load_desktop_file),
	(gsm_autostart_app_set_desktop_filename),
	(gsm_autostart_app_set_property), (gsm_autostart_app_get_property),
	(gsm_autostart_app_dispose), (is_disabled),
	(autostart_app_stop_spawn), (autostart_app_stop_activate),
	(gsm_autostart_app_stop), (autostart_app_start_spawn),
	(start_notify), (autostart_app_start_activate),
	(gsm_autostart_app_start), (gsm_autostart_app_constructor),
	(gsm_autostart_app_class_init), (gsm_autostart_app_new):
	* gnome-session/gsm-autostart-app.h:
	* gnome-session/gsm-manager.c (_app_has_client_id),
	(find_app_for_client_id), (register_client_for_name),
	(bus_name_owner_changed), (register_manager),
	(append_default_apps), (append_autostart_apps),
	(append_required_apps):
	Add preliminary support for service clients.



Modified:
   branches/dbus_based/ChangeLog
   branches/dbus_based/gnome-session/gsm-app.c
   branches/dbus_based/gnome-session/gsm-app.h
   branches/dbus_based/gnome-session/gsm-autostart-app.c
   branches/dbus_based/gnome-session/gsm-autostart-app.h
   branches/dbus_based/gnome-session/gsm-manager.c

Modified: branches/dbus_based/gnome-session/gsm-app.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-app.c	(original)
+++ branches/dbus_based/gnome-session/gsm-app.c	Thu Jun 19 00:39:22 2008
@@ -57,6 +57,17 @@
 
 G_DEFINE_TYPE (GsmApp, gsm_app, G_TYPE_OBJECT)
 
+GQuark
+gsm_app_error_quark (void)
+{
+        static GQuark ret = 0;
+        if (ret == 0) {
+                ret = g_quark_from_static_string ("gsm_app_error");
+        }
+
+        return ret;
+}
+
 static void
 gsm_app_init (GsmApp *app)
 {
@@ -73,21 +84,44 @@
 }
 
 static void
-set_property (GObject      *object,
-              guint         prop_id,
-              const GValue *value,
-              GParamSpec   *pspec)
+gsm_app_set_id (GsmApp     *app,
+                const char *id)
+{
+        g_return_if_fail (GSM_IS_APP (app));
+
+        g_free (app->priv->id);
+
+        app->priv->id = g_strdup (id);
+        g_object_notify (G_OBJECT (app), "id");
+
+}
+static void
+gsm_app_set_client_id (GsmApp     *app,
+                       const char *client_id)
+{
+        g_return_if_fail (GSM_IS_APP (app));
+
+        g_free (app->priv->client_id);
+
+        app->priv->client_id = g_strdup (client_id);
+        g_object_notify (G_OBJECT (app), "client-id");
+
+}
+
+static void
+gsm_app_set_property (GObject      *object,
+                      guint         prop_id,
+                      const GValue *value,
+                      GParamSpec   *pspec)
 {
         GsmApp *app = GSM_APP (object);
 
         switch (prop_id) {
         case PROP_CLIENT_ID:
-                g_free (app->priv->client_id);
-                app->priv->client_id = g_value_dup_string (value);
+                gsm_app_set_client_id (app, g_value_get_string (value));
                 break;
         case PROP_ID:
-                g_free (app->priv->id);
-                app->priv->id = g_value_dup_string (value);
+                gsm_app_set_id (app, g_value_get_string (value));
                 break;
         case PROP_PHASE:
                 gsm_app_set_phase (app, g_value_get_int (value));
@@ -98,10 +132,10 @@
 }
 
 static void
-get_property (GObject    *object,
-              guint       prop_id,
-              GValue     *value,
-              GParamSpec *pspec)
+gsm_app_get_property (GObject    *object,
+                      guint       prop_id,
+                      GValue     *value,
+                      GParamSpec *pspec)
 {
         GsmApp *app = GSM_APP (object);
 
@@ -121,7 +155,7 @@
 }
 
 static void
-dispose (GObject *object)
+gsm_app_dispose (GObject *object)
 {
         GsmApp *app = GSM_APP (object);
 
@@ -136,9 +170,9 @@
 {
         GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-        object_class->set_property = set_property;
-        object_class->get_property = get_property;
-        object_class->dispose = dispose;
+        object_class->set_property = gsm_app_set_property;
+        object_class->get_property = gsm_app_get_property;
+        object_class->dispose = gsm_app_dispose;
 
         klass->get_id = NULL;
         klass->start = NULL;

Modified: branches/dbus_based/gnome-session/gsm-app.h
==============================================================================
--- branches/dbus_based/gnome-session/gsm-app.h	(original)
+++ branches/dbus_based/gnome-session/gsm-app.h	Thu Jun 19 00:39:22 2008
@@ -76,6 +76,16 @@
                                         GsmClient  *client);
 };
 
+typedef enum
+{
+        GSM_APP_ERROR_GENERAL = 0,
+        GSM_APP_ERROR_START,
+        GSM_APP_NUM_ERRORS
+} GsmAppError;
+
+#define GSM_APP_ERROR gsm_app_error_quark ()
+
+GQuark           gsm_app_error_quark     (void);
 GType            gsm_app_get_type        (void) G_GNUC_CONST;
 
 gboolean         gsm_app_start           (GsmApp     *app,
@@ -97,9 +107,6 @@
 gboolean         gsm_app_provides        (GsmApp     *app,
                                           const char *service);
 gboolean         gsm_app_is_disabled     (GsmApp     *app);
-void             gsm_app_set_client      (GsmApp     *app,
-                                          GsmClient  *client);
-
 void             gsm_app_registered      (GsmApp     *app);
 
 G_END_DECLS

Modified: branches/dbus_based/gnome-session/gsm-autostart-app.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-autostart-app.c	(original)
+++ branches/dbus_based/gnome-session/gsm-autostart-app.c	Thu Jun 19 00:39:22 2008
@@ -29,17 +29,32 @@
 #include <glib.h>
 #include <gio/gio.h>
 
+#include <gconf/gconf-client.h>
+
 #include "gsm-autostart-app.h"
-#include "gconf.h"
+#include "util.h"
+
+enum {
+        AUTOSTART_LAUNCH_SPAWN = 0,
+        AUTOSTART_LAUNCH_ACTIVATE,
+};
+
+#define GSM_SESSION_CLIENT_DBUS_INTERFACE "org.gnome.SessionClient"
 
 struct _GsmAutostartAppPrivate {
+        char                 *desktop_filename;
         char                 *desktop_id;
         char                 *startup_id;
+
         GFileMonitor         *monitor;
         gboolean              condition;
         EggDesktopFile       *desktop_file;
+
+        int                   launch_type;
         GPid                  pid;
         guint                 child_watch_id;
+        DBusGProxy           *proxy;
+        DBusGProxyCall       *proxy_call;
 };
 
 enum {
@@ -49,7 +64,7 @@
 
 enum {
         PROP_0,
-        PROP_DESKTOP_FILE,
+        PROP_DESKTOP_FILENAME,
 };
 
 static guint signals[LAST_SIGNAL] = { 0 };
@@ -68,33 +83,16 @@
         app->priv->condition = FALSE;
 }
 
-static void
-gsm_autostart_app_set_desktop_file (GsmAutostartApp *app,
-                                    const char      *desktop_filename)
+static gboolean
+load_desktop_file (GsmAutostartApp *app)
 {
-        GError *error;
+        char   *dbus_name;
+        char   *client_id;
         char   *phase_str;
         int     phase;
 
-        if (app->priv->desktop_file != NULL) {
-                egg_desktop_file_free (app->priv->desktop_file);
-                app->priv->desktop_file = NULL;
-                g_free (app->priv->desktop_id);
-        }
-
-        if (desktop_filename == NULL) {
-                return;
-        }
-
-        app->priv->desktop_id = g_path_get_basename (desktop_filename);
-
-        app->priv->desktop_file = egg_desktop_file_new (desktop_filename, &error);
         if (app->priv->desktop_file == NULL) {
-                g_warning ("Could not parse desktop file %s: %s",
-                           desktop_filename,
-                           error->message);
-                g_error_free (error);
-                return;
+                return FALSE;
         }
 
         phase_str = egg_desktop_file_get_string (app->priv->desktop_file,
@@ -118,7 +116,66 @@
                 phase = GSM_MANAGER_PHASE_APPLICATION;
         }
 
-        g_object_set (app, "phase", phase, NULL);
+        dbus_name = egg_desktop_file_get_string (app->priv->desktop_file,
+                                                 "X-GNOME-DBus-Name",
+                                                 NULL);
+        if (dbus_name != NULL) {
+                app->priv->launch_type = AUTOSTART_LAUNCH_ACTIVATE;
+        } else {
+                app->priv->launch_type = AUTOSTART_LAUNCH_SPAWN;
+        }
+
+        /* this must only be done on first load */
+        switch (app->priv->launch_type) {
+        case AUTOSTART_LAUNCH_SPAWN:
+                client_id = gsm_util_generate_client_id ();
+                break;
+        case AUTOSTART_LAUNCH_ACTIVATE:
+                client_id = g_strdup (dbus_name);
+                break;
+        default:
+                g_assert_not_reached ();
+        }
+
+        g_object_set (app,
+                      "phase", phase,
+                      "client-id", client_id,
+                      NULL);
+
+        g_free (client_id);
+        g_free (dbus_name);
+
+        return TRUE;
+}
+
+static void
+gsm_autostart_app_set_desktop_filename (GsmAutostartApp *app,
+                                        const char      *desktop_filename)
+{
+        GError *error;
+
+        g_debug ("GsmAutostartApp: setting desktop filename to %s", desktop_filename);
+
+        if (app->priv->desktop_file != NULL) {
+                egg_desktop_file_free (app->priv->desktop_file);
+                app->priv->desktop_file = NULL;
+                g_free (app->priv->desktop_id);
+        }
+
+        if (desktop_filename == NULL) {
+                return;
+        }
+
+        app->priv->desktop_id = g_path_get_basename (desktop_filename);
+
+        app->priv->desktop_file = egg_desktop_file_new (desktop_filename, &error);
+        if (app->priv->desktop_file == NULL) {
+                g_warning ("Could not parse desktop file %s: %s",
+                           desktop_filename,
+                           error->message);
+                g_error_free (error);
+                return;
+        }
 }
 
 static void
@@ -132,8 +189,8 @@
         self = GSM_AUTOSTART_APP (object);
 
         switch (prop_id) {
-        case PROP_DESKTOP_FILE:
-                gsm_autostart_app_set_desktop_file (self, g_value_get_string (value));
+        case PROP_DESKTOP_FILENAME:
+                gsm_autostart_app_set_desktop_filename (self, g_value_get_string (value));
                 break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -152,7 +209,7 @@
         self = GSM_AUTOSTART_APP (object);
 
         switch (prop_id) {
-        case PROP_DESKTOP_FILE:
+        case PROP_DESKTOP_FILENAME:
                 if (self->priv->desktop_file != NULL) {
                         g_value_set_string (value, egg_desktop_file_get_source (self->priv->desktop_file));
                 } else {
@@ -192,6 +249,16 @@
                 priv->child_watch_id = 0;
         }
 
+        if (priv->proxy_call != NULL) {
+                dbus_g_proxy_cancel_call (priv->proxy, priv->proxy_call);
+                priv->proxy_call = NULL;
+        }
+
+        if (priv->proxy != NULL) {
+                g_object_unref (priv->proxy);
+                priv->proxy = NULL;
+        }
+
         if (priv->monitor) {
                 g_file_monitor_cancel (priv->monitor);
         }
@@ -398,7 +465,7 @@
                         if (key) {
                                 GConfClient *client;
 
-                                client = gsm_gconf_get_client ();
+                                client = gconf_client_get_default ();
 
                                 g_assert (GCONF_IS_CLIENT (client));
 
@@ -471,57 +538,200 @@
 }
 
 static gboolean
-gsm_autostart_app_stop (GsmApp  *app,
-                        GError **error)
+autostart_app_stop_spawn (GsmAutostartApp *app,
+                          GError         **error)
 {
-        /* FIXME: */
-        /* first try to stop client */
+        return TRUE;
+}
 
-        /* then try to stop pid */
+static gboolean
+autostart_app_stop_activate (GsmAutostartApp *app,
+                             GError         **error)
+{
         return TRUE;
 }
 
 static gboolean
-gsm_autostart_app_start (GsmApp  *app,
-                         GError **error)
+gsm_autostart_app_stop (GsmApp  *app,
+                        GError **error)
 {
-        char            *env[2] = { NULL, NULL };
-        gboolean         success;
         GsmAutostartApp *aapp;
+        gboolean         ret;
 
         aapp = GSM_AUTOSTART_APP (app);
 
         g_return_val_if_fail (aapp->priv->desktop_file != NULL, FALSE);
 
-        if (egg_desktop_file_get_boolean (aapp->priv->desktop_file,
-                                          "X-GNOME-Autostart-Notify", NULL) ||
-            egg_desktop_file_get_boolean (aapp->priv->desktop_file,
-                                          "AutostartNotify", NULL)) {
-                env[0] = g_strdup_printf ("DESKTOP_AUTOSTART_ID=%s",
-                                          gsm_app_get_client_id (app));
+        switch (aapp->priv->launch_type) {
+        case AUTOSTART_LAUNCH_SPAWN:
+                ret = autostart_app_stop_spawn (aapp, error);
+                break;
+        case AUTOSTART_LAUNCH_ACTIVATE:
+                ret = autostart_app_stop_activate (aapp, error);
+                break;
+        default:
+                g_assert_not_reached ();
+                break;
         }
 
-        success = egg_desktop_file_launch (aapp->priv->desktop_file,
+        return ret;
+}
+
+static gboolean
+autostart_app_start_spawn (GsmAutostartApp *app,
+                           GError         **error)
+{
+        char            *env[2] = { NULL, NULL };
+        gboolean         success;
+        GError          *local_error;
+        const char      *client_id;
+
+        client_id = gsm_app_get_client_id (GSM_APP (app));
+        g_assert (client_id != NULL);
+
+        env[0] = g_strdup_printf ("DESKTOP_AUTOSTART_ID=%s", client_id);
+        g_debug ("GsmAutostartApp: starting %s: %s", app->priv->desktop_id, client_id);
+
+        local_error = NULL;
+        success = egg_desktop_file_launch (app->priv->desktop_file,
                                            NULL,
-                                           error,
+                                           &local_error,
                                            EGG_DESKTOP_FILE_LAUNCH_PUTENV, env,
                                            EGG_DESKTOP_FILE_LAUNCH_FLAGS, G_SPAWN_DO_NOT_REAP_CHILD,
-                                           EGG_DESKTOP_FILE_LAUNCH_RETURN_PID, &aapp->priv->pid,
-                                           EGG_DESKTOP_FILE_LAUNCH_RETURN_STARTUP_ID, &aapp->priv->startup_id,
+                                           EGG_DESKTOP_FILE_LAUNCH_RETURN_PID, &app->priv->pid,
+                                           EGG_DESKTOP_FILE_LAUNCH_RETURN_STARTUP_ID, &app->priv->startup_id,
                                            NULL);
-
         g_free (env[0]);
 
         if (success) {
-                g_debug ("GsmAutostartApp: started pid:%d", aapp->priv->pid);
-                aapp->priv->child_watch_id = g_child_watch_add (aapp->priv->pid,
-                                                                (GChildWatchFunc)app_exited,
-                                                                app);
+                g_debug ("GsmAutostartApp: started pid:%d", app->priv->pid);
+                app->priv->child_watch_id = g_child_watch_add (app->priv->pid,
+                                                               (GChildWatchFunc)app_exited,
+                                                               app);
+        } else {
+                g_set_error (error,
+                             GSM_APP_ERROR,
+                             GSM_APP_ERROR_START,
+                             "Unable to start application: %s", local_error->message);
+                g_error_free (local_error);
+        }
 
-                return TRUE;
+        return success;
+}
+
+static void
+start_notify (DBusGProxy      *proxy,
+              DBusGProxyCall  *call,
+              GsmAutostartApp *app)
+{
+        gboolean res;
+        GError  *error;
+
+        res = dbus_g_proxy_end_call (proxy,
+                                     call,
+                                     &error,
+                                     G_TYPE_INVALID);
+        app->priv->proxy_call = NULL;
+
+        if (! res) {
+                g_warning ("GsmAutostartApp: Error starting application: %s", error->message);
+                g_error_free (error);
         } else {
+                g_debug ("GsmAutostartApp: Started application %s", app->priv->desktop_id);
+        }
+}
+
+static gboolean
+autostart_app_start_activate (GsmAutostartApp  *app,
+                              GError          **error)
+{
+        const char      *name;
+        char            *path;
+        char            *arguments;
+        DBusGConnection *bus;
+        GError          *local_error;
+
+        local_error = NULL;
+        bus = dbus_g_bus_get (DBUS_BUS_SESSION, &local_error);
+        if (bus == NULL) {
+                if (local_error != NULL) {
+                        g_warning ("error getting session bus: %s", local_error->message);
+                }
+                g_propagate_error (error, local_error);
                 return FALSE;
         }
+
+        name = gsm_app_get_client_id (GSM_APP (app));
+        g_assert (name != NULL);
+
+        path = egg_desktop_file_get_string (app->priv->desktop_file,
+                                            "X-GNOME-DBus-Path",
+                                            NULL);
+        if (path == NULL) {
+                /* just pick one? */
+                path = g_strdup ("/");
+        }
+
+        arguments = egg_desktop_file_get_string (app->priv->desktop_file,
+                                                 "X-GNOME-DBus-Start-Arguments",
+                                                 NULL);
+
+        app->priv->proxy = dbus_g_proxy_new_for_name (bus,
+                                                      name,
+                                                      path,
+                                                      GSM_SESSION_CLIENT_DBUS_INTERFACE);
+        if (app->priv->proxy == NULL) {
+                g_set_error (error,
+                             GSM_APP_ERROR,
+                             GSM_APP_ERROR_START,
+                             "Unable to start application: unable to create proxy for client");
+                return FALSE;
+        }
+
+        app->priv->proxy_call = dbus_g_proxy_begin_call (app->priv->proxy,
+                                                         "Start",
+                                                         (DBusGProxyCallNotify)start_notify,
+                                                         app,
+                                                         NULL,
+                                                         G_TYPE_STRING, arguments,
+                                                         G_TYPE_INVALID);
+        if (app->priv->proxy_call == NULL) {
+                g_object_unref (app->priv->proxy);
+                app->priv->proxy = NULL;
+                g_set_error (error,
+                             GSM_APP_ERROR,
+                             GSM_APP_ERROR_START,
+                             "Unable to start application: unable to call Start on client");
+                return FALSE;
+        }
+
+        return TRUE;
+}
+
+static gboolean
+gsm_autostart_app_start (GsmApp  *app,
+                         GError **error)
+{
+        GsmAutostartApp *aapp;
+        gboolean         ret;
+
+        aapp = GSM_AUTOSTART_APP (app);
+
+        g_return_val_if_fail (aapp->priv->desktop_file != NULL, FALSE);
+
+        switch (aapp->priv->launch_type) {
+        case AUTOSTART_LAUNCH_SPAWN:
+                ret = autostart_app_start_spawn (aapp, error);
+                break;
+        case AUTOSTART_LAUNCH_ACTIVATE:
+                ret = autostart_app_start_activate (aapp, error);
+                break;
+        default:
+                g_assert_not_reached ();
+                break;
+        }
+
+        return ret;
 }
 
 static gboolean
@@ -642,6 +852,11 @@
 
         g_object_set (app, "id", id, NULL);
 
+        if (! load_desktop_file (app)) {
+                g_object_unref (app);
+                app = NULL;
+        }
+
         return G_OBJECT (app);
 }
 
@@ -666,9 +881,9 @@
         app_class->get_autorestart = gsm_autostart_app_get_autorestart;
 
         g_object_class_install_property (object_class,
-                                         PROP_DESKTOP_FILE,
-                                         g_param_spec_string ("desktop-file",
-                                                              "Desktop file",
+                                         PROP_DESKTOP_FILENAME,
+                                         g_param_spec_string ("desktop-filename",
+                                                              "Desktop filename",
                                                               "Freedesktop .desktop file",
                                                               NULL,
                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
@@ -687,20 +902,13 @@
 }
 
 GsmApp *
-gsm_autostart_app_new (const char *desktop_file,
-                       const char *client_id)
+gsm_autostart_app_new (const char *desktop_file)
 {
         GsmAutostartApp *app;
 
         app = g_object_new (GSM_TYPE_AUTOSTART_APP,
-                            "desktop-file", desktop_file,
-                            "client-id", client_id,
+                            "desktop-filename", desktop_file,
                             NULL);
 
-        if (app->priv->desktop_file == NULL) {
-                g_object_unref (app);
-                app = NULL;
-        }
-
         return GSM_APP (app);
 }

Modified: branches/dbus_based/gnome-session/gsm-autostart-app.h
==============================================================================
--- branches/dbus_based/gnome-session/gsm-autostart-app.h	(original)
+++ branches/dbus_based/gnome-session/gsm-autostart-app.h	Thu Jun 19 00:39:22 2008
@@ -57,8 +57,7 @@
 
 GType   gsm_autostart_app_get_type           (void) G_GNUC_CONST;
 
-GsmApp *gsm_autostart_app_new                (const char *desktop_file,
-                                              const char *client_id);
+GsmApp *gsm_autostart_app_new                (const char *desktop_file);
 
 G_END_DECLS
 

Modified: branches/dbus_based/gnome-session/gsm-manager.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-manager.c	(original)
+++ branches/dbus_based/gnome-session/gsm-manager.c	Thu Jun 19 00:39:22 2008
@@ -46,6 +46,7 @@
 
 #include "gsm-xsmp-client.h"
 #include "gsm-method-client.h"
+#include "gsm-service-client.h"
 
 #include "gsm-autostart-app.h"
 #include "gsm-resumed-app.h"
@@ -483,6 +484,84 @@
                                   &data);
 }
 
+static gboolean
+_app_has_client_id (const char *id,
+                    GsmApp     *app,
+                    const char *client_id_a)
+{
+        const char *client_id_b;
+
+        client_id_b = gsm_app_get_client_id (app);
+
+        if (client_id_b == NULL) {
+                return FALSE;
+        }
+
+        return (strcmp (client_id_a, client_id_b) == 0);
+}
+
+static GsmApp *
+find_app_for_client_id (GsmManager *manager,
+                        const char *client_id)
+{
+        GsmApp *found_app;
+        GSList *a;
+
+        found_app = NULL;
+
+        /* If we're starting up the session, try to match the new client
+         * with one pending apps for the current phase. If not, try to match
+         * with any of the autostarted apps. */
+        if (manager->priv->phase < GSM_MANAGER_PHASE_APPLICATION) {
+                for (a = manager->priv->pending_apps; a != NULL; a = a->next) {
+                        GsmApp *app = GSM_APP (a->data);
+
+                        if (strcmp (client_id, gsm_app_get_client_id (app)) == 0) {
+                                found_app = app;
+                                goto out;
+                        }
+                }
+        } else {
+                GsmApp *app;
+
+                app = g_hash_table_find (manager->priv->apps_by_id,
+                                         (GHRFunc)_app_has_client_id,
+                                         (char *)client_id);
+                if (app != NULL) {
+                        found_app = app;
+                        goto out;
+                }
+        }
+ out:
+        return found_app;
+}
+
+static void
+register_client_for_name (GsmManager *manager,
+                          const char *dbus_name)
+{
+        GsmApp    *app;
+        GsmClient *client;
+
+        app = find_app_for_client_id (manager, dbus_name);
+        if (app == NULL) {
+                return;
+        }
+
+        client = gsm_service_client_new (dbus_name);
+        if (client == NULL) {
+                g_warning ("GsmManager: Unable to create client for name '%s'", dbus_name);
+                return;
+        }
+
+        gsm_client_store_add (manager->priv->store, client);
+
+        gsm_client_set_app_id (client, gsm_app_get_id (app));
+        gsm_app_registered (app);
+
+        gsm_client_set_status (client, GSM_CLIENT_REGISTERED);
+}
+
 static void
 bus_name_owner_changed (DBusGProxy  *bus_proxy,
                         const char  *service_name,
@@ -490,12 +569,16 @@
                         const char  *new_service_name,
                         GsmManager  *manager)
 {
-        if (strlen (new_service_name) == 0) {
+        if (strlen (new_service_name) == 0
+            && strlen (old_service_name) > 0) {
                 /* service removed */
                 remove_clients_for_connection (manager, old_service_name);
-        } else if (strlen (old_service_name) == 0) {
+        } else if (strlen (old_service_name) == 0
+                   && strlen (new_service_name) > 0) {
                 /* service added */
-                
+                if (new_service_name[0] == '/') {
+                        register_client_for_name (manager, new_service_name);
+                }
         }
 }
 
@@ -508,7 +591,7 @@
         manager->priv->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
         if (manager->priv->connection == NULL) {
                 if (error != NULL) {
-                        g_critical ("error getting system bus: %s", error->message);
+                        g_critical ("error getting session bus: %s", error->message);
                         g_error_free (error);
                 }
                 exit (1);
@@ -560,22 +643,6 @@
         return (strcmp (client_id_a, client_id_b) == 0);
 }
 
-static gboolean
-_app_has_client_id (const char *id,
-                    GsmApp     *app,
-                    const char *client_id_a)
-{
-        const char *client_id_b;
-
-        client_id_b = gsm_app_get_client_id (app);
-
-        if (client_id_b == NULL) {
-                return FALSE;
-        }
-
-        return (strcmp (client_id_a, client_id_b) == 0);
-}
-
 static void
 on_client_disconnected (GsmClient  *client,
                         GsmManager *manager)
@@ -584,42 +651,6 @@
         disconnect_client (manager, client);
 }
 
-static GsmApp *
-find_app_for_client_id (GsmManager *manager,
-                        const char *client_id)
-{
-        GsmApp *found_app;
-        GSList *a;
-
-        found_app = NULL;
-
-        /* If we're starting up the session, try to match the new client
-         * with one pending apps for the current phase. If not, try to match
-         * with any of the autostarted apps. */
-        if (manager->priv->phase < GSM_MANAGER_PHASE_APPLICATION) {
-                for (a = manager->priv->pending_apps; a != NULL; a = a->next) {
-                        GsmApp *app = GSM_APP (a->data);
-
-                        if (strcmp (client_id, gsm_app_get_client_id (app)) == 0) {
-                                found_app = app;
-                                goto out;
-                        }
-                }
-        } else {
-                GsmApp *app;
-
-                app = g_hash_table_find (manager->priv->apps_by_id,
-                                         (GHRFunc)_app_has_client_id,
-                                         (char *)client_id);
-                if (app != NULL) {
-                        found_app = app;
-                        goto out;
-                }
-        }
- out:
-        return found_app;
-}
-
 static gboolean
 on_xsmp_client_register_request (GsmXSMPClient *client,
                                  char         **id,
@@ -868,13 +899,10 @@
 
                 if (app_path != NULL) {
                         GsmApp *app;
-                        char   *client_id;
 
                         g_debug ("GsmManager: Found in: %s", app_path);
 
-                        client_id = gsm_util_generate_client_id ();
-                        app = gsm_autostart_app_new (app_path, client_id);
-                        g_free (client_id);
+                        app = gsm_autostart_app_new (app_path);
                         g_free (app_path);
 
                         if (app != NULL) {
@@ -912,7 +940,6 @@
         while ((name = g_dir_read_name (dir))) {
                 GsmApp *app;
                 char   *desktop_file;
-                char   *client_id;
 
                 if (!g_str_has_suffix (name, ".desktop")) {
                         continue;
@@ -920,8 +947,7 @@
 
                 desktop_file = g_build_filename (path, name, NULL);
 
-                client_id = gsm_util_generate_client_id ();
-                app = gsm_autostart_app_new (desktop_file, client_id);
+                app = gsm_autostart_app_new (desktop_file);
                 if (app != NULL) {
                         g_debug ("GsmManager: read %s\n", desktop_file);
                         append_app (manager, app);
@@ -931,7 +957,6 @@
                 }
 
                 g_free (desktop_file);
-                g_free (client_id);
         }
 
         g_dir_close (dir);
@@ -1030,11 +1055,7 @@
                                          (GHRFunc)_find_app_provides,
                                          (char *)service);
                 if (app == NULL) {
-                        char *client_id;
-
-                        client_id = gsm_util_generate_client_id ();
-                        app = gsm_autostart_app_new (default_provider, client_id);
-                        g_free (client_id);
+                        app = gsm_autostart_app_new (default_provider);
                         if (app != NULL) {
                                 append_app (manager, app);
                                 g_object_unref (app);



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