From 4b5d13297286ec722c304ff41579bf8a819d3fff Mon Sep 17 00:00:00 2001 From: Frederic Peters Date: Thu, 7 Jun 2007 00:20:07 +0000 Subject: extended xml_insure_namespace so it creates the namespace itself, after having looked for a preexisting namespace; the function was previously called with ns == NULL, which caused namespace to be *removed* from elements (ns was NULL because xmlNewNs will return NULL when the namespace is already defined). --- lasso/xml/id-wsf-2.0/dstref_query.c | 7 +++---- lasso/xml/id-wsf-2.0/dstref_query_response.c | 7 ++++--- lasso/xml/private.h | 3 ++- lasso/xml/xml.c | 15 +++++++++++++-- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/lasso/xml/id-wsf-2.0/dstref_query.c b/lasso/xml/id-wsf-2.0/dstref_query.c index 3746e36c..5f6e2d22 100644 --- a/lasso/xml/id-wsf-2.0/dstref_query.c +++ b/lasso/xml/id-wsf-2.0/dstref_query.c @@ -60,12 +60,11 @@ static xmlNode* get_xmlNode(LassoNode *node, gboolean lasso_dump) { xmlNode *xmlnode; - xmlNs *ns; xmlnode = parent_class->get_xmlNode(node, lasso_dump); - ns = xmlNewNs(xmlnode, (xmlChar*)LASSO_IDWSF2_DSTREF_QUERY(node)->hrefServiceType, - (xmlChar*)LASSO_IDWSF2_DSTREF_QUERY(node)->prefixServiceType); - xml_insure_namespace(xmlnode, ns, TRUE); + xml_insure_namespace(xmlnode, NULL, TRUE, + LASSO_IDWSF2_DSTREF_QUERY(node)->hrefServiceType, + LASSO_IDWSF2_DSTREF_QUERY(node)->prefixServiceType); return xmlnode; } diff --git a/lasso/xml/id-wsf-2.0/dstref_query_response.c b/lasso/xml/id-wsf-2.0/dstref_query_response.c index f497b7fb..82fb3b25 100644 --- a/lasso/xml/id-wsf-2.0/dstref_query_response.c +++ b/lasso/xml/id-wsf-2.0/dstref_query_response.c @@ -60,11 +60,12 @@ get_xmlNode(LassoNode *node, gboolean lasso_dump) { xmlNode *xmlnode; xmlNs *ns; + char *ns_href; xmlnode = parent_class->get_xmlNode(node, lasso_dump); - ns = xmlNewNs(xmlnode, (xmlChar*)LASSO_IDWSF2_DSTREF_QUERY_RESPONSE(node)->hrefServiceType, - (xmlChar*)LASSO_IDWSF2_DSTREF_QUERY_RESPONSE(node)->prefixServiceType); - xml_insure_namespace(xmlnode, ns, TRUE); + xml_insure_namespace(xmlnode, NULL, TRUE, + LASSO_IDWSF2_DSTREF_QUERY_RESPONSE(node)->hrefServiceType, + LASSO_IDWSF2_DSTREF_QUERY_RESPONSE(node)->prefixServiceType); return xmlnode; } diff --git a/lasso/xml/private.h b/lasso/xml/private.h index 2a239722..bb266131 100644 --- a/lasso/xml/private.h +++ b/lasso/xml/private.h @@ -119,7 +119,8 @@ int lasso_sign_node(xmlNode *xmlnode, const char *id_attr_name, const char *id_v void xmlCleanNs(xmlNode *root_node); -void xml_insure_namespace(xmlNode *xmlnode, xmlNs *ns, gboolean force); +void xml_insure_namespace(xmlNode *xmlnode, xmlNs *ns, gboolean force, + char *ns_href, char *ns_prefix); gchar* lasso_node_build_deflated_query(LassoNode *node); diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c index dde38a39..2fdc451e 100644 --- a/lasso/xml/xml.c +++ b/lasso/xml/xml.c @@ -2337,14 +2337,25 @@ xmlCleanNs(xmlNode *root_node) } void -xml_insure_namespace(xmlNode *xmlnode, xmlNs *ns, gboolean force) +xml_insure_namespace(xmlNode *xmlnode, xmlNs *ns, gboolean force, char *ns_href, char *ns_prefix) { xmlNode *t = xmlnode->children; + if (ns == NULL) { + for (ns = xmlnode->nsDef; ns; ns = ns->next) { + if (strcmp(ns->href, ns_href) == 0) { + break; + } + } + if (ns == NULL) { + ns = xmlNewNs(xmlnode, ns_href, ns_prefix); + } + } + xmlSetNs(xmlnode, ns); while (t) { if (t->type == XML_ELEMENT_NODE && (force == TRUE || t->ns == NULL)) { - xml_insure_namespace(t, ns, force); + xml_insure_namespace(t, ns, force, NULL, NULL); } t = t->next; } -- cgit