[gnome-software] Allow all plugins to share a SoupSession



commit 09372cfcee295f258d67ff1566c0668600e9daec
Author: Richard Hughes <richard hughsie com>
Date:   Thu Feb 11 21:15:40 2016 +0000

    Allow all plugins to share a SoupSession
    
    This allows us to do more efficient pipelining and to share other resources.

 src/gs-plugin-loader.c                         |   11 +++++++++
 src/gs-plugin.h                                |    2 +
 src/plugins/gs-plugin-fedora-distro-upgrades.c |    8 +------
 src/plugins/gs-plugin-fedora-tagger-ratings.c  |   10 +------
 src/plugins/gs-plugin-fedora-tagger-usage.c    |   21 +-----------------
 src/plugins/gs-plugin-fwupd.c                  |   16 ++-----------
 src/plugins/gs-plugin-icons.c                  |   28 +-----------------------
 src/plugins/gs-plugin-xdg-app-reviews.c        |   14 +++++------
 8 files changed, 27 insertions(+), 83 deletions(-)
---
diff --git a/src/gs-plugin-loader.c b/src/gs-plugin-loader.c
index 132ef86..21b17f9 100644
--- a/src/gs-plugin-loader.c
+++ b/src/gs-plugin-loader.c
@@ -27,6 +27,7 @@
 
 #include "gs-plugin-loader.h"
 #include "gs-plugin.h"
+#include "gs-utils.h"
 
 #define GS_PLUGIN_LOADER_UPDATES_CHANGED_DELAY 3       /* s */
 
@@ -37,6 +38,7 @@ typedef struct
        gchar                   *locale;
        GsPluginStatus           status_last;
        AsProfile               *profile;
+       SoupSession             *soup_session;
 
        GMutex                   pending_apps_mutex;
        GPtrArray               *pending_apps;
@@ -3033,6 +3035,7 @@ gs_plugin_loader_open_plugin (GsPluginLoader *plugin_loader,
        plugin->updates_changed_fn = gs_plugin_loader_updates_changed_cb;
        plugin->updates_changed_user_data = plugin_loader;
        plugin->profile = g_object_ref (priv->profile);
+       plugin->soup_session = g_object_ref (priv->soup_session);
        plugin->scale = gs_plugin_loader_get_scale (plugin_loader);
        g_debug ("opened plugin %s: %s", filename, plugin->name);
 
@@ -3247,6 +3250,7 @@ gs_plugin_loader_plugin_free (GsPlugin *plugin)
        g_free (plugin->priv);
        g_free (plugin->name);
        g_object_unref (plugin->profile);
+       g_object_unref (plugin->soup_session);
        g_module_close (plugin->module);
        g_slice_free (GsPlugin, plugin);
 }
@@ -3290,6 +3294,7 @@ gs_plugin_loader_finalize (GObject *object)
        g_strfreev (priv->compatible_projects);
        g_free (priv->location);
        g_free (priv->locale);
+       g_object_unref (priv->soup_session);
 
        g_mutex_clear (&priv->pending_apps_mutex);
        g_mutex_clear (&priv->app_cache_mutex);
@@ -3352,6 +3357,12 @@ gs_plugin_loader_init (GsPluginLoader *plugin_loader)
                                                                g_free,
                                                                (GFreeFunc) g_object_unref);
 
+       /* share a soup session (also disable the double-compression) */
+       priv->soup_session = soup_session_new_with_options (SOUP_SESSION_USER_AGENT, gs_user_agent (),
+                                                           NULL);
+       soup_session_remove_feature_by_type (priv->soup_session,
+                                            SOUP_TYPE_CONTENT_DECODER);
+
        /* get the locale without the UTF-8 suffix */
        priv->locale = g_strdup (setlocale (LC_MESSAGES, NULL));
        match = g_strstr_len (priv->locale, -1, ".UTF-8");
diff --git a/src/gs-plugin.h b/src/gs-plugin.h
index cfbeef9..7b72782 100644
--- a/src/gs-plugin.h
+++ b/src/gs-plugin.h
@@ -27,6 +27,7 @@
 #include <gmodule.h>
 #include <gio/gio.h>
 #include <gtk/gtk.h>
+#include <libsoup/soup.h>
 
 #include "gs-app.h"
 #include "gs-category.h"
