From 02354c3a339b7f8d6661731f224e7ccf1fc34ddc Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Mon, 13 Sep 2021 19:57:12 +0200 Subject: [PATCH] pk-offline: Add flags to D-Bus invoking methods That's currently to be able to set whether the method should be interactive or not. The old functions call the methods as non-interactive. Closes https://github.com/PackageKit/PackageKit/issues/504 --- client/pk-console.c | 4 +- docs/api/PackageKit-sections.txt | 4 + lib/packagekit-glib2/pk-offline.c | 104 ++++++++++++++++++++++++-- lib/packagekit-glib2/pk-offline.h | 31 ++++++++ lib/packagekit-glib2/pk-test-daemon.c | 4 +- 5 files changed, 138 insertions(+), 9 deletions(-) diff --git a/client/pk-console.c b/client/pk-console.c index 3d027e601..4fd620fec 100644 --- a/client/pk-console.c +++ b/client/pk-console.c @@ -2283,14 +2283,14 @@ main (int argc, char *argv[]) } else if (strcmp (mode, "offline-trigger") == 0) { run_mainloop = FALSE; - ret = pk_offline_trigger (PK_OFFLINE_ACTION_REBOOT, NULL, &error); + ret = pk_offline_trigger_with_flags (PK_OFFLINE_ACTION_REBOOT, PK_OFFLINE_FLAGS_INTERACTIVE, NULL, &error); if (!ret) ctx->retval = error->code; } else if (strcmp (mode, "offline-cancel") == 0) { run_mainloop = FALSE; - ret = pk_offline_cancel (NULL, &error); + ret = pk_offline_cancel_with_flags (PK_OFFLINE_FLAGS_INTERACTIVE, NULL, &error); if (!ret) ctx->retval = error->code; diff --git a/docs/api/PackageKit-sections.txt b/docs/api/PackageKit-sections.txt index ead052f92..2020bd65d 100644 --- a/docs/api/PackageKit-sections.txt +++ b/docs/api/PackageKit-sections.txt @@ -525,9 +525,13 @@ pk_offline_get_action_monitor pk_offline_get_results pk_offline_get_results_mtime pk_offline_cancel +pk_offline_cancel_with_flags pk_offline_clear_results +pk_offline_clear_results_with_flags pk_offline_trigger +pk_offline_trigger_with_flags pk_offline_trigger_upgrade +pk_offline_trigger_upgrade_with_flags
diff --git a/lib/packagekit-glib2/pk-offline.c b/lib/packagekit-glib2/pk-offline.c index 2e3870580..9030be293 100644 --- a/lib/packagekit-glib2/pk-offline.c +++ b/lib/packagekit-glib2/pk-offline.c @@ -95,6 +95,14 @@ pk_offline_action_from_string (const gchar *action) return PK_OFFLINE_ACTION_UNKNOWN; } +static GDBusCallFlags +pk_offline_flags_to_gdbus_call_flags (PkOfflineFlags flags) +{ + if ((flags & PK_OFFLINE_FLAGS_INTERACTIVE) != 0) + return G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION; + return G_DBUS_CALL_FLAGS_NONE; +} + /** * pk_offline_cancel: * @cancellable: A #GCancellable or %NULL @@ -102,6 +110,8 @@ pk_offline_action_from_string (const gchar *action) * * Cancels the offline operation that has been scheduled. If there is no * scheduled offline operation then this method returns with success. + * The function always allows user interaction. To change the behavior, + * use pk_offline_cancel_with_flags(). * * Return value: %TRUE for success, else %FALSE and @error set * @@ -109,6 +119,25 @@ pk_offline_action_from_string (const gchar *action) **/ gboolean pk_offline_cancel (GCancellable *cancellable, GError **error) +{ + return pk_offline_cancel_with_flags (PK_OFFLINE_FLAGS_INTERACTIVE, cancellable, error); +} + +/** + * pk_offline_cancel_with_flags: + * @flags: bit-or of #PkOfflineFlags + * @cancellable: A #GCancellable or %NULL + * @error: A #GError or %NULL + * + * Cancels the offline operation that has been scheduled. If there is no + * scheduled offline operation then this method returns with success. + * + * Return value: %TRUE for success, else %FALSE and @error set + * + * Since: 1.2.5 + **/ +gboolean +pk_offline_cancel_with_flags (PkOfflineFlags flags, GCancellable *cancellable, GError **error) { g_autoptr(GDBusConnection) connection = NULL; g_autoptr(GVariant) res = NULL; @@ -125,7 +154,7 @@ pk_offline_cancel (GCancellable *cancellable, GError **error) "Cancel", NULL, NULL, - G_DBUS_CALL_FLAGS_NONE, + pk_offline_flags_to_gdbus_call_flags (flags), -1, cancellable, error); @@ -139,8 +168,10 @@ pk_offline_cancel (GCancellable *cancellable, GError **error) * @cancellable: A #GCancellable or %NULL * @error: A #GError or %NULL * - * Crears the last offline operation report, which may be success or failure. + * Clears the last offline operation report, which may be success or failure. * If the report does not exist then this method returns success. + * The function always allows user interaction. To change the behavior, + * use pk_offline_clear_results_with_flags(). * * Return value: %TRUE for success, else %FALSE and @error set * @@ -148,6 +179,25 @@ pk_offline_cancel (GCancellable *cancellable, GError **error) **/ gboolean pk_offline_clear_results (GCancellable *cancellable, GError **error) +{ + return pk_offline_clear_results_with_flags (PK_OFFLINE_FLAGS_INTERACTIVE, cancellable, error); +} + +/** + * pk_offline_clear_results_with_flags: + * @flags: bit-or of #PkOfflineFlags + * @cancellable: A #GCancellable or %NULL + * @error: A #GError or %NULL + * + * Clears the last offline operation report, which may be success or failure. + * If the report does not exist then this method returns success. + * + * Return value: %TRUE for success, else %FALSE and @error set + * + * Since: 1.2.5 + **/ +gboolean +pk_offline_clear_results_with_flags (PkOfflineFlags flags, GCancellable *cancellable, GError **error) { g_autoptr(GDBusConnection) connection = NULL; g_autoptr(GVariant) res = NULL; @@ -164,7 +214,7 @@ pk_offline_clear_results (GCancellable *cancellable, GError **error) "ClearResults", NULL, NULL, - G_DBUS_CALL_FLAGS_NONE, + pk_offline_flags_to_gdbus_call_flags (flags), -1, cancellable, error); @@ -181,6 +231,8 @@ pk_offline_clear_results (GCancellable *cancellable, GError **error) * * Triggers the offline update so that the next reboot will perform the * pending transaction. + * The function always allows user interaction. To change the behavior, + * use pk_offline_trigger_with_flags(). * * Return value: %TRUE for success, else %FALSE and @error set * @@ -188,6 +240,26 @@ pk_offline_clear_results (GCancellable *cancellable, GError **error) **/ gboolean pk_offline_trigger (PkOfflineAction action, GCancellable *cancellable, GError **error) +{ + return pk_offline_trigger_with_flags (action, PK_OFFLINE_FLAGS_INTERACTIVE, cancellable, error); +} + +/** + * pk_offline_trigger_with_flags: + * @action: a #PkOfflineAction, e.g. %PK_OFFLINE_ACTION_REBOOT + * @flags: bit-or of #PkOfflineFlags + * @cancellable: A #GCancellable or %NULL + * @error: A #GError or %NULL + * + * Triggers the offline update so that the next reboot will perform the + * pending transaction. + * + * Return value: %TRUE for success, else %FALSE and @error set + * + * Since: 1.2.5 + **/ +gboolean +pk_offline_trigger_with_flags (PkOfflineAction action, PkOfflineFlags flags, GCancellable *cancellable, GError **error) { const gchar *tmp; g_autoptr(GDBusConnection) connection = NULL; @@ -206,7 +278,7 @@ pk_offline_trigger (PkOfflineAction action, GCancellable *cancellable, GError ** "Trigger", g_variant_new ("(s)", tmp), NULL, - G_DBUS_CALL_FLAGS_NONE, + pk_offline_flags_to_gdbus_call_flags (flags), -1, cancellable, error); @@ -223,6 +295,8 @@ pk_offline_trigger (PkOfflineAction action, GCancellable *cancellable, GError ** * * Triggers the offline system upgrade so that the next reboot will perform the * pending transaction. + * The function always allows user interaction. To change the behavior, + * use pk_offline_trigger_upgrade_with_flags(). * * Return value: %TRUE for success, else %FALSE and @error set * @@ -230,6 +304,26 @@ pk_offline_trigger (PkOfflineAction action, GCancellable *cancellable, GError ** **/ gboolean pk_offline_trigger_upgrade (PkOfflineAction action, GCancellable *cancellable, GError **error) +{ + return pk_offline_trigger_upgrade_with_flags (action, PK_OFFLINE_FLAGS_INTERACTIVE, cancellable, error); +} + +/** + * pk_offline_trigger_upgrade_with_flags: + * @action: a #PkOfflineAction, e.g. %PK_OFFLINE_ACTION_REBOOT + * @flags: bit-or of #PkOfflineFlags + * @cancellable: A #GCancellable or %NULL + * @error: A #GError or %NULL + * + * Triggers the offline system upgrade so that the next reboot will perform the + * pending transaction. + * + * Return value: %TRUE for success, else %FALSE and @error set + * + * Since: 1.2.5 + **/ +gboolean +pk_offline_trigger_upgrade_with_flags (PkOfflineAction action, PkOfflineFlags flags, GCancellable *cancellable, GError **error) { const gchar *tmp; g_autoptr(GDBusConnection) connection = NULL; @@ -248,7 +342,7 @@ pk_offline_trigger_upgrade (PkOfflineAction action, GCancellable *cancellable, G "TriggerUpgrade", g_variant_new ("(s)", tmp), NULL, - G_DBUS_CALL_FLAGS_NONE, + pk_offline_flags_to_gdbus_call_flags (flags), -1, cancellable, error); diff --git a/lib/packagekit-glib2/pk-offline.h b/lib/packagekit-glib2/pk-offline.h index e85179823..943e9a13b 100644 --- a/lib/packagekit-glib2/pk-offline.h +++ b/lib/packagekit-glib2/pk-offline.h @@ -71,6 +71,21 @@ typedef enum PK_OFFLINE_ERROR_LAST } PkOfflineError; +/** + * PkOfflineFlags: + * @PK_OFFLINE_FLAGS_NONE: No specific flag + * @PK_OFFLINE_FLAGS_INTERACTIVE: Run the action in an interactive mode, allowing polkit authentication dialogs + * + * Flags to be used for the method invocations. + * + * Since: 1.2.5 + */ +typedef enum +{ + PK_OFFLINE_FLAGS_NONE = 0, + PK_OFFLINE_FLAGS_INTERACTIVE = 1 << 0 +} PkOfflineFlags; + GQuark pk_offline_error_quark (void); const gchar *pk_offline_action_to_string (PkOfflineAction action); PkOfflineAction pk_offline_action_from_string (const gchar *action); @@ -92,14 +107,30 @@ PkResults *pk_offline_get_results (GError **error); guint64 pk_offline_get_results_mtime (GError **error); gboolean pk_offline_cancel (GCancellable *cancellable, GError **error); +gboolean pk_offline_cancel_with_flags (PkOfflineFlags flags, + GCancellable *cancellable, + GError **error); gboolean pk_offline_clear_results (GCancellable *cancellable, GError **error); +gboolean pk_offline_clear_results_with_flags + (PkOfflineFlags flags, + GCancellable *cancellable, + GError **error); gboolean pk_offline_trigger (PkOfflineAction action, GCancellable *cancellable, GError **error); +gboolean pk_offline_trigger_with_flags (PkOfflineAction action, + PkOfflineFlags flags, + GCancellable *cancellable, + GError **error); gboolean pk_offline_trigger_upgrade (PkOfflineAction action, GCancellable *cancellable, GError **error); +gboolean pk_offline_trigger_upgrade_with_flags + (PkOfflineAction action, + PkOfflineFlags flags, + GCancellable *cancellable, + GError **error); G_END_DECLS diff --git a/lib/packagekit-glib2/pk-test-daemon.c b/lib/packagekit-glib2/pk-test-daemon.c index efa762077..b2917b07d 100644 --- a/lib/packagekit-glib2/pk-test-daemon.c +++ b/lib/packagekit-glib2/pk-test-daemon.c @@ -154,7 +154,7 @@ pk_test_offline_func (void) g_assert_cmpstr (data, ==, "powertop;1.8-1.fc8;i386;fedora"); /* trigger */ - ret = pk_offline_trigger (PK_OFFLINE_ACTION_REBOOT, NULL, &error); + ret = pk_offline_trigger_with_flags (PK_OFFLINE_ACTION_REBOOT, PK_OFFLINE_FLAGS_INTERACTIVE, NULL, &error); g_assert_no_error (error); g_assert (ret); g_assert (g_file_test (PK_OFFLINE_PREPARED_FILENAME, G_FILE_TEST_EXISTS)); @@ -163,7 +163,7 @@ pk_test_offline_func (void) g_assert (!g_file_test (PK_OFFLINE_RESULTS_FILENAME, G_FILE_TEST_EXISTS)); /* cancel the trigger */ - ret = pk_offline_cancel (NULL, &error); + ret = pk_offline_cancel_with_flags (PK_OFFLINE_FLAGS_INTERACTIVE, NULL, &error); g_assert_no_error (error); g_assert (ret); g_assert (g_file_test (PK_OFFLINE_PREPARED_FILENAME, G_FILE_TEST_EXISTS));