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



Author: mccann
Date: Tue Jun 17 23:03:09 2008
New Revision: 4758
URL: http://svn.gnome.org/viewvc/gnome-session?rev=4758&view=rev

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

	* gnome-session/Makefile.am:
	* gnome-session/gsm-app.c (gsm_app_class_init), (gsm_app_get_id):
	* gnome-session/gsm-app.h:
	* gnome-session/gsm-autostart-app.c
	(gsm_autostart_app_set_desktop_file), (gsm_autostart_app_dispose),
	(is_disabled), (app_exited), (gsm_autostart_app_get_id),
	(gsm_autostart_app_constructor), (gsm_autostart_app_class_init):
	* gnome-session/gsm-client-store.c (gsm_client_store_get_locked):
	* gnome-session/gsm-client-store.h:
	* gnome-session/gsm-client.c (gsm_client_finalize),
	(gsm_client_set_app_id), (gsm_client_set_property),
	(gsm_client_get_property), (gsm_client_class_init),
	(gsm_client_get_app_id), (gsm_client_notify_session_over),
	(gsm_client_restart), (gsm_client_stop), (gsm_client_disconnected):
	* gnome-session/gsm-client.h:
	* gnome-session/gsm-dbus-client.c (gsm_dbus_client_constructor),
	(gsm_dbus_client_init), (gsm_dbus_client_set_property),
	(gsm_dbus_client_get_property), (gsm_dbus_client_finalize),
	(gsm_dbus_client_class_init):
	* gnome-session/gsm-dbus-client.h:
	* gnome-session/gsm-manager.c (gsm_manager_error_get_type),
	(app_condition_changed), (phase_timeout), (_start_app),
	(find_app_for_client_id), (find_app_for_app_id),
	(on_xsmp_client_register_request), (on_store_client_added),
	(gsm_manager_class_init), (_shutdown_client), (get_caller_info),
	(gsm_manager_register_client), (gsm_manager_unregister_client),
	(gsm_manager_inhibit), (gsm_manager_uninhibit):
	* gnome-session/gsm-manager.h:
	* gnome-session/gsm-manager.xml:
	* gnome-session/gsm-method-client.c
	(gsm_method_client_constructor), (gsm_method_client_init),
	(gsm_method_client_set_property), (gsm_method_client_get_property),
	(gsm_method_client_finalize), (gsm_method_client_stop),
	(gsm_method_client_restart), (gsm_method_client_class_init),
	(gsm_method_client_new):
	* gnome-session/gsm-method-client.h:
	* gnome-session/gsm-resumed-app.c (gsm_resumed_app_get_id),
	(gsm_resumed_app_class_init):
	* gnome-session/gsm-service-client.c
	(gsm_service_client_constructor), (gsm_service_client_init),
	(gsm_service_client_set_property),
	(gsm_service_client_get_property), (gsm_service_client_finalize),
	(gsm_service_client_stop), (gsm_service_client_restart),
	(gsm_service_client_class_init), (gsm_service_client_new):
	* gnome-session/gsm-service-client.h:
	* gnome-session/gsm-xsmp-client.c (xsmp_restart), (xsmp_stop),
	(_boolean_handled_accumulator), (gsm_xsmp_client_class_init),
	(register_client_callback), (save_yourself_request_callback),
	(save_yourself_phase2_request_callback),
	(interact_request_callback), (interact_done_callback),
	(save_yourself_done_callback), (gsm_xsmp_client_register_request),
	(gsm_xsmp_client_save_state):
	* gnome-session/gsm-xsmp-client.h:
	Stub out some dbus based client classes.  Make the GsmClient
	class more generic.



Added:
   branches/dbus_based/gnome-session/gsm-dbus-client.c
   branches/dbus_based/gnome-session/gsm-dbus-client.h
   branches/dbus_based/gnome-session/gsm-method-client.c
   branches/dbus_based/gnome-session/gsm-method-client.h
   branches/dbus_based/gnome-session/gsm-service-client.c
   branches/dbus_based/gnome-session/gsm-service-client.h
Modified:
   branches/dbus_based/ChangeLog
   branches/dbus_based/gnome-session/Makefile.am
   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-client-store.c
   branches/dbus_based/gnome-session/gsm-client-store.h
   branches/dbus_based/gnome-session/gsm-client.c
   branches/dbus_based/gnome-session/gsm-client.h
   branches/dbus_based/gnome-session/gsm-manager.c
   branches/dbus_based/gnome-session/gsm-manager.h
   branches/dbus_based/gnome-session/gsm-manager.xml
   branches/dbus_based/gnome-session/gsm-resumed-app.c
   branches/dbus_based/gnome-session/gsm-xsmp-client.c
   branches/dbus_based/gnome-session/gsm-xsmp-client.h

Modified: branches/dbus_based/gnome-session/Makefile.am
==============================================================================
--- branches/dbus_based/gnome-session/Makefile.am	(original)
+++ branches/dbus_based/gnome-session/Makefile.am	Tue Jun 17 23:03:09 2008
@@ -26,16 +26,22 @@
 	$(POLKIT_GNOME_LIBS)
 
 gnome_session_SOURCES =				\
+	gsm-app.h				\
+	gsm-app.c				\
 	gsm-autostart-app.h			\
 	gsm-autostart-app.c			\
 	gsm-resumed-app.h			\
 	gsm-resumed-app.c			\
-	gsm-app.h				\
-	gsm-app.c				\
-	gsm-xsmp-client.h			\
-	gsm-xsmp-client.c			\
 	gsm-client.c				\
 	gsm-client.h				\
+	gsm-xsmp-client.h			\
+	gsm-xsmp-client.c			\
+	gsm-dbus-client.h			\
+	gsm-dbus-client.c			\
+	gsm-method-client.h			\
+	gsm-method-client.c			\
+	gsm-service-client.h			\
+	gsm-service-client.c			\
 	gsm-marshal.h				\
 	gsm-marshal.c				\
 	gsm-consolekit.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	Tue Jun 17 23:03:09 2008
@@ -139,7 +139,7 @@
         object_class->get_property = get_property;
         object_class->dispose = dispose;
 
-        klass->get_basename = NULL;
+        klass->get_id = NULL;
         klass->start = NULL;
         klass->provides = NULL;
         klass->is_running = NULL;
@@ -201,15 +201,9 @@
 }
 
 const char *
-gsm_app_get_basename (GsmApp *app)
-{
-        return GSM_APP_GET_CLASS (app)->get_basename (app);
-}
-
-const char *
 gsm_app_get_id (GsmApp *app)
 {
-        return app->priv->id;
+        return GSM_APP_GET_CLASS (app)->get_id (app);
 }
 
 const char *

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	Tue Jun 17 23:03:09 2008
@@ -66,7 +66,7 @@
                                       const char *service);
         gboolean    (*is_running)    (GsmApp     *app);
 
-        const char *(*get_basename) (GsmApp *app);
+        const char *(*get_id)       (GsmApp *app);
         gboolean    (*is_disabled)  (GsmApp *app);
         void        (*set_client)   (GsmApp    *app,
                                      GsmClient *client);
@@ -86,8 +86,6 @@
 void             gsm_app_exited          (GsmApp     *app);
 void             gsm_app_died            (GsmApp     *app);
 
-
-const char      *gsm_app_get_basename    (GsmApp     *app);
 gboolean         gsm_app_provides        (GsmApp     *app,
                                           const char *service);
 gboolean         gsm_app_is_disabled     (GsmApp     *app);

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	Tue Jun 17 23:03:09 2008
@@ -31,6 +31,7 @@
 #include "gconf.h"
 
 struct _GsmAutostartAppPrivate {
+        char                 *desktop_id;
         GFileMonitor         *monitor;
         gboolean              condition;
         EggDesktopFile       *desktop_file;
@@ -67,7 +68,7 @@
 
 static void
 gsm_autostart_app_set_desktop_file (GsmAutostartApp *app,
-                                    const char      *desktop_file)
+                                    const char      *desktop_filename)
 {
         GError *error;
         char   *phase_str;
@@ -76,24 +77,27 @@
         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_file == NULL) {
+        if (desktop_filename == NULL) {
                 return;
         }
 
-        app->priv->desktop_file = egg_desktop_file_new (desktop_file, &error);
+        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_file,
+                           desktop_filename,
                            error->message);
                 g_error_free (error);
                 return;
         }
 
         phase_str = egg_desktop_file_get_string (app->priv->desktop_file,
-                                             "X-GNOME-Autostart-Phase",
-                                             NULL);
+                                                 "X-GNOME-Autostart-Phase",
+                                                 NULL);
         if (phase_str != NULL) {
                 if (strcmp (phase_str, "Initialization") == 0) {
                         phase = GSM_MANAGER_PHASE_INITIALIZATION;
@@ -118,8 +122,8 @@
 static void
 gsm_autostart_app_set_property (GObject      *object,
                                 guint         prop_id,
-                                const GValue  *value,
-                                GParamSpec    *pspec)
+                                const GValue *value,
+                                GParamSpec   *pspec)
 {
         GsmAutostartApp *self;
 
@@ -176,6 +180,11 @@
                 priv->desktop_file = NULL;
         }
 
+        if (priv->desktop_id) {
+                g_free (priv->desktop_id);
+                priv->desktop_id = NULL;
+        }
+
         if (priv->monitor) {
                 g_file_monitor_cancel (priv->monitor);
         }
@@ -183,14 +192,14 @@
 
 
 static void
-if_exists_condition_cb (GFileMonitor *monitor,
-                        GFile *file,
-                        GFile *other_file,
+if_exists_condition_cb (GFileMonitor     *monitor,
+                        GFile            *file,
+                        GFile            *other_file,
                         GFileMonitorEvent event,
-                        GsmApp *app)
+                        GsmApp           *app)
 {
         GsmAutostartAppPrivate *priv;
-        gboolean condition = FALSE;
+        gboolean                condition = FALSE;
 
         priv = GSM_AUTOSTART_APP (app)->priv;
 
@@ -212,14 +221,14 @@
 }
 
 static void
-unless_exists_condition_cb (GFileMonitor *monitor,
-                            GFile *file,
-                            GFile *other_file,
+unless_exists_condition_cb (GFileMonitor     *monitor,
+                            GFile            *file,
+                            GFile            *other_file,
                             GFileMonitorEvent event,
-                            GsmApp *app)
+                            GsmApp           *app)
 {
         GsmAutostartAppPrivate *priv;
-        gboolean condition = FALSE;
+        gboolean                condition = FALSE;
 
         priv = GSM_AUTOSTART_APP (app)->priv;
 
@@ -246,9 +255,9 @@
                     GConfEntry  *entry,
                     gpointer    user_data)
 {
-        GsmApp *app;
+        GsmApp                 *app;
         GsmAutostartAppPrivate *priv;
-        gboolean condition = FALSE;
+        gboolean                condition = FALSE;
 
         g_return_if_fail (GSM_IS_APP (user_data));
 
@@ -306,7 +315,7 @@
             !egg_desktop_file_get_boolean (priv->desktop_file,
                                            "X-GNOME-Autostart-enabled", NULL)) {
                 g_debug ("app %s is disabled by X-GNOME-Autostart-enabled",
-                         gsm_app_get_basename (app));
+                         gsm_app_get_id (app));
                 return TRUE;
         }
 