@@ -75,6 +76,7 @@ struct GsPlugin {
        GsPluginUpdatesChanged   updates_changed_fn;
        gpointer                 updates_changed_user_data;
        AsProfile               *profile;
+       SoupSession             *soup_session;
 };
 
 typedef enum {
diff --git a/src/plugins/gs-plugin-fedora-distro-upgrades.c b/src/plugins/gs-plugin-fedora-distro-upgrades.c
index 8c32318..735870d 100644
--- a/src/plugins/gs-plugin-fedora-distro-upgrades.c
+++ b/src/plugins/gs-plugin-fedora-distro-upgrades.c
@@ -23,7 +23,6 @@
 
 #include <errno.h>
 #include <json-glib/json-glib.h>
-#include <libsoup/soup.h>
 
 #include <gs-plugin.h>
 #include <gs-os-release.h>
@@ -37,7 +36,6 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(JsonParser, g_object_unref)
 
 struct GsPluginPrivate {
        GPtrArray       *distros;
-       SoupSession     *session;
 };
 
 /**
@@ -56,8 +54,6 @@ void
 gs_plugin_initialize (GsPlugin *plugin)
 {
        plugin->priv = GS_PLUGIN_GET_PRIVATE (GsPluginPrivate);
-       plugin->priv->session = soup_session_new_with_options (SOUP_SESSION_USER_AGENT, gs_user_agent (),
-                                                              NULL);
        /* check that we are running on Fedora */
        if (!gs_plugin_check_distro_id (plugin, "fedora")) {
                gs_plugin_set_enabled (plugin, FALSE);
@@ -74,8 +70,6 @@ gs_plugin_destroy (GsPlugin *plugin)
 {
        if (plugin->priv->distros != NULL)
                g_ptr_array_unref (plugin->priv->distros);
-       if (plugin->priv->session != NULL)
-               g_object_unref (plugin->priv->session);
 }
 
 typedef enum {
@@ -225,7 +219,7 @@ gs_plugin_add_distro_upgrades (GsPlugin *plugin,
        msg = soup_message_new (SOUP_METHOD_GET, FEDORA_PKGDB_COLLECTIONS_API_URI);
 
        /* set sync request */
-       status_code = soup_session_send_message (plugin->priv->session, msg);
+       status_code = soup_session_send_message (plugin->soup_session, msg);
        if (status_code != SOUP_STATUS_OK) {
                g_set_error (error,
                             GS_PLUGIN_ERROR,
diff --git a/src/plugins/gs-plugin-fedora-tagger-ratings.c b/src/plugins/gs-plugin-fedora-tagger-ratings.c
index 5535f72..eb06441 100644
--- a/src/plugins/gs-plugin-fedora-tagger-ratings.c
+++ b/src/plugins/gs-plugin-fedora-tagger-ratings.c
@@ -22,7 +22,6 @@
 #include <config.h>
 
 #include <json-glib/json-glib.h>
-#include <libsoup/soup.h>
 #include <string.h>
 #include <sqlite3.h>
 #include <stdlib.h>
@@ -38,7 +37,6 @@
  */
 
 struct GsPluginPrivate {
-       SoupSession             *session;
        gchar                   *db_path;
        gsize                    loaded;
        sqlite3                 *db;
@@ -71,8 +69,6 @@ gs_plugin_initialize (GsPlugin *plugin)
                                                  "gnome-software",
                                                  "fedora-tagger.db",
                                                  NULL);
-       plugin->priv->session = soup_session_new_with_options (SOUP_SESSION_USER_AGENT, gs_user_agent (),
-                                                              NULL);
 
        /* check that we are running on Fedora */
        if (!gs_plugin_check_distro_id (plugin, "fedora")) {
@@ -113,8 +109,6 @@ gs_plugin_destroy (GsPlugin *plugin)
        g_free (plugin->priv->db_path);
        if (plugin->priv->db != NULL)
                sqlite3_close (plugin->priv->db);
-       if (plugin->priv->session != NULL)
-               g_object_unref (plugin->priv->session);
 }
 
 /**
@@ -174,7 +168,7 @@ gs_plugin_app_set_rating_pkg (GsPlugin *plugin,
                                  SOUP_MEMORY_COPY, data, strlen (data));
 
        /* set sync request */
-       status_code = soup_session_send_message (plugin->priv->session, msg);
+       status_code = soup_session_send_message (plugin->soup_session, msg);
        if (status_code != SOUP_STATUS_OK) {
                g_debug ("Failed to set rating on fedora-tagger: %s",
                         soup_status_get_phrase (status_code));
@@ -341,7 +335,7 @@ gs_plugin_fedora_tagger_download (GsPlugin *plugin, GError **error)
        msg = soup_message_new (SOUP_METHOD_GET, uri);
 
        /* set sync request */
-       status_code = soup_session_send_message (plugin->priv->session, msg);
+       status_code = soup_session_send_message (plugin->soup_session, msg);
        if (status_code != SOUP_STATUS_OK) {
                g_set_error (error,
                             GS_PLUGIN_ERROR,
diff --git a/src/plugins/gs-plugin-fedora-tagger-usage.c b/src/plugins/gs-plugin-fedora-tagger-usage.c
index d5ce131..d962840 100644
--- a/src/plugins/gs-plugin-fedora-tagger-usage.c
+++ b/src/plugins/gs-plugin-fedora-tagger-usage.c
@@ -21,7 +21,6 @@
 
 #include <config.h>
 
-#include <libsoup/soup.h>
 #include <string.h>
 #include <sqlite3.h>
 #include <stdlib.h>
@@ -36,10 +35,6 @@
  * It will self-disable if not run on a Fedora system.
  */
 
-struct GsPluginPrivate {
-       SoupSession             *session;
-};
-
 /**
  * gs_plugin_get_name:
  */
@@ -59,10 +54,6 @@ gs_plugin_initialize (GsPlugin *plugin)
 {
        g_autoptr(GSettings) settings = NULL;
 
-       plugin->priv = GS_PLUGIN_GET_PRIVATE (GsPluginPrivate);
-       plugin->priv->session = soup_session_new_with_options (SOUP_SESSION_USER_AGENT, gs_user_agent (),
-                                                              NULL);
-
        /* this is opt-in, and turned off by default */
        settings = g_settings_new ("org.gnome.desktop.privacy");
        if (!g_settings_get_boolean (settings, "send-software-usage-stats")) {
@@ -93,16 +84,6 @@ gs_plugin_get_deps (GsPlugin *plugin)
 }
 
 /**
- * gs_plugin_destroy:
- */
-void
-gs_plugin_destroy (GsPlugin *plugin)
-{
-       if (plugin->priv->session != NULL)
-               g_object_unref (plugin->priv->session);
-}
-
-/**
  * gs_plugin_app_set_usage_pkg:
  */
 static gboolean
@@ -128,7 +109,7 @@ gs_plugin_app_set_usage_pkg (GsPlugin *plugin,
                                  SOUP_MEMORY_COPY, data, strlen (data));
 
        /* set sync request */
-       status_code = soup_session_send_message (plugin->priv->session, msg);
+       status_code = soup_session_send_message (plugin->soup_session, msg);
        if (status_code != SOUP_STATUS_OK) {
                g_debug ("Failed to set usage on fedora-tagger: %s",
                         soup_status_get_phrase (status_code));
diff --git a/src/plugins/gs-plugin-fwupd.c b/src/plugins/gs-plugin-fwupd.c
index 9b36314..36cf7f4 100644
--- a/src/plugins/gs-plugin-fwupd.c
+++ b/src/plugins/gs-plugin-fwupd.c
@@ -26,7 +26,6 @@
 #include <fcntl.h>
 #include <gio/gio.h>
 #include <gio/gunixfdlist.h>
-#include <libsoup/soup.h>
 #include <glib/gstdio.h>
 
 #include <gs-plugin.h>
@@ -46,7 +45,6 @@ struct GsPluginPrivate {
        GDBusProxy              *proxy;
        GPtrArray               *to_download;
        GPtrArray               *to_ignore;
-       SoupSession             *session;
        gchar                   *cachedir;
        gchar                   *lvfs_sig_fn;
        gchar                   *lvfs_sig_hash;
@@ -71,12 +69,6 @@ gs_plugin_initialize (GsPlugin *plugin)
        plugin->priv = GS_PLUGIN_GET_PRIVATE (GsPluginPrivate);
        plugin->priv->to_download = g_ptr_array_new_with_free_func (g_free);
        plugin->priv->to_ignore = g_ptr_array_new_with_free_func (g_free);
-       plugin->priv->session = soup_session_new_with_options (SOUP_SESSION_USER_AGENT, gs_user_agent (),
-                                                              NULL);
-       /* this disables the double-compression of the firmware.xml.gz file */
-       soup_session_remove_feature_by_type (plugin->priv->session,
-                                            SOUP_TYPE_CONTENT_DECODER);
-
        plugin->priv->config_fn = g_build_filename (SYSCONFDIR, "fwupd.conf", NULL);
        if (!g_file_test (plugin->priv->config_fn, G_FILE_TEST_EXISTS)) {
                g_free (plugin->priv->config_fn);
@@ -102,8 +94,6 @@ gs_plugin_destroy (GsPlugin *plugin)
        g_ptr_array_unref (plugin->priv->to_ignore);
        if (plugin->priv->proxy != NULL)
                g_object_unref (plugin->priv->proxy);
-       if (plugin->priv->session != NULL)
-               g_object_unref (plugin->priv->session);
 }
 
 /**
@@ -645,7 +635,7 @@ gs_plugin_fwupd_check_lvfs_metadata (GsPlugin *plugin,
        /* download the signature first, it's smaller */
        url_sig = g_strdup_printf ("%s.asc", url_data);
        msg_sig = soup_message_new (SOUP_METHOD_GET, url_sig);
-       status_code = soup_session_send_message (plugin->priv->session, msg_sig);
+       status_code = soup_session_send_message (plugin->soup_session, msg_sig);
        if (status_code != SOUP_STATUS_OK) {
                g_warning ("Failed to download %s, ignoring: %s",
                           url_sig, soup_status_get_phrase (status_code));
@@ -681,7 +671,7 @@ gs_plugin_fwupd_check_lvfs_metadata (GsPlugin *plugin,
 
        /* download the payload */
        msg_data = soup_message_new (SOUP_METHOD_GET, url_data);
-       status_code = soup_session_send_message (plugin->priv->session, msg_data);
+       status_code = soup_session_send_message (plugin->soup_session, msg_data);
        if (status_code != SOUP_STATUS_OK) {
                g_warning ("Failed to download %s, ignoring: %s",
                           url_data, soup_status_get_phrase (status_code));
@@ -753,7 +743,7 @@ gs_plugin_refresh (GsPlugin *plugin,
 
                /* set sync request */
                msg = soup_message_new (SOUP_METHOD_GET, tmp);
-               status_code = soup_session_send_message (plugin->priv->session, msg);
+               status_code = soup_session_send_message (plugin->soup_session, msg);
                if (status_code != SOUP_STATUS_OK) {
                        g_warning ("Failed to download %s, ignoring: %s",
                                   tmp, soup_status_get_phrase (status_code));
diff --git a/src/plugins/gs-plugin-icons.c b/src/plugins/gs-plugin-icons.c
index 299d180..40e3563 100644
--- a/src/plugins/gs-plugin-icons.c
+++ b/src/plugins/gs-plugin-icons.c
@@ -25,7 +25,6 @@
 #include <string.h>
 
 #include <glib/gi18n.h>
-#include <libsoup/soup.h>
 
 #include <gs-plugin.h>
 #include <gs-utils.h>
@@ -38,10 +37,6 @@
  * have to handle the download and caching functionality.
  */
 
-struct GsPluginPrivate {
-       SoupSession             *session;
-};
-
 /**
  * gs_plugin_get_name:
  */
@@ -52,17 +47,6 @@ gs_plugin_get_name (void)
 }
 
 /**
- * gs_plugin_initialize:
- */
-void
-gs_plugin_initialize (GsPlugin *plugin)
-{
-       plugin->priv = GS_PLUGIN_GET_PRIVATE (GsPluginPrivate);
-       plugin->priv->session = soup_session_new_with_options (SOUP_SESSION_USER_AGENT, gs_user_agent (),
-                                                              NULL);
-}
-
-/**
  * gs_plugin_get_deps:
  */
 const gchar **
@@ -76,16 +60,6 @@ gs_plugin_get_deps (GsPlugin *plugin)
 }
 
 /**
- * gs_plugin_destroy:
- */
-void
-gs_plugin_destroy (GsPlugin *plugin)
-{
-       if (plugin->priv->session != NULL)
-               g_object_unref (plugin->priv->session);
-}
-
-/**
  * gs_plugin_icons_download:
  */
 static gboolean
@@ -108,7 +82,7 @@ gs_plugin_icons_download (GsPlugin *plugin, const gchar *uri, const gchar *filen
        }
 
        /* set sync request */
-       status_code = soup_session_send_message (plugin->priv->session, msg);
+       status_code = soup_session_send_message (plugin->soup_session, msg);
        if (status_code != SOUP_STATUS_OK) {
                g_set_error (error,
                             GS_PLUGIN_ERROR,
diff --git a/src/plugins/gs-plugin-xdg-app-reviews.c b/src/plugins/gs-plugin-xdg-app-reviews.c
index 8ab9a5c..b86a157 100644
--- a/src/plugins/gs-plugin-xdg-app-reviews.c
+++ b/src/plugins/gs-plugin-xdg-app-reviews.c
@@ -23,7 +23,6 @@
 
 #include <gs-plugin.h>
 #include <json-glib/json-glib.h>
-#include <libsoup/soup.h>
 #include <string.h>
 
 #include "gs-app.h"
@@ -49,7 +48,6 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(JsonGenerator, g_object_unref)
 
 struct GsPluginPrivate {
        GSettings               *settings;
-       SoupSession             *session;
        gchar                   *distro;
        gchar                   *user_hash;
        gchar                   *review_server;
@@ -72,7 +70,7 @@ gs_plugin_initialize (GsPlugin *plugin)
 {
        g_autoptr(GError) error = NULL;
        plugin->priv = GS_PLUGIN_GET_PRIVATE (GsPluginPrivate);
-       plugin->priv->session = soup_session_new_with_options (SOUP_SESSION_USER_AGENT, gs_user_agent (), 
NULL);
+       plugin->soup_session = soup_session_new_with_options (SOUP_SESSION_USER_AGENT, gs_user_agent (), 
NULL);
        plugin->priv->settings = g_settings_new ("org.gnome.software");
        plugin->priv->review_server = g_settings_get_string (plugin->priv->settings,
                                                             "review-server");
@@ -114,7 +112,7 @@ gs_plugin_destroy (GsPlugin *plugin)
 {
        g_free (plugin->priv->user_hash);
        g_free (plugin->priv->distro);
-       g_object_unref (plugin->priv->session);
+       g_object_unref (plugin->soup_session);
        g_object_unref (plugin->priv->settings);
 }
 
@@ -495,7 +493,7 @@ xdg_app_review_get_ratings (GsPlugin *plugin, GsApp *app, GError **error)
                               plugin->priv->review_server,
                               gs_app_get_id (app));
        msg = soup_message_new (SOUP_METHOD_GET, uri);
-       status_code = soup_session_send_message (plugin->priv->session, msg);
+       status_code = soup_session_send_message (plugin->soup_session, msg);
        if (status_code != SOUP_STATUS_OK) {
                if (!xdg_app_review_parse_success (msg->response_body->data,
                                                   msg->response_body->length,
@@ -633,7 +631,7 @@ xdg_app_review_fetch_for_app (GsPlugin *plugin, GsApp *app, GError **error)
        msg = soup_message_new (SOUP_METHOD_POST, uri);
        soup_message_set_request (msg, "application/json",
                                  SOUP_MEMORY_COPY, data, strlen (data));
-       status_code = soup_session_send_message (plugin->priv->session, msg);
+       status_code = soup_session_send_message (plugin->soup_session, msg);
        if (status_code != SOUP_STATUS_OK) {
                if (!xdg_app_review_parse_success (msg->response_body->data,
                                                   msg->response_body->length,
@@ -863,7 +861,7 @@ gs_plugin_review_submit (GsPlugin *plugin,
 
        /* POST */
        uri = g_strdup_printf ("%s/submit", plugin->priv->review_server);
-       return gs_plugin_xdg_app_reviews_json_post (plugin->priv->session,
+       return gs_plugin_xdg_app_reviews_json_post (plugin->soup_session,
                                                    uri, data, error);
 }
 
@@ -915,7 +913,7 @@ gs_plugin_xdg_app_reviews_vote (GsPlugin *plugin, GsReview *review,
                return FALSE;
 
        /* send to server */
-       if (!gs_plugin_xdg_app_reviews_json_post (plugin->priv->session,
+       if (!gs_plugin_xdg_app_reviews_json_post (plugin->soup_session,
                                                  uri, data, error))
                return FALSE;
 


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