[gnome-software/wip/rancell/paid] Pass price to plugins



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]