summaryrefslogtreecommitdiff
path: root/asdcplib/src/KM_xml.h
diff options
context:
space:
mode:
Diffstat (limited to 'asdcplib/src/KM_xml.h')
-rw-r--r--asdcplib/src/KM_xml.h141
1 files changed, 141 insertions, 0 deletions
diff --git a/asdcplib/src/KM_xml.h b/asdcplib/src/KM_xml.h
new file mode 100644
index 0000000..cf77366
--- /dev/null
+++ b/asdcplib/src/KM_xml.h
@@ -0,0 +1,141 @@
+/*
+Copyright (c) 2005-2011, 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.h
+ \version $Id: KM_xml.h,v 1.8 2011/08/15 23:03:26 jhurst Exp $
+ \brief XML writer
+*/
+
+
+#ifndef _KM_XML_H_
+#define _KM_XML_H_
+
+#include <KM_util.h>
+#include <list>
+#include <string>
+
+namespace Kumu
+{
+ class XMLElement;
+
+ // Return true if the given string contains an XML document (or the start of one).
+ bool StringIsXML(const char* document, ui32_t len = 0);
+
+ //
+ struct NVPair
+ {
+ std::string name;
+ std::string value;
+ };
+
+ //
+ typedef std::list<NVPair> AttributeList;
+ typedef AttributeList::const_iterator Attr_i;
+ typedef std::list<XMLElement*> ElementList;
+ typedef ElementList::const_iterator Elem_i;
+
+ //
+ class XMLNamespace
+ {
+ std::string m_Prefix;
+ std::string m_Name;
+
+ KM_NO_COPY_CONSTRUCT(XMLNamespace);
+ XMLNamespace();
+
+ public:
+ XMLNamespace(const char* prefix, const char* name) : m_Prefix(prefix), m_Name(name) {}
+ ~XMLNamespace() {}
+
+ inline const std::string& Prefix() const { return m_Prefix; }
+ inline const std::string& Name() const { return m_Name; }
+ };
+
+ //
+ class XMLElement
+ {
+ KM_NO_COPY_CONSTRUCT(XMLElement);
+ XMLElement();
+
+ protected:
+ AttributeList m_AttrList;
+ ElementList m_ChildList;
+ const XMLNamespace* m_Namespace;
+ void* m_NamespaceOwner;
+
+ std::string m_Name;
+ std::string m_Body;
+
+ public:
+ XMLElement(const char* name);
+ ~XMLElement();
+
+ inline const XMLNamespace* Namespace() const { return m_Namespace; }
+ inline void SetNamespace(const XMLNamespace* ns) { assert(ns); m_Namespace = ns; }
+
+ bool ParseString(const char* document, ui32_t doc_len);
+ bool ParseString(const ByteString& document);
+ bool ParseString(const std::string& document);
+
+ // building
+ void SetName(const char* name);
+ void SetBody(const std::string& value);
+ void AppendBody(const std::string& value);
+ void SetAttr(const char* name, const char* value);
+ void SetAttr(const char* name, const std::string& value) { SetAttr(name, value.c_str()); }
+ XMLElement* AddChild(XMLElement* element);
+ XMLElement* AddChild(const char* name);
+ XMLElement* AddChildWithContent(const char* name, const char* value);
+ XMLElement* AddChildWithContent(const char* name, const std::string& value);
+ XMLElement* AddChildWithPrefixedContent(const char* name, const char* prefix, const char* value);
+ void AddComment(const char* value);
+ void Render(std::string&) const;
+ void RenderElement(std::string& outbuf, ui32_t depth) const;
+
+ // querying
+ inline const std::string& GetBody() const { return m_Body; }
+ inline const ElementList& GetChildren() const { return m_ChildList; }
+ inline const std::string& GetName() const { return m_Name; }
+ inline const AttributeList& GetAttributes() const { return m_AttrList; }
+ const char* GetAttrWithName(const char* name) const;
+ XMLElement* GetChildWithName(const char* name) const;
+ const ElementList& GetChildrenWithName(const char* name, ElementList& outList) const;
+ bool HasName(const char* name) const;
+
+ // altering
+ void DeleteAttributes();
+ void DeleteAttrWithName(const char* name);
+ void DeleteChildren();
+ void DeleteChild(const XMLElement* element);
+ void ForgetChild(const XMLElement* element);
+ };
+} // namespace Kumu
+
+#endif // _KM_XML_H_
+
+//
+// end KM_xml.h
+//