@@ -314,14 +323,14 @@
         if (egg_desktop_file_get_boolean (priv->desktop_file,
                                           EGG_DESKTOP_FILE_KEY_HIDDEN, NULL)) {
                 g_debug ("app %s is disabled by Hidden",
-                         gsm_app_get_basename (app));
+                         gsm_app_get_id (app));
                 return TRUE;
         }
 
         /* Check OnlyShowIn/NotShowIn/TryExec */
         if (!egg_desktop_file_can_launch (priv->desktop_file, "GNOME")) {
                 g_debug ("app %s not installed or not for GNOME",
-                         gsm_app_get_basename (app));
+                         gsm_app_get_id (app));
                 return TRUE;
         }
 
@@ -419,7 +428,7 @@
 
                 if (disabled) {
                         g_debug ("app %s is disabled by AutostartCondition",
-                                 gsm_app_get_basename (app));
+                                 gsm_app_get_id (app));
                         return TRUE;
                 }
         }
@@ -448,10 +457,8 @@
         app->priv->child_watch_id = 0;
 
         if (WIFEXITED (status)) {
-                int code = WEXITSTATUS (status);
                 gsm_app_exited (GSM_APP (app));
         } else if (WIFSIGNALED (status)) {
-                int num = WTERMSIG (status);
                 gsm_app_died (GSM_APP (app));
         }
 }
@@ -535,7 +542,7 @@
 }
 
 static const char *
-get_basename (GsmApp *app)
+gsm_autostart_app_get_id (GsmApp *app)
 {
         const char *location;
         const char *slash;
@@ -566,7 +573,7 @@
                                                                                                n_construct_properties,
                                                                                                construct_properties));
 
-        id = get_basename (GSM_APP (app));
+        id = gsm_autostart_app_get_id (GSM_APP (app));
 
         g_object_set (app, "id", id, NULL);
 
@@ -588,7 +595,7 @@
         app_class->is_running = is_running;
         app_class->start = launch;
         app_class->provides = gsm_autostart_app_provides;
-        app_class->get_basename = get_basename;
+        app_class->get_id = gsm_autostart_app_get_id;
 
         g_object_class_install_property (object_class,
                                          PROP_DESKTOP_FILE,

Modified: branches/dbus_based/gnome-session/gsm-client-store.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-client-store.c	(original)
+++ branches/dbus_based/gnome-session/gsm-client-store.c	Tue Jun 17 23:03:09 2008
@@ -206,6 +206,14 @@
         store->priv->locked = locked;
 }
 
+gboolean
+gsm_client_store_get_locked (GsmClientStore *store)
+{
+        g_return_val_if_fail (GSM_IS_CLIENT_STORE (store), FALSE);
+
+        return store->priv->locked;
+}
+
 static void
 gsm_client_store_set_property (GObject      *object,
                                guint         prop_id,

Modified: branches/dbus_based/gnome-session/gsm-client-store.h
==============================================================================
--- branches/dbus_based/gnome-session/gsm-client-store.h	(original)
+++ branches/dbus_based/gnome-session/gsm-client-store.h	Tue Jun 17 23:03:09 2008
@@ -68,6 +68,7 @@
 
 GsmClientStore *    gsm_client_store_new                      (void);
 
+gboolean            gsm_client_store_get_locked               (GsmClientStore    *store);
 void                gsm_client_store_set_locked               (GsmClientStore    *store,
                                                                gboolean           locked);
 

Modified: branches/dbus_based/gnome-session/gsm-client.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-client.c	(original)
+++ branches/dbus_based/gnome-session/gsm-client.c	Tue Jun 17 23:03:09 2008
@@ -22,7 +22,6 @@
 #include "config.h"
 #endif
 
-#include "gsm-marshal.h"
 #include "gsm-client.h"
 
 static guint32 client_serial = 1;
@@ -33,6 +32,7 @@
 {
         char *id;
         char *client_id;
+        char *app_id;
         int   status;
 };
 
@@ -40,25 +40,18 @@
         PROP_0,
         PROP_ID,
         PROP_CLIENT_ID,
+        PROP_APP_ID,
         PROP_STATUS,
 };
 
 enum {
-        MANAGE_REQUEST,
-        LOGOUT_REQUEST,
-
-        SAVED_STATE,
-        REQUEST_PHASE2,
-        REQUEST_INTERACTION,
-        INTERACTION_DONE,
-        SAVE_YOURSELF_DONE,
         DISCONNECTED,
         LAST_SIGNAL
 };
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
-G_DEFINE_TYPE (GsmClient, gsm_client, G_TYPE_OBJECT)
+G_DEFINE_ABSTRACT_TYPE (GsmClient, gsm_client, G_TYPE_OBJECT)
 
 static guint32
 get_next_client_serial (void)
@@ -117,6 +110,7 @@
 
         g_free (client->priv->id);
         g_free (client->priv->client_id);
+        g_free (client->priv->app_id);
 }
 
 void
@@ -142,6 +136,18 @@
         g_object_notify (G_OBJECT (client), "client-id");
 }
 
+void
+gsm_client_set_app_id (GsmClient  *client,
+                       const char *app_id)
+{
+        g_return_if_fail (GSM_IS_CLIENT (client));
+
+        g_free (client->priv->app_id);
+
+        client->priv->app_id = g_strdup (app_id);
+        g_object_notify (G_OBJECT (client), "app-id");
+}
+
 static void
 gsm_client_set_property (GObject       *object,
                          guint          prop_id,
@@ -156,6 +162,9 @@
         case PROP_CLIENT_ID:
                 gsm_client_set_client_id (self, g_value_get_string (value));
                 break;
+        case PROP_APP_ID:
+                gsm_client_set_app_id (self, g_value_get_string (value));
+                break;
         case PROP_STATUS:
                 gsm_client_set_status (self, g_value_get_int (value));
                 break;
@@ -179,6 +188,9 @@
         case PROP_CLIENT_ID:
                 g_value_set_string (value, self->priv->client_id);
                 break;
+        case PROP_APP_ID:
+                g_value_set_string (value, self->priv->app_id);
+                break;
         case PROP_STATUS:
                 g_value_set_int (value, self->priv->status);
                 break;
@@ -188,22 +200,6 @@
         }
 }
 
