diff options
author | Jens Georg <mail@jensge.org> | 2020-07-18 18:50:22 +0200 |
---|---|---|
committer | Jens Georg <mail@jensge.org> | 2020-07-18 18:50:22 +0200 |
commit | 59a5b38947a61ad0d1f50ef4face08849132383f (patch) | |
tree | 910eb8aed71ae806920f6001b6374877d4bf0a97 | |
parent | 5da240ddc9ef233c42f739a4ed861a08133fe508 (diff) | |
download | gupnp-tools-59a5b38947a61ad0d1f50ef4face08849132383f.tar.gz |
av-cp: Also introspect SeachCaps on discovery
-rw-r--r-- | src/av-cp/server-device.c | 65 | ||||
-rw-r--r-- | 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 */ |