diff options
author | Kalev Lember <klember@redhat.com> | 2019-12-13 13:04:08 +0100 |
---|---|---|
committer | Kalev Lember <klember@redhat.com> | 2019-12-13 13:07:11 +0100 |
commit | f825a3d09218e319a504bc119f1ec981887467c1 (patch) | |
tree | d5e30b7778c149e9a8956b4af89d990c3ea6301c | |
parent | 2bb33887ea575263b06cb7154f48ed8438c4b8cc (diff) | |
download | gnome-session-kalev/reboot-to-update-dbus-api.tar.gz |
session manager: Add new RebootToUpdate DBus APIkalev/reboot-to-update-dbus-api
This adds a new API that callers (gnome-software) can use to control how
updates are presented in the shutdown dialog.
-rw-r--r-- | gnome-session/gsm-manager.c | 73 | ||||
-rw-r--r-- | gnome-session/gsm-shell.c | 12 | ||||
-rw-r--r-- | gnome-session/gsm-shell.h | 4 | ||||
-rw-r--r-- | 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), @@ -2516,6 +2524,21 @@ request_reboot (GsmManager *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) { g_debug ("GsmManager: requesting shutdown"); @@ -2609,6 +2632,42 @@ gsm_manager_reboot (GsmExportedManager *skeleton, } 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, GsmManager *manager) @@ -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> |