-static gboolean
-_boolean_handled_accumulator (GSignalInvocationHint *ihint,
-                              GValue                *return_accu,
-                              const GValue          *handler_return,
-                              gpointer               dummy)
-{
-        gboolean    continue_emission;
-        gboolean    signal_handled;
-
-        signal_handled = g_value_get_boolean (handler_return);
-        g_value_set_boolean (return_accu, signal_handled);
-        continue_emission = !signal_handled;
-
-        return continue_emission;
-}
-
 static void
 gsm_client_class_init (GsmClientClass *klass)
 {
@@ -214,77 +210,6 @@
         object_class->constructor = gsm_client_constructor;
         object_class->finalize = gsm_client_finalize;
 
-        signals[MANAGE_REQUEST] =
-                g_signal_new ("manage-request",
-                              G_OBJECT_CLASS_TYPE (object_class),
-                              G_SIGNAL_RUN_LAST,
-                              G_STRUCT_OFFSET (GsmClientClass, manage_request),
-                              _boolean_handled_accumulator,
-                              NULL,
-                              gsm_marshal_BOOLEAN__POINTER,
-                              G_TYPE_BOOLEAN,
-                              1, G_TYPE_POINTER);
-        signals[LOGOUT_REQUEST] =
-                g_signal_new ("logout-request",
-                              G_OBJECT_CLASS_TYPE (object_class),
-                              G_SIGNAL_RUN_LAST,
-                              G_STRUCT_OFFSET (GsmClientClass, logout_request),
-                              NULL,
-                              NULL,
-                              g_cclosure_marshal_VOID__BOOLEAN,
-                              G_TYPE_NONE,
-                              1, G_TYPE_BOOLEAN);
-
-        signals[SAVED_STATE] =
-                g_signal_new ("saved_state",
-                              G_OBJECT_CLASS_TYPE (object_class),
-                              G_SIGNAL_RUN_LAST,
-                              G_STRUCT_OFFSET (GsmClientClass, saved_state),
-                              NULL, NULL,
-                              g_cclosure_marshal_VOID__VOID,
-                              G_TYPE_NONE,
-                              0);
-
-        signals[REQUEST_PHASE2] =
-                g_signal_new ("request_phase2",
-                              G_OBJECT_CLASS_TYPE (object_class),
-                              G_SIGNAL_RUN_LAST,
-                              G_STRUCT_OFFSET (GsmClientClass, request_phase2),
-                              NULL, NULL,
-                              g_cclosure_marshal_VOID__VOID,
-                              G_TYPE_NONE,
-                              0);
-
-        signals[REQUEST_INTERACTION] =
-                g_signal_new ("request_interaction",
-                              G_OBJECT_CLASS_TYPE (object_class),
-                              G_SIGNAL_RUN_LAST,
-                              G_STRUCT_OFFSET (GsmClientClass, request_interaction),
-                              NULL, NULL,
-                              g_cclosure_marshal_VOID__VOID,
-                              G_TYPE_NONE,
-                              0);
-
-        signals[INTERACTION_DONE] =
-                g_signal_new ("interaction_done",
-                              G_OBJECT_CLASS_TYPE (object_class),
-                              G_SIGNAL_RUN_LAST,
-                              G_STRUCT_OFFSET (GsmClientClass, interaction_done),
-                              NULL, NULL,
-                              g_cclosure_marshal_VOID__BOOLEAN,
-                              G_TYPE_NONE,
-                              1, G_TYPE_BOOLEAN);
-
-        signals[SAVE_YOURSELF_DONE] =
-                g_signal_new ("save_yourself_done",
-                              G_OBJECT_CLASS_TYPE (object_class),
-                              G_SIGNAL_RUN_LAST,
-                              G_STRUCT_OFFSET (GsmClientClass, save_yourself_done),
-                              NULL, NULL,
-                              g_cclosure_marshal_VOID__VOID,
-                              G_TYPE_NONE,
-                              0);
-
         signals[DISCONNECTED] =
                 g_signal_new ("disconnected",
                               G_OBJECT_CLASS_TYPE (object_class),
@@ -303,6 +228,13 @@
                                                               NULL,
                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
         g_object_class_install_property (object_class,
+                                         PROP_APP_ID,
+                                         g_param_spec_string ("app-id",
+                                                              "app-id",
+                                                              "app-id",
+                                                              NULL,
+                                                              G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+        g_object_class_install_property (object_class,
                                          PROP_STATUS,
                                          g_param_spec_int ("status",
                                                            "status",
@@ -332,20 +264,12 @@
         return client->priv->client_id;
 }
 
-char *
-gsm_client_get_restart_command (GsmClient *client)
-{
-        g_return_val_if_fail (GSM_IS_CLIENT (client), NULL);
-
-        return GSM_CLIENT_GET_CLASS (client)->get_restart_command (client);
-}
-
-char *
-gsm_client_get_discard_command (GsmClient *client)
+const char *
+gsm_client_get_app_id (GsmClient *client)
 {
         g_return_val_if_fail (GSM_IS_CLIENT (client), NULL);
 
-        return GSM_CLIENT_GET_CLASS (client)->get_discard_command (client);
+        return client->priv->app_id;
 }
 
 gboolean
@@ -357,88 +281,30 @@
 }
 
 void
-gsm_client_save_state (GsmClient *client)
-{
-        g_return_if_fail (GSM_IS_CLIENT (client));
-}
-
-void
-gsm_client_restart (GsmClient *client, GError **error)
-{
-        g_return_if_fail (GSM_IS_CLIENT (client));
-
-        GSM_CLIENT_GET_CLASS (client)->restart (client, error);
-}
-
-void
-gsm_client_save_yourself (GsmClient *client,
-                          gboolean   save_state)
+gsm_client_notify_session_over (GsmClient *client)
 {
         g_return_if_fail (GSM_IS_CLIENT (client));
 
-        GSM_CLIENT_GET_CLASS (client)->save_yourself (client, save_state);
+        GSM_CLIENT_GET_CLASS (client)->notify_session_over (client);
 }
 
-void
-gsm_client_save_yourself_phase2 (GsmClient *client)
-{
-        g_return_if_fail (GSM_IS_CLIENT (client));
-
-        GSM_CLIENT_GET_CLASS (client)->save_yourself_phase2 (client);
-}
 
-void
-gsm_client_interact (GsmClient *client)
-{
-        g_return_if_fail (GSM_IS_CLIENT (client));
-
-        GSM_CLIENT_GET_CLASS (client)->interact (client);
-}
-
-void
-gsm_client_shutdown_cancelled (GsmClient *client)
-{
-        g_return_if_fail (GSM_IS_CLIENT (client));
-
-        GSM_CLIENT_GET_CLASS (client)->shutdown_cancelled (client);
-}
-
-void
-gsm_client_stop (GsmClient *client)
-{
-        g_return_if_fail (GSM_IS_CLIENT (client));
-
-        GSM_CLIENT_GET_CLASS (client)->stop (client);
-}
-
-void
-gsm_client_saved_state (GsmClient *client)
-{
-        g_signal_emit (client, signals[SAVED_STATE], 0);
-}
-
-void
-gsm_client_request_phase2 (GsmClient *client)
+gboolean
+gsm_client_restart (GsmClient *client,
+                    GError   **error)
 {
-        g_signal_emit (client, signals[REQUEST_PHASE2], 0);
-}
+        g_return_val_if_fail (GSM_IS_CLIENT (client), FALSE);
 
-void
-gsm_client_request_interaction (GsmClient *client)
-{
-        g_signal_emit (client, signals[REQUEST_INTERACTION], 0);
+        return GSM_CLIENT_GET_CLASS (client)->restart (client, error);
 }
 
-void
-gsm_client_interaction_done (GsmClient *client, gboolean cancel_shutdown)
+gboolean
+gsm_client_stop (GsmClient *client,
+                 GError   **error)
 {
-        g_signal_emit (client, signals[INTERACTION_DONE], 0, cancel_shutdown);
-}
+        g_return_val_if_fail (GSM_IS_CLIENT (client), FALSE);
 
-void
-gsm_client_save_yourself_done (GsmClient *client)
-{
-        g_signal_emit (client, signals[SAVE_YOURSELF_DONE], 0);
+        return GSM_CLIENT_GET_CLASS (client)->stop (client, error);
 }
 
 void
@@ -446,23 +312,3 @@
 {
         g_signal_emit (client, signals[DISCONNECTED], 0);
 }
-
-
-gboolean
-gsm_client_manage_request (GsmClient *client,
-                           char     **client_idp)
-{
-        gboolean res;
-
-        res = FALSE;
-        g_signal_emit (client, signals[MANAGE_REQUEST], 0, client_idp, &res);
-
-        return res;
-}
-
-void
-gsm_client_logout_request (GsmClient *client,
-                           gboolean   prompt)
-{
-        g_signal_emit (client, signals[LOGOUT_REQUEST], 0, prompt);
-}

Modified: branches/dbus_based/gnome-session/gsm-client.h
==============================================================================
--- branches/dbus_based/gnome-session/gsm-client.h	(original)
+++ branches/dbus_based/gnome-session/gsm-client.h	Tue Jun 17 23:03:09 2008
@@ -56,85 +56,39 @@
         GObjectClass parent_class;
 
         /* signals */
-        gboolean (*manage_request)   (GsmClient *client,
-                                      char     **client_id);
-        gboolean (*logout_request)   (GsmClient *client,
-                                      gboolean   prompt);
-
-
-        void (*saved_state)          (GsmClient *client);
-
-        void (*request_phase2)       (GsmClient *client);
-
-        void (*request_interaction)  (GsmClient *client);
-        void (*interaction_done)     (GsmClient *client,
-                                      gboolean   cancel_shutdown);
-
-        void (*save_yourself_done)   (GsmClient *client);
-
-        void (*disconnected)         (GsmClient *client);
+        void     (*disconnected)            (GsmClient *client);
 
         /* virtual methods */
-        void (*stop)                 (GsmClient *client);
-
-
-        char       * (*get_restart_command) (GsmClient *client);
-        char       * (*get_discard_command) (GsmClient *client);
+        void         (*notify_session_over) (GsmClient *client);
+        gboolean     (*stop)                (GsmClient *client,
+                                             GError   **error);
+        gboolean     (*restart)             (GsmClient *client,
+                                             GError   **error);
         gboolean     (*get_autorestart)     (GsmClient *client);
-
-        void (*restart)              (GsmClient *client,
-                                      GError   **error);
-        void (*save_yourself)        (GsmClient *client,
-                                      gboolean   save_state);
-        void (*save_yourself_phase2) (GsmClient *client);
-        void (*interact)             (GsmClient *client);
-        void (*shutdown_cancelled)   (GsmClient *client);
 };
 
 GType       gsm_client_get_type             (void) G_GNUC_CONST;
 
 const char *gsm_client_get_id               (GsmClient  *client);
 const char *gsm_client_get_client_id        (GsmClient  *client);
+const char *gsm_client_get_app_id           (GsmClient  *client);
+void        gsm_client_set_app_id           (GsmClient  *client,
+                                             const char *app_id);
 int         gsm_client_get_status           (GsmClient  *client);
 void        gsm_client_set_status           (GsmClient  *client,
                                              int         status);
 
-gboolean    gsm_client_manage               (GsmClient  *client,
-                                             const char *client_id);
-void        gsm_client_stop                 (GsmClient  *client);
-
+void        gsm_client_notify_session_over  (GsmClient  *client);
 
-
-char       *gsm_client_get_restart_command  (GsmClient  *client);
-char       *gsm_client_get_discard_command  (GsmClient  *client);
+gboolean    gsm_client_stop                 (GsmClient  *client,
+                                             GError    **error);
+gboolean    gsm_client_restart              (GsmClient  *client,
+                                             GError    **error);
 gboolean    gsm_client_get_autorestart      (GsmClient  *client);
 
-void        gsm_client_save_state           (GsmClient  *client);
 
-void        gsm_client_restart              (GsmClient  *client,
-                                             GError    **error);
-void        gsm_client_save_yourself        (GsmClient  *client,
-                                             gboolean    save_state);
-void        gsm_client_save_yourself_phase2 (GsmClient  *client);
-void        gsm_client_interact             (GsmClient  *client);
-void        gsm_client_shutdown_cancelled   (GsmClient  *client);
-
-/* protected */
-gboolean    gsm_client_manage_request       (GsmClient  *client,
-                                             char      **id);
-void        gsm_client_logout_request       (GsmClient  *client,
-                                             gboolean    prompt);
-
-
-void        gsm_client_saved_state          (GsmClient  *client);
-void        gsm_client_request_phase2       (GsmClient  *client);
-void        gsm_client_request_interaction  (GsmClient  *client);
-void        gsm_client_interaction_done     (GsmClient  *client,
-                                             gboolean    cancel_shutdown);
-void        gsm_client_save_yourself_done   (GsmClient  *client);
 void        gsm_client_disconnected         (GsmClient  *client);
 
-
 G_END_DECLS
 
 #endif /* __GSM_CLIENT_H__ */

Added: branches/dbus_based/gnome-session/gsm-dbus-client.c
==============================================================================
--- (empty file)
+++ branches/dbus_based/gnome-session/gsm-dbus-client.c	Tue Jun 17 23:03:09 2008
@@ -0,0 +1,128 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "gsm-dbus-client.h"
+#include "gsm-marshal.h"
+
+#include "gsm-manager.h"
+
+#define GSM_DBUS_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSM_TYPE_DBUS_CLIENT, GsmDBusClientPrivate))
+
+struct GsmDBusClientPrivate
+{
+        char *bus_name;
+};
+
+enum {
+        PROP_0,
+        PROP_BUS_NAME,
+};
+
+G_DEFINE_ABSTRACT_TYPE (GsmDBusClient, gsm_dbus_client, GSM_TYPE_CLIENT)
+
+static GObject *
+gsm_dbus_client_constructor (GType                  type,
+                             guint                  n_construct_properties,
+                             GObjectConstructParam *construct_properties)
+{
+        GsmDBusClient *client;
+
+        client = GSM_DBUS_CLIENT (G_OBJECT_CLASS (gsm_dbus_client_parent_class)->constructor (type,
+                                                                                              n_construct_properties,
+                                                                                              construct_properties));
+
+
+
+        return G_OBJECT (client);
+}
+
+static void
+gsm_dbus_client_init (GsmDBusClient *client)
+{
+        client->priv = GSM_DBUS_CLIENT_GET_PRIVATE (client);
+}
+
+static void
+gsm_dbus_client_set_property (GObject       *object,
+                              guint          prop_id,
+                              const GValue  *value,
+                              GParamSpec    *pspec)
+{
+        GsmDBusClient *self;
+
+        self = GSM_DBUS_CLIENT (object);
+
+        switch (prop_id) {
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                break;
+        }
+}
+
+static void
+gsm_dbus_client_get_property (GObject    *object,
+                              guint       prop_id,
+                              GValue     *value,
+                              GParamSpec *pspec)
+{
+        GsmDBusClient *self;
+
+        self = GSM_DBUS_CLIENT (object);
+
+        switch (prop_id) {
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                break;
+        }
+}
+
+static void
+gsm_dbus_client_finalize (GObject *object)
+{
+        GsmDBusClient *client = (GsmDBusClient *) object;
+
+        g_free (client->priv->bus_name);
+
+        G_OBJECT_CLASS (gsm_dbus_client_parent_class)->finalize (object);
+}
+
+static void
+gsm_dbus_client_class_init (GsmDBusClientClass *klass)
+{
+        GObjectClass   *object_class = G_OBJECT_CLASS (klass);
+        GsmClientClass *client_class = GSM_CLIENT_CLASS (klass);
+
+        object_class->finalize             = gsm_dbus_client_finalize;
+        object_class->constructor          = gsm_dbus_client_constructor;
+        object_class->get_property         = gsm_dbus_client_get_property;
+        object_class->set_property         = gsm_dbus_client_set_property;
+
+        g_type_class_add_private (klass, sizeof (GsmDBusClientPrivate));
+}

Added: branches/dbus_based/gnome-session/gsm-dbus-client.h
==============================================================================
--- (empty file)
+++ branches/dbus_based/gnome-session/gsm-dbus-client.h	Tue Jun 17 23:03:09 2008
@@ -0,0 +1,56 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifndef __GSM_DBUS_CLIENT_H__
+#define __GSM_DBUS_CLIENT_H__
+
+#include "gsm-client.h"
+
+G_BEGIN_DECLS
+
+#define GSM_TYPE_DBUS_CLIENT            (gsm_dbus_client_get_type ())
+#define GSM_DBUS_CLIENT(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSM_TYPE_DBUS_CLIENT, GsmDBusClient))
+#define GSM_DBUS_CLIENT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GSM_TYPE_DBUS_CLIENT, GsmDBusClientClass))
+#define GSM_IS_DBUS_CLIENT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSM_TYPE_DBUS_CLIENT))
+#define GSM_IS_DBUS_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSM_TYPE_DBUS_CLIENT))
+#define GSM_DBUS_CLIENT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GSM_TYPE_DBUS_CLIENT, GsmDBusClientClass))
+
+typedef struct _GsmDBusClient        GsmDBusClient;
+typedef struct _GsmDBusClientClass   GsmDBusClientClass;
+
+typedef struct GsmDBusClientPrivate  GsmDBusClientPrivate;
+
+struct _GsmDBusClient
+{
+        GsmClient             parent;
+        GsmDBusClientPrivate *priv;
+};
+
+struct _GsmDBusClientClass
+{
+        GsmClientClass parent_class;
+
+};
+
+GType          gsm_dbus_client_get_type           (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __GSM_DBUS_CLIENT_H__ */

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	Tue Jun 17 23:03:09 2008
@@ -34,7 +34,6 @@
 #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>
 
@@ -44,8 +43,12 @@
 #include "gsm-manager.h"
 #include "gsm-manager-glue.h"
 
+#include "gsm-xsmp-client.h"
+#include "gsm-method-client.h"
+
 #include "gsm-autostart-app.h"
 #include "gsm-resumed-app.h"
+
 #include "util.h"
 #include "gdm.h"
 #include "gsm-logout-dialog.h"
@@ -96,6 +99,7 @@
         PHASE_CHANGED,
         SESSION_RUNNING,
         SESSION_OVER,
+        SESSION_OVER_NOTICE,
         CLIENT_ADDED,
         CLIENT_REMOVED,
         LAST_SIGNAL
@@ -122,6 +126,30 @@
         return ret;
 }
 
+#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
+
+GType
+gsm_manager_error_get_type (void)
+{
+        static GType etype = 0;
+
+        if (etype == 0) {
+                static const GEnumValue values[] = {
+                        ENUM_ENTRY (GSM_MANAGER_ERROR_GENERAL, "GeneralError"),
+                        ENUM_ENTRY (GSM_MANAGER_ERROR_NOT_IN_INITIALIZATION, "NotInInitialization"),
+                        ENUM_ENTRY (GSM_MANAGER_ERROR_NOT_IN_RUNNING, "NotInRunning"),
+                        ENUM_ENTRY (GSM_MANAGER_ERROR_ALREADY_REGISTERED, "AlreadyRegistered"),
+                        { 0, 0, 0 }
+                };
+
+                g_assert (GSM_MANAGER_NUM_ERRORS == G_N_ELEMENTS (values) - 1);
+
+                etype = g_enum_register_static ("GsmManagerError", values);
+        }
+
+        return etype;
+}
+
 static gboolean
 _find_by_client_id (const char *id,
                     GsmClient  *client,
@@ -149,29 +177,34 @@
                                         (char *)gsm_app_get_client_id (app));
 
         if (condition) {
-                GError *error = NULL;
-
                 if (!gsm_app_is_running (app) && client == NULL) {
-                        gsm_app_start (app, &error);
-                }
-
-                if (error != NULL) {
-                        g_warning ("Not able to launch autostart app from its condition: %s",
-                                   error->message);
+                        GError  *error;
+                        gboolean res;
 
-                        g_error_free (error);
+                        error = NULL;
+                        res = gsm_app_start (app, &error);
+                        if (error != NULL) {
+                                g_warning ("Not able to start app from its condition: %s",
+                                           error->message);
+                                g_error_free (error);
+                        }
                 }
         } else {
+                GError  *error;
+                gboolean res;
+
                 /* Kill client in case condition if false and make sure it won't
                  * be automatically restarted by adding the client to
                  * condition_clients */
                 manager->priv->condition_clients = g_slist_prepend (manager->priv->condition_clients, client);
 
-                /* FIXME: this should probably do gsm_app_stop
-                 */
-
-                gsm_client_stop (client);
-                gsm_app_stop (app, NULL);
+                error = NULL;
+                res = gsm_client_stop (client, &error);
+                if (error != NULL) {
+                        g_warning ("Not able to stop app from its condition: %s",
+                                   error->message);
+                        g_error_free (error);
+                }
         }
 }
 
@@ -222,7 +255,7 @@
 
         for (a = manager->priv->pending_apps; a; a = a->next) {
                 g_warning ("Application '%s' failed to register before timeout",
-                           gsm_app_get_basename (a->data));
+                           gsm_app_get_id (a->data));
                 g_signal_handlers_disconnect_by_func (a->data, app_registered, manager);
                 /* FIXME: what if the app was filling in a required slot? */
         }
@@ -272,7 +305,7 @@
         if (!res) {
                 if (error != NULL) {
                         g_warning ("Could not launch application '%s': %s",
-                                   gsm_app_get_basename (app),
+                                   gsm_app_get_id (app),
                                    error->message);
                         g_error_free (error);
                         error = NULL;
@@ -496,14 +529,59 @@
         }
 }
 
+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 GsmApp *
+find_app_for_app_id (GsmManager *manager,
+                     const char *app_id)
+{
+        GsmApp *app;
+        app = g_hash_table_lookup (manager->priv->apps_by_id, app_id);
+        return app;
+}
+
 static gboolean
-on_manage_request (GsmClient  *client,
-                   char      **id,
-                   GsmManager *manager)
+on_xsmp_client_register_request (GsmXSMPClient *client,
+                                 char         **id,
+                                 GsmManager    *manager)
 {
         gboolean handled;
         char    *new_id;
-        GSList  *a;
+        GsmApp  *app;
 
         handled = TRUE;
         new_id = NULL;
@@ -552,28 +630,10 @@
                 goto out;
         }
 
-        /* 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 (new_id, gsm_app_get_client_id (app)) == 0) {
-                                gsm_app_registered (app);
-                                goto out;
-                        }
-                }
-        } else {
-                GsmApp *app;
-
-                app = g_hash_table_find (manager->priv->apps_by_id,
-                                         (GHRFunc)_app_has_client_id,
-                                         new_id);
-                if (app != NULL) {
-                        gsm_app_registered (app);
-                        goto out;
-                }
+        app = find_app_for_client_id (manager, new_id);
+        if (app != NULL) {
+                gsm_app_registered (app);
+                goto out;
         }
 
         /* app not found */
@@ -598,11 +658,15 @@
 
         client = gsm_client_store_lookup (store, id);
 
-        g_signal_connect (client,
-                          "manage-request",
-                          G_CALLBACK (on_manage_request),
-                          manager);
-        /* FIXME: disconnect signal */
+        /* a bit hacky */
+        if (GSM_IS_XSMP_CLIENT (client)) {
+                g_signal_connect (client,
+                                  "register-request",
+                                  G_CALLBACK (on_xsmp_client_register_request),
+                                  manager);
+        }
+
+        /* FIXME: disconnect signal handler */
 }
 
 static void
