[gnome-software] Allow plugins to add, remove and change user-submitted reviews



commit 7b320cf9eaf5b0caa3549d635deae515fdff4f92
Author: Robert Ancell <robert ancell canonical com>
Date:   Tue Feb 9 11:30:34 2016 +0000

    Allow plugins to add, remove and change user-submitted reviews
    
    Signed-off-by: Richard Hughes <richard hughsie com>

 src/gs-plugin-loader.c        |  153 +++++++++++++++++++++++++++++++++++++++++
 src/gs-plugin-loader.h        |   15 ++++
 src/gs-plugin.h               |   30 ++++++++
 src/plugins/gs-plugin-dummy.c |   65 +++++++++++++++++
 4 files changed, 263 insertions(+), 0 deletions(-)
---
diff --git a/src/gs-plugin-loader.c b/src/gs-plugin-loader.c
index 9149491..4a5f81b 100644
--- a/src/gs-plugin-loader.c
+++ b/src/gs-plugin-loader.c
@@ -73,6 +73,7 @@ typedef struct {
        guint                            cache_age;
        GsCategory                      *category;
        GsApp                           *app;
+       GsReview                        *review;
        AsAppState                       state_success;
        AsAppState                       state_failure;
 } GsPluginLoaderAsyncState;
@@ -84,6 +85,8 @@ gs_plugin_loader_free_async_state (GsPluginLoaderAsyncState *state)
                g_object_unref (state->category);
        if (state->app != NULL)
                g_object_unref (state->app);
+       if (state->review != NULL)
+               g_object_unref (state->review);
 
        g_free (state->filename);
        g_free (state->value);
@@ -2388,6 +2391,104 @@ gs_plugin_loader_app_action_thread_cb (GTask *task,
        g_idle_add (emit_pending_apps_idle, g_object_ref (plugin_loader));
 }
 
