[gnome-software/1364-implement-other-apps-by-author-section-in-app-details-page: 210/215] flatpak: Implement search for developer apps
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/1364-implement-other-apps-by-author-section-in-app-details-page: 210/215] flatpak: Implement search for developer apps
- Date: Mon, 30 May 2022 09:50:39 +0000 (UTC)
commit 599d6a881ed5a637470fa62656138f695ccf13d3
Author: Milan Crha <mcrha redhat com>
Date: Fri May 6 10:39:35 2022 +0200
flatpak: Implement search for developer apps
plugins/flatpak/gs-flatpak.c | 74 +++++++++++++++++++++++++++++++++++++
plugins/flatpak/gs-flatpak.h | 6 +++
plugins/flatpak/gs-plugin-flatpak.c | 11 +++++-
3 files changed, 90 insertions(+), 1 deletion(-)
---
diff --git a/plugins/flatpak/gs-flatpak.c b/plugins/flatpak/gs-flatpak.c
index d4d066ec7..280b02b75 100644
--- a/plugins/flatpak/gs-flatpak.c
+++ b/plugins/flatpak/gs-flatpak.c
@@ -4006,6 +4006,80 @@ gs_flatpak_search (GsFlatpak *self,
return TRUE;
}
+gboolean
+gs_flatpak_search_developer_apps (GsFlatpak *self,
+ const gchar * const *values,
+ GsAppList *list,
+ gboolean interactive,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
+ g_autoptr(GRWLockReaderLocker) locker = NULL;
+ g_autoptr(GMutexLocker) app_silo_locker = NULL;
+ g_autoptr(GPtrArray) silos_to_remove = g_ptr_array_new ();
+ GHashTableIter iter;
+ gpointer key, value;
+
+ if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
+ return FALSE;
+
+ locker = g_rw_lock_reader_locker_new (&self->silo_lock);
+ if (!gs_appstream_search_developer_apps (self->plugin, self->silo, values, list_tmp,
+ cancellable, error))
+ return FALSE;
+
+ gs_flatpak_ensure_remote_title (self, interactive, cancellable);
+
+ gs_flatpak_claim_app_list (self, list_tmp, interactive);
+ gs_app_list_add_list (list, list_tmp);
+
+ /* Also search silos from installed apps which were missing from self->silo */
+ app_silo_locker = g_mutex_locker_new (&self->app_silos_mutex);
+ g_hash_table_iter_init (&iter, self->app_silos);
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ g_autoptr(XbSilo) app_silo = g_object_ref (value);
+ g_autoptr(GsAppList) app_list_tmp = gs_app_list_new ();
+ const char *app_ref = (char *)key;
+ g_autoptr(FlatpakInstalledRef) installed_ref = NULL;
+ g_auto(GStrv) split = NULL;
+ FlatpakRefKind kind;
+
+ /* Ignore any silos of apps that have since been removed.
+ * FIXME: can we use self->installed_refs here? */
+ split = g_strsplit (app_ref, "/", -1);
+ g_assert (g_strv_length (split) == 4);
+ if (g_strcmp0 (split[0], "app") == 0)
+ kind = FLATPAK_REF_KIND_APP;
+ else
+ kind = FLATPAK_REF_KIND_RUNTIME;
+ installed_ref = flatpak_installation_get_installed_ref (gs_flatpak_get_installation (self,
interactive),
+ kind,
+ split[1],
+ split[2],
+ split[3],
+ NULL, NULL);
+ if (installed_ref == NULL) {
+ g_ptr_array_add (silos_to_remove, (gpointer) app_ref);
+ continue;
+ }
+
+ if (!gs_appstream_search_developer_apps (self->plugin, app_silo, values, app_list_tmp,
+ cancellable, error))
+ return FALSE;
+
+ gs_flatpak_claim_app_list (self, app_list_tmp, interactive);
+ gs_app_list_add_list (list, app_list_tmp);
+ }
+
+ for (guint i = 0; i < silos_to_remove->len; i++) {
+ const char *silo = g_ptr_array_index (silos_to_remove, i);
+ g_hash_table_remove (self->app_silos, silo);
+ }
+
+ return TRUE;
+}
+
gboolean
gs_flatpak_add_category_apps (GsFlatpak *self,
GsCategory *category,
diff --git a/plugins/flatpak/gs-flatpak.h b/plugins/flatpak/gs-flatpak.h
index a704e3b40..c2de7fceb 100644
--- a/plugins/flatpak/gs-flatpak.h
+++ b/plugins/flatpak/gs-flatpak.h
@@ -125,6 +125,12 @@ gboolean gs_flatpak_search (GsFlatpak *self,
gboolean interactive,
GCancellable *cancellable,
GError **error);
+gboolean gs_flatpak_search_developer_apps(GsFlatpak *self,
+ const gchar * const *values,
+ GsAppList *list,
+ gboolean interactive,
+ GCancellable *cancellable,
+ GError **error);
gboolean gs_flatpak_add_categories (GsFlatpak *self,
GPtrArray *list,
gboolean interactive,
diff --git a/plugins/flatpak/gs-plugin-flatpak.c b/plugins/flatpak/gs-plugin-flatpak.c
index e255f45fa..9f4cc40a7 100644
--- a/plugins/flatpak/gs-plugin-flatpak.c
+++ b/plugins/flatpak/gs-plugin-flatpak.c
@@ -1847,6 +1847,7 @@ list_apps_thread_cb (GTask *task,
GsAppQueryTristate is_installed = GS_APP_QUERY_TRISTATE_UNSET;
guint64 age_secs = 0;
const gchar * const *deployment_featured = NULL;
+ const gchar *const *developers = NULL;
g_autoptr(GError) local_error = NULL;
assert_in_worker (self);
@@ -1858,6 +1859,7 @@ list_apps_thread_cb (GTask *task,
category = gs_app_query_get_category (data->query);
is_installed = gs_app_query_get_is_installed (data->query);
deployment_featured = gs_app_query_get_deployment_featured (data->query);
+ developers = gs_app_query_get_developers (data->query);
}
if (released_since != NULL) {
@@ -1872,7 +1874,8 @@ list_apps_thread_cb (GTask *task,
is_featured == GS_APP_QUERY_TRISTATE_UNSET &&
category == NULL &&
is_installed == GS_APP_QUERY_TRISTATE_UNSET &&
- deployment_featured == NULL) ||
+ deployment_featured == NULL &&
+ developers == NULL) ||
is_curated == GS_APP_QUERY_TRISTATE_FALSE ||
is_featured == GS_APP_QUERY_TRISTATE_FALSE ||
is_installed == GS_APP_QUERY_TRISTATE_FALSE ||
@@ -1920,6 +1923,12 @@ list_apps_thread_cb (GTask *task,
g_task_return_error (task, g_steal_pointer (&local_error));
return;
}
+
+ if (developers != NULL &&
+ !gs_flatpak_search_developer_apps (flatpak, developers, list, interactive, cancellable,
&local_error)) {
+ g_task_return_error (task, g_steal_pointer (&local_error));
+ return;
+ }
}
g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]