#include <string.h>
#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,
struct _GUPnPDIDLLiteResourcePrivate {
xmlNode *xml_node;
GUPnPXMLDoc *xml_doc;
+ xmlNs *dlna_ns;
+ xmlNs *pv_ns;
GUPnPProtocolInfo *protocol_info;
};
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_HEIGHT,
PROP_COLOR_DEPTH,
- PROP_UPDATE_COUNT
+ PROP_UPDATE_COUNT,
+ PROP_TRACK_TOTAL,
+
+ PROP_SUBTITLE_FILE_TYPE,
+ PROP_SUBTITLE_FILE_URI
};
static void
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,
(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;
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,
(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;
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_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));
}
/**
**/
GUPnPDIDLLiteResource *
gupnp_didl_lite_resource_new_from_xml (xmlNode *xml_node,
- GUPnPXMLDoc *xml_doc)
+ GUPnPXMLDoc *xml_doc,
+ xmlNs *dlna_ns,
+ xmlNs *pv_ns)
{
GUPnPDIDLLiteResource *resource;
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);
return resource;
}
/**
+ * 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
*
-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:
}
/**
+ * 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
*
}
/**
+ * 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
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.
+ *
+ * Return value: None.
+ **/
+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);
+ xmlSetNsProp (resource->priv->xml_node,
+ resource->priv->dlna_ns,
+ (unsigned char *) "cleartextSize",
+ (unsigned char *) str);
+ g_free (str);
+ }
+
+ g_object_notify (G_OBJECT (resource), "cleartextSize");
+}
/**
* gupnp_didl_lite_resource_set_duration:
}
/**
+ * 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.
+ *
+ * Return value: None.
+ **/
+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));
+
+ 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
*
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.
+ *
+ * Return value: None.
+ **/
+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
+ xmlSetNsProp (resource->priv->xml_node,
+ resource->priv->pv_ns,
+ (unsigned char *) "subtitleFileUri",
+ 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
+ xmlSetNsProp (resource->priv->xml_node,
+ resource->priv->pv_ns,
+ (unsigned char *) "subtitleFileType",
+ type);
+
+ g_object_notify (G_OBJECT (resource), "subtitle-file-type");
+}