summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Neumann <s.neumann@raumfeld.com>2010-05-28 23:13:35 +0200
committerZeeshan Ali (Khattak) <zeeshanak@gnome.org>2010-06-17 20:32:21 +0300
commit14b5b8b87b1d06afdb68ef0f618f4811fe62d9a6 (patch)
tree4d5e068a9f9244c6dcbb6282ff7e9d7076025048
parent2a5dd4589c8589a418ff013e19f288f2ec1d746f (diff)
downloadgupnp-av-14b5b8b87b1d06afdb68ef0f618f4811fe62d9a6.tar.gz
Require namespaces to be passed to gupnp_didl_lite_object_new_from_xml()
Move namespace lookup from GUPnPDIDLLiteObject to GUPnPDIDLLiteParser and require the upnp_ns and dc_ns parameters to be non-NULL in gupnp_didl_lite_object_new_from_xml(). The parser now registers the namespaces in case that they can't be found. Otherwise modifying GUPnPDIDLLiteObject objects created by the parser will fail. Signed-off-by: Sven Neumann <s.neumann@raumfeld.com>
-rw-r--r--libgupnp-av/gupnp-didl-lite-object.c55
-rw-r--r--libgupnp-av/gupnp-didl-lite-parser.c49
2 files changed, 49 insertions, 55 deletions
diff --git a/libgupnp-av/gupnp-didl-lite-object.c b/libgupnp-av/gupnp-didl-lite-object.c
index ccc0757..e298708 100644
--- a/libgupnp-av/gupnp-didl-lite-object.c
+++ b/libgupnp-av/gupnp-didl-lite-object.c
@@ -297,55 +297,6 @@ gupnp_didl_lite_object_get_property (GObject *object,
}
static void
-gupnp_didl_lite_object_lookup_namespaces (GUPnPDIDLLiteObjectPrivate *priv)
-{
- xmlNs **ns_list;
-
- if (priv->upnp_ns && priv->dc_ns)
- return;
-
- ns_list = xmlGetNsList (priv->xml_doc->doc,
- xmlDocGetRootElement (priv->xml_doc->doc));
-
- if (ns_list) {
- short i;
-
- for (i = 0; ns_list[i] != NULL; i++) {
- const char *prefix;
-
- prefix = (const char *) ns_list[i]->prefix;
-
- if (prefix == NULL)
- continue;
-
- if (! priv->upnp_ns &&
- g_ascii_strcasecmp (prefix, "upnp") == 0)
- priv->upnp_ns = ns_list[i];
- else if (! priv->dc_ns &&
- g_ascii_strcasecmp (prefix, "dc") == 0)
- priv->dc_ns = ns_list[i];
- }
-
- xmlFree (ns_list);
- }
-}
-
-static void
-gupnp_didl_lite_object_constructed (GObject *object)
-{
- GObjectClass *object_class;
- GUPnPDIDLLiteObjectPrivate *priv;
-
- priv = GUPNP_DIDL_LITE_OBJECT (object)->priv;
-
- gupnp_didl_lite_object_lookup_namespaces (priv);
-
- object_class = G_OBJECT_CLASS (gupnp_didl_lite_object_parent_class);
- if (object_class->constructed != NULL)
- object_class->constructed (object);
-}
-
-static void
gupnp_didl_lite_object_dispose (GObject *object)
{
GObjectClass *object_class;
@@ -371,7 +322,6 @@ gupnp_didl_lite_object_class_init (GUPnPDIDLLiteObjectClass *klass)
object_class->set_property = gupnp_didl_lite_object_set_property;
object_class->get_property = gupnp_didl_lite_object_get_property;
- object_class->constructed = gupnp_didl_lite_object_constructed;
object_class->dispose = gupnp_didl_lite_object_dispose;
g_type_class_add_private (klass, sizeof (GUPnPDIDLLiteObjectPrivate));
@@ -790,6 +740,8 @@ get_contributor_list_by_name (GUPnPDIDLLiteObject *object,
* gupnp_didl_lite_object_new_from_xml:
* @xml_node: The pointer to 'res' node in XML document
* @xml_doc: The reference to XML document containing this object
+ * @upnp_ns: The pointer to 'upnp' namespace in XML document
+ * @dc_ns: The pointer to 'dc' namespace in XML document
*
* Creates a new #GUPnPDIDLLiteObject for the @xml_node.
*
@@ -803,7 +755,8 @@ gupnp_didl_lite_object_new_from_xml (xmlNode *xml_node,
{
g_return_val_if_fail (xml_node != NULL, NULL);
g_return_val_if_fail (xml_node->name != NULL, NULL);
- g_return_val_if_fail (GUPNP_IS_XML_DOC (xml_doc), NULL);
+ g_return_val_if_fail (upnp_ns != NULL, NULL);
+ g_return_val_if_fail (dc_ns != NULL, NULL);
if (g_ascii_strcasecmp ((char *) xml_node->name, "container") == 0)
return g_object_new (GUPNP_TYPE_DIDL_LITE_CONTAINER,
diff --git a/libgupnp-av/gupnp-didl-lite-parser.c b/libgupnp-av/gupnp-didl-lite-parser.c
index e7e24ac..ad554ae 100644
--- a/libgupnp-av/gupnp-didl-lite-parser.c
+++ b/libgupnp-av/gupnp-didl-lite-parser.c
@@ -163,9 +163,12 @@ gupnp_didl_lite_parser_parse_didl (GUPnPDIDLLiteParser *parser,
const char *didl,
GError **error)
{
- xmlDoc *doc;
- xmlNode *element;
- GUPnPXMLDoc *xml_doc;
+ xmlDoc *doc;
+ xmlNode *element;
+ xmlNs **ns_list;
+ xmlNs *upnp_ns = NULL;
+ xmlNs *dc_ns = NULL;
+ GUPnPXMLDoc *xml_doc;
doc = xmlRecoverMemory (didl, strlen (didl));
if (doc == NULL) {
@@ -203,13 +206,51 @@ gupnp_didl_lite_parser_parse_didl (GUPnPDIDLLiteParser *parser,
return FALSE;
}
+ /* Lookup UPnP and DC namespaces */
+ ns_list = xmlGetNsList (doc,
+ xmlDocGetRootElement (doc));
+
+ if (ns_list) {
+ short i;
+
+ for (i = 0; ns_list[i] != NULL; i++) {
+ const char *prefix = (const char *) ns_list[i]->prefix;
+
+ if (prefix == NULL)
+ continue;
+
+ if (! upnp_ns &&
+ g_ascii_strcasecmp (prefix, "upnp") == 0)
+ upnp_ns = ns_list[i];
+ else if (! dc_ns &&
+ g_ascii_strcasecmp (prefix, "dc") == 0)
+ dc_ns = ns_list[i];
+ }
+
+ xmlFree (ns_list);
+ }
+
+ /* Create UPnP and DC namespaces if they don't exist */
+ if (! upnp_ns)
+ upnp_ns = xmlNewNs (xmlDocGetRootElement (doc),
+ (unsigned char *)
+ "urn:schemas-upnp-org:metadata-1-0/upnp/",
+ (unsigned char *)
+ GUPNP_DIDL_LITE_WRITER_NAMESPACE_UPNP);
+ if (! dc_ns)
+ dc_ns = xmlNewNs (xmlDocGetRootElement (doc),
+ (unsigned char *)
+ "http://purl.org/dc/elements/1.1/",
+ (unsigned char *)
+ GUPNP_DIDL_LITE_WRITER_NAMESPACE_DC);
+
xml_doc = gupnp_xml_doc_new (doc);
for (element = element->children; element; element = element->next) {
GUPnPDIDLLiteObject *object;
object = gupnp_didl_lite_object_new_from_xml (element, xml_doc,
- NULL, NULL);
+ upnp_ns, dc_ns);
if (object == NULL)
continue;