From af2a6159b38ee8b912a60de4898516ff1d7a3b10 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 4 Feb 2010 23:10:56 -0500 Subject: [PATCH 05/22] 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 f444f1e..4031c26 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; @@ -1057,6 +1072,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) { @@ -1084,6 +1115,8 @@ do_stop (CkManager *manager, g_error_free (new_error); g_error_free (error); + + cleanup_after_stop (manager); } else { dbus_g_method_return (context); } @@ -1095,6 +1128,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"; @@ -2250,6 +2298,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] = @@ -2283,6 +2333,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); @@ -2495,6 +2553,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.6