@@ -1022,6 +1086,16 @@
                               G_TYPE_NONE,
                               0);
 
+        signals [SESSION_OVER_NOTICE] =
+                g_signal_new ("session-over-notice",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GsmManagerClass, session_over_notice),
+                              NULL, NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE,
+                              0);
+
         signals [CLIENT_ADDED] =
                 g_signal_new ("client-added",
                               G_TYPE_FROM_CLASS (object_class),
@@ -1061,6 +1135,7 @@
         g_type_class_add_private (klass, sizeof (GsmManagerPrivate));
 
         dbus_g_object_type_install_info (GSM_TYPE_MANAGER, &dbus_glib_gsm_manager_object_info);
+        dbus_g_error_domain_register (GSM_MANAGER_ERROR, NULL, GSM_MANAGER_TYPE_ERROR);
 }
 
 static void
@@ -1209,7 +1284,7 @@
                   GsmClient  *client,
                   GsmManager *manager)
 {
-        gsm_client_save_yourself (client, FALSE);
+        gsm_client_notify_session_over (client);
         return FALSE;
 }
 
@@ -1450,3 +1525,224 @@
 
         return TRUE;
 }
+
+/* adapted from PolicyKit */
+static gboolean
+get_caller_info (GsmManager  *manager,
+                 const char  *sender,
+                 uid_t       *calling_uid,
+                 pid_t       *calling_pid)
+{
+        gboolean res;
+        gboolean ret;
+        GError  *error = NULL;
+
+        ret = FALSE;
+
+        if (sender == NULL) {
+                goto out;
+        }
+
+        res = dbus_g_proxy_call (manager->priv->bus_proxy,
+                                 "GetConnectionUnixUser",
+                                 &error,
+                                 G_TYPE_STRING, sender,
+                                 G_TYPE_INVALID,
+                                 G_TYPE_UINT, calling_uid,
+                                 G_TYPE_INVALID);
+        if (! res) {
+                g_debug ("GetConnectionUnixUser() failed: %s", error->message);
+                g_error_free (error);
+                goto out;
+        }
+
+        res = dbus_g_proxy_call (manager->priv->bus_proxy,
+                                 "GetConnectionUnixProcessID",
+                                 &error,
+                                 G_TYPE_STRING, sender,
+                                 G_TYPE_INVALID,
+                                 G_TYPE_UINT, calling_pid,
+                                 G_TYPE_INVALID);
+        if (! res) {
+                g_debug ("GetConnectionUnixProcessID() failed: %s", error->message);
+                g_error_free (error);
+                goto out;
+        }
+
+        ret = TRUE;
+
+        g_debug ("uid = %d", *calling_uid);
+        g_debug ("pid = %d", *calling_pid);
+
+out:
+        return ret;
+}
+
+gboolean
+gsm_manager_register_client (GsmManager            *manager,
+                             const char            *client_startup_id,
+                             const char            *app_id,
+                             DBusGMethodInvocation *context)
+{
+        char      *client_id;
+        char      *sender;
+        GsmClient *client;
+        GsmApp    *app;
+
+        g_debug ("GsmManager: RegisterClient %s", client_startup_id);
+
+        if (manager->priv->phase == GSM_MANAGER_PHASE_SHUTDOWN) {
+                GError *new_error;
+
+                g_debug ("Unable to register client: shutting down");
+
+                new_error = g_error_new (GSM_MANAGER_ERROR,
+                                         GSM_MANAGER_ERROR_NOT_IN_RUNNING,
+                                         "Unable to register client");
+                dbus_g_method_return_error (context, new_error);
+                g_error_free (new_error);
+                return FALSE;
+        }
+
+        if (client_startup_id == NULL) {
+                client_id = gsm_util_generate_client_id ();
+        } else {
+                GsmClient *client;
+
+                client = gsm_client_store_find (manager->priv->store,
+                                                (GsmClientStoreFunc)_client_has_client_id,
+                                                (char *)client_startup_id);
+                /* We can't have two clients with the same id. */
+                if (client != NULL) {
+                        GError *new_error;
+
+                        g_debug ("Unable to register client: already registered");
+
+                        new_error = g_error_new (GSM_MANAGER_ERROR,
+                                                 GSM_MANAGER_ERROR_ALREADY_REGISTERED,
+                                                 "Unable to register client");
+                        dbus_g_method_return_error (context, new_error);
+                        g_error_free (new_error);
+                        return FALSE;
+                }
+
+                client_id = g_strdup (client_startup_id);
+        }
+
+        g_debug ("GsmManager: Adding new client %s to session", client_id);
+
+        if (client_startup_id == NULL && app_id == NULL) {
+                /* just accept the client - we can't associate with an
+                   existing App */
+                g_free (client_id);
+                goto out;
+        } else if (client_startup_id != NULL) {
+                app = find_app_for_client_id (manager, client_startup_id);
+        } else if (app_id != NULL) {
+                /* try to associate this app id with a known app */
+                app = find_app_for_app_id (manager, app_id);
+        }
+
+        sender = dbus_g_method_get_sender (context);
+        client = gsm_method_client_new (client_id, sender);
+        g_free (sender);
+        g_free (client_id);
+        if (client == NULL) {
+                GError *new_error;
+
+                g_debug ("Unable to create client");
+
+                new_error = g_error_new (GSM_MANAGER_ERROR,
+                                         GSM_MANAGER_ERROR_GENERAL,
+                                         "Unable to register client");
+                dbus_g_method_return_error (context, new_error);
+                g_error_free (new_error);
+                return FALSE;
+        }
+
+        gsm_client_store_add (manager->priv->store, client);
+
+        if (app != NULL) {
+                gsm_client_set_app_id (client, gsm_app_get_id (app));
+                gsm_app_registered (app);
+        } else {
+                /* if an app id is specified store it in the client
+                   so we can save it later */
+                gsm_client_set_app_id (client, app_id);
+        }
+
+ out:
+        dbus_g_method_return (context, client_id);
+
+        return TRUE;
+}
+
+gboolean
+gsm_manager_unregister_client (GsmManager            *manager,
+                               const char            *session_client_id,
+                               DBusGMethodInvocation *context)
+{
+        g_debug ("GsmManager: UnregisterClient %s", session_client_id);
+        if (1) {
+                GError *new_error;
+
+                g_debug ("Unable to unregister client");
+
+                new_error = g_error_new (GSM_MANAGER_ERROR,
+                                         GSM_MANAGER_ERROR_GENERAL,
+                                         "Unable to unregister client");
+                dbus_g_method_return_error (context, new_error);
+                g_error_free (new_error);
+        }
+
+        return FALSE;
+}
+
+gboolean
+gsm_manager_inhibit (GsmManager            *manager,
+                     guint                  toplevel_xid,
+                     const char            *application,
+                     const char            *reason,
+                     DBusGMethodInvocation *context)
+{
+        g_debug ("GsmManager: Inhibit xid=%u application=%s reason=%s",
+                 toplevel_xid,
+                 application,
+                 reason);
+
+        if (1) {
+                GError *new_error;
+
+                g_debug ("Unable to inhibit");
+
+                new_error = g_error_new (GSM_MANAGER_ERROR,
+                                         GSM_MANAGER_ERROR_GENERAL,
+                                         "Unable to inhibit");
+                dbus_g_method_return_error (context, new_error);
+                g_error_free (new_error);
+        }
+
+        return FALSE;
+}
+
+gboolean
+gsm_manager_uninhibit (GsmManager            *manager,
+                       const char            *inhibit_cookie,
+                       DBusGMethodInvocation *context)
+{
+        g_debug ("GsmManager: Uninhibit %s", inhibit_cookie);
+
+        if (1) {
+                GError *new_error;
+
+                g_debug ("Unable to uninhibit");
+
+                new_error = g_error_new (GSM_MANAGER_ERROR,
+                                         GSM_MANAGER_ERROR_GENERAL,
+                                         "Unable to uninhibit");
+                dbus_g_method_return_error (context, new_error);
+                g_error_free (new_error);
+        }
+
+        return FALSE;
+}

