diff options
Diffstat (limited to '')
-rw-r--r-- | lib/gs-plugin-helpers.c | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/lib/gs-plugin-helpers.c b/lib/gs-plugin-helpers.c new file mode 100644 index 0000000..40c8a61 --- /dev/null +++ b/lib/gs-plugin-helpers.c @@ -0,0 +1,338 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall <pwithnall@endlessos.org> + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +/** + * SECTION:gs-plugin-helpers + * @short_description: Helpers for storing call closures for #GsPlugin vfuncs + * + * The helpers in this file each create a context structure to store the + * arguments passed to a standard #GsPlugin vfunc. + * + * These are intended to be used by plugin implementations to easily create + * #GTasks for handling #GsPlugin vfunc calls, without all having to write the + * same code to create a structure to wrap the vfunc arguments. + * + * Since: 42 + */ + +#include "config.h" + +#include <glib.h> +#include <glib-object.h> + +#include "gs-plugin-helpers.h" + +/** + * gs_plugin_refine_data_new: + * @list: list of #GsApps to refine + * @flags: refine flags + * + * Context data for a call to #GsPluginClass.refine_async. + * + * Returns: (transfer full): context data structure + * Since: 42 + */ +GsPluginRefineData * +gs_plugin_refine_data_new (GsAppList *list, + GsPluginRefineFlags flags) +{ + g_autoptr(GsPluginRefineData) data = g_new0 (GsPluginRefineData, 1); + data->list = g_object_ref (list); + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_refine_data_new_task: + * @source_object: task source object + * @list: list of #GsApps to refine + * @flags: refine flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for a refine operation with the given arguments. The task + * data will be set to a #GsPluginRefineData containing the given context. + * + * This is essentially a combination of gs_plugin_refine_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 42 + */ +GTask * +gs_plugin_refine_data_new_task (gpointer source_object, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_refine_data_new (list, flags), (GDestroyNotify) gs_plugin_refine_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_refine_data_free: + * @data: (transfer full): a #GsPluginRefineData + * + * Free the given @data. + * + * Since: 42 + */ +void +gs_plugin_refine_data_free (GsPluginRefineData *data) +{ + g_clear_object (&data->list); + g_free (data); +} + +/** + * gs_plugin_refresh_metadata_data_new: + * @cache_age_secs: maximum allowed age of the cache in order for it to remain valid, in seconds + * @flags: refresh metadata flags + * + * Context data for a call to #GsPluginClass.refresh_metadata_async. + * + * Returns: (transfer full): context data structure + * Since: 42 + */ +GsPluginRefreshMetadataData * +gs_plugin_refresh_metadata_data_new (guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags) +{ + g_autoptr(GsPluginRefreshMetadataData) data = g_new0 (GsPluginRefreshMetadataData, 1); + data->cache_age_secs = cache_age_secs; + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_refresh_metadata_data_free: + * @data: (transfer full): a #GsPluginRefreshMetadataData + * + * Free the given @data. + * + * Since: 42 + */ +void +gs_plugin_refresh_metadata_data_free (GsPluginRefreshMetadataData *data) +{ + g_free (data); +} + +/** + * gs_plugin_list_apps_data_new: + * @query: (nullable) (transfer none): a query to filter apps, or %NULL for + * no filtering + * @flags: list apps flags + * + * Context data for a call to #GsPluginClass.list_apps_async. + * + * Returns: (transfer full): context data structure + * Since: 43 + */ +GsPluginListAppsData * +gs_plugin_list_apps_data_new (GsAppQuery *query, + GsPluginListAppsFlags flags) +{ + g_autoptr(GsPluginListAppsData) data = g_new0 (GsPluginListAppsData, 1); + data->query = (query != NULL) ? g_object_ref (query) : NULL; + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_list_apps_data_new_task: + * @source_object: task source object + * @query: (nullable) (transfer none): a query to filter apps, or %NULL for + * no filtering + * @flags: list apps flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for a list apps operation with the given arguments. The task + * data will be set to a #GsPluginListAppsData containing the given context. + * + * This is essentially a combination of gs_plugin_list_apps_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 43 + */ +GTask * +gs_plugin_list_apps_data_new_task (gpointer source_object, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_list_apps_data_new (query, flags), (GDestroyNotify) gs_plugin_list_apps_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_list_apps_data_free: + * @data: (transfer full): a #GsPluginListAppsData + * + * Free the given @data. + * + * Since: 43 + */ +void +gs_plugin_list_apps_data_free (GsPluginListAppsData *data) +{ + g_clear_object (&data->query); + g_free (data); +} + +/** + * gs_plugin_manage_repository_data_new: + * @repository: (not-nullable) (transfer none): a repository to manage + * @flags: manage repository flags + * + * Common context data for a call to #GsPluginClass.install_repository_async, + * #GsPluginClass.remove_repository_async, #GsPluginClass.enable_repository_async + * and #GsPluginClass.disable_repository_async. + * + * Returns: (transfer full): context data structure + * Since: 43 + */ +GsPluginManageRepositoryData * +gs_plugin_manage_repository_data_new (GsApp *repository, + GsPluginManageRepositoryFlags flags) +{ + g_autoptr(GsPluginManageRepositoryData) data = g_new0 (GsPluginManageRepositoryData, 1); + data->repository = g_object_ref (repository); + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_manage_repository_data_new_task: + * @source_object: task source object + * @repository: (not-nullable) (transfer none): a repository to manage + * @flags: manage repository flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for a manage repository operation with the given arguments. The task + * data will be set to a #GsPluginManageRepositoryData containing the given context. + * + * This is essentially a combination of gs_plugin_manage_repository_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 43 + */ +GTask * +gs_plugin_manage_repository_data_new_task (gpointer source_object, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_manage_repository_data_new (repository, flags), (GDestroyNotify) gs_plugin_manage_repository_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_manage_repository_data_free: + * @data: (transfer full): a #GsPluginManageRepositoryData + * + * Free the given @data. + * + * Since: 43 + */ +void +gs_plugin_manage_repository_data_free (GsPluginManageRepositoryData *data) +{ + g_clear_object (&data->repository); + g_free (data); +} + +/** + * gs_plugin_refine_categories_data_new: + * @list: (element-type GsCategory): list of #GsCategory objects to refine + * @flags: refine flags + * + * Context data for a call to #GsPluginClass.refine_categories_async. + * + * Returns: (transfer full): context data structure + * Since: 43 + */ +GsPluginRefineCategoriesData * +gs_plugin_refine_categories_data_new (GPtrArray *list, + GsPluginRefineCategoriesFlags flags) +{ + g_autoptr(GsPluginRefineCategoriesData) data = g_new0 (GsPluginRefineCategoriesData, 1); + data->list = g_ptr_array_ref (list); + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_refine_categories_data_new_task: + * @source_object: task source object + * @list: (element-type GsCategory): list of #GsCategory objects to refine + * @flags: refine flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for a refine categories operation with the given arguments. + * The task data will be set to a #GsPluginRefineCategoriesData containing the + * given context. + * + * This is essentially a combination of gs_plugin_refine_categories_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 43 + */ +GTask * +gs_plugin_refine_categories_data_new_task (gpointer source_object, + GPtrArray *list, + GsPluginRefineCategoriesFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_refine_categories_data_new (list, flags), (GDestroyNotify) gs_plugin_refine_categories_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_refine_categories_data_free: + * @data: (transfer full): a #GsPluginRefineCategoriesData + * + * Free the given @data. + * + * Since: 43 + */ +void +gs_plugin_refine_categories_data_free (GsPluginRefineCategoriesData *data) +{ + g_clear_pointer (&data->list, g_ptr_array_unref); + g_free (data); +} |