[gupnp-tools: 1/2] Port to GUPnP 1.6 and libsoup 3




commit 7ee5fd9beb04cdb5ebf76b3bf79b132aaacc5e11
Author: Jens Georg <mail jensge org>
Date:   Fri May 20 08:10:10 2022 +0000

    Port to GUPnP 1.6 and libsoup 3

 .gitlab-ci.yml                                 |  24 +--
 meson.build                                    |   8 +-
 src/av-cp/playlist-treeview.c                  |   1 -
 src/av-cp/renderer-combo.c                     |  34 ++++-
 src/av-cp/server-device.c                      |  26 +++-
 src/common/icons.c                             | 199 +++++++++++--------------
 src/common/icons.h                             |  13 +-
 src/network-light/upnp.c                       |  20 +--
 src/universal-cp/details-treeview.c            |   8 +-
 src/universal-cp/device-treeview.c             |  69 ++++++---
 subprojects/{gssdp-1.2.wrap => gssdp-1.6.wrap} |   2 +-
 subprojects/{gupnp-1.2.wrap => gupnp-1.6.wrap} |   2 +-
 12 files changed, 220 insertions(+), 186 deletions(-)
---
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ed76e71..7148490 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,6 @@
 include:
-    - remote: 
"https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/290b79e0e78eab67a83766f4e9691be554fc4afd/templates/ci-fairy.yml";
-    - remote: 
'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/290b79e0e78eab67a83766f4e9691be554fc4afd/templates/fedora.yml'
+    - remote: 
"https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/0c312d9c7255f46e741d43bcd1930f09cd12efe7/templates/ci-fairy.yml";
+    - remote: 
'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/0c312d9c7255f46e741d43bcd1930f09cd12efe7/templates/fedora.yml'
 
 variables:
     MESON_TEST_TIMEOUT_MULTIPLIER: 3
@@ -61,23 +61,23 @@ check-merge-request:
 
 .gupnp_tools.fedora@common:
   variables:
-    BASE_TAG: '2021-06-19.0'
+    BASE_TAG: '2022-05-20.0'
     FDO_UPSTREAM_REPO: GNOME/gupnp-tools
-    FDO_DISTRIBUTION_PACKAGES: 'clang clang-analyzer gcovr git libasan libubsan python3-gobject python3-pip 
xmlto gobject-introspection-devel gtk-doc libsoup-devel libuuid-devel libxml2-devel vala ninja-build 
gtk3-devel gtksourceview4-devel'
+    FDO_DISTRIBUTION_PACKAGES: 'clang clang-analyzer gcovr git libasan libubsan python3-gobject python3-pip 
xmlto gobject-introspection-devel gtk-doc libsoup3-devel libuuid-devel libxml2-devel vala ninja-build 
gtk3-devel gtksourceview4-devel'
     FDO_DISTRIBUTION_EXEC: |
       dnf clean all &&
       pip3 install meson
 
-.gupnp_tools.fedora:34@x86_64:
+.gupnp_tools.fedora:36@x86_64:
   extends: .gupnp_tools.fedora@common
   variables:
-    FDO_DISTRIBUTION_VERSION: 34
+    FDO_DISTRIBUTION_VERSION: 36
     FDO_DISTRIBUTION_TAG: "x86_64-${BASE_TAG}"
 
 build-fedora-container@x86_64:
   extends:
     - .fdo.container-build@fedora
-    - .gupnp_tools.fedora:34@x86_64
+    - .gupnp_tools.fedora:36@x86_64
   stage: prepare
   variables:
     GIT_STRATEGY: none
@@ -86,7 +86,7 @@ build-fedora-container@x86_64:
 build-fedora@x86_64:
     extends:
         - .fdo.distribution-image@fedora
-        - .gupnp_tools.fedora:34@x86_64
+        - .gupnp_tools.fedora:36@x86_64
     needs:
         - build-fedora-container@x86_64
     <<: *build
@@ -128,7 +128,7 @@ build-fedora@x86_64:
 test-fedora@x86_64:
   extends:
     - .fdo.distribution-image@fedora
-    - .gupnp_tools.fedora:34@x86_64
+    - .gupnp_tools.fedora:36@x86_64
   needs:
     - build-fedora@x86_64
   <<: *test