Modified: branches/dbus_based/gnome-session/gsm-manager.h
==============================================================================
--- branches/dbus_based/gnome-session/gsm-manager.h	(original)
+++ branches/dbus_based/gnome-session/gsm-manager.h	Tue Jun 17 23:03:09 2008
@@ -23,6 +23,7 @@
 #define __GSM_MANAGER_H
 
 #include <glib-object.h>
+#include <dbus/dbus-glib.h>
 
 #include "gsm-client-store.h"
 
@@ -47,16 +48,17 @@
 {
         GObjectClass   parent_class;
 
-        void          (* session_running)  (GsmManager      *manager);
-        void          (* session_over)     (GsmManager      *manager);
-
-        void          (* phase_changed)    (GsmManager      *manager,
-                                            const char      *phase);
-
-        void          (* client_added)     (GsmManager      *manager,
-                                            const char      *id);
-        void          (* client_removed)   (GsmManager      *manager,
-                                            const char      *id);
+        void          (* session_running)     (GsmManager      *manager);
+        void          (* session_over)        (GsmManager      *manager);
+        void          (* session_over_notice) (GsmManager      *manager);
+
+        void          (* phase_changed)       (GsmManager      *manager,
+                                               const char      *phase);
+
+        void          (* client_added)        (GsmManager      *manager,
+                                               const char      *id);
+        void          (* client_removed)      (GsmManager      *manager,
+                                               const char      *id);
 } GsmManagerClass;
 
 typedef enum {
@@ -80,24 +82,24 @@
 
 typedef enum
 {
-        GSM_MANAGER_ERROR_GENERAL,
+        GSM_MANAGER_ERROR_GENERAL = 0,
         GSM_MANAGER_ERROR_NOT_IN_INITIALIZATION,
         GSM_MANAGER_ERROR_NOT_IN_RUNNING,
+        GSM_MANAGER_ERROR_ALREADY_REGISTERED,
+        GSM_MANAGER_NUM_ERRORS
 } GsmManagerError;
 
 #define GSM_MANAGER_ERROR gsm_manager_error_quark ()
 
 typedef enum {
-        GSM_MANAGER_LOGOUT_TYPE_LOGOUT,
-        GSM_MANAGER_LOGOUT_TYPE_SHUTDOWN
-} GsmManagerLogoutType;
-
-typedef enum {
         GSM_MANAGER_LOGOUT_MODE_NORMAL,
         GSM_MANAGER_LOGOUT_MODE_NO_CONFIRMATION,
         GSM_MANAGER_LOGOUT_MODE_FORCE
 } GsmManagerLogoutMode;
 
+GType               gsm_manager_error_get_type       (void);
+#define GSM_MANAGER_TYPE_ERROR (gsm_manager_error_get_type ())
+
 GQuark              gsm_manager_error_quark          (void);
 GType               gsm_manager_get_type             (void);
 
@@ -109,6 +111,29 @@
 
 /* exported methods */
 
+gboolean            gsm_manager_register_client      (GsmManager            *manager,
+                                                      const char            *client_startup_id,
+                                                      const char            *program_id,
+                                                      DBusGMethodInvocation *context);
+gboolean            gsm_manager_unregister_client    (GsmManager            *manager,
+                                                      const char            *session_client_id,
+                                                      DBusGMethodInvocation *context);
+
+gboolean            gsm_manager_inhibit              (GsmManager            *manager,
+                                                      guint                  toplevel_xid,
+                                                      const char            *application,
+                                                      const char            *reason,
+                                                      DBusGMethodInvocation *context);
+gboolean            gsm_manager_uninhibit            (GsmManager            *manager,
+                                                      const char            *inhibit_cookie,
+                                                      DBusGMethodInvocation *context);
+
+gboolean            gsm_manager_shutdown             (GsmManager     *manager,
+                                                      GError        **error);
+gboolean            gsm_manager_logout               (GsmManager     *manager,
+                                                      int             logout_mode,
+                                                      GError        **error);
+
 gboolean            gsm_manager_setenv               (GsmManager     *manager,
                                                       const char     *variable,
                                                       const char     *value,
@@ -117,11 +142,6 @@
                                                       const char     *message,
                                                       gboolean        fatal,
                                                       GError        **error);
-gboolean            gsm_manager_shutdown             (GsmManager     *manager,
-                                                      GError        **error);
-gboolean            gsm_manager_logout               (GsmManager     *manager,
-                                                      int             logout_mode,
-                                                      GError        **error);
 gboolean            gsm_manager_set_name             (GsmManager     *manager,
                                                       const char     *session_name,
                                                       GError        **error);

Modified: branches/dbus_based/gnome-session/gsm-manager.xml
==============================================================================
--- branches/dbus_based/gnome-session/gsm-manager.xml	(original)
+++ branches/dbus_based/gnome-session/gsm-manager.xml	Tue Jun 17 23:03:09 2008
@@ -16,6 +16,26 @@
 
     <!-- Running phase interfaces -->
 
+    <method name="RegisterClient">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="client_startup_id" direction="in"/>
+      <arg type="s" name="app_id" direction="in"/>
+      <arg type="s" name="session_client_id" direction="out"/>
+    </method>
+    <method name="UnregisterClient">
+      <arg type="s" name="session_client_id" direction="in"/>
+    </method>
+
+    <method name="Inhibit">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="app_id" direction="in"/>
+      <arg type="s" name="reason" direction="in"/>
+      <arg type="u" name="inhibit_cookie" direction="out"/>
+    </method>
+    <method name="Uninhibit">
+      <arg type="u" name="inhibit_cookie" direction="in"/>
+    </method>
+
     <method name="Shutdown">
     </method>
 
@@ -32,6 +52,9 @@
     <signal name="SessionRunning">
     </signal>
 
+    <signal name="SessionOverNotice">
+    </signal>
+
     <signal name="SessionOver">
     </signal>
 

Added: branches/dbus_based/gnome-session/gsm-method-client.c
==============================================================================
--- (empty file)
+++ branches/dbus_based/gnome-session/gsm-method-client.c	Tue Jun 17 23:03:09 2008
@@ -0,0 +1,153 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "gsm-method-client.h"
+#include "gsm-marshal.h"
+
+#include "gsm-manager.h"
+
+#define GSM_METHOD_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSM_TYPE_METHOD_CLIENT, GsmMethodClientPrivate))
+
+struct GsmMethodClientPrivate
+{
+};
+
+enum {
+        PROP_0,
+};
+
+G_DEFINE_TYPE (GsmMethodClient, gsm_method_client, GSM_TYPE_DBUS_CLIENT)
+
+static GObject *
+gsm_method_client_constructor (GType                  type,
+                               guint                  n_construct_properties,
+                               GObjectConstructParam *construct_properties)
+{
+        GsmMethodClient *client;
+
+        client = GSM_METHOD_CLIENT (G_OBJECT_CLASS (gsm_method_client_parent_class)->constructor (type,
+                                                                                              n_construct_properties,
+                                                                                              construct_properties));
+
+
+
+        return G_OBJECT (client);
+}
+
+static void
+gsm_method_client_init (GsmMethodClient *client)
+{
+        client->priv = GSM_METHOD_CLIENT_GET_PRIVATE (client);
+}
+
+static void
+gsm_method_client_set_property (GObject       *object,
+                                guint          prop_id,
+                                const GValue  *value,
+                                GParamSpec    *pspec)
+{
+        GsmMethodClient *self;
+
+        self = GSM_METHOD_CLIENT (object);
+
+        switch (prop_id) {
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                break;
+        }
+}
+
+static void
+gsm_method_client_get_property (GObject    *object,
+                                guint       prop_id,
+                                GValue     *value,
+                                GParamSpec *pspec)
+{
+        GsmMethodClient *self;
+
+        self = GSM_METHOD_CLIENT (object);
+
+        switch (prop_id) {
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                break;
+        }
+}
+
+static void
+gsm_method_client_finalize (GObject *object)
+{
+        G_OBJECT_CLASS (gsm_method_client_parent_class)->finalize (object);
+}
+
+static gboolean
+gsm_method_client_stop (GsmClient *client,
+                        GError   **error)
+{
+        return FALSE;
+}
+
+static gboolean
+gsm_method_client_restart (GsmClient *client,
+                           GError   **error)
+{
+        return FALSE;
+}
+
+static void
+gsm_method_client_class_init (GsmMethodClientClass *klass)
+{
+        GObjectClass   *object_class = G_OBJECT_CLASS (klass);
+        GsmClientClass *client_class = GSM_CLIENT_CLASS (klass);
+
+        object_class->finalize             = gsm_method_client_finalize;
+        object_class->constructor          = gsm_method_client_constructor;
+        object_class->get_property         = gsm_method_client_get_property;
+        object_class->set_property         = gsm_method_client_set_property;
+
+        client_class->stop                 = gsm_method_client_stop;
+        client_class->restart              = gsm_method_client_restart;
+
+        g_type_class_add_private (klass, sizeof (GsmMethodClientPrivate));
+}
+
+GsmClient *
+gsm_method_client_new (const char *client_id,
+                       const char *bus_name)
+{
+        GsmMethodClient *method;
+
+        method = g_object_new (GSM_TYPE_METHOD_CLIENT,
+                               "client-id", client_id,
+                               "bus-name", bus_name,
+                               NULL);
+
+        return GSM_CLIENT (method);
+}

Added: branches/dbus_based/gnome-session/gsm-method-client.h
==============================================================================
--- (empty file)
+++ branches/dbus_based/gnome-session/gsm-method-client.h	Tue Jun 17 23:03:09 2008
@@ -0,0 +1,59 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifndef __GSM_METHOD_CLIENT_H__
+#define __GSM_METHOD_CLIENT_H__
+
+#include "gsm-dbus-client.h"
+
+G_BEGIN_DECLS
+
+#define GSM_TYPE_METHOD_CLIENT            (gsm_method_client_get_type ())
+#define GSM_METHOD_CLIENT(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSM_TYPE_METHOD_CLIENT, GsmMethodClient))
+#define GSM_METHOD_CLIENT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GSM_TYPE_METHOD_CLIENT, GsmMethodClientClass))
+#define GSM_IS_METHOD_CLIENT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSM_TYPE_METHOD_CLIENT))
+#define GSM_IS_METHOD_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSM_TYPE_METHOD_CLIENT))
+#define GSM_METHOD_CLIENT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GSM_TYPE_METHOD_CLIENT, GsmMethodClientClass))
+
+typedef struct _GsmMethodClient        GsmMethodClient;
+typedef struct _GsmMethodClientClass   GsmMethodClientClass;
+
+typedef struct GsmMethodClientPrivate  GsmMethodClientPrivate;
+
+struct _GsmMethodClient
+{
+        GsmDBusClient           parent;
+        GsmMethodClientPrivate *priv;
+};
+
+struct _GsmMethodClientClass
+{
+        GsmDBusClientClass parent_class;
+
+};
+
+GType          gsm_method_client_get_type           (void) G_GNUC_CONST;
+
+GsmClient     *gsm_method_client_new                (const char *client_id,
+                                                     const char *bus_name);
+
+G_END_DECLS
+
+#endif /* __GSM_METHOD_CLIENT_H__ */

Modified: branches/dbus_based/gnome-session/gsm-resumed-app.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-resumed-app.c	(original)
+++ branches/dbus_based/gnome-session/gsm-resumed-app.c	Tue Jun 17 23:03:09 2008
@@ -88,7 +88,7 @@
 }
 
 static const char *
