[gupnp-tools] av-cp: Fix DIDL browser



commit 274ccb3f5c48e50f328f23741d894881d565d21e
Author: Jens Georg <mail jensge org>
Date:   Sat Apr 2 22:11:42 2016 +0200

    av-cp: Fix DIDL browser
    
    Signed-off-by: Jens Georg <mail jensge org>
    
    https://bugzilla.gnome.org/show_bug.cgi?id=730747

 src/av-cp/playlist-treeview.c |   77 +++++++++++++------------------------
 src/av-cp/server-device.c     |   85 +++++++++++++++++++++++++++++++++++++++++
 src/av-cp/server-device.h     |   13 ++++++
 3 files changed, 125 insertions(+), 50 deletions(-)
---
diff --git a/src/av-cp/playlist-treeview.c b/src/av-cp/playlist-treeview.c
index 77129ec..1b485a6 100644
--- a/src/av-cp/playlist-treeview.c
+++ b/src/av-cp/playlist-treeview.c
@@ -893,9 +893,9 @@ browse_cb (GObject *object,
 }
 
 static void
-browse_metadata_cb (GUPnPServiceProxy       *content_dir,
-                    GUPnPServiceProxyAction *action,
-                    gpointer                 user_data)
+browse_metadata_cb (GObject      *object,
+                    GAsyncResult *result,
+                    gpointer      user_data)
 {
         BrowseMetadataData *data;
         char               *metadata;
@@ -906,15 +906,12 @@ browse_metadata_cb (GUPnPServiceProxy       *content_dir,
         metadata = NULL;
         error = NULL;
 
-        gupnp_service_proxy_end_action (content_dir,
-                                        action,
-                                        &error,
-                                        /* OUT args */
-                                        "Result",
-                                        G_TYPE_STRING,
-                                        &metadata,
-                                        NULL);
-        if (metadata) {
+        av_cp_media_server_browse_metadata_finish (AV_CP_MEDIA_SERVER (object),
+                                                   result,
+                                                   &metadata,
+                                                   &error);
+
+        if (metadata != NULL) {
                 data->callback (metadata, data->user_data);
 
                 g_free (metadata);
@@ -927,7 +924,6 @@ browse_metadata_cb (GUPnPServiceProxy       *content_dir,
         }
 
         browse_metadata_data_free (data);
-        g_object_unref (content_dir);
 }
 
 static void
@@ -952,39 +948,20 @@ browse (AVCPMediaServer *server,
 }
 
 static void
-browse_metadata (GUPnPServiceProxy *content_dir,
-                 const char        *id,
-                 MetadataFunc       callback,
-                 gpointer           user_data)
+browse_metadata (AVCPMediaServer *server,
+                 const char      *id,
+                 MetadataFunc     callback,
+                 gpointer         user_data)
 {
         BrowseMetadataData *data;
 
         data = browse_metadata_data_new (callback, id, user_data);
 
-        gupnp_service_proxy_begin_action
-                                (g_object_ref (content_dir),
-                                 "Browse",
-                                 browse_metadata_cb,
-                                 data,
-                                 /* IN args */
-                                 "ObjectID",
-                                 G_TYPE_STRING,
-                                 data->id,
-                                 "BrowseFlag",
-                                 G_TYPE_STRING,
-                                 "BrowseMetadata",
-                                 "Filter",
-                                 G_TYPE_STRING,
-                                 "*",
-                                 "StartingIndex",
-                                 G_TYPE_UINT,
-                                 0,
-                                 "RequestedCount",
-                                 G_TYPE_UINT, 0,
-                                 "SortCriteria",
-                                 G_TYPE_STRING,
-                                 "",
-                                 NULL);
+        av_cp_media_server_browse_metadata_async (server,
+                                                  NULL,
+                                                  browse_metadata_cb,
+                                                  id,
+                                                  data);
 }
 
 static void
@@ -1104,12 +1081,12 @@ gboolean
 get_selected_object (MetadataFunc callback,
                      gpointer     user_data)
 {
-        GUPnPServiceProxy  *content_dir;
-        GtkTreeSelection   *selection;
-        GtkTreeModel       *model;
-        GtkTreeIter         iter;
-        char               *id = NULL;
-        gboolean            ret = FALSE;
+        AVCPMediaServer   *server;
+        GtkTreeSelection  *selection;
+        GtkTreeModel      *model;
+        GtkTreeIter        iter;
+        char              *id = NULL;
+        gboolean           ret = FALSE;
 
         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
         g_assert (selection != NULL);
@@ -1120,11 +1097,11 @@ get_selected_object (MetadataFunc callback,
 
         gtk_tree_model_get (model,
                             &iter,
-                            3, &content_dir,
+                            2, &server,
                             4, &id,
                             -1);
 
-        browse_metadata (g_object_ref (content_dir), id, callback, user_data);
+        browse_metadata (server, id, callback, user_data);
 
         ret = TRUE;
 
@@ -1132,7 +1109,7 @@ get_selected_object (MetadataFunc callback,
                 g_free (id);
         }
 
-        g_object_unref (content_dir);
+        g_object_unref (server);
 
 return_point:
         return ret;
diff --git a/src/av-cp/server-device.c b/src/av-cp/server-device.c
index eac8283..73ed478 100644
--- a/src/av-cp/server-device.c
+++ b/src/av-cp/server-device.c
@@ -469,3 +469,88 @@ av_cp_media_server_browse_finish (AVCPMediaServer  *self,
 
         return FALSE;
 }
+
+static void
+av_cp_media_server_on_browse_metadata (GUPnPServiceProxy       *content_dir,
+                                       GUPnPServiceProxyAction *action,
+                                       gpointer                 user_data)
+{
+        GTask   *task = G_TASK (user_data);
+        GError  *error = NULL;
+        char    *didl_xml = NULL;
+
+        gupnp_service_proxy_end_action (content_dir,
+                                        action,
+                                        &error,
+                                        /* OUT args */
+                                        "Result",
+                                        G_TYPE_STRING,
+                                        &didl_xml,
+                                        NULL);
+        if (error != NULL) {
+                g_task_return_error (task, error);
+        } else {
+                g_task_return_pointer (task, didl_xml, g_free);
+        }
+
+        g_object_unref (task);
+}
+
+void
+av_cp_media_server_browse_metadata_async (AVCPMediaServer     *self,
+                                          GCancellable        *cancellable,
+                                          GAsyncReadyCallback  callback,
+                                          const char          *id,
+                                          gpointer             user_data)
+{
+        GTask *task = g_task_new (self, cancellable, callback, user_data);
+
+        gupnp_service_proxy_begin_action
+                                (self->priv->content_directory,
+                                 "Browse",
+                                 av_cp_media_server_on_browse_metadata,
+                                 task,
+                                 /* IN args */
+                                 "ObjectID",
+                                 G_TYPE_STRING,
+                                 id,
+                                 "BrowseFlag",
+                                 G_TYPE_STRING,
+                                 "BrowseMetadata",
+                                 "Filter",
+                                 G_TYPE_STRING,
+                                 "*",
+                                 "StartingIndex",
+                                 G_TYPE_UINT,
+                                 0,
+                                 "RequestedCount",
+                                 G_TYPE_UINT, 0,
+                                 "SortCriteria",
+                                 G_TYPE_STRING,
+                                 "",
+                                 NULL);
+}
+
+gboolean
+av_cp_media_server_browse_metadata_finish (AVCPMediaServer  *self,
+                                           GAsyncResult     *result,
+                                           char            **didl_xml,
+                                           GError          **error)
+{
+        char *res;
+
+        g_return_val_if_fail (g_task_is_valid (result, self), FALSE);
+
+        res = g_task_propagate_pointer (G_TASK (result), error);
+        if (res != NULL) {
+                if (didl_xml != NULL) {
+                        *didl_xml = res;
+                } else {
+                        g_free (res);
+                }
+
+                return TRUE;
+        }
+
+        return FALSE;
+}
diff --git a/src/av-cp/server-device.h b/src/av-cp/server-device.h
index c441a78..c66fd5f 100644
--- a/src/av-cp/server-device.h
+++ b/src/av-cp/server-device.h
@@ -82,6 +82,19 @@ av_cp_media_server_browse_finish (AVCPMediaServer  *self,
                                   guint32          *number_returned,
                                   GError          **error);
 
+void
+av_cp_media_server_browse_metadata_async (AVCPMediaServer     *self,
+                                          GCancellable        *cancellable,
+                                          GAsyncReadyCallback  callback,
+                                          const char          *container_id,
+                                          gpointer             user_data);
+
+gboolean
+av_cp_media_server_browse_metadata_finish (AVCPMediaServer  *self,
+                                           GAsyncResult     *result,
+                                           char            **didl_xml,
+                                           GError          **error);
+
 G_END_DECLS
 
 #endif /* MEDIA_SERVER_H */


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