summaryrefslogtreecommitdiffstats
path: root/lib/libUPnP/Neptune/Source/Core/NptXml.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libUPnP/Neptune/Source/Core/NptXml.h')
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptXml.h391
1 files changed, 391 insertions, 0 deletions
diff --git a/lib/libUPnP/Neptune/Source/Core/NptXml.h b/lib/libUPnP/Neptune/Source/Core/NptXml.h
new file mode 100644
index 0000000..cd06a88
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptXml.h
@@ -0,0 +1,391 @@
+/*****************************************************************
+|
+| Neptune - Xml Support
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * 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.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''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 AXIOMATIC SYSTEMS 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.
+|
+ ****************************************************************/
+
+#ifndef _NPT_XML_H_
+#define _NPT_XML_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptList.h"
+#include "NptStrings.h"
+#include "NptStreams.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_ERROR_XML_INVALID_NESTING = NPT_ERROR_BASE_XML - 0;
+const int NPT_ERROR_XML_TAG_MISMATCH = NPT_ERROR_BASE_XML - 1;
+const int NPT_ERROR_XML_NO_ROOT = NPT_ERROR_BASE_XML - 2;
+const int NPT_ERROR_XML_MULTIPLE_ROOTS = NPT_ERROR_BASE_XML - 3;
+
+#define NPT_XML_ANY_NAMESPACE "*"
+#define NPT_XML_NO_NAMESPACE NULL
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class NPT_XmlProcessor;
+
+/*----------------------------------------------------------------------
+| NPT_XmlAttribute
++---------------------------------------------------------------------*/
+class NPT_XmlAttribute
+{
+ public:
+ // methods
+ NPT_XmlAttribute(const char* name, const char* value);
+ NPT_XmlAttribute(const char* prefix, const char* name, const char* value) :
+ m_Prefix(prefix), m_Name(name), m_Value(value) {}
+ const NPT_String& GetPrefix() const { return m_Prefix; }
+ const NPT_String& GetName() const { return m_Name; }
+ const NPT_String& GetValue() const { return m_Value; }
+ void SetValue(const char* value) { m_Value = value; }
+
+ private:
+ // members
+ NPT_String m_Prefix;
+ NPT_String m_Name;
+ NPT_String m_Value;
+
+ NPT_XmlAttribute(const NPT_XmlAttribute& attribute) :
+ m_Prefix(attribute.m_Prefix),
+ m_Name(attribute.m_Name),
+ m_Value(attribute.m_Value) {}
+ NPT_XmlAttribute& operator=(const NPT_XmlAttribute& a);
+
+ // friends
+ friend class NPT_XmlAttributeFinder;
+ friend class NPT_XmlAttributeFinderWithPrefix;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlNamespaceMap
++---------------------------------------------------------------------*/
+class NPT_XmlNamespaceMap
+{
+public:
+ // destructor
+ ~NPT_XmlNamespaceMap();
+
+ // methods
+ NPT_Result SetNamespaceUri(const char* prefix, const char* uri);
+ const NPT_String* GetNamespaceUri(const char* prefix);
+ const NPT_String* GetNamespacePrefix(const char* uri);
+
+private:
+ // types
+ class Entry {
+ public:
+ // constructor
+ Entry(const char* prefix, const char* uri) :
+ m_Prefix(prefix), m_Uri(uri) {}
+
+ // members
+ NPT_String m_Prefix;
+ NPT_String m_Uri;
+ };
+
+ // members
+ NPT_List<Entry*> m_Entries;
+
+ // friends
+ friend class NPT_XmlWriter;
+ friend class NPT_XmlNodeWriter;
+ friend class NPT_XmlNodeCanonicalWriter;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlNode
++---------------------------------------------------------------------*/
+class NPT_XmlElementNode;
+class NPT_XmlTextNode;
+class NPT_XmlNode
+{
+ public:
+ // types
+ typedef enum {
+ DOCUMENT,
+ ELEMENT,
+ TEXT
+ } Type;
+
+ // methods
+ NPT_XmlNode(Type type) : m_Type(type), m_Parent(NULL) {}
+ virtual ~NPT_XmlNode() {}
+ Type GetType() const { return m_Type; }
+ NPT_XmlNode* GetParent() const { return m_Parent; }
+
+ // type casting
+ virtual NPT_XmlElementNode* AsElementNode() { return NULL; }
+ virtual const NPT_XmlElementNode* AsElementNode() const { return NULL; }
+ virtual NPT_XmlTextNode* AsTextNode() { return NULL; }
+ virtual const NPT_XmlTextNode* AsTextNode() const { return NULL; }
+
+ protected:
+ // methods
+ virtual void SetParent(NPT_XmlNode* parent) { m_Parent = parent; }
+
+ // members
+ Type m_Type;
+ NPT_XmlNode* m_Parent;
+
+ // friends
+ friend class NPT_XmlNodeFinder;
+ friend class NPT_XmlSerializer;
+ friend class NPT_XmlWriter;
+ friend class NPT_XmlElementNode; // to allow access to SetParent()
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode
++---------------------------------------------------------------------*/
+class NPT_XmlElementNode : public NPT_XmlNode
+{
+ public:
+ // methods
+ NPT_XmlElementNode(const char* tag);
+ NPT_XmlElementNode(const char* prefix, const char* tag);
+ ~NPT_XmlElementNode() override;
+ NPT_List<NPT_XmlNode*>& GetChildren() { return m_Children; }
+ const NPT_List<NPT_XmlNode*>&
+ GetChildren() const { return m_Children; }
+ NPT_XmlElementNode* GetChild(const char* tag,
+ const char* namespc = NPT_XML_NO_NAMESPACE,
+ NPT_Ordinal n=0) const;
+ NPT_Result AddChild(NPT_XmlNode* child);
+ NPT_Result SetAttribute(const char* prefix,
+ const char* name,
+ const char* value);
+ NPT_Result SetAttribute(const char* name,
+ const char* value);
+ NPT_Result AddText(const char* text);
+ NPT_List<NPT_XmlAttribute*>&
+ GetAttributes() { return m_Attributes; }
+ const NPT_List<NPT_XmlAttribute*>&
+ GetAttributes() const { return m_Attributes; }
+ const NPT_String* GetAttribute(const char* name,
+ const char* namespc = NPT_XML_NO_NAMESPACE) const;
+ const NPT_String& GetPrefix() const { return m_Prefix; }
+ const NPT_String& GetTag() const { return m_Tag; }
+ const NPT_String* GetText(NPT_Ordinal n=0) const;
+
+ // bring all the namespace definitions used in this element of one of its descendants
+ // into the namespace map of this element so that it may be serialized as a
+ // standalone element without any prefixes with undefined namespace uris
+ NPT_Result MakeStandalone();
+
+ // namespace methods
+ const NPT_String* GetNamespace() const;
+ NPT_Result SetNamespaceUri(const char* prefix, const char* uri);
+ const NPT_String* GetNamespaceUri(const char* prefix) const;
+ const NPT_String* GetNamespacePrefix(const char* uri) const;
+
+ // type casting
+ NPT_XmlElementNode* AsElementNode() override { return this; }
+ const NPT_XmlElementNode* AsElementNode() const override { return this; }
+
+protected:
+ // methods
+ void SetParent(NPT_XmlNode* parent) override;
+ void SetNamespaceParent(NPT_XmlElementNode* parent);
+ void RelinkNamespaceMaps();
+
+ NPT_Result AddAttribute(const char* name, const char* value);
+
+ // members
+ NPT_String m_Prefix;
+ NPT_String m_Tag;
+ NPT_List<NPT_XmlNode*> m_Children;
+ NPT_List<NPT_XmlAttribute*> m_Attributes;
+ NPT_XmlNamespaceMap* m_NamespaceMap;
+ NPT_XmlElementNode* m_NamespaceParent;
+
+ // friends
+ friend class NPT_XmlTagFinder;
+ friend class NPT_XmlSerializer;
+ friend class NPT_XmlWriter;
+ friend class NPT_XmlNodeWriter;
+ friend class NPT_XmlNodeCanonicalWriter;
+ friend class NPT_XmlParser;
+ friend class NPT_XmlProcessor;
+ friend class NPT_XmlNamespaceCollapser;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlTextNode
++---------------------------------------------------------------------*/
+class NPT_XmlTextNode : public NPT_XmlNode
+{
+ public:
+ // types
+ typedef enum {
+ CHARACTER_DATA,
+ IGNORABLE_WHITESPACE,
+ CDATA_SECTION,
+ ENTITY_REFERENCE,
+ COMMENT
+ } TokenType;
+
+ // constructor
+ NPT_XmlTextNode(TokenType token_type, const char* text);
+
+ // methods
+ const NPT_String& GetString() const { return m_Text; }
+ TokenType GetTokenType() const { return m_TokenType; }
+
+ // type casting
+ NPT_XmlTextNode* AsTextNode() override { return this; }
+ const NPT_XmlTextNode* AsTextNode() const override { return this; }
+
+ private:
+ // members
+ TokenType m_TokenType;
+ NPT_String m_Text;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlParser
++---------------------------------------------------------------------*/
+class NPT_XmlParser
+{
+ public:
+ // methods
+ NPT_XmlParser(bool keep_whitespace = true);
+ virtual ~NPT_XmlParser();
+ virtual NPT_Result Parse(const char* xml,
+ NPT_XmlNode*& tree,
+ bool incremental=false);
+ virtual NPT_Result Parse(const char* xml,
+ NPT_Size size,
+ NPT_XmlNode*& tree,
+ bool incremental=false);
+ virtual NPT_Result Parse(NPT_InputStream& stream,
+ NPT_XmlNode*& tree,
+ bool incremental=false);
+ virtual NPT_Result Parse(NPT_InputStream& stream,
+ NPT_Size& size,
+ NPT_XmlNode*& tree,
+ bool incremental=false);
+
+ protected:
+ // NPT_XmlHandler methods
+ NPT_Result OnStartElement(const char* name);
+ NPT_Result OnElementAttribute(const char* name, const char* value);
+ NPT_Result OnEndElement(const char* name);
+ NPT_Result OnCharacterData(const char* data, NPT_Size size);
+ void RemoveIgnorableWhitespace();
+
+ // members
+ NPT_XmlProcessor* m_Processor;
+ NPT_XmlElementNode* m_Root;
+ NPT_XmlElementNode* m_CurrentElement;
+ bool m_KeepWhitespace;
+
+private:
+ void Reset();
+
+ // friends
+ friend class NPT_XmlProcessor;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer
++---------------------------------------------------------------------*/
+class NPT_XmlSerializer
+{
+public:
+ // methods
+ NPT_XmlSerializer(NPT_OutputStream* output,
+ NPT_Cardinal indentation = 0,
+ bool shrink_empty_elements = true,
+ bool add_xml_decl = false);
+ virtual ~NPT_XmlSerializer();
+ virtual NPT_Result StartDocument();
+ virtual NPT_Result EndDocument();
+ virtual NPT_Result StartElement(const char* prefix, const char* name);
+ virtual NPT_Result EndElement(const char* prefix, const char* name);
+ virtual NPT_Result Attribute(const char* prefix, const char* name, const char* value);
+ virtual NPT_Result Text(const char* text);
+ virtual NPT_Result CdataSection(const char* data);
+ virtual NPT_Result Comment(const char* comment);
+
+protected:
+ // methods
+ void EscapeChar(unsigned char c, char* text);
+ NPT_Result ProcessPending();
+ NPT_Result OutputEscapedString(const char* text, bool attribute);
+ void OutputIndentation(bool start);
+
+ // members
+ NPT_OutputStream* m_Output;
+ bool m_ElementPending;
+ NPT_Cardinal m_Depth;
+ NPT_Cardinal m_Indentation;
+ NPT_String m_IndentationPrefix;
+ bool m_ElementHasText;
+ bool m_ShrinkEmptyElements;
+ bool m_AddXmlDecl;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlWriter
++---------------------------------------------------------------------*/
+class NPT_XmlWriter
+{
+public:
+ // constructor
+ explicit NPT_XmlWriter(NPT_Cardinal indentation = 0) : m_Indentation(indentation) {}
+
+ // methods
+ NPT_Result Serialize(NPT_XmlNode& node,
+ NPT_OutputStream& stream,
+ bool add_xml_decl = false);
+
+private:
+ // members
+ NPT_Cardinal m_Indentation;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlCanonicalizer
++---------------------------------------------------------------------*/
+class NPT_XmlCanonicalizer
+{
+public:
+ // methods
+ NPT_Result Serialize(NPT_XmlNode& node,
+ NPT_OutputStream& stream,
+ bool add_xml_decl = false);
+};
+
+#endif // _NPT_XML_H_