gnome-session r4758 - in branches/dbus_based: . gnome-session
- From: mccann svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-session r4758 - in branches/dbus_based: . gnome-session
- Date: Tue, 17 Jun 2008 23:03:09 +0000 (UTC)
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]