summaryrefslogtreecommitdiffstats
path: root/lib/gs-plugin-vfuncs.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gs-plugin-vfuncs.h')
-rw-r--r--lib/gs-plugin-vfuncs.h942
1 files changed, 942 insertions, 0 deletions
diff --git a/lib/gs-plugin-vfuncs.h b/lib/gs-plugin-vfuncs.h
new file mode 100644
index 0000000..05772f2
--- /dev/null
+++ b/lib/gs-plugin-vfuncs.h
@@ -0,0 +1,942 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ * vi:set noexpandtab tabstop=8 shiftwidth=8:
+ *
+ * Copyright (C) 2012-2017 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+/**
+ * SECTION:gs-plugin-vfuncs
+ * @title: GsPlugin Exports
+ * @include: gnome-software.h
+ * @stability: Unstable
+ * @short_description: Vfuncs that plugins can implement
+ */
+
+#include <appstream-glib.h>
+#include <glib-object.h>
+#include <gmodule.h>
+#include <gio/gio.h>
+#include <libsoup/soup.h>
+
+#include "gs-app.h"
+#include "gs-app-list.h"
+#include "gs-category.h"
+
+G_BEGIN_DECLS
+
+/**
+ * gs_plugin_initialize:
+ * @plugin: a #GsPlugin
+ *
+ * Checks if the plugin should run, and if initializes it. If the plugin should
+ * not be run then gs_plugin_set_enabled() should be called.
+ * This is also the place to call gs_plugin_alloc_data() if private data is
+ * required for the plugin.
+ *
+ * NOTE: Do not do any failable actions in this function; use gs_plugin_setup()
+ * instead.
+ **/
+void gs_plugin_initialize (GsPlugin *plugin);
+
+/**
+ * gs_plugin_destroy:
+ * @plugin: a #GsPlugin
+ *
+ * Called when the plugin should destroy any private data.
+ **/
+void gs_plugin_destroy (GsPlugin *plugin);
+
+/**
+ * gs_plugin_adopt_app:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ *
+ * Called when an #GsApp has not been claimed (i.e. a management plugin has not
+ * been set).
+ *
+ * A claimed application means other plugins will not try to perform actions
+ * such as install, remove or update. Most applications are claimed when they
+ * are created.
+ *
+ * If a plugin can adopt this application then it should call
+ * gs_app_set_management_plugin() on @app.
+ **/
+void gs_plugin_adopt_app (GsPlugin *plugin,
+ GsApp *app);
+
+/**
+ * gs_plugin_add_search:
+ * @plugin: a #GsPlugin
+ * @values: a NULL terminated list of search terms, e.g. [ "gnome", "software" ]
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Get search results for a specific query.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_search (GsPlugin *plugin,
+ gchar **values,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_search_files:
+ * @plugin: a #GsPlugin
+ * @values: a list of filenames, e.g. [ "/usr/share/help/gimp/index.html" ]
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Called when searching for an application that provides a specific filename
+ * on the filesystem.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_search_files (GsPlugin *plugin,
+ gchar **values,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_search_what_provides
+ * @plugin: a list of tags, e.g. [ "text/rtf" ]
+ * @values: a #GStrv
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Called when searching for an application that provides specific defined tags,
+ * for instance a codec string or mime-type.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_search_what_provides (GsPlugin *plugin,
+ gchar **values,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_alternates
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Called when trying to find alternates to a specific app, for instance
+ * finding a flatpak version of an existing distro packaged application.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_alternates (GsPlugin *plugin,
+ GsApp *app,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_setup:
+ * @plugin: a #GsPlugin
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Called when the plugin should set up the initial state, and with the write
+ * lock held.
+ *
+ * All functions can block, but should sent progress notifications, e.g. using
+ * gs_app_set_progress() if they will take more than tens of milliseconds
+ * to complete.
+ *
+ * This function will also not be called if gs_plugin_initialize() self-disabled.
+ *
+ * Returns: %TRUE for success
+ **/
+gboolean gs_plugin_setup (GsPlugin *plugin,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_installed:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Get the list of installed applications.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_installed (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_updates:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Get the list of updates.
+ *
+ * NOTE: Actually downloading the updates can be done in gs_plugin_download_app()
+ * or in gs_plugin_download().
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_updates (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_distro_upgrades:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Get the list of distribution upgrades. Due to the download size, these
+ * should not be downloaded until the user has explicitly opted-in.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add() of type
+ * %AS_APP_KIND_OS_UPGRADE.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_distro_upgrades (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_sources:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Get the list of sources, for example the repos listed in /etc/yum.repos.d
+ * or the remotes configured in flatpak.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add() of type
+ * %AS_APP_KIND_SOURCE.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_sources (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_updates_historical
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Get the list of historical updates, i.e. the updates that have just been
+ * installed.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_updates_historical (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_categories:
+ * @plugin: a #GsPlugin
+ * @list: (element-type GsCategory): a #GPtrArray
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Get the category tree, for instance Games->Action or Internet->Email.
+ *
+ * Plugins are expected to add new categories using g_ptr_array_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_categories (GsPlugin *plugin,
+ GPtrArray *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_category_apps:
+ * @plugin: a #GsPlugin
+ * @category: a #GsCategory
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Get all the applications that match a specific category.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_category_apps (GsPlugin *plugin,
+ GsCategory *category,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_recent:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @age: a number of seconds
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Return all the applications that have had upstream releases recently.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_recent (GsPlugin *plugin,
+ GsAppList *list,
+ guint64 age,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_popular:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Get popular applications that should be featured on the main page as
+ * "Editors Picks".
+ * This is expected to be a curated list of applications that are high quality
+ * and feature-complete.
+ *
+ * The returned list of popular applications are not sorted, but each #GsApp has
+ * to be valid, for instance having a known state and a valid icon.
+ * If an insufficient number of applications are added by plugins then the
+ * section on the overview shell may be hidden.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_popular (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_featured:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Get applications that should be featured as a large full-width banner on the
+ * overview page.
+ * This is expected to be a curated list of applications that are high quality
+ * and feature-complete.
+ *
+ * The returned list of popular applications are randomized in a way so that
+ * the same application is featured for the entire calendar day.
+ *
+ * NOTE: The UI code may expect that applications have additional metadata set on
+ * results, for instance <code>GnomeSoftware::FeatureTile-css</code>.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_featured (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_unvoted_reviews:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Gets the list of unvoted reviews. Only applications should be returned where
+ * there are reviews, and where the user has not previously moderated them.
+ * This function is supposed to be used to display a moderation panel for
+ * reviewers.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_unvoted_reviews (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_refine:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @flags: a #GsPluginRefineFlags, e.g. %GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Adds required information to a list of #GsApp's. It allows requests to be
+ * batched up, which allows better performance than individual calls per app.
+ *
+ * An example for when this is useful would be in the PackageKit plugin where
+ * we want to do one transaction of GetDetails with multiple source-ids rather
+ * than scheduling a large number of pending requests.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_refine (GsPlugin *plugin,
+ GsAppList *list,
+ GsPluginRefineFlags flags,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_refine_wildcard:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @list: a #GsAppList
+ * @flags: a #GsPluginRefineFlags, e.g. %GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Adds applications that match the wildcard specified in @app.
+ *
+ * The general idea is that plugins create and add *new* applications rather
+ * than all trying to fight over the wildcard application.
+ * This allows the plugin loader to filter using the #GsApp priority value.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_refine_wildcard (GsPlugin *plugin,
+ GsApp *app,
+ GsAppList *list,
+ GsPluginRefineFlags flags,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_launch:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Launch the specified application using a plugin-specific method.
+ * This is normally setting some environment or launching a specific binary.
+ *
+ * Plugins can simply use gs_plugin_app_launch() if no plugin-specific
+ * functionality is required.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_launch (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_shortcut:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Adds a shortcut for the application in a desktop-defined location.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_shortcut (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_remove_shortcut:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Removes a shortcut for the application in a desktop-defined location.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_remove_shortcut (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_update_cancel:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Cancels the offline update of @app.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_update_cancel (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_app_install:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Install the application.
+ *
+ * Plugins are expected to send progress notifications to the UI using
+ * gs_app_set_progress() using the passed in @app.
+ *
+ * All functions can block, but should sent progress notifications, e.g. using
+ * gs_app_set_progress() if they will take more than tens of milliseconds
+ * to complete.
+ *
+ * On failure the error message returned will usually only be shown on the
+ * console, but they can also be retrieved using gs_plugin_loader_get_events().
+ *
+ * NOTE: Once the action is complete, the plugin must set the new state of @app
+ * to %AS_APP_STATE_INSTALLED.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_app_install (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_app_remove:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Remove the application.
+ *
+ * Plugins are expected to send progress notifications to the UI using
+ * gs_app_set_progress() using the passed in @app.
+ *
+ * All functions can block, but should sent progress notifications, e.g. using
+ * gs_app_set_progress() if they will take more than tens of milliseconds
+ * to complete.
+ *
+ * On failure the error message returned will usually only be shown on the
+ * console, but they can also be retrieved using gs_plugin_loader_get_events().
+ *
+ * NOTE: Once the action is complete, the plugin must set the new state of @app
+ * to %AS_APP_STATE_AVAILABLE or %AS_APP_STATE_UNKNOWN if not known.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_app_remove (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_app_set_rating:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Gets any ratings for the applications.
+ *
+ * Plugins are expected to call gs_app_set_rating() on @app.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_app_set_rating (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_update_app:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Update the application live.
+ *
+ * Plugins are expected to send progress notifications to the UI using
+ * gs_app_set_progress() using the passed in @app.
+ *
+ * All functions can block, but should sent progress notifications, e.g. using
+ * gs_app_set_progress() if they will take more than tens of milliseconds
+ * to complete.
+ *
+ * On failure the error message returned will usually only be shown on the
+ * console, but they can also be retrieved using gs_plugin_loader_get_events().
+ *
+ * NOTE: Once the action is complete, the plugin must set the new state of @app
+ * to %AS_APP_STATE_INSTALLED or %AS_APP_STATE_UNKNOWN if not known.
+ *
+ * If %GS_APP_QUIRK_IS_PROXY is set on the application then the actual #GsApp
+ * set in @app will be the related application of the parent. Plugins do not
+ * need to manually iterate on the related list of applications.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_update_app (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_download_app:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Downloads the application and any dependencies ready to be installed or
+ * updated.
+ *
+ * Plugins are expected to schedule downloads using the system download
+ * scheduler if appropriate (if the download is not guaranteed to be under a few
+ * hundred kilobytes, for example), so that the user’s metered data preferences
+ * are honoured.
+ *
+ * Plugins are expected to send progress notifications to the UI using
+ * gs_app_set_progress() using the passed in @app.
+ *
+ * All functions can block, but should sent progress notifications, e.g. using
+ * gs_app_set_progress() if they will take more than tens of milliseconds
+ * to complete.
+ *
+ * If the @app is already downloaded, do not return an error and return %TRUE.
+ *
+ * On failure the error message returned will usually only be shown on the
+ * console, but they can also be retrieved using gs_plugin_loader_get_events().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_download_app (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_download:
+ * @plugin: a #GsPlugin
+ * @apps: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Downloads a list of applications ready to be installed or updated.
+ *
+ * Plugins are expected to schedule downloads using the system download
+ * scheduler if appropriate (if the download is not guaranteed to be under a few
+ * hundred kilobytes, for example), so that the user’s metered data preferences
+ * are honoured.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_download (GsPlugin *plugin,
+ GsAppList *apps,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_app_upgrade_download:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp, with kind %AS_APP_KIND_OS_UPGRADE
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Starts downloading a distribution upgrade in the background.
+ *
+ * All functions can block, but should sent progress notifications, e.g. using
+ * gs_app_set_progress() if they will take more than tens of milliseconds
+ * to complete.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_app_upgrade_download (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_app_upgrade_trigger:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp, with kind %AS_APP_KIND_OS_UPGRADE
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Triggers the distribution upgrade to be installed on next boot.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_app_upgrade_trigger (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_review_submit:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @review: a #AsReview
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Submits a new end-user application review.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_review_submit (GsPlugin *plugin,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_review_upvote:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @review: a #AsReview
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Upvote a specific review to indicate the review is helpful.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_review_upvote (GsPlugin *plugin,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_review_downvote:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @review: a #AsReview
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Downvote a specific review to indicate the review is unhelpful.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_review_downvote (GsPlugin *plugin,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_review_report:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @review: a #AsReview
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Report a review that is not suitable in some way.
+ * It is expected that this action flags a review to be checked by a moderator
+ * and that the review won't be shown to any users until this happens.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_review_report (GsPlugin *plugin,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_review_remove:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @review: a #AsReview
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Remove a review that the user wrote.
+ * NOTE: Users should only be able to remove reviews with %AS_REVIEW_FLAG_SELF.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_review_remove (GsPlugin *plugin,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_review_dismiss:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @review: a #AsReview
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Dismisses a review, i.e. hide it from future moderated views.
+ * This action is useful when the moderator is unable to speak the language of
+ * the review for example.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_review_dismiss (GsPlugin *plugin,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_refresh:
+ * @plugin: a #GsPlugin
+ * @cache_age: the acceptable cache age in seconds, or MAXUINT for "any"
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Refreshes the state of all the plugins. Plugins should make sure
+ * there's enough metadata to start the application, for example lists of
+ * available applications.
+ *
+ * All functions can block, but should sent progress notifications, e.g. using
+ * gs_app_set_progress() if they will take more than tens of milliseconds
+ * to complete.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_refresh (GsPlugin *plugin,
+ guint cache_age,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_file_to_app:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @file: a #GFile
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Converts a local file to a #GsApp. It's expected that only one plugin will
+ * match the mimetype of @file and that a single #GsApp will be in the returned
+ * list. If no plugins can handle the file, the list will be empty.
+ *
+ * For example, the PackageKit plugin can turn a .rpm file into a application
+ * of kind %AS_APP_KIND_UNKNOWN but that in some cases it will be further refined
+ * into a %AS_APP_KIND_DESKTOP (with all the extra metadata) by the appstream
+ * plugin.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_file_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ GFile *file,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_url_to_app:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @url: a #URL, e.g. "apt://gimp"
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Converts a URL to a #GsApp. It's expected that only one plugin will
+ * match the scheme of @url and that a single #GsApp will be in the returned
+ * list. If no plugins can handle the file, the list will be empty.
+ *
+ * For example, the apt plugin can turn apt://gimp into a application.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_url_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ const gchar *url,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_update:
+ * @plugin: a #GsPlugin
+ * @apps: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Updates a list of applications, typically scheduling them for offline update.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_update (GsPlugin *plugin,
+ GsAppList *apps,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_langpacks:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @locale: a #LANGUAGE_CODE or #LOCALE, e.g. "ja" or "ja_JP"
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Returns a list of language packs, as per input language code or locale.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_langpacks (GsPlugin *plugin,
+ GsAppList *list,
+ const gchar *locale,
+ GCancellable *cancellable,
+ GError **error);
+
+G_END_DECLS