[gnome-software: 6/24] packagekit: Make listing apps providing a specific file asynchronous




commit 989ed25f38e5eca48279b635471d9523d1ddf8e4
Author: Philip Withnall <pwithnall endlessos org>
Date:   Wed Apr 6 23:57:03 2022 +0100

    packagekit: Make listing apps providing a specific file asynchronous
    
    Signed-off-by: Philip Withnall <pwithnall endlessos org>
    
    Helps: #1472

 plugins/packagekit/gs-plugin-packagekit.c | 91 +++++++++++++++++++++++--------
 1 file changed, 69 insertions(+), 22 deletions(-)
---
diff --git a/plugins/packagekit/gs-plugin-packagekit.c b/plugins/packagekit/gs-plugin-packagekit.c
index 6121f0c50..2d2a37d8c 100644
--- a/plugins/packagekit/gs-plugin-packagekit.c
+++ b/plugins/packagekit/gs-plugin-packagekit.c
@@ -875,37 +875,82 @@ gs_plugin_add_updates (GsPlugin *plugin,
        return gs_plugin_packagekit_add_updates (plugin, list, cancellable, error);
 }
 
-gboolean
-gs_plugin_add_search_files (GsPlugin *plugin,
-                            gchar **search,
-                            GsAppList *list,
-                            GCancellable *cancellable,
-                            GError **error)
+static void list_apps_cb (GObject      *source_object,
+                          GAsyncResult *result,
+                          gpointer      user_data);
+
+static void
+gs_plugin_packagekit_list_apps_async (GsPlugin              *plugin,
+                                      GsAppQuery            *query,
+                                      GsPluginListAppsFlags  flags,
+                                      GCancellable          *cancellable,
+                                      GAsyncReadyCallback    callback,
+                                      gpointer               user_data)
 {
        GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
        PkBitfield filter;
        g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
-       g_autoptr(PkResults) results = NULL;
+       g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name (plugin));
+       gboolean interactive = (flags & GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE);
+       g_autoptr(GTask) task = NULL;
+
+       task = g_task_new (plugin, cancellable, callback, user_data);
+       g_task_set_source_tag (task, gs_plugin_packagekit_list_apps_async);
+       g_task_set_task_data (task, g_object_ref (helper), g_object_unref);
 
-       /* do sync call */
        gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING);
-       filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST,
-                                        PK_FILTER_ENUM_ARCH,
-                                        -1);
+       gs_packagekit_helper_set_progress_app (helper, app_dl);
+
        g_mutex_lock (&self->task_mutex);
-       gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_SEARCH_FILES, 
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
-       results = pk_client_search_files (PK_CLIENT (self->task),
-                                         filter,
-                                         search,
-                                         cancellable,
-                                         gs_packagekit_helper_cb, helper,
-                                         error);
+       pk_client_set_background (PK_CLIENT (self->task), !interactive);
+       gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_UNKNOWN, interactive);
+
+       if (gs_app_query_get_provides_files (query) != NULL) {
+               filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST,
+                                                PK_FILTER_ENUM_ARCH,
+                                                -1);
+               pk_client_search_files_async (PK_CLIENT (self->task),
+                                             filter,
+                                             (gchar **) gs_app_query_get_provides_files (query),
+                                             cancellable,
+                                             gs_packagekit_helper_cb, helper,
+                                             list_apps_cb, g_steal_pointer (&task));
+       } else {
+               g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+                                        "Unsupported query");
+       }
+
        g_mutex_unlock (&self->task_mutex);
-       if (!gs_plugin_packagekit_results_valid (results, error))
-               return FALSE;
+}
 
-       /* add results */
-       return gs_plugin_packagekit_add_results (plugin, list, results, error);
+static void
+list_apps_cb (GObject      *source_object,
+              GAsyncResult *result,
+              gpointer      user_data)
+{
+       PkClient *client = PK_CLIENT (source_object);
+       g_autoptr(GTask) task = g_steal_pointer (&user_data);
+       GsPlugin *plugin = g_task_get_source_object (task);
+       g_autoptr(PkResults) results = NULL;
+       g_autoptr(GsAppList) list = gs_app_list_new ();
+       g_autoptr(GError) local_error = NULL;
+
+       results = pk_client_generic_finish (client, result, &local_error);
+
+       if (!gs_plugin_packagekit_results_valid (results, &local_error) ||
+           !gs_plugin_packagekit_add_results (plugin, list, results, &local_error)) {
+               g_task_return_error (task, g_steal_pointer (&local_error));
+       } else {
+               g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref);
+       }
+}
+
+static GsAppList *
+gs_plugin_packagekit_list_apps_finish (GsPlugin      *plugin,
+                                       GAsyncResult  *result,
+                                       GError       **error)
+{
+       return g_task_propagate_pointer (G_TASK (result), error);
 }
 
 gboolean
@@ -4011,6 +4056,8 @@ gs_plugin_packagekit_class_init (GsPluginPackagekitClass *klass)
        plugin_class->refine_finish = gs_plugin_packagekit_refine_finish;
        plugin_class->refresh_metadata_async = gs_plugin_packagekit_refresh_metadata_async;
        plugin_class->refresh_metadata_finish = gs_plugin_packagekit_refresh_metadata_finish;
+       plugin_class->list_apps_async = gs_plugin_packagekit_list_apps_async;
+       plugin_class->list_apps_finish = gs_plugin_packagekit_list_apps_finish;
 }
 
 GType


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]