[gnome-software/wip/rancell/paid] Pass price to plugins
- From: Robert Ancell <rancell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/wip/rancell/paid] Pass price to plugins
- Date: Fri, 6 May 2016 04:56:37 +0000 (UTC)
commit 57f86bbdba5619261b4a82f87001fa6c606bb005
Author: Robert Ancell <robert ancell canonical com>
Date: Fri May 6 16:56:26 2016 +1200
Pass price to plugins
src/gs-page.c | 22 +++-----
src/gs-plugin-loader.c | 106 +++++++++++++++++++++++++++++++++++++++++
src/gs-plugin-loader.h | 9 ++++
src/gs-plugin.h | 2 +
src/plugins/gs-plugin-dummy.c | 1 +
5 files changed, 126 insertions(+), 14 deletions(-)
---
diff --git a/src/gs-page.c b/src/gs-page.c
index a6af722..f74ea71 100644
--- a/src/gs-page.c
+++ b/src/gs-page.c
@@ -83,14 +83,6 @@ gs_page_app_purchased_cb (GObject *source,
error);
return;
}
-
- /* only show this if the window is not active */
- if (gs_app_get_state (helper->app) != AS_APP_STATE_QUEUED_FOR_INSTALL &&
- !gs_shell_is_active (priv->shell))
- gs_app_notify_installed (helper->app);
-
- if (GS_PAGE_GET_CLASS (page)->app_installed != NULL)
- GS_PAGE_GET_CLASS (page)->app_installed (page, helper->app);
}
static void
@@ -222,6 +214,7 @@ gs_page_purchase_app_response_cb (GtkDialog *dialog,
GsPageHelper *helper)
{
GsPagePrivate *priv = gs_page_get_instance_private (helper->page);
+ GPtrArray *prices;
/* not agreed */
if (response != GTK_RESPONSE_OK) {
@@ -229,12 +222,13 @@ gs_page_purchase_app_response_cb (GtkDialog *dialog,
return;
}
g_debug ("purchase %s", gs_app_get_id (helper->app));
- gs_plugin_loader_app_action_async (priv->plugin_loader,
- helper->app,
- GS_PLUGIN_LOADER_ACTION_PURCHASE,
- priv->cancellable,
- gs_page_app_purchased_cb,
- helper);
+ prices = gs_app_get_prices (helper->app);
+ gs_plugin_loader_app_purchase_async (priv->plugin_loader,
+ helper->app,
+ g_ptr_array_index (prices, 0), // FIXME: User should pick price,
check if no prices
+ priv->cancellable,
+ gs_page_app_purchased_cb,
+ helper);
}
void
diff --git a/src/gs-plugin-loader.c b/src/gs-plugin-loader.c
index 7b00b72..e5940be 100644
--- a/src/gs-plugin-loader.c
+++ b/src/gs-plugin-loader.c
@@ -91,6 +91,11 @@ typedef gboolean (*GsPluginReviewFunc) (GsPlugin *plugin,
GsReview *review,
GCancellable *cancellable,
GError **error);
+typedef gboolean (*GsPluginPurchaseFunc) (GsPlugin *plugin,
+ GsApp *app,
+ GsPrice *price,
+ GCancellable *cancellable,
+ GError **error);
typedef gboolean (*GsPluginRefineFunc) (GsPlugin *plugin,
GList **list,
GsPluginRefineFlags flags,
@@ -129,6 +134,7 @@ typedef struct {
GsCategory *category;
GsApp *app;
GsReview *review;
+ GsPrice *price;
} GsPluginLoaderAsyncState;
static void
@@ -140,6 +146,8 @@ gs_plugin_loader_free_async_state (GsPluginLoaderAsyncState *state)
g_object_unref (state->app);
if (state->review != NULL)
g_object_unref (state->review);
+ if (state->price != NULL)
+ g_object_unref (state->price);
if (state->file != NULL)
g_object_unref (state->file);
@@ -2666,6 +2674,74 @@ gs_plugin_loader_review_action_thread_cb (GTask *task,
g_task_return_boolean (task, TRUE);
}
+/**
+ * gs_plugin_loader_app_purchase_thread_cb:
+ **/
+static void
+gs_plugin_loader_app_purchase_thread_cb (GTask *task,
+ gpointer object,
+ gpointer task_data,
+ GCancellable *cancellable)
+{
+ GError *error = NULL;
+ GsPluginLoaderAsyncState *state = (GsPluginLoaderAsyncState *) task_data;
+ GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (object);
+ GsPluginLoaderPrivate *priv = gs_plugin_loader_get_instance_private (plugin_loader);
+ GsPlugin *plugin;
+ GsPluginPurchaseFunc plugin_func = NULL;
+ gboolean anything_ran = FALSE;
+ gboolean exists;
+ gboolean ret;
+ guint i;
+
+ /* run each plugin */
+ for (i = 0; i < priv->plugins->len; i++) {
+ g_autoptr(AsProfileTask) ptask = NULL;
+ g_autoptr(GError) error_local = NULL;
+
+ plugin = g_ptr_array_index (priv->plugins, i);
+ if (!gs_plugin_get_enabled (plugin))
+ continue;
+ if (g_cancellable_set_error_if_cancelled (cancellable, &error))
+ g_task_return_error (task, error);
+
+ exists = g_module_symbol (gs_plugin_get_module (plugin),
+ state->function_name,
+ (gpointer *) &plugin_func);
+ if (!exists)
+ continue;
+ ptask = as_profile_start (priv->profile,
+ "GsPlugin::%s(%s)",
+ gs_plugin_get_name (plugin),
+ state->function_name);
+ gs_plugin_loader_action_start (plugin_loader, plugin, FALSE);
+ ret = plugin_func (plugin, state->app, state->price,
+ cancellable, &error_local);
+ gs_plugin_loader_action_stop (plugin_loader, plugin);
+ if (!ret) {
+ g_warning ("failed to call %s on %s: %s",
+ state->function_name,
+ gs_plugin_get_name (plugin),
+ error_local->message);
+ continue;
+ }
+ anything_ran = TRUE;
+ gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED);
+ }
+
+ /* nothing ran */
+ if (!anything_ran) {
+ g_set_error (&error,
+ GS_PLUGIN_LOADER_ERROR,
+ GS_PLUGIN_LOADER_ERROR_FAILED,
+ "no plugin could handle %s",
+ state->function_name);
+ g_task_return_error (task, error);
+ }
+
+ g_task_return_boolean (task, TRUE);
+}
+
static gboolean
load_install_queue (GsPluginLoader *plugin_loader, GError **error)
{
@@ -2910,6 +2986,36 @@ gs_plugin_loader_app_action_async (GsPluginLoader *plugin_loader,
}
/**
+ * gs_plugin_loader_app_purchase_async:
+ **/
+void
+gs_plugin_loader_app_purchase_async (GsPluginLoader *plugin_loader,
+ GsApp *app,
+ GsPrice *price,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GsPluginLoaderAsyncState *state;
+ g_autoptr(GTask) task = NULL;
+
+ g_return_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader));
+ g_return_if_fail (GS_IS_APP (app));
+ g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+
+ /* save state */
+ state = g_slice_new0 (GsPluginLoaderAsyncState);
+ state->app = g_object_ref (app);
+ state->price = g_object_ref (price);
+ state->function_name = "gs_plugin_app_purchase";
+
+ /* run in a thread */
+ task = g_task_new (plugin_loader, cancellable, callback, user_data);
+ g_task_set_task_data (task, state, (GDestroyNotify) gs_plugin_loader_free_async_state);
+ g_task_run_in_thread (task, gs_plugin_loader_app_purchase_thread_cb);
+}
+
+/**
* gs_plugin_loader_review_action_async:
**/
void
diff --git a/src/gs-plugin-loader.h b/src/gs-plugin-loader.h
index 26ee54d..b70f96b 100644
--- a/src/gs-plugin-loader.h
+++ b/src/gs-plugin-loader.h
@@ -220,6 +220,15 @@ void gs_plugin_loader_app_action_async (GsPluginLoader
*plugin_loader,
gboolean gs_plugin_loader_app_action_finish (GsPluginLoader *plugin_loader,
GAsyncResult *res,
GError **error);
+void gs_plugin_loader_app_purchase_async (GsPluginLoader *plugin_loader,
+ GsApp *app,
+ GsPrice *price,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gboolean gs_plugin_loader_app_purchase_finish (GsPluginLoader *plugin_loader,
+ GAsyncResult *res,
+ GError **error);
void gs_plugin_loader_review_action_async (GsPluginLoader *plugin_loader,
GsApp *app,
GsReview *review,
diff --git a/src/gs-plugin.h b/src/gs-plugin.h
index 5ad92fb..b235ad6 100644
--- a/src/gs-plugin.h
+++ b/src/gs-plugin.h
@@ -31,6 +31,7 @@
#include "gs-app.h"
#include "gs-app-list.h"
#include "gs-category.h"
+#include "gs-price.h"
G_BEGIN_DECLS
@@ -272,6 +273,7 @@ gboolean gs_plugin_update_cancel (GsPlugin *plugin,
GError **error);
gboolean gs_plugin_app_purchase (GsPlugin *plugin,
GsApp *app,
+ GsPrice *price,
GCancellable *cancellable,
GError **error);
gboolean gs_plugin_app_install (GsPlugin *plugin,
diff --git a/src/plugins/gs-plugin-dummy.c b/src/plugins/gs-plugin-dummy.c
index c313d66..b9a1064 100644
--- a/src/plugins/gs-plugin-dummy.c
+++ b/src/plugins/gs-plugin-dummy.c
@@ -647,6 +647,7 @@ gs_plugin_update_cancel (GsPlugin *plugin, GsApp *app,
gboolean
gs_plugin_app_purchase (GsPlugin *plugin,
GsApp *app,
+ GsPrice *price,
GCancellable *cancellable,
GError **error)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]