@@ -144,7 +144,7 @@ test-fedora@x86_64:
 #coverage-analysis:
 #  extends:
 #    - .fdo.distribution-image@fedora
-#    - .gupnp_tools.fedora:34@x86_64
+#    - .gupnp_tools.fedora:36@x86_64
 #  stage: analysis
 #  allow_failure: true
 #  script:
@@ -162,7 +162,7 @@ test-fedora@x86_64:
 static-scan:
   extends:
     - .fdo.distribution-image@fedora
-    - .gupnp_tools.fedora:34@x86_64
+    - .gupnp_tools.fedora:36@x86_64
   stage: analysis
   needs:
     - build-fedora-container@x86_64
@@ -177,7 +177,7 @@ static-scan:
 #pages:
 #  extends:
 #    - .fdo.distribution-image@fedora
-#    - .gupnp_tools.fedora:34@x86_64
+#    - .gupnp_tools.fedora:36@x86_64
 #  stage: website
 #  script:
 #      - meson doc-build -Dgtk_doc=true
diff --git a/meson.build b/meson.build
index db84969..0baacb7 100644
--- a/meson.build
+++ b/meson.build
@@ -1,4 +1,4 @@
-project('gupnp-tools', ['c'], version: '0.10.2')
+project('gupnp-tools', ['c'], version: '0.11.0')
 
 gnome = import('gnome')
 i18n = import('i18n')
@@ -7,9 +7,9 @@ if host_machine.system() == 'windows'
     win = import('windows')
 endif
 
-gssdp = dependency('gssdp-1.2', version: '>= 1.2.0', default_options: ['sniffer=false'])
-gupnp = dependency('gupnp-1.2', version: '>= 1.4.0')
-soup = dependency('libsoup-2.4', version: '>= 2.42')
+gssdp = dependency('gssdp-1.6', version: '>= 1.5.0', default_options: ['sniffer=false'])
+gupnp = dependency('gupnp-1.6', version: '>= 1.5.1')
+soup = dependency('libsoup-3.0', version: '>= 3.0')
 gupnp_av = dependency('gupnp-av-1.0', version: '>= 0.5.5', required: get_option('av-tools'))
 gtk = dependency('gtk+-3.0', version: '>= 3.10')
 glib = dependency('glib-2.0', version: '>= 2.24')
diff --git a/src/av-cp/playlist-treeview.c b/src/av-cp/playlist-treeview.c
index 9c3f525..bda5d09 100644
--- a/src/av-cp/playlist-treeview.c
+++ b/src/av-cp/playlist-treeview.c
@@ -1024,7 +1024,6 @@ remove_media_server (GUPnPDeviceProxy *proxy)
                       compare_media_server,
                       (gpointer) udn,
                       FALSE)) {
-                unschedule_icon_update (info);
                 gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
         }
 }
diff --git a/src/av-cp/renderer-combo.c b/src/av-cp/renderer-combo.c
index 962e5b0..95d3c2b 100644
--- a/src/av-cp/renderer-combo.c
+++ b/src/av-cp/renderer-combo.c
@@ -340,12 +340,20 @@ set_duration (const gchar *udn,
 }
 
 static void
