summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Georg <mail@jensge.org>2013-12-14 14:02:50 +0100
committerJens Georg <mail@jensge.org>2014-05-31 09:50:54 +0200
commit9b4e5e8b0969a62aabb618dcee4be60b48794ee8 (patch)
tree83a0e0eb53015c987a022e9cd94a0acf3e7927f9
parentfcd094d21baa999f56945ebfcce1f072950054ee (diff)
downloadgupnp-av-9b4e5e8b0969a62aabb618dcee4be60b48794ee8.tar.gz
Add utility function to find namespaces
https://bugzilla.gnome.org/show_bug.cgi?id=705564
-rw-r--r--libgupnp-av/gupnp-didl-lite-parser.c38
-rw-r--r--libgupnp-av/xml-util.c50
-rw-r--r--libgupnp-av/xml-util.h3
3 files changed, 60 insertions, 31 deletions
diff --git a/libgupnp-av/gupnp-didl-lite-parser.c b/libgupnp-av/gupnp-didl-lite-parser.c
index 8f31605..c11340e 100644
--- a/libgupnp-av/gupnp-didl-lite-parser.c
+++ b/libgupnp-av/gupnp-didl-lite-parser.c
@@ -272,46 +272,22 @@ gupnp_didl_lite_parser_parse_didl_recursive (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];
- else if (! dlna_ns &&
- g_ascii_strcasecmp (prefix, "dlna") == 0)
- dlna_ns = ns_list[i];
- else if (! pv_ns &&
- g_ascii_strcasecmp (prefix, "pv") == 0)
- pv_ns = ns_list[i];
- }
-
- xmlFree (ns_list);
- }
-
- /* Create UPnP and DC namespaces if they don't exist */
+ /* Create namespaces if they don't exist */
+ upnp_ns = xml_util_lookup_namespace (doc, GUPNP_XML_NAMESPACE_UPNP);
if (! upnp_ns)
upnp_ns = xml_util_create_namespace (xmlDocGetRootElement (doc),
GUPNP_XML_NAMESPACE_UPNP);
+
+ dc_ns = xml_util_lookup_namespace (doc, GUPNP_XML_NAMESPACE_DC);
if (! dc_ns)
dc_ns = xml_util_create_namespace (xmlDocGetRootElement (doc),
GUPNP_XML_NAMESPACE_DC);
+ dlna_ns = xml_util_lookup_namespace (doc, GUPNP_XML_NAMESPACE_DLNA);
if (! dlna_ns)
dlna_ns = xml_util_create_namespace (xmlDocGetRootElement (doc),
GUPNP_XML_NAMESPACE_DLNA);
+
+ pv_ns = xml_util_lookup_namespace (doc, GUPNP_XML_NAMESPACE_PV);
if (! pv_ns)
pv_ns = xml_util_create_namespace (xmlDocGetRootElement (doc),
GUPNP_XML_NAMESPACE_PV);
diff --git a/libgupnp-av/xml-util.c b/libgupnp-av/xml-util.c
index a8de2c8..dd32089 100644
--- a/libgupnp-av/xml-util.c
+++ b/libgupnp-av/xml-util.c
@@ -444,3 +444,53 @@ xml_util_create_namespace (xmlNodePtr root, GUPnPXMLNamespace ns)
(const xmlChar *) gupnp_xml_namespaces[ns].uri,
(const xmlChar *) gupnp_xml_namespaces[ns].prefix);
}
+
+/**
+ * xml_util_lookup_namespace:
+ * @doc: #xmlDoc
+ * @ns: namespace to look up (except DIDL-Lite, which doesn't have a prefix)
+ * @returns: %NULL if namespace does not exist, a pointer to the namespace
+ * otherwise.
+ */
+xmlNsPtr
+xml_util_lookup_namespace (xmlDocPtr doc, GUPnPXMLNamespace ns)
+{
+ xmlNsPtr *ns_list, *it, retval = NULL;
+ const char *ns_prefix = NULL;
+ const char *ns_uri = NULL;
+
+ g_return_val_if_fail (ns < GUPNP_XML_NAMESPACE_COUNT, NULL);
+
+ ns_prefix = gupnp_xml_namespaces[ns].prefix;
+ ns_uri = gupnp_xml_namespaces[ns].uri;
+
+ ns_list = xmlGetNsList (doc, xmlDocGetRootElement (doc));
+ if (ns_list == NULL)
+ return NULL;
+
+ for (it = ns_list; *it != NULL; it++) {
+ const char *it_prefix = (const char *) (*it)->prefix;
+ const char *it_uri = (const char *) (*it)->href;
+
+ if (it_prefix == NULL) {
+ if (ns_prefix != NULL)
+ continue;
+
+ if (g_ascii_strcasecmp (it_uri, ns_uri) == 0) {
+ retval = *it;
+ break;
+ }
+
+ continue;
+ }
+
+ if (g_ascii_strcasecmp (it_prefix, ns_prefix) == 0) {
+ retval = *it;
+ break;
+ }
+ }
+
+ xmlFree (ns_list);
+
+ return retval;
+}
diff --git a/libgupnp-av/xml-util.h b/libgupnp-av/xml-util.h
index 8d34b4b..e08fa19 100644
--- a/libgupnp-av/xml-util.h
+++ b/libgupnp-av/xml-util.h
@@ -131,6 +131,9 @@ G_GNUC_INTERNAL xmlNsPtr
xml_util_create_namespace (xmlNodePtr root,
GUPnPXMLNamespace ns);
+G_GNUC_INTERNAL xmlNsPtr
+xml_util_lookup_namespace (xmlDocPtr doc,
+ GUPnPXMLNamespace ns);
G_END_DECLS
#endif /* __XML_UTIL_H__ */