summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Müllner <fmuellner@gnome.org>2017-07-07 16:36:03 +0200
committerRichard Hughes <richard@hughsie.com>2018-08-06 14:59:46 +0100
commit1b9364c980f8bae169b646a2d1a78ec9c3fc0754 (patch)
tree2f0d41ed657e44b74529aa89aef781e450d274d1
parentd4fffd203144efa83c2f66a844fbbda59d22b4ad (diff)
downloadappstream-glib-1b9364c980f8bae169b646a2d1a78ec9c3fc0754.tar.gz
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.
-rw-r--r--libappstream-glib/as-store.c128
-rw-r--r--libappstream-glib/as-store.h19
2 files changed, 147 insertions, 0 deletions
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);