-on_device_icon_available (GUPnPDeviceInfo *info,
-                          GdkPixbuf       *icon)
+on_device_icon_available (GObject *source,
+                          GAsyncResult *res,
+                          gpointer user_data)
 {
         GtkTreeModel *model;
         GtkTreeIter   iter;
         const char   *udn;
+        g_autoptr (GdkPixbuf) icon;
+        g_autoptr (GError) error = NULL;
+
+        icon = update_icon_finish (GUPNP_DEVICE_INFO (source), res, &error);
+        if (error != NULL) {
+                g_debug ("Failed to download icon: %s", error->message);
+        }
 
         if (icon == NULL)
                 return;
@@ -353,7 +361,7 @@ on_device_icon_available (GUPnPDeviceInfo *info,
         model = gtk_combo_box_get_model (GTK_COMBO_BOX (renderer_combo));
         g_assert (model != NULL);
 
-        udn = gupnp_device_info_get_udn (info);
+        udn = gupnp_device_info_get_udn (GUPNP_DEVICE_INFO (source));
 
         if (find_renderer (model, udn, &iter)) {
                 gtk_list_store_set (GTK_LIST_STORE (model),
@@ -362,7 +370,7 @@ on_device_icon_available (GUPnPDeviceInfo *info,
                                     -1);
         }
 
-        g_object_unref (icon);
+        g_object_set_data (source, "icon-download-cancellable", NULL);
 }
 
 static void
@@ -516,7 +524,12 @@ append_media_renderer_to_tree (GUPnPDeviceProxy  *proxy,
         gupnp_service_proxy_set_subscribed (av_transport, TRUE);
         gupnp_service_proxy_set_subscribed (rendering_control, TRUE);
 
-        schedule_icon_update (info, on_device_icon_available);
+        GCancellable *cancellable = g_cancellable_new ();
+        g_object_set_data_full (G_OBJECT (info),
+                                "icon-download-cancellable",
+                                cancellable,
+                                g_object_unref);
+        update_icon_async (info, cancellable, on_device_icon_available, NULL);
 
         if (was_empty)
                 gtk_combo_box_set_active_iter (combo, &iter);
@@ -846,7 +859,16 @@ remove_media_renderer (GUPnPDeviceProxy *proxy)
         model = gtk_combo_box_get_model (combo);
 
         if (find_renderer (model, udn, &iter)) {
-                unschedule_icon_update (info);
+                GCancellable *cancellable =
+                        g_object_get_data (G_OBJECT (info),
+                                           "icon-download-cancellable");
+                if (cancellable != NULL) {
+                        g_cancellable_cancel (cancellable);
+
+                        g_object_set_data (G_OBJECT (info),
+                                           "icon-download-cancellable",
+                                           NULL);
+                }
                 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
                 gtk_combo_box_set_active (combo, 0);
         }
diff --git a/src/av-cp/server-device.c b/src/av-cp/server-device.c
index dd312ef..e767447 100644
--- a/src/av-cp/server-device.c
+++ b/src/av-cp/server-device.c
@@ -150,8 +150,9 @@ av_cp_media_server_get_property (GObject    *obj,
 }
 
 static void
-av_cp_media_server_on_icon_updated (GUPnPDeviceInfo *info,
-                                    GdkPixbuf       *icon);
+av_cp_media_server_on_icon_updated (GObject *source,
+                                    GAsyncResult *res,
+                                    gpointer user_data);
 
 static void
 av_cp_media_server_on_get_sort_caps (GObject      *object,
@@ -308,13 +309,20 @@ av_cp_media_server_init (AVCPMediaServer *self)
 }
 
 static void
-av_cp_media_server_on_icon_updated (GUPnPDeviceInfo *info,
-                                    GdkPixbuf       *icon)
+av_cp_media_server_on_icon_updated (GObject *source,
+                                    GAsyncResult *res,
+                                    gpointer user_data)
 {
-        AVCPMediaServer *self = AV_CP_MEDIA_SERVER (info);
+        AVCPMediaServer *self = AV_CP_MEDIA_SERVER (source);
         AVCPMediaServerPrivate *priv = av_cp_media_server_get_instance_private (self);
+        g_autoptr (GError) error = NULL;
+
+        priv->icon =
+                update_icon_finish (GUPNP_DEVICE_INFO (source), res, &error);
+        if (error != NULL) {
+                g_debug ("Failed to download device icon: %s", error->message);
+        }
 
-        priv->icon = icon;
         av_cp_media_server_get_content_directory (self);
 
         if (priv->content_directory != NULL) {
@@ -401,8 +409,10 @@ av_cp_media_server_init_finish (GAsyncInitable *initable,
 static void
 av_cp_media_server_introspect (AVCPMediaServer *self)
 {
-        schedule_icon_update (GUPNP_DEVICE_INFO (self),
-                              av_cp_media_server_on_icon_updated);
+        update_icon_async (GUPNP_DEVICE_INFO (self),
+                           NULL,
+                           av_cp_media_server_on_icon_updated,
+                           NULL);
 }
 
 static void
diff --git a/src/common/icons.c b/src/common/icons.c
index 3419f8d..e8fa308 100644
--- a/src/common/icons.c
+++ b/src/common/icons.c
@@ -39,11 +39,6 @@ static SoupSession *download_session;
 static GList       *pending_gets;
 
 typedef struct {
-        GUPnPDeviceInfo *info;
-
-        DeviceIconAvailableCallback callback;
-
-        SoupMessage     *message;
         gchar           *mime_type;
         gint             width;
         gint             height;
@@ -52,28 +47,23 @@ typedef struct {
 static void
 get_icon_url_data_free (GetIconURLData *data)
 {
-        g_object_unref (data->info);
-
         g_free (data->mime_type);
         g_slice_free (GetIconURLData, data);
 }
 
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (GetIconURLData, get_icon_url_data_free)
+
 static GdkPixbuf *
-get_icon_from_message (SoupMessage    *msg,
-                       GetIconURLData *data,
-                       GError        **error)
+get_icon_from_bytes (GBytes *icon_data, GetIconURLData *data, GError **error)
 {
-        GdkPixbufLoader *loader;
+        g_autoptr (GdkPixbufLoader) loader;
         GdkPixbuf       *pixbuf;
 
         loader = gdk_pixbuf_loader_new_with_mime_type (data->mime_type, error);
         if (loader == NULL)
                 return NULL;
 
-        gdk_pixbuf_loader_write (loader,
-                                 (guchar *) msg->response_body->data,
-                                 msg->response_body->length,
-                                 error);
+        gdk_pixbuf_loader_write_bytes (loader, icon_data, error);
         pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
         if (pixbuf) {
                 gfloat aspect_ratio;
@@ -89,7 +79,6 @@ get_icon_from_message (SoupMessage    *msg,
         }
 
         gdk_pixbuf_loader_close (loader, NULL);
-        g_object_unref (loader);
 
         return pixbuf;
 }
@@ -97,123 +86,115 @@ get_icon_from_message (SoupMessage    *msg,
 /**
  * Icon downloaded.
  **/
+
 static void
-got_icon_url (SoupSession    *session,
-              SoupMessage    *msg,
-              GetIconURLData *data)
+on_got_icon (GObject *source, GAsyncResult *res, gpointer user_data)
 {
-        GdkPixbuf *pixbuf = NULL;
-
-        if (SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
-                GError *error = NULL;
+        GError *error = NULL;
+        g_autoptr (GTask) task = G_TASK (user_data);
+        SoupMessage *message =
+                soup_session_get_async_result_message (SOUP_SESSION (source),
+                                                       res);
+
+        g_autoptr (GBytes) body =
+                soup_session_send_and_read_finish (SOUP_SESSION (source),
+                                                   res,
+                                                   &error);
 
-                pixbuf = get_icon_from_message (msg, data, &error);
+        if (error != NULL) {
+                g_task_return_error (task, error);
 
-                if (error) {
-                        g_warning ("Failed to create icon for '%s': %s",
-                                   gupnp_device_info_get_udn (data->info),
-                                   error->message);
-                        g_error_free (error);
-                } else if (!pixbuf) {
-                        g_warning ("Failed to create icon for '%s'",
-                                   gupnp_device_info_get_udn (data->info));
-                }
+                return;
         }
 
-        data->callback (data->info, pixbuf);
-
-        pending_gets = g_list_remove (pending_gets, data);
-        get_icon_url_data_free (data);
-}
+        if (!SOUP_STATUS_IS_SUCCESSFUL (soup_message_get_status (message))) {
+                g_task_return_error (
+                        task,
+                        g_error_new (G_IO_ERROR,
+                                     G_IO_ERROR_FAILED,
+                                     "Unable to  download icon: %s",
+                                     error->message));
+                return;
+        }
 
-static gboolean
-on_icon_schedule_error (gpointer user_data)
-{
-        GetIconURLData *data = (GetIconURLData *) user_data;
+        GdkPixbuf *device_icon =
+                get_icon_from_bytes (body, g_task_get_task_data (task), &error);
+        if (error != NULL) {
+                g_task_return_error (task, error);
 
-        data->callback (data->info, NULL);
-        g_object_unref (data->info);
-        g_slice_free (GetIconURLData, data);
+                return;
+        }
 
-        return FALSE;
+        g_task_return_pointer (task, device_icon, g_object_unref);
 }
 
 void
-schedule_icon_update (GUPnPDeviceInfo            *info,
-                      DeviceIconAvailableCallback callback)
+update_icon_async (GUPnPDeviceInfo *info,
+                   GCancellable *cancellable,
+                   GAsyncReadyCallback callback,
+                   gpointer user_data)
 {
-        GetIconURLData *data;
-        char           *icon_url;
+        g_autoptr (GTask) task =
+                g_task_new (info, cancellable, callback, user_data);
+
+        g_autoptr (GetIconURLData) data;
+        g_autofree char *icon_url;
 
         data = g_slice_new0 (GetIconURLData);
-        data->info = g_object_ref (info);
-        data->callback = callback;
-
-        icon_url = gupnp_device_info_get_icon_url
-                        (info,
-                         NULL,
-                         PREFERED_DEPTH,
-                         PREFERED_WIDTH,
-                         PREFERED_HEIGHT,
-                         TRUE,
-                         &data->mime_type,
-                         NULL,
-                         &data->width,
-                         &data->height);
+
+        icon_url = gupnp_device_info_get_icon_url (info,
+                                                   NULL,
+                                                   PREFERED_DEPTH,
+                                                   PREFERED_WIDTH,
+                                                   PREFERED_HEIGHT,
+                                                   TRUE,
+                                                   &data->mime_type,
+                                                   NULL,
+                                                   &data->width,
+                                                   &data->height);
+
         if (icon_url == NULL) {
-                g_free (data->mime_type);
+                g_task_return_pointer (task, NULL, NULL);
 
-                g_idle_add (on_icon_schedule_error, data);
                 return;
         }
 
-        char *new_uri = gupnp_context_rewrite_uri (gupnp_device_info_get_context (info), icon_url);
-        g_free (icon_url);
+        g_autofree char *new_url =
+                gupnp_context_rewrite_uri (gupnp_device_info_get_context (info),
+                                           icon_url);
+        g_autoptr (SoupMessage) message =
+                soup_message_new (SOUP_METHOD_GET, new_url);
 
-        data->message = soup_message_new (SOUP_METHOD_GET, new_uri);
-
-        if (data->message == NULL) {
-                g_warning ("Invalid URL icon for device '%s': %s",
-                           gupnp_device_info_get_udn (info),
-                           new_uri);
-
-                g_free (new_uri);
-                g_free (data->mime_type);
-                g_idle_add (on_icon_schedule_error, data);
+        if (message == NULL) {
+                g_task_return_error (task,
+                                     g_error_new (G_URI_ERROR,
+                                                  G_URI_ERROR_FAILED,
+                                                  "Could not parse icon url %s",
+                                                  new_url));
 
                 return;
         }
 
-        pending_gets = g_list_prepend (pending_gets, data);
-        soup_session_queue_message (download_session,
-                                    data->message,
-                                    (SoupSessionCallback) got_icon_url,
-                                    data);
+        g_task_set_task_data (task,
+                              g_steal_pointer (&data),
+                              (GDestroyNotify) get_icon_url_data_free);
 
-        g_free (new_uri);
+        soup_session_send_and_read_async (download_session,
+                                          message,
+                                          G_PRIORITY_LOW,
+                                          cancellable,
+                                          on_got_icon,
+                                          task);
+
+        g_steal_pointer (&task);
 }
 
-void
-unschedule_icon_update (GUPnPDeviceInfo *info)
+GdkPixbuf *
+update_icon_finish (GUPnPDeviceInfo *info, GAsyncResult *res, GError **error)
 {
-        GList *gets;
-
-        for (gets = pending_gets; gets; gets = gets->next) {
-                GetIconURLData *data;
-                const char *udn1;
-                const char *udn2;
-
-                data = gets->data;
-                udn1 = gupnp_device_info_get_udn (info);
-                udn2 = gupnp_device_info_get_udn (data->info);
-
-                if (udn1 && udn2 && strcmp (udn1, udn2) == 0) {
-                        soup_session_cancel_message (download_session,
-                                                     data->message,
-                                                     SOUP_STATUS_CANCELLED);
-                        break;
-                }
-        }
+        g_return_val_if_fail (g_task_is_valid (res, info), NULL);
+
+        return g_task_propagate_pointer (G_TASK (res), error);
 }
 
 GdkPixbuf *
@@ -329,16 +310,6 @@ deinit_icons (void)
 {
         int i;
 
-        while (pending_gets) {
-                GetIconURLData *data;
-
-                data = pending_gets->data;
-
-                soup_session_cancel_message (download_session,
-                                             data->message,
-                                             SOUP_STATUS_CANCELLED);
-        }
-
         g_object_unref (download_session);
 
         for (i = 0; i < ICON_LAST; i++) {
diff --git a/src/common/icons.h b/src/common/icons.h
index 6b5fb95..7708a38 100644
--- a/src/common/icons.h
+++ b/src/common/icons.h
@@ -46,15 +46,14 @@ typedef enum
         ICON_LAST
 } IconID;
 
-typedef void (* DeviceIconAvailableCallback) (GUPnPDeviceInfo *info,
-                                              GdkPixbuf       *icon);
-
 void
-schedule_icon_update   (GUPnPDeviceInfo            *info,
-                        DeviceIconAvailableCallback callback);
+update_icon_async (GUPnPDeviceInfo *info,
+                   GCancellable *cancellable,
+                   GAsyncReadyCallback callback,
+                   gpointer user_data);
 
-void
-unschedule_icon_update (GUPnPDeviceInfo *info);
+GdkPixbuf *
+update_icon_finish (GUPnPDeviceInfo *info, GAsyncResult *res, GError **error);
 
 GdkPixbuf *
 get_icon_by_id         (IconID icon_id);
diff --git a/src/network-light/upnp.c b/src/network-light/upnp.c
index f02b077..5ff3a00 100644
--- a/src/network-light/upnp.c
+++ b/src/network-light/upnp.c
@@ -197,7 +197,7 @@ on_get_status (GUPnPService       *service,
                                   get_status (),
                                   NULL);
 
-        gupnp_service_action_return (action);
+        gupnp_service_action_return_success (action);
 }
 
 G_MODULE_EXPORT
@@ -212,7 +212,7 @@ on_get_target (GUPnPService       *service,
                                   get_status (),
                                   NULL);
 
-        gupnp_service_action_return (action);
+        gupnp_service_action_return_success (action);
 }
 
 G_MODULE_EXPORT
@@ -228,7 +228,7 @@ on_set_target (GUPnPService       *service,
                                   G_TYPE_BOOLEAN,
                                   &status,
                                   NULL);
-        gupnp_service_action_return (action);
+        gupnp_service_action_return_success (action);
 
         set_status (status);
 }
@@ -267,7 +267,7 @@ on_get_load_level_status (GUPnPService       *service,
                                   get_load_level (),
                                   NULL);
 
-        gupnp_service_action_return (action);
+        gupnp_service_action_return_success (action);
 }
 
 G_MODULE_EXPORT
@@ -282,7 +282,7 @@ on_get_load_level_target (GUPnPService       *service,
                                   get_load_level (),
                                   NULL);
 
-        gupnp_service_action_return (action);
+        gupnp_service_action_return_success (action);
 }
 
 G_MODULE_EXPORT
@@ -298,7 +298,7 @@ on_set_load_level_target (GUPnPService       *service,
                                   G_TYPE_UINT,
                                   &load_level,
                                   NULL);
-        gupnp_service_action_return (action);
+        gupnp_service_action_return_success (action);
 
         if (load_level > 100)
                 load_level = 100;
@@ -809,10 +809,10 @@ init_upnp (gchar **interfaces, guint port, gchar *name, gboolean ipv4, gboolean
         g_assert (context_manager != NULL);
 
         if (interfaces != NULL) {
-                white_list = gupnp_context_manager_get_white_list
-                                            (context_manager);
-                gupnp_white_list_add_entryv (white_list, interfaces);
-                gupnp_white_list_set_enabled (white_list, TRUE);
+                white_list = gupnp_context_manager_get_context_filter (
+                        context_manager);
+                gupnp_context_filter_add_entryv (white_list, interfaces);
+                gupnp_context_filter_set_enabled (white_list, TRUE);
         }
 
         g_signal_connect (context_manager,
diff --git a/src/universal-cp/details-treeview.c b/src/universal-cp/details-treeview.c
index 0ac1c2b..d1e3716 100644
--- a/src/universal-cp/details-treeview.c
+++ b/src/universal-cp/details-treeview.c
@@ -310,7 +310,7 @@ void
 show_service_details (GUPnPServiceInfo *info)
 {
         char          *details[32];
-        const SoupURI *uri;
+        const GUri *uri;
         const char    *str;
         int            i = 0;
 
@@ -332,7 +332,7 @@ show_service_details (GUPnPServiceInfo *info)
         details[i++] = _("Base URL");
         uri = gupnp_service_info_get_url_base (info);
         if (uri)
-                details[i++] = soup_uri_to_string ((SoupURI *) uri, FALSE);
+                details[i++] = g_uri_to_string ((GUri *) uri);
 
         details[i++] = _("Service ID");
         details[i++] = gupnp_service_info_get_id (info);
@@ -357,7 +357,7 @@ void
 show_device_details (GUPnPDeviceInfo *info)
 {
         char          *details[32];
-        const SoupURI *uri;
+        const GUri *uri;
         const char    *str;
         int            i = 0;
 
@@ -379,7 +379,7 @@ show_device_details (GUPnPDeviceInfo *info)
         details[i++] = _("Base URL");
         uri = gupnp_device_info_get_url_base (info);
         if (uri)
-                details[i++] = soup_uri_to_string ((SoupURI *) uri, FALSE);
+                details[i++] = g_uri_to_string ((GUri *) uri);
 
         details[i++] = _("Friendly Name");
         details[i++] = gupnp_device_info_get_friendly_name (info);
diff --git a/src/universal-cp/device-treeview.c b/src/universal-cp/device-treeview.c
index df3a649..3d31b9f 100644
--- a/src/universal-cp/device-treeview.c
+++ b/src/universal-cp/device-treeview.c
@@ -324,7 +324,16 @@ remove_device (GUPnPDeviceInfo *info)
                 return;
 
         if (find_device (model, udn, &root_iter, &iter)) {
-                unschedule_icon_update (info);
+                GCancellable *cancellable =
+                        g_object_get_data (G_OBJECT (info),
+                                           "icon-download-cancellable");
+                if (cancellable != NULL) {
+                        g_cancellable_cancel (cancellable);
+
+                        g_object_set_data (G_OBJECT (info),
+                                           "icon-download-cancellable",
+                                           NULL);
+                }
                 gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
         }
 }
@@ -380,13 +389,21 @@ on_state_variable_changed (GUPnPServiceProxy *proxy,
 }
 
 static void
-on_device_icon_available (GUPnPDeviceInfo *info,
-                          GdkPixbuf       *icon)
+on_device_icon_available (GObject *source,
+                          GAsyncResult *res,
+                          gpointer user_data)
 {
         GtkTreeModel *model;
         GtkTreeIter   root_iter;
         GtkTreeIter   device_iter;
         const char   *udn;
+        g_autoptr (GError) error = NULL;
+        g_autoptr (GdkPixbuf) icon = NULL;
+
+        icon = update_icon_finish (GUPNP_DEVICE_INFO (source), res, &error);
+        if (error != NULL) {
+                g_debug ("Failed to download icon: %s", error->message);
+        }
 
         // There was no icon or there was an error getting that
         // icon. Just keep the default then
@@ -394,21 +411,22 @@ on_device_icon_available (GUPnPDeviceInfo *info,
                 return;
         }
 
-        model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
+        model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data));
         g_assert (model != NULL);
 
-        udn = gupnp_device_info_get_udn (info);
+        udn = gupnp_device_info_get_udn (GUPNP_DEVICE_INFO (source));
 
         if (!gtk_tree_model_get_iter_first (model, &root_iter))
                 return;
 
-        if (find_device (model, udn, &root_iter, &device_iter))
+        if (find_device (model, udn, &root_iter, &device_iter)) {
+                g_object_set_data (source, "icon-download-cancellable", NULL);
+
                 gtk_tree_store_set (GTK_TREE_STORE (model),
                                     &device_iter,
                                     0, icon,
                                     -1);
-
-        g_clear_object (&icon);
+        }
 }
 
 static void
@@ -553,20 +571,24 @@ append_introspection (GUPnPServiceProxy         *proxy,
 }
 
 static void
-got_introspection (GUPnPServiceInfo          *info,
-                   GUPnPServiceIntrospection *introspection,
-                   const GError              *error,
-                   gpointer                   user_data)
+got_introspection (GObject *source, GAsyncResult *res, gpointer user_data)
 {
         GtkTreeModel *model;
         GtkTreeIter  *service_iter;
+        GError *error = NULL;
+
+        GUPnPServiceIntrospection *introspection =
+                gupnp_service_info_introspect_finish (
+                        GUPNP_SERVICE_INFO (source),
+                        res,
+                        &error);
 
         service_iter = (GtkTreeIter *) user_data;
 
         model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
         g_assert (model != NULL);
 
-        append_introspection (GUPNP_SERVICE_PROXY (info),
+        append_introspection (GUPNP_SERVICE_PROXY (source),
                               introspection,
                               GTK_TREE_STORE (model),
                               service_iter);
@@ -576,7 +598,9 @@ got_introspection (GUPnPServiceInfo          *info,
                 g_object_unref (introspection);
 
                 /* Services are subscribed to by default */
-                gupnp_service_proxy_set_subscribed (GUPNP_SERVICE_PROXY (info), TRUE);
+                gupnp_service_proxy_set_subscribed (
+                        GUPNP_SERVICE_PROXY (source),
+                        TRUE);
         }
 }
 
@@ -602,9 +626,10 @@ append_service_tree (GUPnPServiceInfo *info,
                                  5, ICON_SERVICE,
                                  -1);
 
-                gupnp_service_info_get_introspection_async (info,
-                                                            got_introspection,
-                                                            service_iter);
+                gupnp_service_info_introspect_async (info,
+                                                     NULL,
+                                                     got_introspection,
+                                                     service_iter);
 
                 g_free (id);
         }
@@ -621,6 +646,7 @@ append_device_tree (GUPnPDeviceInfo *info,
         if (friendly_name) {
                 GtkTreeIter device_iter;
                 GList *child;
+                GCancellable *cancellable = g_cancellable_new ();
 
                 gtk_tree_store_insert_with_values
                                 (GTK_TREE_STORE (model),
@@ -632,7 +658,14 @@ append_device_tree (GUPnPDeviceInfo *info,
                                  -1);
                 g_free (friendly_name);
 
-                schedule_icon_update (info, on_device_icon_available);
+                g_object_set_data_full (G_OBJECT (info),
+                                        "icon-download-cancellable",
+                                        cancellable,
+                                        g_object_unref);
+                update_icon_async (info,
+                                   cancellable,
+                                   on_device_icon_available,
+                                   treeview);
 
                 /* Append the embedded devices */
                 child = gupnp_device_info_list_devices (info);
diff --git a/subprojects/gssdp-1.2.wrap b/subprojects/gssdp-1.6.wrap
similarity index 83%
rename from subprojects/gssdp-1.2.wrap
rename to subprojects/gssdp-1.6.wrap
index 469c75d..34d9b0b 100644
--- a/subprojects/gssdp-1.2.wrap
+++ b/subprojects/gssdp-1.6.wrap
@@ -1,6 +1,6 @@
 [wrap-git]
 url = https://gitlab.gnome.org/GNOME/gssdp.git
-revision = gssdp-1.4
+revision = master
 depth = 1
  
 [provides]
diff --git a/subprojects/gupnp-1.2.wrap b/subprojects/gupnp-1.6.wrap
similarity index 83%
rename from subprojects/gupnp-1.2.wrap
rename to subprojects/gupnp-1.6.wrap
index 3c6f48a..c345910 100644
--- a/subprojects/gupnp-1.2.wrap
+++ b/subprojects/gupnp-1.6.wrap
@@ -1,6 +1,6 @@
 [wrap-git]
 url = https://gitlab.gnome.org/GNOME/gupnp.git
-revision = gupnp-1.4
+revision = master
 depth = 1
  
 [provides]


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