-get_basename (GsmApp *app)
+gsm_resumed_app_get_id (GsmApp *app)
 {
         return GSM_RESUMED_APP (app)->priv->program;
 }
@@ -98,7 +98,7 @@
 {
         GsmAppClass *app_class = GSM_APP_CLASS (klass);
 
-        app_class->get_basename = get_basename;
+        app_class->get_id = gsm_resumed_app_get_id;
         app_class->start = launch;
 
         g_type_class_add_private (klass, sizeof (GsmResumedAppPrivate));

Added: branches/dbus_based/gnome-session/gsm-service-client.c
==============================================================================
--- (empty file)
+++ branches/dbus_based/gnome-session/gsm-service-client.c	Tue Jun 17 23:03:09 2008
@@ -0,0 +1,151 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "gsm-service-client.h"
+#include "gsm-marshal.h"
+
+#include "gsm-manager.h"
+
+#define GSM_SERVICE_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSM_TYPE_SERVICE_CLIENT, GsmServiceClientPrivate))
+
+struct GsmServiceClientPrivate
+{
+};
+
+enum {
+        PROP_0,
+};
+
+G_DEFINE_TYPE (GsmServiceClient, gsm_service_client, GSM_TYPE_DBUS_CLIENT)
+
+static GObject *
+gsm_service_client_constructor (GType                  type,
+                               guint                  n_construct_properties,
+                               GObjectConstructParam *construct_properties)
+{
+        GsmServiceClient *client;
+
+        client = GSM_SERVICE_CLIENT (G_OBJECT_CLASS (gsm_service_client_parent_class)->constructor (type,
+                                                                                              n_construct_properties,
+                                                                                              construct_properties));
+
+
+
+        return G_OBJECT (client);
+}
+
+static void
+gsm_service_client_init (GsmServiceClient *client)
+{
+        client->priv = GSM_SERVICE_CLIENT_GET_PRIVATE (client);
+}
+
+static void
+gsm_service_client_set_property (GObject       *object,
+                                guint          prop_id,
+                                const GValue  *value,
+                                GParamSpec    *pspec)
+{
+        GsmServiceClient *self;
+
+        self = GSM_SERVICE_CLIENT (object);
+
+        switch (prop_id) {
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                break;
+        }
+}
+
+static void
+gsm_service_client_get_property (GObject    *object,
+                                guint       prop_id,
+                                GValue     *value,
+                                GParamSpec *pspec)
+{
+        GsmServiceClient *self;
+
+        self = GSM_SERVICE_CLIENT (object);
+
+        switch (prop_id) {
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                break;
+        }
+}
+
+static void
+gsm_service_client_finalize (GObject *object)
+{
+        G_OBJECT_CLASS (gsm_service_client_parent_class)->finalize (object);
+}
+
+static gboolean
+gsm_service_client_stop (GsmClient *client,
+                         GError   **error)
+{
+        return FALSE;
+}
+
+static gboolean
+gsm_service_client_restart (GsmClient *client,
+                            GError   **error)
+{
+        return FALSE;
+}
+
+static void
+gsm_service_client_class_init (GsmServiceClientClass *klass)
+{
+        GObjectClass   *object_class = G_OBJECT_CLASS (klass);
+        GsmClientClass *client_class = GSM_CLIENT_CLASS (klass);
+
+        object_class->finalize             = gsm_service_client_finalize;
+        object_class->constructor          = gsm_service_client_constructor;
+        object_class->get_property         = gsm_service_client_get_property;
+        object_class->set_property         = gsm_service_client_set_property;
+
+        client_class->stop                 = gsm_service_client_stop;
+        client_class->restart              = gsm_service_client_restart;
+
+        g_type_class_add_private (klass, sizeof (GsmServiceClientPrivate));
+}
+
+GsmClient *
+gsm_service_client_new (const char *bus_name)
+{
+        GsmServiceClient *service;
+
+        service = g_object_new (GSM_TYPE_SERVICE_CLIENT,
+                                "bus-name", bus_name,
+                                NULL);
+
+        return GSM_CLIENT (service);
+}

Added: branches/dbus_based/gnome-session/gsm-service-client.h
==============================================================================
--- (empty file)
+++ branches/dbus_based/gnome-session/gsm-service-client.h	Tue Jun 17 23:03:09 2008
@@ -0,0 +1,58 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifndef __GSM_SERVICE_CLIENT_H__
+#define __GSM_SERVICE_CLIENT_H__
+
+#include "gsm-dbus-client.h"
+
+G_BEGIN_DECLS
+
+#define GSM_TYPE_SERVICE_CLIENT            (gsm_service_client_get_type ())
+#define GSM_SERVICE_CLIENT(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSM_TYPE_SERVICE_CLIENT, GsmServiceClient))
+#define GSM_SERVICE_CLIENT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GSM_TYPE_SERVICE_CLIENT, GsmServiceClientClass))
+#define GSM_IS_SERVICE_CLIENT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSM_TYPE_SERVICE_CLIENT))
+#define GSM_IS_SERVICE_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSM_TYPE_SERVICE_CLIENT))
+#define GSM_SERVICE_CLIENT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GSM_TYPE_SERVICE_CLIENT, GsmServiceClientClass))
+
+typedef struct _GsmServiceClient        GsmServiceClient;
+typedef struct _GsmServiceClientClass   GsmServiceClientClass;
+
+typedef struct GsmServiceClientPrivate  GsmServiceClientPrivate;
+
+struct _GsmServiceClient
+{
+        GsmDBusClient            parent;
+        GsmServiceClientPrivate *priv;
+};
+
+struct _GsmServiceClientClass
+{
+        GsmDBusClientClass parent_class;
+
+};
+
+GType          gsm_service_client_get_type           (void) G_GNUC_CONST;
+
+GsmClient     *gsm_service_client_new                (const char *bus_name);
+
+G_END_DECLS
+
+#endif /* __GSM_SERVICE_CLIENT_H__ */

Modified: branches/dbus_based/gnome-session/gsm-xsmp-client.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-xsmp-client.c	(original)
+++ branches/dbus_based/gnome-session/gsm-xsmp-client.c	Tue Jun 17 23:03:09 2008
@@ -29,6 +29,7 @@
 #include <unistd.h>
 
 #include "gsm-xsmp-client.h"
+#include "gsm-marshal.h"
 
 #include "gsm-manager.h"
 
@@ -57,6 +58,20 @@
         PROP_ICE_CONNECTION,
 };
 