+/**
+ * gs_plugin_loader_run_review_plugin:
+ **/
+static gboolean
+gs_plugin_loader_run_review_plugin (GsPluginLoader *plugin_loader,
+                                   GsPlugin *plugin,
+                                   GsApp *app,
+                                   GsReview *review,
+                                   const gchar *function_name,
+                                   GCancellable *cancellable,
+                                   GError **error)
+{
+       GsPluginLoaderPrivate *priv = gs_plugin_loader_get_instance_private (plugin_loader);
+       GError *error_local = NULL;
+       GsPluginReviewFunc plugin_func = NULL;
+       gboolean exists;
+       gboolean ret = TRUE;
+       g_autoptr(AsProfileTask) ptask = NULL;
+
+       exists = g_module_symbol (plugin->module,
+                                 function_name,
+                                 (gpointer *) &plugin_func);
+       if (!exists)
+               goto out;
+       ptask = as_profile_start (priv->profile,
+                                 "GsPlugin::%s(%s)",
+                                 plugin->name,
+                                 function_name);
+       ret = plugin_func (plugin, app, review, cancellable, &error_local);
+       if (!ret) {
+               if (g_error_matches (error_local,
+                                    GS_PLUGIN_ERROR,
+                                    GS_PLUGIN_ERROR_NOT_SUPPORTED)) {
+                       ret = TRUE;
+                       g_debug ("not supported for plugin %s: %s",
+                                plugin->name,
+                                error_local->message);
+                       g_clear_error (&error_local);
+               } else {
+                       g_propagate_error (error, error_local);
+                       goto out;
+               }
+       }
+out:
+       gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED);
+       return ret;
+}
+
+/**
+ * gs_plugin_loader_review_action_thread_cb:
+ **/
+static void
+gs_plugin_loader_review_action_thread_cb (GTask *task,
+                                         gpointer object,
+                                         gpointer task_data,
+                                         GCancellable *cancellable)
+{
+       GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (object);
+       GsPluginLoaderPrivate *priv = gs_plugin_loader_get_instance_private (plugin_loader);
+       GError *error = NULL;
+       GsPluginLoaderAsyncState *state = (GsPluginLoaderAsyncState *) task_data;
+       GsPlugin *plugin;
+       gboolean ret;
+       gboolean anything_ran = FALSE;
+       guint i;
+
+       /* run each plugin */
+       for (i = 0; i < priv->plugins->len; i++) {
+               plugin = g_ptr_array_index (priv->plugins, i);
+               if (!plugin->enabled)
+                       continue;
+               if (g_cancellable_set_error_if_cancelled (cancellable, &error))
+                       g_task_return_error (task, error);
+               ret = gs_plugin_loader_run_review_plugin (plugin_loader,
+                                                         plugin,
+                                                         state->app,
+                                                         state->review,
+                                                         state->function_name,
+                                                         cancellable,
+                                                         &error);
+               if (!ret)
+                       g_task_return_error (task, error);
+               anything_ran = TRUE;
+       }
+
+       /* 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)
 {
@@ -2639,6 +2740,58 @@ gs_plugin_loader_app_action_async (GsPluginLoader *plugin_loader,
 }
 
 /**
+ * gs_plugin_loader_review_action_async:
+ **/
+void
+gs_plugin_loader_review_action_async (GsPluginLoader *plugin_loader,
+                                     GsApp *app,
+                                     GsReview *review,
+                                     GsPluginLoaderAction action,
+                                     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->review = g_object_ref (review);
+
+       switch (action) {
+       case GS_PLUGIN_LOADER_ACTION_REVIEW_SUBMIT:
+               state->function_name = "gs_plugin_review_submit";
+               break;
+       case GS_PLUGIN_LOADER_ACTION_REVIEW_UPVOTE:
+               state->function_name = "gs_plugin_review_upvote";
+               break;
+       case GS_PLUGIN_LOADER_ACTION_REVIEW_DOWNVOTE:
+               state->function_name = "gs_plugin_review_downvote";
+               break;
+       case GS_PLUGIN_LOADER_ACTION_REVIEW_REPORT:
+               state->function_name = "gs_plugin_review_report";
+               break;
+       case GS_PLUGIN_LOADER_ACTION_REVIEW_REMOVE:
+               state->function_name = "gs_plugin_review_remove";
+               break;
+       default:
+               g_assert_not_reached ();
+               break;
+       }
+
+       /* 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_set_return_on_cancel (task, TRUE);
+       g_task_run_in_thread (task, gs_plugin_loader_review_action_thread_cb);
+}
+
+/**
  * gs_plugin_loader_app_action_finish:
  *
  * Return value: success
diff --git a/src/gs-plugin-loader.h b/src/gs-plugin-loader.h
index 48ede73..3ff6399 100644
--- a/src/gs-plugin-loader.h
+++ b/src/gs-plugin-loader.h
@@ -61,6 +61,11 @@ typedef enum {
        GS_PLUGIN_LOADER_ACTION_UPGRADE_TRIGGER,
        GS_PLUGIN_LOADER_ACTION_LAUNCH,
        GS_PLUGIN_LOADER_ACTION_OFFLINE_UPDATE_CANCEL,
+       GS_PLUGIN_LOADER_ACTION_REVIEW_SUBMIT,
+       GS_PLUGIN_LOADER_ACTION_REVIEW_UPVOTE,
+       GS_PLUGIN_LOADER_ACTION_REVIEW_DOWNVOTE,
+       GS_PLUGIN_LOADER_ACTION_REVIEW_REPORT,
+       GS_PLUGIN_LOADER_ACTION_REVIEW_REMOVE,
        GS_PLUGIN_LOADER_ACTION_LAST
 } GsPluginLoaderAction;
 
@@ -209,6 +214,16 @@ 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_review_action_async   (GsPluginLoader *plugin_loader,
+                                                        GsApp          *app,
+                                                        GsReview       *review,
+                                                        GsPluginLoaderAction a,
+                                                        GCancellable   *cancellable,
+                                                        GAsyncReadyCallback callback,
+                                                        gpointer        user_data);
+gboolean        gs_plugin_loader_review_action_finish  (GsPluginLoader *plugin_loader,
+                                                        GAsyncResult   *res,
+                                                        GError         **error);
 gboolean        gs_plugin_loader_refresh_finish        (GsPluginLoader *plugin_loader,
                                                         GAsyncResult   *res,
                                                         GError         **error);
diff --git a/src/gs-plugin.h b/src/gs-plugin.h
index 5e67565..baeeb51 100644
--- a/src/gs-plugin.h
+++ b/src/gs-plugin.h
@@ -142,6 +142,11 @@ typedef gboolean    (*GsPluginActionFunc)          (GsPlugin       *plugin,
                                                         GsApp          *app,
                                                         GCancellable   *cancellable,
                                                         GError         **error);
+typedef gboolean        (*GsPluginReviewFunc)          (GsPlugin       *plugin,
+                                                        GsApp          *app,
+                                                        GsReview       *review,
+                                                        GCancellable   *cancellable,
+                                                        GError         **error);
 typedef gboolean        (*GsPluginRefineFunc)          (GsPlugin       *plugin,
                                                         GList          **list,
                                                         GsPluginRefineFlags flags,
@@ -276,6 +281,31 @@ gboolean    gs_plugin_app_upgrade_download         (GsPlugin       *plugin,
                                                         GsApp          *app,
                                                         GCancellable   *cancellable,
                                                         GError         **error);
+gboolean        gs_plugin_review_submit                (GsPlugin       *plugin,
+                                                        GsApp          *app,
+                                                        GsReview       *review,
+                                                        GCancellable   *cancellable,
+                                                        GError         **error);
+gboolean        gs_plugin_review_upvote                (GsPlugin       *plugin,
+                                                        GsApp          *app,
+                                                        GsReview       *review,
+                                                        GCancellable   *cancellable,
+                                                        GError         **error);
+gboolean        gs_plugin_review_downvote              (GsPlugin       *plugin,
+                                                        GsApp          *app,
+                                                        GsReview       *review,
+                                                        GCancellable   *cancellable,
+                                                        GError         **error);
+gboolean        gs_plugin_review_report                (GsPlugin       *plugin,
+                                                        GsApp          *app,
+                                                        GsReview       *review,
+                                                        GCancellable   *cancellable,
+                                                        GError         **error);
+gboolean        gs_plugin_review_remove                (GsPlugin       *plugin,
+                                                        GsApp          *app,
+                                                        GsReview       *review,
+                                                        GCancellable   *cancellable,
+                                                        GError         **error);
 gboolean        gs_plugin_refresh                      (GsPlugin       *plugin,
                                                         guint           cache_age,
                                                         GsPluginRefreshFlags flags,
diff --git a/src/plugins/gs-plugin-dummy.c b/src/plugins/gs-plugin-dummy.c
index e021213..fb843ef 100644
--- a/src/plugins/gs-plugin-dummy.c
+++ b/src/plugins/gs-plugin-dummy.c
@@ -219,3 +219,68 @@ gs_plugin_add_distro_upgrades (GsPlugin *plugin,
        gs_plugin_add_app (list, app);
        return TRUE;
 }
+
+/**
+ * gs_plugin_review_submit:
+ */
+gboolean
+gs_plugin_review_submit (GsPlugin *plugin,
+                        GsApp *app,
+                        GsReview *review,
+                        GCancellable *cancellable,
+                        GError **error)
+{
+       return TRUE;
+}
+
+/**
+ * gs_plugin_review_report:
+ */
+gboolean
+gs_plugin_review_report (GsPlugin *plugin,
+                        GsApp *app,
+                        GsReview *review,
+                        GCancellable *cancellable,
+                        GError **error)
+{
+       return TRUE;
+}
+
+/**
+ * gs_plugin_review_upvote:
+ */
+gboolean
+gs_plugin_review_upvote (GsPlugin *plugin,
+                        GsApp *app,
+                        GsReview *review,
+                        GCancellable *cancellable,
+                        GError **error)
+{
+       return TRUE;
+}
+
+/**
+ * gs_plugin_review_downvote:
+ */
+gboolean
+gs_plugin_review_downvote (GsPlugin *plugin,
+                          GsApp *app,
+                          GsReview *review,
+                          GCancellable *cancellable,
+                          GError **error)
+{
+       return TRUE;
+}
+
+/**
+ * gs_plugin_review_remove:
+ */
+gboolean
+gs_plugin_review_remove (GsPlugin *plugin,
+                        GsApp *app,
+                        GsReview *review,
+                        GCancellable *cancellable,
+                        GError **error)
+{
+       return TRUE;
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]