[gupnp-tools] av-cp: Fix DIDL browser
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gupnp-tools] av-cp: Fix DIDL browser
- Date: Mon, 25 Apr 2016 21:37:32 +0000 (UTC)
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]