+enum {
+        REGISTER_REQUEST,
+        LOGOUT_REQUEST,
+        SAVED_STATE,
+        REQUEST_PHASE2,
+        REQUEST_INTERACTION,
+        INTERACTION_DONE,
+        SAVE_YOURSELF_DONE,
+        DISCONNECTED,
+        LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
 G_DEFINE_TYPE (GsmXSMPClient, gsm_xsmp_client, GSM_TYPE_CLIENT)
 
 static gboolean
@@ -403,17 +418,20 @@
         return ((unsigned char *)prop->vals[0].value)[0] == SmRestartImmediately;
 }
 
-static void
+static gboolean
 xsmp_restart (GsmClient *client,
               GError   **error)
 {
-        char *restart_cmd;
+        char    *restart_cmd;
+        gboolean res;
 
-        restart_cmd = gsm_client_get_restart_command (client);
+        restart_cmd = xsmp_get_restart_command (client);
 
-        g_spawn_command_line_async (restart_cmd, error);
+        res = g_spawn_command_line_async (restart_cmd, error);
 
         g_free (restart_cmd);
+
+        return res;
 }
 
 static void
@@ -500,14 +518,17 @@
         SmsShutdownCancelled (xsmp->priv->conn);
 }
 
-static void
-xsmp_stop (GsmClient *client)
+static gboolean
+xsmp_stop (GsmClient *client,
+           GError   **error)
 {
         GsmXSMPClient *xsmp = (GsmXSMPClient *) client;
 
         g_debug ("GsmXSMPClient: xsmp_die ('%s')", xsmp->priv->description);
 
         SmsDie (xsmp->priv->conn);
+
+        return TRUE;
 }
 
 static void
