From 1b9364c980f8bae169b646a2d1a78ec9c3fc0754 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Fri, 7 Jul 2017 16:36:03 +0200 Subject: store: Provide async variants of load functions The existing functions may block, which isn't ideal in IO-sensitive contexts. To address this, add async variants that run the functions in a thread. --- libappstream-glib/as-store.c | 128 +++++++++++++++++++++++++++++++++++++++++++ libappstream-glib/as-store.h | 19 +++++++ 2 files changed, 147 insertions(+) diff --git a/libappstream-glib/as-store.c b/libappstream-glib/as-store.c index 0b69ecc..66558b6 100644 --- a/libappstream-glib/as-store.c +++ b/libappstream-glib/as-store.c @@ -2973,6 +2973,70 @@ as_store_load_path (AsStore *store, const gchar *path, path, cancellable, error); } +static void +store_load_path_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + AsStore *store = source_object; + const char *path = task_data; + GError *error = NULL; + gboolean success; + + success = as_store_load_path (store, path, cancellable, &error); + if (error) + g_task_return_error (task, error); + else + g_task_return_boolean (task, success); +} + + +/** + * as_store_load_path_async: + * @store: a #AsStore instance. + * @path: A path to load + * @cancellable: a #GCancellable. + * @callback: A #GAsyncReadyCallback + * @user_data: Data to pass to @callback + * + * Asynchronously loads the store from a specific path. + * + * Since: 0.7.11 + **/ +void +as_store_load_path_async (AsStore *store, const gchar *path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task = g_task_new (store, cancellable, callback, user_data); + g_task_set_task_data (task, g_strdup (path), g_free); + g_task_run_in_thread (task, store_load_path_thread); + g_object_unref (task); +} + +/** + * as_store_load_path_finish: + * @store: a #AsStore instance. + * @result: A #GAsyncResult + * @error: A #GError or %NULL. + * + * Retrieve the result of as_store_load_path_async(). + * + * Returns: %TRUE for success + * + * Since: 0.7.11 + **/ +gboolean +as_store_load_path_finish (AsStore *store, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, store), FALSE); + return g_task_propagate_boolean (G_TASK (result), error); +} + static gboolean as_store_search_installed (AsStore *store, guint32 flags, @@ -3252,6 +3316,70 @@ as_store_load (AsStore *store, guint32 flags, GCancellable *cancellable, GError return TRUE; } +static void +store_load_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + AsStore *store = AS_STORE (source_object); + AsStoreLoadFlags flags = GPOINTER_TO_INT (task_data); + GError *error = NULL; + gboolean success; + + success = as_store_load (store, flags, cancellable, &error); + if (error != NULL) + g_task_return_error (task, error); + else + g_task_return_boolean (task, success); +} + +/** + * as_store_load_async: + * @store: a #AsStore instance. + * @flags: #AsStoreLoadFlags, e.g. %AS_STORE_LOAD_FLAG_APP_INFO_SYSTEM + * @cancellable: a #GCancellable. + * @callback: A #GAsyncReadyCallback + * @user_data: Data to pass to @callback + * + * Asynchronously loads the store from the default locations. + * + * Since: 0.7.11 + **/ +void +as_store_load_async (AsStore *store, + AsStoreLoadFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task = g_task_new (store, cancellable, callback, user_data); + g_task_set_task_data (task, GINT_TO_POINTER (flags), NULL); + g_task_run_in_thread (task, store_load_thread); + g_object_unref (task); +} + +/** + * as_store_load_finish: + * @store: a #AsStore instance. + * @result: A #GAsyncResult + * @error: A #GError or %NULL. + * + * Retrieve the result of as_store_load_async(). + * + * Returns: %TRUE for success + * + * Since: 0.7.11 + **/ +gboolean +as_store_load_finish (AsStore *store, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, store), FALSE); + return g_task_propagate_boolean (G_TASK (result), error); +} + G_GNUC_PRINTF (3, 4) static void as_store_validate_add (GPtrArray *problems, AsProblemKind kind, const gchar *fmt, ...) { diff --git a/libappstream-glib/as-store.h b/libappstream-glib/as-store.h index 553b38d..3d8c749 100644 --- a/libappstream-glib/as-store.h +++ b/libappstream-glib/as-store.h @@ -176,14 +176,33 @@ gboolean as_store_from_xml (AsStore *store, const gchar *data, const gchar *icon_root, GError **error); + gboolean as_store_load (AsStore *store, guint32 flags, GCancellable *cancellable, GError **error); +void as_store_load_async (AsStore *store, + AsStoreLoadFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean as_store_load_finish (AsStore *store, + GAsyncResult *result, + GError **error); + gboolean as_store_load_path (AsStore *store, const gchar *path, GCancellable *cancellable, GError **error); +void as_store_load_path_async (AsStore *store, + const gchar *path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean as_store_load_path_finish (AsStore *store, + GAsyncResult *result, + GError **error); + void as_store_load_search_cache (AsStore *store); void as_store_set_search_match (AsStore *store, guint16 search_match); -- cgit v1.2.1