diff options
Diffstat (limited to 'asdcplib/src/KM_xml.cpp')
| -rw-r--r-- | asdcplib/src/KM_xml.cpp | 1012 |
1 files changed, 0 insertions, 1012 deletions
diff --git a/asdcplib/src/KM_xml.cpp b/asdcplib/src/KM_xml.cpp deleted file mode 100644 index 98dccc4..0000000 --- a/asdcplib/src/KM_xml.cpp +++ /dev/null @@ -1,1012 +0,0 @@ -/* -Copyright (c) 2005-2010, John Hurst -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! \file KM_xml.cpp - \version $Id: KM_xml.cpp,v 1.19 2011/12/01 18:42:39 jhurst Exp $ - \brief XML writer -*/ - -#include <KM_xml.h> -#include <KM_log.h> -#include <KM_mutex.h> -#include <stack> -#include <map> - -#ifdef HAVE_EXPAT -# ifdef HAVE_XERCES_C -# error "Both HAVE_EXPAT and HAVE_XERCES_C defined" -# endif -#include <expat.h> -#endif - -#ifdef HAVE_XERCES_C -# ifdef HAVE_EXPAT -# error "Both HAVE_EXPAT and HAVE_XERCES_C defined" -# endif - -#include <xercesc/util/PlatformUtils.hpp> -#include <xercesc/util/XMLString.hpp> -#include <xercesc/util/TransService.hpp> -#include <xercesc/sax/AttributeList.hpp> -#include <xercesc/sax/HandlerBase.hpp> -#include <xercesc/sax/ErrorHandler.hpp> -#include <xercesc/sax/SAXParseException.hpp> -#include <xercesc/parsers/SAXParser.hpp> -#include <xercesc/framework/MemBufInputSource.hpp> -#include <xercesc/framework/XMLPScanToken.hpp> - - -XERCES_CPP_NAMESPACE_USE - -namespace Kumu { - void init_xml_dom(); - typedef std::basic_string<XMLCh> XercesString; - bool UTF_8_to_XercesString(const std::string& in_str, XercesString& out_str); - bool UTF_8_to_XercesString(const char* in_str, XercesString& out_str); - bool XercesString_to_UTF_8(const XercesString& in_str, std::string& out_str); - bool XercesString_to_UTF_8(const XMLCh* in_str, std::string& out_str); -} - -#endif - -using namespace Kumu; - - -class ns_map : public std::map<std::string, XMLNamespace*> -{ -public: - ~ns_map() - { - while ( ! empty() ) - { - ns_map::iterator ni = begin(); - delete ni->second; - erase(ni); - } - } -}; - - -Kumu::XMLElement::XMLElement(const char* name) : m_Namespace(0), m_NamespaceOwner(0) -{ - m_Name = name; -} - -Kumu::XMLElement::~XMLElement() -{ - for ( Elem_i i = m_ChildList.begin(); i != m_ChildList.end(); i++ ) - delete *i; - - delete (ns_map*)m_NamespaceOwner; -} - -// -void -Kumu::XMLElement::SetAttr(const char* name, const char* value) -{ - NVPair TmpVal; - TmpVal.name = name; - TmpVal.value = value; - - m_AttrList.push_back(TmpVal); -} - -// -Kumu::XMLElement* -Kumu::XMLElement::AddChild(Kumu::XMLElement* element) -{ - m_ChildList.push_back(element); // takes posession! - return element; -} - -// -Kumu::XMLElement* -Kumu::XMLElement::AddChild(const char* name) -{ - XMLElement* tmpE = new XMLElement(name); - m_ChildList.push_back(tmpE); - return tmpE; -} - -// -Kumu::XMLElement* -Kumu::XMLElement::AddChildWithContent(const char* name, const std::string& value) -{ - return AddChildWithContent(name, value.c_str()); -} - -// -void -Kumu::XMLElement::AppendBody(const std::string& value) -{ - m_Body += value; -} - -// -void -Kumu::XMLElement::SetBody(const std::string& value) -{ - m_Body = value; -} - -// -Kumu::XMLElement* -Kumu::XMLElement::AddChildWithContent(const char* name, const char* value) -{ - assert(name); - assert(value); - XMLElement* tmpE = new XMLElement(name); - tmpE->m_Body = value; - m_ChildList.push_back(tmpE); - return tmpE; -} - -// -Kumu::XMLElement* -Kumu::XMLElement::AddChildWithPrefixedContent(const char* name, const char* prefix, const char* value) -{ - XMLElement* tmpE = new XMLElement(name); - tmpE->m_Body = prefix; - tmpE->m_Body += value; - m_ChildList.push_back(tmpE); - return tmpE; -} - -// -void -Kumu::XMLElement::AddComment(const char* value) -{ - m_Body += " <!-- "; - m_Body += value; - m_Body += " -->\n"; -} - -// -void -Kumu::XMLElement::Render(std::string& outbuf) const -{ - outbuf = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; - RenderElement(outbuf, 0); -} - -// -inline void -add_spacer(std::string& outbuf, i32_t depth) -{ - while ( depth-- ) - outbuf+= " "; -} - -// -void -Kumu::XMLElement::RenderElement(std::string& outbuf, ui32_t depth) const -{ - add_spacer(outbuf, depth); - - outbuf += "<"; - outbuf += m_Name; - - // render attributes - for ( Attr_i i = m_AttrList.begin(); i != m_AttrList.end(); i++ ) - { - outbuf += " "; - outbuf += (*i).name; - outbuf += "=\""; - outbuf += (*i).value; - outbuf += "\""; - } - - outbuf += ">"; - - // body contents and children - if ( ! m_ChildList.empty() ) - { - outbuf += "\n"; - - // render body - if ( m_Body.length() > 0 ) - outbuf += m_Body; - - for ( Elem_i i = m_ChildList.begin(); i != m_ChildList.end(); i++ ) - (*i)->RenderElement(outbuf, depth + 1); - - add_spacer(outbuf, depth); - } - else if ( m_Body.length() > 0 ) - { - outbuf += m_Body; - } - - outbuf += "</"; - outbuf += m_Name; - outbuf += ">\n"; -} - -// -bool -Kumu::XMLElement::HasName(const char* name) const -{ - if ( name == 0 || *name == 0 ) - return false; - - return (m_Name == name); -} - - -void -Kumu::XMLElement::SetName(const char* name) -{ - if ( name != 0) - m_Name = name; -} - -// -const char* -Kumu::XMLElement::GetAttrWithName(const char* name) const -{ - for ( Attr_i i = m_AttrList.begin(); i != m_AttrList.end(); i++ ) - { - if ( (*i).name == name ) - return (*i).value.c_str(); - } - - return 0; -} - -// -Kumu::XMLElement* -Kumu::XMLElement::GetChildWithName(const char* name) const -{ - for ( Elem_i i = m_ChildList.begin(); i != m_ChildList.end(); i++ ) - { - if ( (*i)->HasName(name) ) - return *i; - } - - return 0; -} - -// -const Kumu::ElementList& -Kumu::XMLElement::GetChildrenWithName(const char* name, ElementList& outList) const -{ - assert(name); - for ( Elem_i i = m_ChildList.begin(); i != m_ChildList.end(); i++ ) - { - if ( (*i)->HasName(name) ) - outList.push_back(*i); - - if ( ! (*i)->m_ChildList.empty() ) - (*i)->GetChildrenWithName(name, outList); - } - - return outList; -} - -// -void -Kumu::XMLElement::DeleteAttributes() -{ - m_AttrList.clear(); -} - -// -void -Kumu::XMLElement::DeleteAttrWithName(const char* name) -{ - assert(name); - AttributeList::iterator i = m_AttrList.begin(); - - while ( i != m_AttrList.end() ) - { - if ( i->name == std::string(name) ) - m_AttrList.erase(i++); - else - ++i; - } -} - -// -void -Kumu::XMLElement::DeleteChildren() -{ - while ( ! m_ChildList.empty() ) - { - delete m_ChildList.back(); - m_ChildList.pop_back(); - } -} - -// -void -Kumu::XMLElement::DeleteChild(const XMLElement* element) -{ - if ( element != 0 ) - { - for ( ElementList::iterator i = m_ChildList.begin(); i != m_ChildList.end(); i++ ) - { - if ( *i == element ) - { - delete *i; - m_ChildList.erase(i); - return; - } - } - } -} - -// -void -Kumu::XMLElement::ForgetChild(const XMLElement* element) -{ - if ( element != 0 ) - { - for ( ElementList::iterator i = m_ChildList.begin(); i != m_ChildList.end(); i++ ) - { - if ( *i == element ) - { - m_ChildList.erase(i); - return; - } - } - } -} - -// -bool -Kumu::XMLElement::ParseString(const ByteString& document) -{ - return ParseString((const char*)document.RoData(), document.Length()); -} - -// -bool -Kumu::XMLElement::ParseString(const std::string& document) -{ - return ParseString(document.c_str(), document.size()); -} - - -//---------------------------------------------------------------------------------------------------- - -#ifdef HAVE_EXPAT - - -class ExpatParseContext -{ - KM_NO_COPY_CONSTRUCT(ExpatParseContext); - ExpatParseContext(); -public: - ns_map* Namespaces; - std::stack<XMLElement*> Scope; - XMLElement* Root; - - ExpatParseContext(XMLElement* root) : Root(root) { - Namespaces = new ns_map; - assert(Root); - } - - ~ExpatParseContext() {} -}; - -// expat wrapper functions -// -static void -xph_start(void* p, const XML_Char* name, const XML_Char** attrs) -{ - assert(p); assert(name); assert(attrs); - ExpatParseContext* Ctx = (ExpatParseContext*)p; - XMLElement* Element; - - const char* ns_root = name; - const char* local_name = strchr(name, '|'); - if ( local_name != 0 ) - name = local_name + 1; - - if ( Ctx->Scope.empty() ) - { - Ctx->Scope.push(Ctx->Root); - } - else - { - Element = Ctx->Scope.top(); - Ctx->Scope.push(Element->AddChild(name)); - } - - Element = Ctx->Scope.top(); - Element->SetName(name); - - // map the namespace - std::string key; - if ( ns_root != name ) - key.assign(ns_root, name - ns_root - 1); - - ns_map::iterator ni = Ctx->Namespaces->find(key); - if ( ni != Ctx->Namespaces->end() ) - Element->SetNamespace(ni->second); - - // set attributes - for ( int i = 0; attrs[i] != 0; i += 2 ) - { - if ( ( local_name = strchr(attrs[i], '|') ) == 0 ) - local_name = attrs[i]; - else - local_name++; - - Element->SetAttr(local_name, attrs[i+1]); - } -} - -// -static void -xph_end(void* p, const XML_Char* name) -{ - assert(p); assert(name); - ExpatParseContext* Ctx = (ExpatParseContext*)p; - Ctx->Scope.pop(); -} - -// -static void -xph_char(void* p, const XML_Char* data, int len) -{ - assert(p); assert(data); - ExpatParseContext* Ctx = (ExpatParseContext*)p; - - if ( len > 0 ) - { - std::string tmp_str; - tmp_str.assign(data, len); - Ctx->Scope.top()->AppendBody(tmp_str); - } -} - -// -void -xph_namespace_start(void* p, const XML_Char* ns_prefix, const XML_Char* ns_name) -{ - assert(p); assert(ns_name); - ExpatParseContext* Ctx = (ExpatParseContext*)p; - - if ( ns_prefix == 0 ) - ns_prefix = ""; - - ns_map::iterator ni = Ctx->Namespaces->find(ns_name); - - if ( ni != Ctx->Namespaces->end() ) - { - if ( ni->second->Name() != std::string(ns_name) ) - { - DefaultLogSink().Error("Duplicate prefix: %s\n", ns_prefix); - return; - } - } - else - { - XMLNamespace* Namespace = new XMLNamespace(ns_prefix, ns_name); - Ctx->Namespaces->insert(ns_map::value_type(ns_name, Namespace)); - } -} - -// -bool -Kumu::XMLElement::ParseString(const char* document, ui32_t doc_len) -{ - XML_Parser Parser = XML_ParserCreateNS("UTF-8", '|'); - - if ( Parser == 0 ) - { - DefaultLogSink().Error("Error allocating memory for XML parser.\n"); - return false; - } - - ExpatParseContext Ctx(this); - XML_SetUserData(Parser, (void*)&Ctx); - XML_SetElementHandler(Parser, xph_start, xph_end); - XML_SetCharacterDataHandler(Parser, xph_char); - XML_SetStartNamespaceDeclHandler(Parser, xph_namespace_start); - - if ( ! XML_Parse(Parser, document, doc_len, 1) ) - { - XML_ParserFree(Parser); - DefaultLogSink().Error("XML Parse error on line %d: %s\n", - XML_GetCurrentLineNumber(Parser), - XML_ErrorString(XML_GetErrorCode(Parser))); - return false; - } - - XML_ParserFree(Parser); - - if ( ! Ctx.Namespaces->empty() ) - m_NamespaceOwner = (void*)Ctx.Namespaces; - - return true; -} - -//------------------------------------------------------------------------------------------ - -struct xph_test_wrapper -{ - XML_Parser Parser; - bool Status; - - xph_test_wrapper(XML_Parser p) : Parser(p), Status(false) {} -}; - -// expat wrapper functions, map callbacks to IASAXHandler -// -static void -xph_test_start(void* p, const XML_Char*, const XML_Char**) -{ - assert(p); - xph_test_wrapper* Wrapper = (xph_test_wrapper*)p; - - Wrapper->Status = true; - XML_StopParser(Wrapper->Parser, false); -} - - -// -bool -Kumu::StringIsXML(const char* document, ui32_t len) -{ - if ( document == 0 ) - return false; - - if ( len == 0 ) - len = strlen(document); - - XML_Parser Parser = XML_ParserCreate("UTF-8"); - - if ( Parser == 0 ) - { - DefaultLogSink().Error("Error allocating memory for XML parser.\n"); - return false; - } - - xph_test_wrapper Wrapper(Parser); - XML_SetUserData(Parser, (void*)&Wrapper); - XML_SetStartElementHandler(Parser, xph_test_start); - - XML_Parse(Parser, document, len, 1); - XML_ParserFree(Parser); - return Wrapper.Status; -} - -#endif - -//---------------------------------------------------------------------------------------------------- - -#ifdef HAVE_XERCES_C - -static Mutex sg_xerces_init_lock; // protect the xerces initialized -static bool sg_xml_init = false; // signal initialization -static Mutex sg_coder_lock; // protect the transcoder context -static XMLTranscoder* sg_coder = 0; -static const int sg_coder_buf_len = 128 * 1024; -static char sg_coder_buf[sg_coder_buf_len + 8]; -static unsigned char sg_coder_counts[sg_coder_buf_len / sizeof(XMLCh)]; // see XMLTranscoder::transcodeFrom - -static const XMLCh sg_LS[] = { chLatin_L, chLatin_S, chNull }; -static const XMLCh sg_label_UTF_8[] = { chLatin_U, chLatin_T, chLatin_F, - chDash, chDigit_8, chNull}; - -// -void -Kumu::init_xml_dom() -{ - if ( ! sg_xml_init ) - { - AutoMutex AL(sg_xerces_init_lock); - - if ( ! sg_xml_init ) - { - try - { - XMLPlatformUtils::Initialize(); - sg_xml_init = true; - - XMLTransService::Codes ret; - sg_coder = XMLPlatformUtils::fgTransService->makeNewTranscoderFor(sg_label_UTF_8, ret, sg_coder_buf_len); - - if ( ret != XMLTransService::Ok ) - { - const char* message = "Undefined Error"; - - switch ( ret ) - { - case XMLTransService::UnsupportedEncoding: message = "Unsupported encoding"; break; - case XMLTransService::InternalFailure: message = "Internal failure"; break; - case XMLTransService::SupportFilesNotFound: message = "Support files not found"; break; - } - - DefaultLogSink().Error("Xerces transform initialization error: %s\n", message); - } - } - catch (const XMLException &e) - { - DefaultLogSink().Error("Xerces initialization error: %s\n", e.getMessage()); - } - } - } -} - -// -bool -Kumu::XercesString_to_UTF_8(const Kumu::XercesString& in_str, std::string& out_str) { - return XercesString_to_UTF_8(in_str.c_str(), out_str); -} - -// -bool -Kumu::XercesString_to_UTF_8(const XMLCh* in_str, std::string& out_str) -{ - assert(in_str); - assert(sg_xml_init); - AutoMutex AL(sg_coder_lock); - ui32_t str_len = XMLString::stringLen(in_str); - ui32_t read_total = 0; - - try - { - while ( str_len > 0 ) - { -#if XERCES_VERSION_MAJOR < 3 - ui32_t read_count = 0; -#else - XMLSize_t read_count = 0; -#endif - ui32_t write_count = sg_coder->transcodeTo(in_str + read_total, str_len, - (XMLByte*)sg_coder_buf, sg_coder_buf_len, - read_count, XMLTranscoder::UnRep_Throw); - - out_str.append(sg_coder_buf, write_count); - str_len -= read_count; - read_total += read_count; - assert(str_len >= 0); - } - } - catch (...) - { - return false; - } - - return true; -} - -// -bool -Kumu::UTF_8_to_XercesString(const std::string& in_str, Kumu::XercesString& out_str) { - return UTF_8_to_XercesString(in_str.c_str(), out_str); -} - -// -bool -Kumu::UTF_8_to_XercesString(const char* in_str, Kumu::XercesString& out_str) -{ - assert(in_str); - assert(sg_xml_init); - AutoMutex AL(sg_coder_lock); - ui32_t str_len = strlen(in_str); - ui32_t read_total = 0; - - try - { - while ( str_len > 0 ) - { -#if XERCES_VERSION_MAJOR < 3 - ui32_t read_count = 0; -#else - XMLSize_t read_count = 0; -#endif - ui32_t write_count = sg_coder->transcodeFrom((const XMLByte*)(in_str + read_total), str_len, - (XMLCh*)sg_coder_buf, sg_coder_buf_len / sizeof(XMLCh), - read_count, sg_coder_counts); - - out_str.append((XMLCh*)sg_coder_buf, write_count * sizeof(XMLCh)); - str_len -= read_count; - read_total += read_count; - assert(str_len >= 0); - } - } - catch (...) - { - return false; - } - - return true; -} - -// -class MyTreeHandler : public HandlerBase -{ - ns_map* m_Namespaces; - std::stack<XMLElement*> m_Scope; - XMLElement* m_Root; - bool m_HasEncodeErrors; - -public: - MyTreeHandler(XMLElement* root) : m_Namespaces(0), m_Root(root), m_HasEncodeErrors(false) - { - assert(m_Root); - m_Namespaces = new ns_map; - } - - ~MyTreeHandler() { - delete m_Namespaces; - } - - bool HasEncodeErrors() const { return m_HasEncodeErrors; } - - ns_map* TakeNamespaceMap() - { - if ( m_Namespaces == 0 || m_Namespaces->empty() ) - return 0; - - ns_map* ret = m_Namespaces; - m_Namespaces = 0; - return ret; - } - - // - void AddNamespace(const char* ns_prefix, const char* ns_name) - { - assert(ns_prefix); - assert(ns_name); - - if ( ns_prefix[0] == ':' ) - { - ns_prefix++; - } - else - { - assert(ns_prefix[0] == 0); - ns_prefix = ""; - } - - ns_map::iterator ni = m_Namespaces->find(ns_name); - - if ( ni != m_Namespaces->end() ) - { - if ( ni->second->Name() != std::string(ns_name) ) - { - DefaultLogSink().Error("Duplicate prefix: %s\n", ns_prefix); - return; - } - } - else - { - XMLNamespace* Namespace = new XMLNamespace(ns_prefix, ns_name); - m_Namespaces->insert(ns_map::value_type(ns_prefix, Namespace)); - } - - assert(!m_Namespaces->empty()); - } - - // - void startElement(const XMLCh* const x_name, - XERCES_CPP_NAMESPACE::AttributeList& attributes) - { - assert(x_name); - std::string tx_name; - - if ( ! XercesString_to_UTF_8(x_name, tx_name) ) - m_HasEncodeErrors = true; - - const char* name = tx_name.c_str(); - XMLElement* Element; - const char* ns_root = name; - const char* local_name = strchr(name, ':'); - - if ( local_name != 0 ) - name = local_name + 1; - - if ( m_Scope.empty() ) - { - m_Scope.push(m_Root); - } - else - { - Element = m_Scope.top(); - m_Scope.push(Element->AddChild(name)); - } - - Element = m_Scope.top(); - Element->SetName(name); - - // set attributes - ui32_t a_len = attributes.getLength(); - - for ( ui32_t i = 0; i < a_len; i++) - { - std::string aname, value; - if ( ! XercesString_to_UTF_8(attributes.getName(i), aname) ) - m_HasEncodeErrors = true; - - if ( ! XercesString_to_UTF_8(attributes.getValue(i), value) ) - m_HasEncodeErrors = true; - - const char* x_aname = aname.c_str(); - const char* x_value = value.c_str(); - - if ( strncmp(x_aname, "xmlns", 5) == 0 ) - AddNamespace(x_aname+5, x_value); - - if ( ( local_name = strchr(x_aname, ':') ) == 0 ) - local_name = x_aname; - else - local_name++; - - Element->SetAttr(local_name, x_value); - } - - // map the namespace - std::string key; - if ( ns_root != name ) - key.assign(ns_root, name - ns_root - 1); - - ns_map::iterator ni = m_Namespaces->find(key); - if ( ni != m_Namespaces->end() ) - Element->SetNamespace(ni->second); - } - - void endElement(const XMLCh *const name) { - m_Scope.pop(); - } - - void characters(const XMLCh *const chars, const unsigned int length) - { - if ( length > 0 ) - { - std::string tmp; - if ( ! XercesString_to_UTF_8(chars, tmp) ) - m_HasEncodeErrors = true; - - m_Scope.top()->AppendBody(tmp); - } - } -}; - -// -bool -Kumu::XMLElement::ParseString(const char* document, ui32_t doc_len) -{ - if ( doc_len == 0 ) - return false; - - init_xml_dom(); - - int errorCount = 0; - SAXParser* parser = new SAXParser(); - - parser->setValidationScheme(SAXParser::Val_Always); - parser->setDoNamespaces(true); // optional - - MyTreeHandler* docHandler = new MyTreeHandler(this); - parser->setDocumentHandler(docHandler); - parser->setErrorHandler(docHandler); - - try - { - MemBufInputSource xmlSource(reinterpret_cast<const XMLByte*>(document), - static_cast<const unsigned int>(doc_len), - "pidc_rules_file"); - - parser->parse(xmlSource); - } - catch (const XMLException& e) - { - char* message = XMLString::transcode(e.getMessage()); - DefaultLogSink().Error("Parser error: %s\n", message); - XMLString::release(&message); - errorCount++; - } - catch (const SAXParseException& e) - { - char* message = XMLString::transcode(e.getMessage()); - DefaultLogSink().Error("Parser error: %s at line %d\n", message, e.getLineNumber()); - XMLString::release(&message); - errorCount++; - } - catch (...) - { - DefaultLogSink().Error("Unexpected XML parser error\n"); - errorCount++; - } - - if ( errorCount == 0 ) - m_NamespaceOwner = (void*)docHandler->TakeNamespaceMap(); - - delete parser; - delete docHandler; - - return errorCount > 0 ? false : true; -} - -// -bool -Kumu::StringIsXML(const char* document, ui32_t len) -{ - if ( document == 0 || *document == 0 ) - return false; - - init_xml_dom(); - - if ( len == 0 ) - len = strlen(document); - - SAXParser parser; - XMLPScanToken token; - bool status = false; - - try - { - MemBufInputSource xmlSource(reinterpret_cast<const XMLByte*>(document), - static_cast<const unsigned int>(len), - "pidc_rules_file"); - - if ( parser.parseFirst(xmlSource, token) ) - { - if ( parser.parseNext(token) ) - status = true; - } - } - catch (...) - { - } - - return status; -} - - -#endif - -//---------------------------------------------------------------------------------------------------- - -#if ! defined(HAVE_EXPAT) && ! defined(HAVE_XERCES_C) - -// -bool -Kumu::XMLElement::ParseString(const char*, ui32_t) -{ - DefaultLogSink().Error("Kumu compiled without XML parser support.\n"); - return false; -} - -// -bool -Kumu::StringIsXML(const char*, ui32_t) -{ - DefaultLogSink().Error("Kumu compiled without XML parser support.\n"); - return false; -} - -#endif - - -// -// end KM_xml.cpp -// |
