From 5fbe6727c495cfd454c488ffd76af2dbadd71af0 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 12 Oct 2009 19:15:48 -0400 Subject: [PATCH 05/21] Add a "Stopping" property The Stopping property is readonly and set to TRUE during a restart or stop operation. This is intended for e.g. gdm to not permit new logins while a restart is underway. --- src/ck-manager.c | 95 +++++++++++++++++++++++++++- src/org.freedesktop.ConsoleKit.Manager.xml | 10 +++ 2 files changed, 102 insertions(+), 3 deletions(-) diff --git a/src/ck-manager.c b/src/ck-manager.c index fdc290a..a8bfca4 100644 --- a/src/ck-manager.c +++ b/src/ck-manager.c @@ -85,6 +85,7 @@ struct CkManagerPrivate GTimeVal system_idle_since_hint; gboolean restart; + gboolean stopping; }; enum { @@ -96,9 +97,23 @@ enum { static guint signals [LAST_SIGNAL] = { 0, }; -static void ck_manager_class_init (CkManagerClass *klass); -static void ck_manager_init (CkManager *manager); -static void ck_manager_finalize (GObject *object); +enum { + PROP_0, + PROP_STOPPING +}; + +static void ck_manager_class_init (CkManagerClass *klass); +static void ck_manager_init (CkManager *manager); +static void ck_manager_finalize (GObject *object); +static void ck_manager_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void ck_manager_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + static gpointer manager_object = NULL; @@ -1054,6 +1069,22 @@ out: #endif static void +ck_manager_set_stopping (CkManager *manager, + gboolean stopping) +{ + if (manager->priv->stopping != stopping) { + manager->priv->stopping = stopping; + g_object_notify (G_OBJECT (manager), "stopping"); + } +} + +static void +cleanup_after_stop (CkManager *manager) +{ + ck_manager_set_stopping (manager, FALSE); +} + +static void do_stop (CkManager *manager, DBusGMethodInvocation *context) { @@ -1081,6 +1112,8 @@ do_stop (CkManager *manager, g_error_free (new_error); g_error_free (error); + + cleanup_after_stop (manager); } else { dbus_g_method_return (context); } @@ -1092,6 +1125,21 @@ restart_or_stop (CkManager *manager, { const char *action; + if (manager->priv->stopping) { + GError *error; + + error = g_error_new (CK_MANAGER_ERROR, + CK_MANAGER_ERROR_GENERAL, + "Stop in progress"); + dbus_g_method_return_error (context, error); + g_error_free (error); + g_debug ("Stop in progress"); + + return FALSE; + } + + ck_manager_set_stopping (manager, TRUE); + if (get_system_num_users (manager) > 1) { if (manager->priv->restart) { action = "org.freedesktop.consolekit.system.restart-multiple-users"; @@ -2236,6 +2284,8 @@ ck_manager_class_init (CkManagerClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->set_property = ck_manager_set_property; + object_class->get_property = ck_manager_get_property; object_class->finalize = ck_manager_finalize; signals [SEAT_ADDED] = @@ -2269,6 +2319,14 @@ ck_manager_class_init (CkManagerClass *klass) G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + g_object_class_install_property (object_class, + PROP_STOPPING, + g_param_spec_boolean ("stopping", + NULL, + NULL, + FALSE, + G_PARAM_READABLE)); + dbus_g_object_type_install_info (CK_TYPE_MANAGER, &dbus_glib_ck_manager_object_info); dbus_g_error_domain_register (CK_MANAGER_ERROR, NULL, CK_MANAGER_TYPE_ERROR); @@ -2477,6 +2535,37 @@ ck_manager_init (CkManager *manager) } static void +ck_manager_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (prop_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +ck_manager_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + CkManager *manager = CK_MANAGER (object); + + switch (prop_id) { + case PROP_STOPPING: + g_value_set_boolean (value, manager->priv->stopping); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void ck_manager_finalize (GObject *object) { CkManager *manager; diff --git a/src/org.freedesktop.ConsoleKit.Manager.xml b/src/org.freedesktop.ConsoleKit.Manager.xml index 1375174..7bb475d 100644 --- a/src/org.freedesktop.ConsoleKit.Manager.xml +++ b/src/org.freedesktop.ConsoleKit.Manager.xml @@ -354,6 +354,16 @@ + + + + + Set to TRUE when a restart of stop operation is underway. + + + + + -- 1.6.5.rc2