diff options
author | Sven Neumann <s.neumann@raumfeld.com> | 2010-05-28 23:13:35 +0200 |
---|---|---|
committer | Zeeshan Ali (Khattak) <zeeshanak@gnome.org> | 2010-06-17 20:32:21 +0300 |
commit | 14b5b8b87b1d06afdb68ef0f618f4811fe62d9a6 (patch) | |
tree | 4d5e068a9f9244c6dcbb6282ff7e9d7076025048 | |
parent | 2a5dd4589c8589a418ff013e19f288f2ec1d746f (diff) | |
download | gupnp-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.c | 55 | ||||
-rw-r--r-- | libgupnp-av/gupnp-didl-lite-parser.c | 49 |
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; |