[gupnp-tools] av-cp: Also introspect SeachCaps on discovery



commit 59a5b38947a61ad0d1f50ef4face08849132383f
Author: Jens Georg <mail jensge org>
Date:   Sat Jul 18 18:50:22 2020 +0200

    av-cp: Also introspect SeachCaps on discovery

 src/av-cp/server-device.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++-
 src/av-cp/server-device.h |  5 ++--
 2 files changed, 67 insertions(+), 3 deletions(-)
---
diff --git a/src/av-cp/server-device.c b/src/av-cp/server-device.c
index 189f654..19b990b 100644
--- a/src/av-cp/server-device.c
+++ b/src/av-cp/server-device.c
@@ -54,6 +54,11 @@ av_cp_media_server_introspect (AVCPMediaServer *self);
 static void
 av_cp_media_server_introspect_finish (AVCPMediaServer *self);
 
+static void
+av_cp_media_server_on_get_search_caps (GUPnPServiceProxy *proxy,
+                                       GUPnPServiceProxyAction *action,
+                                       gpointer user_data);
+
 enum _AVCPMediaServerInitState {
         NONE = 0,
         INITIALIZED,
@@ -65,6 +70,7 @@ typedef enum _AVCPMediaServerInitState AVCPMediaServerInitState;
 struct _AVCPMediaServerPrivate {
         GdkPixbuf *icon;
         char *default_sort_order;
+        char **search_caps;
         GList *tasks;
         AVCPMediaServerInitState state;
         GUPnPServiceProxy *content_directory;
@@ -82,6 +88,7 @@ enum
 {
         PROP_ICON = 1,
         PROP_SORT_ORDER,
+        PROP_SEARCH_CAPS,
         N_PROPERTIES
 };
 
@@ -112,6 +119,7 @@ av_cp_media_server_dispose (GObject *object)
 
         g_clear_object (&priv->icon);
         g_clear_object (&priv->content_directory);
+        g_clear_pointer (&priv->search_caps, g_strfreev);
 
         parent_class->dispose (object);
 }
@@ -132,6 +140,9 @@ av_cp_media_server_get_property (GObject    *obj,
         case PROP_SORT_ORDER:
                 g_value_set_string (value, priv->default_sort_order);
                 break;
+        case PROP_SEARCH_CAPS:
+                g_value_set_pointer (value, priv->search_caps);
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, spec);
                 break;
@@ -180,10 +191,48 @@ av_cp_media_server_on_get_sort_caps (GUPnPServiceProxy *proxy,
 
                 g_free (sort_caps);
         }
+        g_object_notify (G_OBJECT (self), "sort-order");
+
+        gupnp_service_proxy_begin_action
+                        (priv->content_directory,
+                                "GetSearchCapabilities",
+                                av_cp_media_server_on_get_search_caps,
+                                self,
+                                NULL);
+}
+
+static void
+av_cp_media_server_on_get_search_caps (GUPnPServiceProxy *proxy,
+                                       GUPnPServiceProxyAction *action,
+                                       gpointer user_data)
+{
+        AVCPMediaServer *self = AV_CP_MEDIA_SERVER (user_data);
+        AVCPMediaServerPrivate *priv = av_cp_media_server_get_instance_private (self);
+
+
+        GError *error = NULL;
+        char *search_caps = NULL;
+
+        gupnp_service_proxy_end_action (proxy,
+                                        action,
+                                        &error,
+                                        "SearchCaps",
+                                        G_TYPE_STRING,
+                                        &search_caps,
+                                        NULL);
+        if (error != NULL) {
+                g_warning ("Failed to get sort caps from server: %s",
+                           error->message);
+                g_error_free (error);
+        } else if (search_caps != NULL) {
+                priv->search_caps = g_strsplit (search_caps, ",", -1);
+        } else {
+                priv->search_caps = g_strsplit ("upnp:class,@id", ",", -1);
+        }
+        g_object_notify (G_OBJECT (self), "search-caps");
 
         priv->state = INITIALIZED;
         av_cp_media_server_introspect_finish (self);
-        g_object_notify (G_OBJECT (self), "sort-order");
         g_object_unref (self);
 }
 
@@ -212,6 +261,13 @@ av_cp_media_server_class_init (AVCPMediaServerClass *klass)
                                      G_PARAM_STATIC_STRINGS |
                                      G_PARAM_READABLE);
 
+        av_cp_media_server_properties[PROP_SEARCH_CAPS] =
+                g_param_spec_pointer ("search-caps",
+                                      "search-caps",
+                                      "search-caps",
+                                      G_PARAM_STATIC_STRINGS |
+                                      G_PARAM_READABLE);
+
         g_object_class_install_properties (obj_class,
                                            N_PROPERTIES,
                                            av_cp_media_server_properties);
@@ -616,3 +672,10 @@ av_cp_media_server_search_finish (AVCPMediaServer  *self,
         return av_cp_media_server_browse_finish (self, result, didl_xml,
                 total_matches, number_returned, error);
 }
+
+char**
+av_cp_media_server_get_search_caps (AVCPMediaServer *self) {
+        AVCPMediaServerPrivate *priv = av_cp_media_server_get_instance_private (self);
+
+        return priv->search_caps;
+}
diff --git a/src/av-cp/server-device.h b/src/av-cp/server-device.h
index 7179560..3a68403 100644
--- a/src/av-cp/server-device.h
+++ b/src/av-cp/server-device.h
@@ -53,8 +53,6 @@ typedef struct _AVCPMediaServerPrivate AVCPMediaServerPrivate;
 
 struct _AVCPMediaServer {
         GUPnPDeviceProxy parent;
-
-        AVCPMediaServerPrivate *priv;
 };
 
 struct _AVCPMediaServerClass {
@@ -113,6 +111,9 @@ av_cp_media_server_search_finish (AVCPMediaServer  *self,
                                   guint32          *number_returned,
                                   GError          **error);
 
+char**
+av_cp_media_server_get_search_caps (AVCPMediaServer *self);
+
 G_END_DECLS
 
 #endif /* MEDIA_SERVER_H */


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