diff options
Diffstat (limited to 'src/av-cp')
-rw-r--r-- | src/av-cp/playlist-treeview.c | 1 | ||||
-rw-r--r-- | src/av-cp/renderer-combo.c | 34 | ||||
-rw-r--r-- | src/av-cp/server-device.c | 26 |
3 files changed, 46 insertions, 15 deletions
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 |