/* * Copyright (C) 2009 Nokia Corporation. * Copyright (C) 2007, 2008 OpenedHand Ltd. * Copyright (C) 2012 Intel Corporation * * Authors: Zeeshan Ali (Khattak) * * Jorn Baayen * Krzesimir Nowak * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** * SECTION:gupnp-didl-lite-resource * @short_description: DIDL-Lite Resource * * #GUPnPDIDLLiteResource respresent a DIDL-Lite resource (res) element. */ #include #include "gupnp-didl-lite-resource.h" #include "gupnp-didl-lite-resource-private.h" #include "xml-util.h" #include "time-utils.h" #include "xsd-data.h" G_DEFINE_TYPE (GUPnPDIDLLiteResource, gupnp_didl_lite_resource, G_TYPE_OBJECT); struct _GUPnPDIDLLiteResourcePrivate { xmlNode *xml_node; GUPnPAVXMLDoc *xml_doc; xmlNs *dlna_ns; xmlNs *pv_ns; GUPnPProtocolInfo *protocol_info; }; enum { PROP_0, PROP_XML_NODE, PROP_XML_DOC, PROP_DLNA_NAMESPACE, PROP_PV_NAMESPACE, PROP_URI, PROP_IMPORT_URI, PROP_PROTOCOL_INFO, PROP_SIZE, PROP_SIZE64, PROP_CLEAR_TEXT_SIZE, PROP_DURATION, PROP_BITRATE, PROP_SAMPLE_FREQ, PROP_BITS_PER_SAMPLE, PROP_PROTECTION, PROP_AUDIO_CHANNELS, PROP_WIDTH, PROP_HEIGHT, PROP_COLOR_DEPTH, PROP_UPDATE_COUNT, PROP_TRACK_TOTAL, PROP_SUBTITLE_FILE_TYPE, PROP_SUBTITLE_FILE_URI }; static void get_resolution_info (GUPnPDIDLLiteResource *resource, int *width, int *height) { const char *resolution; char **tokens; resolution = xml_util_get_attribute_content (resource->priv->xml_node, "resolution"); if (resolution == NULL) return; tokens = g_strsplit (resolution, "x", -1); if (tokens == NULL || tokens[0] == NULL || tokens[1] == NULL) { g_warning ("Failed to resolution string '%s'\n", resolution); goto return_point; } if (width) *width = atoi (tokens[0]); if (height) *height = atoi (tokens[1]); return_point: g_strfreev (tokens); } static void on_protocol_info_changed (GUPnPProtocolInfo *info, G_GNUC_UNUSED GParamSpec *pspec, gpointer user_data) { GUPnPDIDLLiteResource *resource = GUPNP_DIDL_LITE_RESOURCE (user_data); gupnp_didl_lite_resource_set_protocol_info (resource, info); } static void gupnp_didl_lite_resource_init (GUPnPDIDLLiteResource *resource) { resource->priv = G_TYPE_INSTANCE_GET_PRIVATE (resource, GUPNP_TYPE_DIDL_LITE_RESOURCE, GUPnPDIDLLiteResourcePrivate); } static void gupnp_didl_lite_resource_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GUPnPDIDLLiteResource *resource; resource = GUPNP_DIDL_LITE_RESOURCE (object); switch (property_id) { case PROP_XML_NODE: resource->priv->xml_node = g_value_get_pointer (value); break; case PROP_XML_DOC: resource->priv->xml_doc = g_value_dup_boxed (value); break; case PROP_URI: gupnp_didl_lite_resource_set_uri (resource, g_value_get_string (value)); break; case PROP_IMPORT_URI: gupnp_didl_lite_resource_set_import_uri (resource, g_value_get_string (value)); break; case PROP_PROTOCOL_INFO: gupnp_didl_lite_resource_set_protocol_info (resource, g_value_get_object (value)); break; case PROP_SIZE: gupnp_didl_lite_resource_set_size (resource, g_value_get_long (value)); break; case PROP_SIZE64: gupnp_didl_lite_resource_set_size64 (resource, g_value_get_int64 (value)); break; case PROP_DLNA_NAMESPACE: resource->priv->dlna_ns = g_value_get_pointer (value); break; case PROP_PV_NAMESPACE: resource->priv->pv_ns = g_value_get_pointer (value); break; case PROP_CLEAR_TEXT_SIZE: gupnp_didl_lite_resource_set_cleartext_size (resource, g_value_get_int64 (value)); break; case PROP_DURATION: gupnp_didl_lite_resource_set_duration (resource, g_value_get_long (value)); break; case PROP_BITRATE: gupnp_didl_lite_resource_set_bitrate (resource, g_value_get_int (value)); break; case PROP_SAMPLE_FREQ: gupnp_didl_lite_resource_set_sample_freq (resource, g_value_get_int (value)); break; case PROP_BITS_PER_SAMPLE: gupnp_didl_lite_resource_set_bits_per_sample (resource, g_value_get_int (value)); break; case PROP_PROTECTION: gupnp_didl_lite_resource_set_protection (resource, g_value_get_string (value)); break; case PROP_AUDIO_CHANNELS: gupnp_didl_lite_resource_set_audio_channels (resource, g_value_get_int (value)); break; case PROP_WIDTH: gupnp_didl_lite_resource_set_width (resource, g_value_get_int (value)); break; case PROP_HEIGHT: gupnp_didl_lite_resource_set_height (resource, g_value_get_int (value)); break; case PROP_COLOR_DEPTH: gupnp_didl_lite_resource_set_color_depth (resource, g_value_get_int (value)); break; case PROP_UPDATE_COUNT: gupnp_didl_lite_resource_set_update_count (resource, g_value_get_uint (value)); break; case PROP_TRACK_TOTAL: gupnp_didl_lite_resource_set_track_total (resource, g_value_get_uint (value)); break; case PROP_SUBTITLE_FILE_TYPE: gupnp_didl_lite_resource_set_subtitle_file_type (resource, g_value_get_string (value)); break; case PROP_SUBTITLE_FILE_URI: gupnp_didl_lite_resource_set_subtitle_file_uri (resource, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void gupnp_didl_lite_resource_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { GUPnPDIDLLiteResource *resource; resource = GUPNP_DIDL_LITE_RESOURCE (object); switch (property_id) { case PROP_XML_NODE: g_value_set_pointer (value, gupnp_didl_lite_resource_get_xml_node (resource)); break; case PROP_URI: g_value_set_string (value, gupnp_didl_lite_resource_get_uri (resource)); break; case PROP_IMPORT_URI: g_value_set_string (value, gupnp_didl_lite_resource_get_import_uri (resource)); break; case PROP_PROTOCOL_INFO: g_value_set_object (value, gupnp_didl_lite_resource_get_protocol_info (resource)); break; case PROP_SIZE: g_value_set_long (value, gupnp_didl_lite_resource_get_size (resource)); break; case PROP_SIZE64: g_value_set_int64 (value, gupnp_didl_lite_resource_get_size64 (resource)); break; case PROP_DLNA_NAMESPACE: g_value_set_pointer (value, gupnp_didl_lite_resource_get_dlna_namespace (resource)); break; case PROP_PV_NAMESPACE: g_value_set_pointer (value, gupnp_didl_lite_resource_get_pv_namespace (resource)); break; case PROP_CLEAR_TEXT_SIZE: g_value_set_int64 (value, gupnp_didl_lite_resource_get_cleartext_size (resource)); break; case PROP_DURATION: g_value_set_long (value, gupnp_didl_lite_resource_get_duration (resource)); break; case PROP_BITRATE: g_value_set_int (value, gupnp_didl_lite_resource_get_bitrate (resource)); break; case PROP_BITS_PER_SAMPLE: g_value_set_int (value, gupnp_didl_lite_resource_get_bits_per_sample (resource)); break; case PROP_SAMPLE_FREQ: g_value_set_int (value, gupnp_didl_lite_resource_get_sample_freq (resource)); break; case PROP_PROTECTION: g_value_set_string (value, gupnp_didl_lite_resource_get_protection (resource)); break; case PROP_AUDIO_CHANNELS: g_value_set_int (value, gupnp_didl_lite_resource_get_audio_channels (resource)); break; case PROP_WIDTH: g_value_set_int (value, gupnp_didl_lite_resource_get_width (resource)); break; case PROP_HEIGHT: g_value_set_int (value, gupnp_didl_lite_resource_get_height (resource)); break; case PROP_COLOR_DEPTH: g_value_set_int (value, gupnp_didl_lite_resource_get_color_depth (resource)); break; case PROP_UPDATE_COUNT: g_value_set_uint (value, gupnp_didl_lite_resource_get_update_count (resource)); break; case PROP_TRACK_TOTAL: g_value_set_uint (value, gupnp_didl_lite_resource_get_track_total (resource)); break; case PROP_SUBTITLE_FILE_TYPE: g_value_set_string (value, gupnp_didl_lite_resource_get_subtitle_file_type (resource)); break; case PROP_SUBTITLE_FILE_URI: g_value_set_string (value, gupnp_didl_lite_resource_get_subtitle_file_uri (resource)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void gupnp_didl_lite_resource_dispose (GObject *object) { GObjectClass *object_class; GUPnPDIDLLiteResourcePrivate *priv; priv = GUPNP_DIDL_LITE_RESOURCE (object)->priv; g_clear_pointer (&priv->xml_doc, xml_doc_unref); if (priv->protocol_info != NULL) { g_object_unref (priv->protocol_info); priv->protocol_info = NULL; } object_class = G_OBJECT_CLASS (gupnp_didl_lite_resource_parent_class); object_class->dispose (object); } static void gupnp_didl_lite_resource_class_init (GUPnPDIDLLiteResourceClass *klass) { GObjectClass *object_class; object_class = G_OBJECT_CLASS (klass); object_class->set_property = gupnp_didl_lite_resource_set_property; object_class->get_property = gupnp_didl_lite_resource_get_property; object_class->dispose = gupnp_didl_lite_resource_dispose; g_type_class_add_private (klass, sizeof (GUPnPDIDLLiteResourcePrivate)); /** * GUPnPDIDLLiteResource:xml-node: * * The pointer to res node in XML document. **/ g_object_class_install_property (object_class, PROP_XML_NODE, g_param_spec_pointer ("xml-node", "XMLNode", "The pointer to res node in XML" " document.", G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:xml-doc: * * The reference to XML document containing this object. * * Internal property. * * Stability: Private **/ g_object_class_install_property (object_class, PROP_XML_DOC, g_param_spec_boxed ("xml-doc", "XMLDoc", "The reference to XML document" " containing this object.", xml_doc_get_type (), G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:uri: * * The URI associated with this resource. **/ g_object_class_install_property (object_class, PROP_URI, g_param_spec_string ("uri", "URI", "The URI associated with this resource", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:import-uri: * * The Import URI associated with this resource. **/ g_object_class_install_property (object_class, PROP_IMPORT_URI, g_param_spec_string ("import-uri", "ImportURI", "The import URI associated with this" " resource", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:protocol-info: * * The protocol info associated with this resource. **/ g_object_class_install_property (object_class, PROP_PROTOCOL_INFO, g_param_spec_object ("protocol-info", "ProtocolInfo", "The protocol info associated with this" " resource", GUPNP_TYPE_PROTOCOL_INFO, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:size: * * The size (in bytes) of this resource. **/ g_object_class_install_property (object_class, PROP_SIZE, g_param_spec_long ("size", "Size", "The size (in bytes) of this resource.", -1, G_MAXLONG, -1, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:size64: * * The size (in bytes) of this resource. **/ g_object_class_install_property (object_class, PROP_SIZE64, g_param_spec_int64 ("size64", "Size64", "The size (in bytes) of this resource.", -1, G_MAXINT64, -1, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:clearTextsize: * * The size (in bytes) of this resource. **/ g_object_class_install_property (object_class, PROP_CLEAR_TEXT_SIZE, g_param_spec_int64 ("cleartext-size", "ClearTextSize", "The clear text size (in bytes) of this resource.", -1, G_MAXLONG, -1, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:dlna-namespace: * * Pointer to the DLNA metadata namespace registered with the * resource object. * **/ g_object_class_install_property (object_class, PROP_DLNA_NAMESPACE, g_param_spec_pointer ("dlna-namespace", "XML namespace", "Pointer to the DLNA metadata namespace " "registered with the resource.", G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:pv-namespace: * * Pointer to the PV metadata namespace registered with the * resource object. * **/ g_object_class_install_property (object_class, PROP_PV_NAMESPACE, g_param_spec_pointer ("pv-namespace", "XML namespace", "Pointer to the PV metadata namespace " "registered with the resource.", G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); /** * GUPnPDIDLLiteResource:duration: * * The duration (in seconds) of this resource. **/ g_object_class_install_property (object_class, PROP_DURATION, g_param_spec_long ("duration", "Duration", "The duration (in seconds) of this" " resource.", -1, G_MAXLONG, -1, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:bitrate: * * The bitrate of this resource. **/ g_object_class_install_property (object_class, PROP_BITRATE, g_param_spec_int ("bitrate", "Bitrate", "The bitrate of this resource.", -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:sample-freq: * * The sample frequency of this resource. **/ g_object_class_install_property (object_class, PROP_SAMPLE_FREQ, g_param_spec_int ("sample-freq", "SampleFrequency", "The sample frequency of this resource.", -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:bits-per-sample: * * The sample size of this resource. **/ g_object_class_install_property (object_class, PROP_BITS_PER_SAMPLE, g_param_spec_int ("bits-per-sample", "BitsPerSample", "The sample size of this resource.", -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:protection: * * The protection system used for this resource. **/ g_object_class_install_property (object_class, PROP_PROTECTION, g_param_spec_string ("protection", "Protection", "The protection system used by this" " resource.", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:audio-channels: * * The number of audio channels in this resource. **/ g_object_class_install_property (object_class, PROP_AUDIO_CHANNELS, g_param_spec_int ("audio-channels", "AudioChannels", "The number of audio channels in this" " resource.", -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:width: * * The width of this image/video resource. **/ g_object_class_install_property (object_class, PROP_WIDTH, g_param_spec_int ("width", "Width", "The width of this image/video resource.", -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:height: * * The height of this image/video resource. **/ g_object_class_install_property (object_class, PROP_HEIGHT, g_param_spec_int ("height", "Height", "The height of this image/video resource.", -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:color-depth: * * The color-depth of this image/video resource. **/ g_object_class_install_property (object_class, PROP_COLOR_DEPTH, g_param_spec_int ("color-depth", "ColorDepth", "The color-depth of this image/video" " resource.", -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:update_count: * * The update count of this resource. **/ g_object_class_install_property (object_class, PROP_UPDATE_COUNT, g_param_spec_uint ("update-count", "UpdateCount", "The update count of this resource.", 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteResource:track-total: * * Number of tracks in a DIDL_S or DIDL_V resource. **/ g_object_class_install_property (object_class, PROP_TRACK_TOTAL, g_param_spec_uint ("track-total", "TrackTotal", "The number of tracks of this " "resource.", 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GUPnPDIDLLiteResource:subtitle-file-type: * * Type of external subtitle file. Usually SRT or SMI. **/ g_object_class_install_property (object_class, PROP_SUBTITLE_FILE_TYPE, g_param_spec_string ("subtitle-file-type", "Subtitle file type", "Type of the external subtitle " "file", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GUPnPDIDLLiteResource:subtitle-file-uri: * * Uri to external subtitle file. **/ g_object_class_install_property (object_class, PROP_SUBTITLE_FILE_TYPE, g_param_spec_string ("subtitle-file-uri", "Subtitle file uri", "Uri of the external subtitle " "file", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } /** * gupnp_didl_lite_resource_new_from_xml: * @xml_node: The pointer to 'res' node in XML document * @xml_doc: The reference to XML document containing this resource * * Creates a new #GUPnPDIDLLiteResource for the @xml_node. * * Return value: A new #GUPnPDIDLLiteResource object. Unref after usage. **/ GUPnPDIDLLiteResource * gupnp_didl_lite_resource_new_from_xml (xmlNode *xml_node, GUPnPAVXMLDoc *xml_doc, xmlNs *dlna_ns, xmlNs *pv_ns) { return g_object_new (GUPNP_TYPE_DIDL_LITE_RESOURCE, "xml-node", xml_node, "xml-doc", xml_doc, "dlna-namespace", dlna_ns, "pv-namespace", pv_ns, NULL); } /** * gupnp_didl_lite_resource_get_xml_node: * @resource: The #GUPnPDIDLLiteResource * * Get the pointer to res node in XML document. * * Returns: (transfer none): The pointer to res node in XML document. **/ xmlNode * gupnp_didl_lite_resource_get_xml_node (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), NULL); return resource->priv->xml_node; } /** * gupnp_didl_lite_resource_get_dlna_namespace: * @resource: The #GUPnPDIDLLiteObject * * Get the pointer to the DLNA metadata namespace registered with the XML * document containing this object. * * Returns: (transfer none): The pointer to DLNA namespace in XML document. **/ xmlNsPtr gupnp_didl_lite_resource_get_dlna_namespace (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), NULL); return resource->priv->dlna_ns; } /** * gupnp_didl_lite_resource_get_pv_namespace: * @resource: The #GUPnPDIDLLiteObject * * Get the pointer to the DLNA metadata namespace registered with the XML * document containing this object. * * Returns: (transfer none): The pointer to DLNA namespace in XML document. **/ xmlNsPtr gupnp_didl_lite_resource_get_pv_namespace (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), NULL); return resource->priv->pv_ns; } /** * gupnp_didl_lite_resource_get_uri: * @resource: A #GUPnPDIDLLiteResource * * Get the URI associated with the @resource. * * Return value: The of URI the @resource or %NULL. **/ const char * gupnp_didl_lite_resource_get_uri (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), NULL); if (G_UNLIKELY (resource->priv->xml_node->children == NULL)) return NULL; return (const char *) resource->priv->xml_node->children->content; } /** * gupnp_didl_lite_resource_get_import_uri: * @resource: A #GUPnPDIDLLiteResource * * Get the import URI associated with the @resource. * * Return value: The import URI or %NULL. **/ const char * gupnp_didl_lite_resource_get_import_uri (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), NULL); return xml_util_get_attribute_content (resource->priv->xml_node, "importUri"); } /** * gupnp_didl_lite_resource_get_protocol_info: * @resource: A #GUPnPDIDLLiteResource * * Get the protocol info associated with the @resource. * * Returns: (transfer none): The protocol info associated with the @resource or %NULL. The * returned object must not be unrefed. **/ GUPnPProtocolInfo * gupnp_didl_lite_resource_get_protocol_info (GUPnPDIDLLiteResource *resource) { GUPnPProtocolInfo *info; const char *protocol_info; GError *error; g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), NULL); if (resource->priv->protocol_info != NULL) return resource->priv->protocol_info; protocol_info = xml_util_get_attribute_content (resource->priv->xml_node, "protocolInfo"); if (protocol_info == NULL) return NULL; error = NULL; info = gupnp_protocol_info_new_from_string (protocol_info, &error); if (info == NULL) { g_warning ("Error parsing protocolInfo '%s': %s", protocol_info, error->message); g_error_free (error); } resource->priv->protocol_info = info; return info; } /** * gupnp_didl_lite_resource_get_size: * @resource: A #GUPnPDIDLLiteResource * * Get the size (in bytes) of the @resource. * * Return value: The size (in bytes) of the @resource or -1. **/ glong gupnp_didl_lite_resource_get_size (GUPnPDIDLLiteResource *resource) { return (glong) gupnp_didl_lite_resource_get_size64 (resource); } /** * gupnp_didl_lite_resource_get_size64: * @resource: A #GUPnPDIDLLiteResource * * Get the size (in bytes) of the @resource. * * Return value: The size (in bytes) of the @resource or -1. **/ gint64 gupnp_didl_lite_resource_get_size64 (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), -1); return xml_util_get_int64_attribute (resource->priv->xml_node, "size", -1); } /** * gupnp_didl_lite_resource_get_cleartext_size: * @resource: A #GUPnPDIDLLiteResource * * Get the size (in bytes) of the @resource. * * Return value: The size (in bytes) of the @resource or -1. **/ gint64 gupnp_didl_lite_resource_get_cleartext_size (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), -1); return xml_util_get_int64_attribute (resource->priv->xml_node, "cleartextSize", -1); } /** * gupnp_didl_lite_resource_get_duration: * @resource: A #GUPnPDIDLLiteResource * * Get the duration (in seconds) of the @resource. * * Return value: The duration (in seconds) of the @resource or -1. **/ glong gupnp_didl_lite_resource_get_duration (GUPnPDIDLLiteResource *resource) { const char *duration_str; long duration; g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), -1); duration_str = xml_util_get_attribute_content (resource->priv->xml_node, "duration"); duration = seconds_from_time (duration_str); return duration; } /** * gupnp_didl_lite_resource_get_bitrate: * @resource: A #GUPnPDIDLLiteResource * * Get the bitrate (in bytes per second) of the @resource. * * Return value: The bitrate (in bytes per second) of the @resource or -1. **/ int gupnp_didl_lite_resource_get_bitrate (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), -1); return xml_util_get_long_attribute (resource->priv->xml_node, "bitrate", -1); } /** * gupnp_didl_lite_resource_get_sample_freq: * @resource: A #GUPnPDIDLLiteResource * * Get the sample frequency of the @resource. * * Return value: The sample frequency of the @resource or -1. **/ int gupnp_didl_lite_resource_get_sample_freq (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), -1); return xml_util_get_long_attribute (resource->priv->xml_node, "sampleFrequency", -1); } /** * gupnp_didl_lite_resource_get_bits_per_sample: * @resource: A #GUPnPDIDLLiteResource * * Get the sample size of the @resource. * * Return value: The number of bits per sample of the @resource or -1. **/ int gupnp_didl_lite_resource_get_bits_per_sample (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), -1); return xml_util_get_long_attribute (resource->priv->xml_node, "bitsPerSample", -1); } /** * gupnp_didl_lite_resource_get_protection: * @resource: A #GUPnPDIDLLiteResource * * Get the protection system used by the @resource. * * Return value: The protection system in use by the @resource or %NULL. **/ const char * gupnp_didl_lite_resource_get_protection (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), NULL); return xml_util_get_attribute_content (resource->priv->xml_node, "protection"); } /** * gupnp_didl_lite_resource_get_audio_channels: * @resource: A #GUPnPDIDLLiteResource * * Get the number of audio channels in the @resource. * * Return value: The number of audio channels in the @resource or -1. **/ int gupnp_didl_lite_resource_get_audio_channels (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), -1); return xml_util_get_long_attribute (resource->priv->xml_node, "nrAudioChannels", -1); } /** * gupnp_didl_lite_resource_get_width: * @resource: A #GUPnPDIDLLiteResource * * Get the width of this image/video resource. * * Return value: The width of this image/video resource or -1. **/ int gupnp_didl_lite_resource_get_width (GUPnPDIDLLiteResource *resource) { int width = -1; g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), -1); get_resolution_info (resource, &width, NULL); return width; } /** * gupnp_didl_lite_resource_get_height: * @resource: A #GUPnPDIDLLiteResource * * Get the height of this image/video resource. * * Return value: The height of the @resource or -1. **/ int gupnp_didl_lite_resource_get_height (GUPnPDIDLLiteResource *resource) { int height = -1; g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), -1); get_resolution_info (resource, NULL, &height); return height; } /** * gupnp_didl_lite_resource_get_color_depth: * @resource: A #GUPnPDIDLLiteResource * * Get the color-depth of this image/video resource. * * Return value: The color depth of the @resource or -1. **/ int gupnp_didl_lite_resource_get_color_depth (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), -1); return xml_util_get_long_attribute (resource->priv->xml_node, "colorDepth", -1); } /** * gupnp_didl_lite_resource_get_update_count: * @resource: A #GUPnPDIDLLiteResource * * Get the update count of this resource. * * Return value: The update count of the @resource. **/ guint gupnp_didl_lite_resource_get_update_count (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), 0); return xml_util_get_uint_attribute (resource->priv->xml_node, "updateCount", -1); } /** * gupnp_didl_lite_resource_get_track_total: * @resource: A #GUPnPDIDLLiteResource * * Get the total track count of this resource. * * Return value: The total track count of the @resource. **/ guint gupnp_didl_lite_resource_get_track_total (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), 0); return xml_util_get_uint_attribute (resource->priv->xml_node, "trackTotal", -1); } /** * gupnp_didl_lite_resource_update_count_is_set: * @resource: A #GUPnPDIDLLiteResource * * Check whether the update count property of this resource is set. * * Return value: %TRUE if set, otherwise %FALSE. **/ gboolean gupnp_didl_lite_resource_update_count_is_set (GUPnPDIDLLiteResource *resource) { const char *content; g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), FALSE); content = xml_util_get_attribute_content (resource->priv->xml_node, "updateCount"); return content != NULL; } /** * gupnp_didl_lite_resource_track_total_is_set: * @resource: A #GUPnPDIDLLiteResource * * Check whether the total track count property of this resource is set. * * Return value: %TRUE if set, otherwise %FALSE. **/ gboolean gupnp_didl_lite_resource_track_total_is_set (GUPnPDIDLLiteResource *resource) { const char *content; g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), FALSE); content = xml_util_get_attribute_content (resource->priv->xml_node, "trackTotal"); return content != NULL; } /** * gupnp_didl_lite_resource_set_uri: * @resource: A #GUPnPDIDLLiteResource * @uri: The URI as string * * Set the URI associated with the @resource. **/ void gupnp_didl_lite_resource_set_uri (GUPnPDIDLLiteResource *resource, const char *uri) { xmlChar *escaped; g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); g_return_if_fail (uri != NULL); escaped = xmlEncodeSpecialChars (resource->priv->xml_doc->doc, (const unsigned char *) uri); xmlNodeSetContent (resource->priv->xml_node, escaped); xmlFree (escaped); g_object_notify (G_OBJECT (resource), "uri"); } /** * gupnp_didl_lite_resource_set_import_uri: * @resource: A #GUPnPDIDLLiteResource * @import_uri: The URI as string * * Set the import URI associated with the @resource. **/ void gupnp_didl_lite_resource_set_import_uri (GUPnPDIDLLiteResource *resource, const char *import_uri) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); xmlSetProp (resource->priv->xml_node, (unsigned char *) "importUri", (unsigned char *) import_uri); g_object_notify (G_OBJECT (resource), "import-uri"); } /** * gupnp_didl_lite_resource_set_protocol_info: * @resource: A #GUPnPDIDLLiteResource * @info: The protocol string * * Set the protocol info associated with the @resource. **/ void gupnp_didl_lite_resource_set_protocol_info (GUPnPDIDLLiteResource *resource, GUPnPProtocolInfo *info) { char *str; g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); g_return_if_fail (GUPNP_IS_PROTOCOL_INFO (info)); str = gupnp_protocol_info_to_string (info); xmlSetProp (resource->priv->xml_node, (unsigned char *) "protocolInfo", (unsigned char *) str); g_free (str); /* Get a ref first in case it's the same object that we already have */ g_object_ref (info); if (resource->priv->protocol_info != NULL) g_object_unref (resource->priv->protocol_info); resource->priv->protocol_info = info; /* We need to listen to changes to properties so we update the * corresponding xml property. */ g_signal_handlers_disconnect_by_func (info, on_protocol_info_changed, resource); g_signal_connect (info, "notify", G_CALLBACK (on_protocol_info_changed), resource); g_object_notify (G_OBJECT (resource), "protocol-info"); } /** * gupnp_didl_lite_resource_set_size: * @resource: A #GUPnPDIDLLiteResource * @size: The size (in bytes) * * Set the size (in bytes) of the @resource. Passing a negative number will * unset this property. **/ void gupnp_didl_lite_resource_set_size (GUPnPDIDLLiteResource *resource, glong size) { gupnp_didl_lite_resource_set_size64 (resource, size); } /** * gupnp_didl_lite_resource_set_size64: * @resource: A #GUPnPDIDLLiteResource * @size: The size (in bytes) * * Set the size (in bytes) of the @resource. Passing a negative number will * unset this property. **/ void gupnp_didl_lite_resource_set_size64 (GUPnPDIDLLiteResource *resource, gint64 size) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); if (size < 0) xmlUnsetProp (resource->priv->xml_node, (unsigned char *) "size"); else { char *str; str = g_strdup_printf ("%" G_GINT64_FORMAT, size); xmlSetProp (resource->priv->xml_node, (unsigned char *) "size", (unsigned char *) str); g_free (str); } g_object_notify (G_OBJECT (resource), "size64"); g_object_notify (G_OBJECT (resource), "size"); } /** * gupnp_didl_lite_resource_set_cleartext_size: * @resource: A #GUPnPDIDLLiteResource * @cleartext_size: The size (in bytes) * * Set the size (in bytes) of the @resource. Passing a negative number will * unset this property. **/ void gupnp_didl_lite_resource_set_cleartext_size (GUPnPDIDLLiteResource *resource, gint64 cleartext_size) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); if (cleartext_size < 0) xmlUnsetNsProp (resource->priv->xml_node, resource->priv->dlna_ns, (unsigned char *) "cleartextSize"); else { char *str; str = g_strdup_printf ("%" G_GINT64_FORMAT, cleartext_size); xml_util_get_ns (resource->priv->xml_doc->doc, GUPNP_XML_NAMESPACE_DLNA, &(resource->priv->dlna_ns)); xmlSetNsProp (resource->priv->xml_node, resource->priv->dlna_ns, (unsigned char *) "cleartextSize", (unsigned char *) str); g_free (str); } g_object_notify (G_OBJECT (resource), "cleartext-size"); } /** * gupnp_didl_lite_resource_set_duration: * @resource: A #GUPnPDIDLLiteResource * @duration: The duration (in seconds) * * Set the duration (in seconds) of the @resource. Passing a negative number * will unset this property. **/ void gupnp_didl_lite_resource_set_duration (GUPnPDIDLLiteResource *resource, glong duration) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); if (duration < 0) xmlUnsetProp (resource->priv->xml_node, (unsigned char *) "duration"); else { char *str; str = seconds_to_time (duration); xmlSetProp (resource->priv->xml_node, (unsigned char *) "duration", (unsigned char *) str); g_free (str); } g_object_notify (G_OBJECT (resource), "duration"); } /** * gupnp_didl_lite_resource_set_bitrate: * @resource: A #GUPnPDIDLLiteResource * @bitrate: The bitrate * * Set the bitrate (in bytes per second) of the @resource. Passing a negative * number will unset this property. **/ void gupnp_didl_lite_resource_set_bitrate (GUPnPDIDLLiteResource *resource, int bitrate) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); if (bitrate < 0) xmlUnsetProp (resource->priv->xml_node, (unsigned char *) "bitrate"); else { char *str; str = g_strdup_printf ("%d", bitrate); xmlSetProp (resource->priv->xml_node, (unsigned char *) "bitrate", (unsigned char *) str); g_free (str); } g_object_notify (G_OBJECT (resource), "bitrate"); } /** * gupnp_didl_lite_resource_set_sample_freq: * @resource: A #GUPnPDIDLLiteResource * @sample_freq: The sample frequency * * Set the sample frequency of the @resource. Passing a negative number will * unset this property. **/ void gupnp_didl_lite_resource_set_sample_freq (GUPnPDIDLLiteResource *resource, int sample_freq) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); if (sample_freq < 0) xmlUnsetProp (resource->priv->xml_node, (unsigned char *) "sampleFrequency"); else { char *str; str = g_strdup_printf ("%d", sample_freq); xmlSetProp (resource->priv->xml_node, (unsigned char *) "sampleFrequency", (unsigned char *) str); g_free (str); } g_object_notify (G_OBJECT (resource), "sample-freq"); } /** * gupnp_didl_lite_resource_set_bits_per_sample: * @resource: A #GUPnPDIDLLiteResource * @sample_size: The number of bits per sample * * Set the sample size of the @resource. Passing a negative number will unset * this property. **/ void gupnp_didl_lite_resource_set_bits_per_sample (GUPnPDIDLLiteResource *resource, int sample_size) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); if (sample_size < 0) xmlUnsetProp (resource->priv->xml_node, (unsigned char *) "bitsPerSample"); else { char *str; str = g_strdup_printf ("%d", sample_size); xmlSetProp (resource->priv->xml_node, (unsigned char *) "bitsPerSample", (unsigned char *) str); g_free (str); } g_object_notify (G_OBJECT (resource), "bits-per-sample"); } /** * gupnp_didl_lite_resource_set_protection: * @resource: A #GUPnPDIDLLiteResource * @protection: The protection system identifier as string * * Set the protection system used by the @resource. Passing a negative number * will unset this property. **/ void gupnp_didl_lite_resource_set_protection (GUPnPDIDLLiteResource *resource, const char *protection) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); xmlSetProp (resource->priv->xml_node, (unsigned char *) "protection", (unsigned char *) protection); g_object_notify (G_OBJECT (resource), "protection"); } /** * gupnp_didl_lite_resource_set_audio_channels: * @resource: A #GUPnPDIDLLiteResource * @n_channels: The number of channels * * Set the number of audio channels in the @resource. Passing a negative number * will unset this property. **/ void gupnp_didl_lite_resource_set_audio_channels (GUPnPDIDLLiteResource *resource, int n_channels) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); if (n_channels < 0) xmlUnsetProp (resource->priv->xml_node, (unsigned char *) "nrAudioChannels"); else { char *str; str = g_strdup_printf ("%d", n_channels); xmlSetProp (resource->priv->xml_node, (unsigned char *) "nrAudioChannels", (unsigned char *) str); g_free (str); } g_object_notify (G_OBJECT (resource), "audio-channels"); } /** * gupnp_didl_lite_resource_set_width: * @resource: A #GUPnPDIDLLiteResource * @width: The width * * Set the width of this image/video resource. Setting both width and height to * a negative number will unset the resolution property. **/ void gupnp_didl_lite_resource_set_width (GUPnPDIDLLiteResource *resource, int width) { char *resolution; int height = -1; g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); get_resolution_info (resource, NULL, &height); if (width < 0 && height < 0) xmlUnsetProp (resource->priv->xml_node, (unsigned char *) "resolution"); else { resolution = g_strdup_printf ("%dx%d", width, height); xmlSetProp (resource->priv->xml_node, (unsigned char *) "resolution", (unsigned char *) resolution); g_free (resolution); } g_object_notify (G_OBJECT (resource), "width"); } /** * gupnp_didl_lite_resource_set_height: * @resource: A #GUPnPDIDLLiteResource * @height: The height * * Set the height of this image/video resource. Setting both width and height to * a negative number will unset the resolution property. **/ void gupnp_didl_lite_resource_set_height (GUPnPDIDLLiteResource *resource, int height) { int width = -1; g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); get_resolution_info (resource, &width, NULL); if (width < 0 && height < 0) xmlUnsetProp (resource->priv->xml_node, (unsigned char *) "resolution"); else { char *resolution; resolution = g_strdup_printf ("%dx%d", width, height); xmlSetProp (resource->priv->xml_node, (unsigned char *) "resolution", (unsigned char *) resolution); g_free (resolution); } g_object_notify (G_OBJECT (resource), "height"); } /** * gupnp_didl_lite_resource_set_color_depth: * @resource: A #GUPnPDIDLLiteResource * @color_depth: The color-depth * * Set the color-depth of this image/video resource. Passing a negative number * will unset this property. **/ void gupnp_didl_lite_resource_set_color_depth (GUPnPDIDLLiteResource *resource, int color_depth) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); if (color_depth < 0) xmlUnsetProp (resource->priv->xml_node, (unsigned char *) "colorDepth"); else { char *str; str = g_strdup_printf ("%d", color_depth); xmlSetProp (resource->priv->xml_node, (unsigned char *) "colorDepth", (unsigned char *) str); g_free (str); } g_object_notify (G_OBJECT (resource), "color-depth"); } /** * gupnp_didl_lite_resource_set_update_count: * @resource: A #GUPnPDIDLLiteResource * @update_count: The update_count * * Set the update count of this resource. **/ void gupnp_didl_lite_resource_set_update_count (GUPnPDIDLLiteResource *resource, guint update_count) { char *str; g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); str = g_strdup_printf ("%u", update_count); xmlSetProp (resource->priv->xml_node, (unsigned char *) "updateCount", (unsigned char *) str); g_free (str); g_object_notify (G_OBJECT (resource), "update-count"); } /** * gupnp_didl_lite_resource_set_track_total: * @resource: A #GUPnPDIDLLiteResource * @track_total: The total number of tracks in this resource * * Set the total number of tracks in this resource. **/ void gupnp_didl_lite_resource_set_track_total (GUPnPDIDLLiteResource *resource, guint track_total) { char *str; g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); xml_util_get_ns (resource->priv->xml_doc->doc, GUPNP_XML_NAMESPACE_DLNA, &(resource->priv->dlna_ns)); str = g_strdup_printf ("%u", track_total); xmlSetNsProp (resource->priv->xml_node, resource->priv->dlna_ns, (unsigned char *) "trackTotal", (unsigned char *) str); g_free (str); g_object_notify (G_OBJECT (resource), "track-total"); } /** * gupnp_didl_lite_resource_unset_update_count: * @resource: A #GUPnPDIDLLiteResource * * Unset the update count of this resource. **/ void gupnp_didl_lite_resource_unset_update_count (GUPnPDIDLLiteResource *resource) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); xmlUnsetProp (resource->priv->xml_node, (unsigned char *) "updateCount"); g_object_notify (G_OBJECT (resource), "update-count"); } /** * gupnp_didl_lite_resource_unset_track_total: * @resource: A #GUPnPDIDLLiteResource * * Unset the total track count of this resource. **/ void gupnp_didl_lite_resource_unset_track_total (GUPnPDIDLLiteResource *resource) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); xmlUnsetNsProp (resource->priv->xml_node, resource->priv->dlna_ns, (unsigned char *) "trackTotal"); g_object_notify (G_OBJECT (resource), "track-total"); } /** * gupnp_didl_lite_resource_get_subtitle_file_uri: * @resource: A #GUPnPDIDLLiteResource * * Returns: The content of the subtitleFileUri property or %NULL when not set. * * Since: 0.12.4 **/ const char * gupnp_didl_lite_resource_get_subtitle_file_uri (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), NULL); return xml_util_get_attribute_content (resource->priv->xml_node, "subtitleFileUri"); } /** * gupnp_didl_lite_resource_get_subtitle_file_type: * @resource: A #GUPnPDIDLLiteResource * * Returns: The content of the subtitleFileType property or %NULL * * Since: 0.12.4 **/ const char * gupnp_didl_lite_resource_get_subtitle_file_type (GUPnPDIDLLiteResource *resource) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), NULL); return xml_util_get_attribute_content (resource->priv->xml_node, "subtitleFileType"); } /** * gupnp_didl_lite_resource_set_subtitle_file_uri: * @resource: A #GUPnPDIDLLiteResource * @uri: (allow-none): An URI to an external subtitle file or %NULL to remove. * * Set the URI of an external subtitle file to be used with this resource. * When @uri is %NULL the value is removed. * * Since: 0.12.4 **/ void gupnp_didl_lite_resource_set_subtitle_file_uri (GUPnPDIDLLiteResource *resource, const char *uri) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); if (uri == NULL) xmlUnsetNsProp (resource->priv->xml_node, resource->priv->pv_ns, (unsigned char *) "subtitleFileUri"); else { xml_util_get_ns (resource->priv->xml_doc->doc, GUPNP_XML_NAMESPACE_PV, &(resource->priv->pv_ns)); xmlSetNsProp (resource->priv->xml_node, resource->priv->pv_ns, (unsigned char *) "subtitleFileUri", (unsigned char *) uri); } g_object_notify (G_OBJECT (resource), "subtitle-file-uri"); } /** * gupnp_didl_lite_resource_set_subtitle_file_type: * @resource: A #GUPnPDIDLLiteResource * @type: (allow-none): An URI to an external subtitle file * * Set the type of an external subtitle file, specified via * pv:subtitleFileUri using gupnp_didl_lite_resource_set_subtitle_file_uri(). * * When @type is %NULL the value is removed. * * Since: 0.12.4 **/ void gupnp_didl_lite_resource_set_subtitle_file_type (GUPnPDIDLLiteResource *resource, const char *type) { g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource)); if (type == NULL) xmlUnsetNsProp (resource->priv->xml_node, resource->priv->pv_ns, (unsigned char *) "subtitleFileUri"); else { xml_util_get_ns (resource->priv->xml_doc->doc, GUPNP_XML_NAMESPACE_PV, &(resource->priv->pv_ns)); xmlSetNsProp (resource->priv->xml_node, resource->priv->pv_ns, (unsigned char *) "subtitleFileType", (unsigned char *) type); } g_object_notify (G_OBJECT (resource), "subtitle-file-type"); }