[gnome-session/kalev/reboot-to-update-dbus-api] session manager: Add new RebootToUpdate DBus API
- From: Kalev Lember <klember src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-session/kalev/reboot-to-update-dbus-api] session manager: Add new RebootToUpdate DBus API
- Date: Fri, 13 Dec 2019 12:09:17 +0000 (UTC)
commit f825a3d09218e319a504bc119f1ec981887467c1
Author: Kalev Lember <klember redhat com>
Date: Fri Dec 13 13:04:08 2019 +0100
session manager: Add new RebootToUpdate DBus API
This adds a new API that callers (gnome-software) can use to control how
updates are presented in the shutdown dialog.
gnome-session/gsm-manager.c | 73 ++++++++++++++++++++++++++++--
gnome-session/gsm-shell.c | 12 ++++-
gnome-session/gsm-shell.h | 4 +-
gnome-session/org.gnome.SessionManager.xml | 13 ++++++
4 files changed, 94 insertions(+), 8 deletions(-)
---
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c
index 6839a02d..ebada887 100644
--- a/gnome-session/gsm-manager.c
+++ b/gnome-session/gsm-manager.c
@@ -118,6 +118,7 @@ typedef enum
GSM_MANAGER_LOGOUT_LOGOUT,
GSM_MANAGER_LOGOUT_REBOOT,
GSM_MANAGER_LOGOUT_REBOOT_INTERACT,
+ GSM_MANAGER_LOGOUT_REBOOT_TO_UPDATE,
GSM_MANAGER_LOGOUT_SHUTDOWN,
GSM_MANAGER_LOGOUT_SHUTDOWN_INTERACT,
} GsmManagerLogoutType;
@@ -171,6 +172,7 @@ struct GsmManagerPrivate
gboolean dbus_disconnected : 1;
GsmShell *shell;
+ GVariant *shell_end_session_dialog_options;
guint shell_end_session_dialog_canceled_id;
guint shell_end_session_dialog_open_failed_id;
guint shell_end_session_dialog_confirmed_logout_id;
@@ -209,7 +211,8 @@ static void _handle_client_end_session_response (GsmManager *manager,
gboolean cancel,
const char *reason);
static void show_shell_end_session_dialog (GsmManager *manager,
- GsmShellEndSessionDialogType type);
+ GsmShellEndSessionDialogType type,
+ GVariant *options);
static gpointer manager_object = NULL;
G_DEFINE_TYPE (GsmManager, gsm_manager, G_TYPE_OBJECT)
@@ -491,6 +494,7 @@ gsm_manager_quit (GsmManager *manager)
break;
case GSM_MANAGER_LOGOUT_REBOOT:
case GSM_MANAGER_LOGOUT_REBOOT_INTERACT:
+ case GSM_MANAGER_LOGOUT_REBOOT_TO_UPDATE:
gsm_system_complete_shutdown (manager->priv->system);
gsm_quit ();
break;
@@ -1164,6 +1168,9 @@ end_session_or_show_shell_dialog (GsmManager *manager)
case GSM_MANAGER_LOGOUT_REBOOT_INTERACT:
type = GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART;
break;
+ case GSM_MANAGER_LOGOUT_REBOOT_TO_UPDATE:
+ type = GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART_TO_UPDATE;
+ break;
case GSM_MANAGER_LOGOUT_SHUTDOWN:
case GSM_MANAGER_LOGOUT_SHUTDOWN_INTERACT:
type = GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN;
@@ -1182,7 +1189,7 @@ end_session_or_show_shell_dialog (GsmManager *manager)
switch (manager->priv->logout_mode) {
case GSM_MANAGER_LOGOUT_MODE_NORMAL:
if (logout_inhibited || logout_prompt) {
- show_shell_end_session_dialog (manager, type);
+ show_shell_end_session_dialog (manager, type,
manager->priv->shell_end_session_dialog_options);
} else {
end_phase (manager);
}
@@ -1190,7 +1197,7 @@ end_session_or_show_shell_dialog (GsmManager *manager)
case GSM_MANAGER_LOGOUT_MODE_NO_CONFIRMATION:
if (logout_inhibited) {
- show_shell_end_session_dialog (manager, type);
+ show_shell_end_session_dialog (manager, type,
manager->priv->shell_end_session_dialog_options);
} else {
end_phase (manager);
}
@@ -2369,6 +2376,7 @@ gsm_manager_dispose (GObject *object)
g_clear_object (&manager->priv->lockdown_settings);
g_clear_object (&manager->priv->system);
g_clear_object (&manager->priv->shell);
+ g_clear_pointer (&manager->priv->shell_end_session_dialog_options, g_variant_unref);
if (manager->priv->skeleton != NULL) {
g_dbus_interface_skeleton_unexport_from_connection (G_DBUS_INTERFACE_SKELETON
(manager->priv->skeleton),
@@ -2515,6 +2523,21 @@ request_reboot (GsmManager *manager)
end_phase (manager);
}
+static void
+request_reboot_to_update (GsmManager *manager, GVariant *options)
+{
+ g_debug ("GsmManager: requesting reboot to update");
+
+ /* See the comment in request_reboot() for some more details about
+ * what work needs to be done here. */
+ manager->priv->logout_type = GSM_MANAGER_LOGOUT_REBOOT_TO_UPDATE;
+
+ g_clear_pointer (&manager->priv->shell_end_session_dialog_options, g_variant_unref);
+ manager->priv->shell_end_session_dialog_options = g_variant_ref (options);
+
+ end_phase (manager);
+}
+
static void
request_shutdown (GsmManager *manager)
{
@@ -2608,6 +2631,42 @@ gsm_manager_reboot (GsmExportedManager *skeleton,
return TRUE;
}
+static gboolean
+gsm_manager_reboot_to_update (GsmExportedManager *skeleton,
+ GDBusMethodInvocation *invocation,
+ GVariant *options,
+ GsmManager *manager)
+{
+ GTask *task;
+
+ g_debug ("GsmManager: RebootToUpdate called");
+
+ if (manager->priv->phase < GSM_MANAGER_PHASE_RUNNING) {
+ g_dbus_method_invocation_return_error (invocation,
+ GSM_MANAGER_ERROR,
+ GSM_MANAGER_ERROR_NOT_IN_RUNNING,
+ "RebootToUpdate interface is only available after the
Running phase starts");
+ return TRUE;
+ }
+
+ if (_log_out_is_locked_down (manager)) {
+ g_dbus_method_invocation_return_error (invocation,
+ GSM_MANAGER_ERROR,
+ GSM_MANAGER_ERROR_LOCKED_DOWN,
+ "Logout has been locked down");
+ return TRUE;
+ }
+
+ task = g_task_new (manager, manager->priv->end_session_cancellable, (GAsyncReadyCallback)
complete_end_session_task, invocation);
+
+ manager->priv->pending_end_session_tasks = g_slist_prepend (manager->priv->pending_end_session_tasks,
+ task);
+
+ request_reboot_to_update (manager, options);
+
+ return TRUE;
+}
+
static gboolean
gsm_manager_can_shutdown (GsmExportedManager *skeleton,
GDBusMethodInvocation *invocation,
@@ -3307,6 +3366,8 @@ register_manager (GsmManager *manager)
G_CALLBACK (gsm_manager_logout_dbus), manager);
g_signal_connect (skeleton, "handle-reboot",
G_CALLBACK (gsm_manager_reboot), manager);
+ g_signal_connect (skeleton, "handle-reboot-to-update",
+ G_CALLBACK (gsm_manager_reboot_to_update), manager);
g_signal_connect (skeleton, "handle-register-client",
G_CALLBACK (gsm_manager_register_client), manager);
g_signal_connect (skeleton, "handle-set-reboot-to-firmware-setup",
@@ -3556,14 +3617,16 @@ connect_shell_dialog_signals (GsmManager *manager)
static void
show_shell_end_session_dialog (GsmManager *manager,
- GsmShellEndSessionDialogType type)
+ GsmShellEndSessionDialogType type,
+ GVariant *options)
{
if (!gsm_shell_is_running (manager->priv->shell))
return;
gsm_shell_open_end_session_dialog (manager->priv->shell,
type,
- manager->priv->inhibitors);
+ manager->priv->inhibitors,
+ options);
connect_shell_dialog_signals (manager);
}
diff --git a/gnome-session/gsm-shell.c b/gnome-session/gsm-shell.c
index 04cfa2f5..5d0a7c1d 100644
--- a/gnome-session/gsm-shell.c
+++ b/gnome-session/gsm-shell.c
@@ -51,6 +51,7 @@ struct _GsmShellPrivate
gboolean dialog_is_open;
GsmShellEndSessionDialogType end_session_dialog_type;
+ GVariant *end_session_dialog_options;
guint update_idle_id;
guint watch_id;
@@ -236,6 +237,8 @@ gsm_shell_finalize (GObject *object)
g_object_unref (shell->priv->inhibitors);
+ g_clear_pointer (&shell->priv->end_session_dialog_options, g_variant_unref);
+
if (shell->priv->watch_id != 0) {
g_bus_unwatch_name (shell->priv->watch_id);
shell->priv->watch_id = 0;
@@ -398,7 +401,8 @@ on_need_end_session_dialog_update (GsmShell *shell)
gsm_shell_open_end_session_dialog (shell,
shell->priv->end_session_dialog_type,
- shell->priv->inhibitors);
+ shell->priv->inhibitors,
+ shell->priv->end_session_dialog_options);
return FALSE;
}
@@ -415,7 +419,8 @@ queue_end_session_dialog_update (GsmShell *shell)
gboolean
gsm_shell_open_end_session_dialog (GsmShell *shell,
GsmShellEndSessionDialogType type,
- GsmStore *inhibitors)
+ GsmStore *inhibitors,
+ GVariant *options)
{
GDBusProxy *proxy;
GError *error;
@@ -488,6 +493,9 @@ gsm_shell_open_end_session_dialog (GsmShell *shell,
shell->priv->dialog_is_open = TRUE;
shell->priv->end_session_dialog_type = type;
+ g_clear_pointer (&shell->priv->end_session_dialog_options, g_variant_unref);
+ shell->priv->end_session_dialog_options = g_variant_ref (options);
+
return TRUE;
}
diff --git a/gnome-session/gsm-shell.h b/gnome-session/gsm-shell.h
index e236493a..baf34591 100644
--- a/gnome-session/gsm-shell.h
+++ b/gnome-session/gsm-shell.h
@@ -46,6 +46,7 @@ typedef enum
GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT = 0,
GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN,
GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART,
+ GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART_TO_UPDATE,
} GsmShellEndSessionDialogType;
struct _GsmShell
@@ -79,7 +80,8 @@ gboolean gsm_shell_is_running (GsmShell *shell);
gboolean gsm_shell_open_end_session_dialog (GsmShell *shell,
GsmShellEndSessionDialogType type,
- GsmStore *inhibitors);
+ GsmStore *inhibitors,
+ GVariant *options);
void gsm_shell_close_end_session_dialog (GsmShell *shell);
G_END_DECLS
diff --git a/gnome-session/org.gnome.SessionManager.xml b/gnome-session/org.gnome.SessionManager.xml
index ce4b8c07..cd811051 100644
--- a/gnome-session/org.gnome.SessionManager.xml
+++ b/gnome-session/org.gnome.SessionManager.xml
@@ -290,6 +290,19 @@
</doc:doc>
</method>
+ <method name="RebootToUpdate">
+ <arg type="a{sv}" direction="in" name="options">
+ <doc:doc>
+ <doc:summary>Allows the caller to change how updates are presented in the shutdown
dialog</doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>Request a reboot dialog for installing updates.</doc:para>
+ </doc:description>
+ </doc:doc>
+ </method>
+
<method name="CanShutdown">
<arg name="is_available" direction="out" type="b">
<doc:doc>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]