@@ -583,6 +604,22 @@
         G_OBJECT_CLASS (gsm_xsmp_client_parent_class)->finalize (object);
 }
 
+static gboolean
+_boolean_handled_accumulator (GSignalInvocationHint *ihint,
+                              GValue                *return_accu,
+                              const GValue          *handler_return,
+                              gpointer               dummy)
+{
+        gboolean    continue_emission;
+        gboolean    signal_handled;
+
+        signal_handled = g_value_get_boolean (handler_return);
+        g_value_set_boolean (return_accu, signal_handled);
+        continue_emission = !signal_handled;
+
+        return continue_emission;
+}
+
 static void
 gsm_xsmp_client_class_init (GsmXSMPClientClass *klass)
 {
@@ -594,16 +631,80 @@
         object_class->get_property         = gsm_xsmp_client_get_property;
         object_class->set_property         = gsm_xsmp_client_set_property;
 
-        client_class->get_restart_command  = xsmp_get_restart_command;
-        client_class->get_discard_command  = xsmp_get_discard_command;
         client_class->get_autorestart      = xsmp_get_autorestart;
-
         client_class->stop                 = xsmp_stop;
         client_class->restart              = xsmp_restart;
-        client_class->save_yourself        = xsmp_save_yourself;
-        client_class->save_yourself_phase2 = xsmp_save_yourself_phase2;
-        client_class->interact             = xsmp_interact;
-        client_class->shutdown_cancelled   = xsmp_shutdown_cancelled;
+
+        signals[REGISTER_REQUEST] =
+                g_signal_new ("register-request",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GsmXSMPClientClass, register_request),
+                              _boolean_handled_accumulator,
+                              NULL,
+                              gsm_marshal_BOOLEAN__POINTER,
+                              G_TYPE_BOOLEAN,
+                              1, G_TYPE_POINTER);
+        signals[LOGOUT_REQUEST] =
+                g_signal_new ("logout-request",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GsmXSMPClientClass, logout_request),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__BOOLEAN,
+                              G_TYPE_NONE,
+                              1, G_TYPE_BOOLEAN);
+
+        signals[SAVED_STATE] =
+                g_signal_new ("saved_state",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GsmXSMPClientClass, saved_state),
+                              NULL, NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE,
+                              0);
+
+        signals[REQUEST_PHASE2] =
+                g_signal_new ("request_phase2",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GsmXSMPClientClass, request_phase2),
+                              NULL, NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE,
+                              0);
+
+        signals[REQUEST_INTERACTION] =
+                g_signal_new ("request_interaction",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GsmXSMPClientClass, request_interaction),
+                              NULL, NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE,
+                              0);
+
+        signals[INTERACTION_DONE] =
+                g_signal_new ("interaction_done",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GsmXSMPClientClass, interaction_done),
+                              NULL, NULL,
+                              g_cclosure_marshal_VOID__BOOLEAN,
+                              G_TYPE_NONE,
+                              1, G_TYPE_BOOLEAN);
+
+        signals[SAVE_YOURSELF_DONE] =
+                g_signal_new ("save_yourself_done",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GsmXSMPClientClass, save_yourself_done),
+                              NULL, NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE,
+                              0);
 
         g_object_class_install_property (object_class,
                                          PROP_ICE_CONNECTION,
@@ -647,7 +748,9 @@
          * 3. id is unknown - this is an error
          */
         id = g_strdup (previous_id);
-        handled = gsm_client_manage_request (GSM_CLIENT (client), &id);
+
+        handled = FALSE;
+        g_signal_emit (client, signals[REGISTER_REQUEST], 0, &id, &handled);
         if (! handled) {
                 g_debug ("GsmXSMPClient:  RegisterClient not handled!");
                 g_free (id);
@@ -738,8 +841,7 @@
 
         if (shutdown && global) {
                 g_debug ("GsmXSMPClient:   initiating shutdown");
-                gsm_client_logout_request (GSM_CLIENT (client),
-                                           !fast);
+                g_signal_emit (client, signals[LOGOUT_REQUEST], 0, !fast);
         } else if (!shutdown && !global) {
                 g_debug ("GsmXSMPClient:   initiating checkpoint");
                 do_save_yourself (client, SmSaveLocal);
@@ -763,7 +865,7 @@
                  */
                 SmsSaveYourselfPhase2 (client->priv->conn);
         } else {
-                gsm_client_request_phase2 (GSM_CLIENT (client));
+                g_signal_emit (client, signals[REQUEST_PHASE2], 0);
         }
 }
 
@@ -778,7 +880,7 @@
                  client->priv->description,
                  dialog_type == SmInteractStyleAny ? "Any" : "Errors");
 
-        gsm_client_request_interaction (GSM_CLIENT (client));
+        g_signal_emit (client, signals[REQUEST_INTERACTION], 0);
 }
 
 static void
@@ -792,7 +894,7 @@
                  client->priv->description,
                  cancel_shutdown ? "True" : "False");
 
-        gsm_client_interaction_done (GSM_CLIENT (client), cancel_shutdown);
+        g_signal_emit (client, signals[INTERACTION_DONE], 0, cancel_shutdown);
 }
 
 static void
@@ -809,10 +911,10 @@
         if (client->priv->current_save_yourself == SmSaveLocal) {
                 client->priv->current_save_yourself = -1;
                 SmsSaveComplete (client->priv->conn);
-                gsm_client_saved_state (GSM_CLIENT (client));
+                g_signal_emit (client, signals[SAVED_STATE], 0);
         } else {
                 client->priv->current_save_yourself = -1;
-                gsm_client_save_yourself_done (GSM_CLIENT (client));
+                g_signal_emit (client, signals[SAVE_YOURSELF_DONE], 0);
         }
 
         if (client->priv->next_save_yourself) {
@@ -898,3 +1000,21 @@
         callbacks_ret->get_properties.callback = get_properties_callback;
         callbacks_ret->get_properties.manager_data = client;
 }
+
+gboolean
+gsm_xsmp_client_register_request (GsmXSMPClient *client,
+                                  char     **client_idp)
+{
+        gboolean res;
+
+        res = FALSE;
+        g_signal_emit (client, signals[REGISTER_REQUEST], 0, client_idp, &res);
+
+        return res;
+}
+
+void
+gsm_xsmp_client_save_state (GsmXSMPClient *client)
+{
+        g_return_if_fail (GSM_IS_XSMP_CLIENT (client));
+}

Modified: branches/dbus_based/gnome-session/gsm-xsmp-client.h
==============================================================================
--- branches/dbus_based/gnome-session/gsm-xsmp-client.h	(original)
+++ branches/dbus_based/gnome-session/gsm-xsmp-client.h	Tue Jun 17 23:03:09 2008
@@ -18,8 +18,8 @@
  * 02111-1307, USA.
  */
 
-#ifndef __GSM_CLIENT_XSMP_H__
-#define __GSM_CLIENT_XSMP_H__
+#ifndef __GSM_XSMP_CLIENT_H__
+#define __GSM_XSMP_CLIENT_H__
 
 #include "gsm-client.h"
 
@@ -48,16 +48,41 @@
 struct _GsmXSMPClientClass
 {
         GsmClientClass parent_class;
+
+        /* signals */
+        gboolean (*register_request)     (GsmXSMPClient  *client,
+                                          char          **client_id);
+        gboolean (*logout_request)       (GsmXSMPClient  *client,
+                                          gboolean        prompt);
+
+
+        void     (*saved_state)          (GsmXSMPClient  *client);
+
+        void     (*request_phase2)       (GsmXSMPClient  *client);
+
+        void     (*request_interaction)  (GsmXSMPClient  *client);
+        void     (*interaction_done)     (GsmXSMPClient  *client,
+                                          gboolean        cancel_shutdown);
+
+        void     (*save_yourself_done)   (GsmXSMPClient  *client);
+
 };
 
-GType          gsm_xsmp_client_get_type           (void) G_GNUC_CONST;
+GType       gsm_xsmp_client_get_type             (void) G_GNUC_CONST;
 
-GsmClient     *gsm_xsmp_client_new                (IceConn ice_conn);
+GsmClient  *gsm_xsmp_client_new                  (IceConn         ice_conn);
 
-void           gsm_xsmp_client_connect            (GsmXSMPClient *client,
-                                                   SmsConn        conn,
-                                                   unsigned long *mask_ret,
-                                                   SmsCallbacks  *callbacks_ret);
+void        gsm_xsmp_client_connect              (GsmXSMPClient  *client,
+                                                  SmsConn         conn,
+                                                  unsigned long  *mask_ret,
+                                                  SmsCallbacks   *callbacks_ret);
+
+void        gsm_xsmp_client_save_state           (GsmXSMPClient  *client);
+void        gsm_xsmp_client_save_yourself        (GsmXSMPClient  *client,
+                                                  gboolean        save_state);
+void        gsm_xsmp_client_save_yourself_phase2 (GsmXSMPClient  *client);
+void        gsm_xsmp_client_interact             (GsmXSMPClient  *client);
+void        gsm_xsmp_client_shutdown_cancelled   (GsmXSMPClient  *client);
 
 G_END_DECLS
 



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