summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Georg <mail@jensge.org>2020-07-18 18:50:22 +0200
committerJens Georg <mail@jensge.org>2020-07-18 18:50:22 +0200
commit59a5b38947a61ad0d1f50ef4face08849132383f (patch)
tree910eb8aed71ae806920f6001b6374877d4bf0a97
parent5da240ddc9ef233c42f739a4ed861a08133fe508 (diff)
downloadgupnp-tools-59a5b38947a61ad0d1f50ef4face08849132383f.tar.gz
av-cp: Also introspect SeachCaps on discovery
-rw-r--r--src/av-cp/server-device.c65
-rw-r--r--src/av-cp/server-device.h5
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 */