summaryrefslogtreecommitdiffstats
path: root/source/XMLParser.h
diff options
context:
space:
mode:
authorAlexander Harkness <bearbin@gmail.com>2013-07-29 13:13:03 +0200
committerAlexander Harkness <bearbin@gmail.com>2013-07-29 13:13:03 +0200
commit53e22b11857fed62e2313d6d84d90f88ed412ffb (patch)
treec61e56725da7dff0154d566722651e2c39c9d6c6 /source/XMLParser.h
parentWebAdmin: Removed the duplicate memory usage querying (diff)
downloadcuberite-53e22b11857fed62e2313d6d84d90f88ed412ffb.tar
cuberite-53e22b11857fed62e2313d6d84d90f88ed412ffb.tar.gz
cuberite-53e22b11857fed62e2313d6d84d90f88ed412ffb.tar.bz2
cuberite-53e22b11857fed62e2313d6d84d90f88ed412ffb.tar.lz
cuberite-53e22b11857fed62e2313d6d84d90f88ed412ffb.tar.xz
cuberite-53e22b11857fed62e2313d6d84d90f88ed412ffb.tar.zst
cuberite-53e22b11857fed62e2313d6d84d90f88ed412ffb.zip
Diffstat (limited to 'source/XMLParser.h')
-rw-r--r--source/XMLParser.h1402
1 files changed, 701 insertions, 701 deletions
diff --git a/source/XMLParser.h b/source/XMLParser.h
index a6b571862..f492d1a5d 100644
--- a/source/XMLParser.h
+++ b/source/XMLParser.h
@@ -1,701 +1,701 @@
-
-// XMLParser.h
-
-// Interfaces to the CXMLParser class representing the base class for XML parsing
-
-// To use, derive a class from this base and override its OnStartElement(), OnEndElement() and OnCharacters() functions
-
-
-
-
-
-#pragma once
-
-#include "expat/expat.h"
-
-
-
-
-
-class CXMLParser
-{
-public:
- CXMLParser(void);
- virtual ~CXMLParser();
-
- // The actual parsing, may be called several times; the last time needs iIsFinal == true (-> flush)
- int Parse(const char * iData, size_t iLength, bool iIsFinal = false);
-
-private:
- // LibExpat stuff:
- XML_Parser mParser;
-
- static void StartElementHandler(void * iContext, const XML_Char * iElement, const XML_Char ** iAttributes)
- {
- ((CXMLParser *)iContext)->OnStartElement(iElement, iAttributes);
- }
-
- static void EndElementHandler (void * iContext, const XML_Char * iElement)
- {
- ((CXMLParser *)iContext)->OnEndElement(iElement);
- }
-
- static void CharacterDataHandler (void * iContext, const XML_Char * iData, int iLength)
- {
- ((CXMLParser *)iContext)->OnCharacters(iData, iLength);
- }
-
-protected:
- virtual void OnStartElement(const XML_Char * iElement, const XML_Char ** iAttributes) = 0;
- virtual void OnEndElement (const XML_Char * iElement) = 0;
- virtual void OnCharacters (const XML_Char * iCharacters, int iLength) = 0;
-} ;
-
-
-
-
-
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// The following template has been modified from code available at
-// http://www.codeproject.com/Articles/1847/C-Wrappers-for-the-Expat-XML-Parser
-// It uses templates to remove the virtual function call penalty (both size and speed) for each callback
-
-/* Usage:
-1, Declare a subclass:
- class CMyParser : public CExpatImpl<CMyParser>
-2, Declare handlers that you want in that subclass:
- void CMyParser::OnEndElement(const XML_Char * iTagName);
-3, Create an instance of your class:
- CMyParser Parser;
-4, Call Create():
- Parser.Create(NULL, NULL);
-4, Call Parse(), repeatedly:
- Parser.Parse(Buffer, Length);
-*/
-
-template <class _T>
-class CExpatImpl
-{
-
-// @access Constructors and destructors
-public:
-
- // @cmember General constructor
-
- CExpatImpl ()
- {
- m_p = NULL;
- }
-
- // @cmember Destructor
-
- ~CExpatImpl ()
- {
- Destroy ();
- }
-
-// @access Parser creation and deletion methods
-public:
-
- // @cmember Create a parser
-
- bool Create (const XML_Char * pszEncoding = NULL, const XML_Char * pszSep = NULL)
- {
- // Destroy the old parser
- Destroy ();
-
- // If the encoding or seperator are empty, then NULL
- if (pszEncoding != NULL && pszEncoding [0] == 0)
- {
- pszEncoding = NULL;
- }
- if (pszSep != NULL && pszSep [0] == 0)
- {
- pszSep = NULL;
- }
-
- // Create the new parser
- m_p = XML_ParserCreate_MM (pszEncoding, NULL, pszSep);
- if (m_p == NULL)
- {
- return false;
- }
-
- // Invoke the post create routine
- _T * pThis = static_cast <_T *> (this);
- pThis ->OnPostCreate ();
-
- // Set the user data used in callbacks
- XML_SetUserData (m_p, (void *) this);
- return true;
- }
-
- // @cmember Destroy the parser
-
- void Destroy (void)
- {
- if (m_p != NULL)
- {
- XML_ParserFree (m_p);
- }
- m_p = NULL;
- }
-
-
- // @cmember Parse a block of data
-
- bool Parse (const char *pszBuffer, int nLength, bool fIsFinal = true)
- {
- assert (m_p != NULL);
- return XML_Parse (m_p, pszBuffer, nLength, fIsFinal) != 0;
- }
-
- // @cmember Parse internal buffer
-
- bool ParseBuffer (int nLength, bool fIsFinal = true)
- {
- assert (m_p != NULL);
- return XML_ParseBuffer (m_p, nLength, fIsFinal) != 0;
- }
-
- // @cmember Get the internal buffer
-
- void *GetBuffer (int nLength)
- {
- assert (m_p != NULL);
- return XML_GetBuffer (m_p, nLength);
- }
-
-
-protected:
- // Parser callback enable/disable methods:
-
- // @cmember Enable/Disable the start element handler
-
- void EnableStartElementHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetStartElementHandler (m_p, fEnable ? StartElementHandler : NULL);
- }
-
- // @cmember Enable/Disable the end element handler
-
- void EnableEndElementHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetEndElementHandler (m_p, fEnable ? EndElementHandler : NULL);
- }
-
- // @cmember Enable/Disable the element handlers
-
- void EnableElementHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- EnableStartElementHandler (fEnable);
- EnableEndElementHandler (fEnable);
- }
-
- // @cmember Enable/Disable the character data handler
-
- void EnableCharacterDataHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetCharacterDataHandler (m_p, fEnable ? CharacterDataHandler : NULL);
- }
-
- // @cmember Enable/Disable the processing instruction handler
-
- void EnableProcessingInstructionHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetProcessingInstructionHandler (m_p, fEnable ? ProcessingInstructionHandler : NULL);
- }
-
- // @cmember Enable/Disable the comment handler
-
- void EnableCommentHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetCommentHandler (m_p, fEnable ? CommentHandler : NULL);
- }
-
- // @cmember Enable/Disable the start CDATA section handler
-
- void EnableStartCdataSectionHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetStartCdataSectionHandler (m_p, fEnable ? StartCdataSectionHandler : NULL);
- }
-
- // @cmember Enable/Disable the end CDATA section handler
-
- void EnableEndCdataSectionHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetEndCdataSectionHandler (m_p, fEnable ? EndCdataSectionHandler : NULL);
- }
-
- // @cmember Enable/Disable the CDATA section handlers
-
- void EnableCdataSectionHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- EnableStartCdataSectionHandler (fEnable);
- EnableEndCdataSectionHandler (fEnable);
- }
-
- // @cmember Enable/Disable default handler
-
- void EnableDefaultHandler (bool fEnable = true, bool fExpand = true)
- {
- assert (m_p != NULL);
- if (fExpand)
- {
- XML_SetDefaultHandlerExpand (m_p, fEnable ? DefaultHandler : NULL);
- }
- else
- XML_SetDefaultHandler (m_p, fEnable ? DefaultHandler : NULL);
- }
-
- // @cmember Enable/Disable external entity ref handler
-
- void EnableExternalEntityRefHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetExternalEntityRefHandler (m_p, fEnable ? ExternalEntityRefHandler : NULL);
- }
-
- // @cmember Enable/Disable unknown encoding handler
-
- void EnableUnknownEncodingHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetUnknownEncodingHandler (m_p, fEnable ? UnknownEncodingHandler : NULL);
- }
-
- // @cmember Enable/Disable start namespace handler
-
- void EnableStartNamespaceDeclHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetStartNamespaceDeclHandler (m_p, fEnable ? StartNamespaceDeclHandler : NULL);
- }
-
- // @cmember Enable/Disable end namespace handler
-
- void EnableEndNamespaceDeclHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetEndNamespaceDeclHandler (m_p, fEnable ? EndNamespaceDeclHandler : NULL);
- }
-
- // @cmember Enable/Disable namespace handlers
-
- void EnableNamespaceDeclHandler (bool fEnable = true)
- {
- EnableStartNamespaceDeclHandler (fEnable);
- EnableEndNamespaceDeclHandler (fEnable);
- }
-
- // @cmember Enable/Disable the XML declaration handler
-
- void EnableXmlDeclHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetXmlDeclHandler (m_p, fEnable ? XmlDeclHandler : NULL);
- }
-
- // @cmember Enable/Disable the start DOCTYPE declaration handler
-
- void EnableStartDoctypeDeclHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetStartDoctypeDeclHandler (m_p, fEnable ? StartDoctypeDeclHandler : NULL);
- }
-
- // @cmember Enable/Disable the end DOCTYPE declaration handler
-
- void EnableEndDoctypeDeclHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- XML_SetEndDoctypeDeclHandler (m_p,
- fEnable ? EndDoctypeDeclHandler : NULL);
- }
-
- // @cmember Enable/Disable the DOCTYPE declaration handler
-
- void EnableDoctypeDeclHandler (bool fEnable = true)
- {
- assert (m_p != NULL);
- EnableStartDoctypeDeclHandler (fEnable);
- EnableEndDoctypeDeclHandler (fEnable);
- }
-
-public:
- // Parser error reporting methods
-
- // @cmember Get last error
-
- enum XML_Error GetErrorCode ()
- {
- assert (m_p != NULL);
- return XML_GetErrorCode (m_p);
- }
-
- // @cmember Get the current byte index
-
- long GetCurrentByteIndex ()
- {
- assert (m_p != NULL);
- return XML_GetCurrentByteIndex (m_p);
- }
-
- // @cmember Get the current line number
-
- int GetCurrentLineNumber ()
- {
- assert (m_p != NULL);
- return XML_GetCurrentLineNumber (m_p);
- }
-
- // @cmember Get the current column number
-
- int GetCurrentColumnNumber ()
- {
- assert (m_p != NULL);
- return XML_GetCurrentColumnNumber (m_p);
- }
-
- // @cmember Get the current byte count
-
- int GetCurrentByteCount ()
- {
- assert (m_p != NULL);
- return XML_GetCurrentByteCount (m_p);
- }
-
- // @cmember Get the input context
-
- const char *GetInputContext (int *pnOffset, int *pnSize)
- {
- assert (m_p != NULL);
- return XML_GetInputContext (m_p, pnOffset, pnSize);
- }
-
- // @cmember Get last error string
-
- const XML_LChar *GetErrorString ()
- {
- return XML_ErrorString (GetErrorCode ());
- }
-
- // @cmember Return the version string
-
- static const XML_LChar *GetExpatVersion ()
- {
- return XML_ExpatVersion ();
- }
-
- // @cmember Get the version information
-
- static void GetExpatVersion (int *pnMajor, int *pnMinor, int *pnMicro)
- {
- XML_expat_version v = XML_ExpatVersionInfo ();
- if (pnMajor)
- *pnMajor = v .major;
- if (pnMinor)
- *pnMinor = v .minor;
- if (pnMicro)
- *pnMicro = v .micro;
- }
-
- // @cmember Get last error string
-
- static const XML_LChar *GetErrorString (enum XML_Error nError)
- {
- return XML_ErrorString (nError);
- }
-
-
- // Public handler methods:
- // The template parameter should provide their own implementation for those handlers that they want
-
- // @cmember Start element handler
-
- void OnStartElement (const XML_Char *pszName, const XML_Char **papszAttrs)
- {
- return;
- }
-
- // @cmember End element handler
-
- void OnEndElement (const XML_Char *pszName)
- {
- return;
- }
-
- // @cmember Character data handler
-
- void OnCharacterData (const XML_Char *pszData, int nLength)
- {
- return;
- }
-
- // @cmember Processing instruction handler
-
- void OnProcessingInstruction (const XML_Char *pszTarget,
- const XML_Char *pszData)
- {
- return;
- }
-
- // @cmember Comment handler
-
- void OnComment (const XML_Char *pszData)
- {
- return;
- }
-
- // @cmember Start CDATA section handler
-
- void OnStartCdataSection ()
- {
- return;
- }
-
- // @cmember End CDATA section handler
-
- void OnEndCdataSection ()
- {
- return;
- }
-
- // @cmember Default handler
-
- void OnDefault (const XML_Char *pszData, int nLength)
- {
- return;
- }
-
- // @cmember External entity ref handler
-
- bool OnExternalEntityRef (const XML_Char *pszContext,
- const XML_Char *pszBase, const XML_Char *pszSystemID,
- const XML_Char *pszPublicID)
- {
- return false;
- }
-
- // @cmember Unknown encoding handler
-
- bool OnUnknownEncoding (const XML_Char *pszName, XML_Encoding *pInfo)
- {
- return false;
- }
-
- // @cmember Start namespace declaration handler
-
- void OnStartNamespaceDecl (const XML_Char *pszPrefix,
- const XML_Char *pszURI)
- {
- return;
- }
-
- // @cmember End namespace declaration handler
-
- void OnEndNamespaceDecl (const XML_Char *pszPrefix)
- {
- return;
- }
-
- // @cmember XML declaration handler
-
- void OnXmlDecl (const XML_Char *pszVersion, const XML_Char *pszEncoding,
- bool fStandalone)
- {
- return;
- }
-
- // @cmember Start DOCTYPE declaration handler
-
- void OnStartDoctypeDecl (const XML_Char *pszDoctypeName,
- const XML_Char *pszSysID, const XML_Char *pszPubID,
- bool fHasInternalSubset)
- {
- return;
- }
-
- // @cmember End DOCTYPE declaration handler
-
- void OnEndDoctypeDecl ()
- {
- return;
- }
-
-// @access Protected methods
-protected:
-
- // @cmember Handle any post creation
-
- void OnPostCreate ()
- {
- }
-
-// @access Protected static methods
-protected:
-
- // @cmember Start element handler wrapper
-
- static void __cdecl StartElementHandler (void *pUserData,
- const XML_Char *pszName, const XML_Char **papszAttrs)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- pThis ->OnStartElement (pszName, papszAttrs);
- }
-
- // @cmember End element handler wrapper
-
- static void __cdecl EndElementHandler (void *pUserData,
- const XML_Char *pszName)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- pThis ->OnEndElement (pszName);
- }
-
- // @cmember Character data handler wrapper
-
- static void __cdecl CharacterDataHandler (void *pUserData,
- const XML_Char *pszData, int nLength)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- pThis ->OnCharacterData (pszData, nLength);
- }
-
- // @cmember Processing instruction handler wrapper
-
- static void __cdecl ProcessingInstructionHandler (void *pUserData,
- const XML_Char *pszTarget, const XML_Char *pszData)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- pThis ->OnProcessingInstruction (pszTarget, pszData);
- }
-
- // @cmember Comment handler wrapper
-
- static void __cdecl CommentHandler (void *pUserData,
- const XML_Char *pszData)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- pThis ->OnComment (pszData);
- }
-
- // @cmember Start CDATA section wrapper
-
- static void __cdecl StartCdataSectionHandler (void *pUserData)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- pThis ->OnStartCdataSection ();
- }
-
- // @cmember End CDATA section wrapper
-
- static void __cdecl EndCdataSectionHandler (void *pUserData)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- pThis ->OnEndCdataSection ();
- }
-
- // @cmember Default wrapper
-
- static void __cdecl DefaultHandler (void *pUserData,
- const XML_Char *pszData, int nLength)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- pThis ->OnDefault (pszData, nLength);
- }
-
- // @cmember External entity ref wrapper
-
- static int __cdecl ExternalEntityRefHandler (void *pUserData,
- const XML_Char *pszContext, const XML_Char *pszBase,
- const XML_Char *pszSystemID, const XML_Char *pszPublicID)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- return pThis ->OnExternalEntityRef (pszContext,
- pszBase, pszSystemID, pszPublicID) ? 1 : 0;
- }
-
- // @cmember Unknown encoding wrapper
-
- static int __cdecl UnknownEncodingHandler (void * pUserData, const XML_Char * pszName, XML_Encoding * pInfo)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- return pThis ->OnUnknownEncoding (pszName, pInfo) ? 1 : 0;
- }
-
- // @cmember Start namespace decl wrapper
-
- static void __cdecl StartNamespaceDeclHandler (void * pUserData, const XML_Char * pszPrefix, const XML_Char * pszURI)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- pThis ->OnStartNamespaceDecl (pszPrefix, pszURI);
- }
-
- // @cmember End namespace decl wrapper
-
- static void __cdecl EndNamespaceDeclHandler (void * pUserData, const XML_Char * pszPrefix)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- pThis ->OnEndNamespaceDecl (pszPrefix);
- }
-
- // @cmember XML declaration wrapper
-
- static void __cdecl XmlDeclHandler (void *pUserData, const XML_Char *pszVersion, const XML_Char *pszEncoding, int nStandalone)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- pThis ->OnXmlDecl (pszVersion, pszEncoding, nStandalone != 0);
- }
-
- // @cmember Start Doctype declaration wrapper
-
- static void __cdecl StartDoctypeDeclHandler (
- void *pUserData, const XML_Char *pszDoctypeName, const XML_Char *pszSysID,
- const XML_Char *pszPubID, int nHasInternalSubset
- )
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- pThis ->OnStartDoctypeDecl (pszDoctypeName, pszSysID,
- pszPubID, nHasInternalSubset != 0);
- }
-
- // @cmember End Doctype declaration wrapper
-
- static void __cdecl EndDoctypeDeclHandler (void *pUserData)
- {
- _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
- pThis ->OnEndDoctypeDecl ();
- }
-
-
-protected:
-
- XML_Parser m_p;
-
- /// Returns the value of the specified attribute, if found; NULL otherwise
- static const XML_Char * FindAttr(const XML_Char ** iAttrs, const XML_Char * iAttrToFind)
- {
- for (const XML_Char ** Attr = iAttrs; *Attr != NULL; Attr += 2)
- {
- if (strcmp(*Attr, iAttrToFind) == 0)
- {
- return *(Attr + 1);
- }
- } // for Attr - iAttrs[]
- return NULL;
- }
-} ;
-
-
-
-
+
+// XMLParser.h
+
+// Interfaces to the CXMLParser class representing the base class for XML parsing
+
+// To use, derive a class from this base and override its OnStartElement(), OnEndElement() and OnCharacters() functions
+
+
+
+
+
+#pragma once
+
+#include "expat/expat.h"
+
+
+
+
+
+class CXMLParser
+{
+public:
+ CXMLParser(void);
+ virtual ~CXMLParser();
+
+ // The actual parsing, may be called several times; the last time needs iIsFinal == true (-> flush)
+ int Parse(const char * iData, size_t iLength, bool iIsFinal = false);
+
+private:
+ // LibExpat stuff:
+ XML_Parser mParser;
+
+ static void StartElementHandler(void * iContext, const XML_Char * iElement, const XML_Char ** iAttributes)
+ {
+ ((CXMLParser *)iContext)->OnStartElement(iElement, iAttributes);
+ }
+
+ static void EndElementHandler (void * iContext, const XML_Char * iElement)
+ {
+ ((CXMLParser *)iContext)->OnEndElement(iElement);
+ }
+
+ static void CharacterDataHandler (void * iContext, const XML_Char * iData, int iLength)
+ {
+ ((CXMLParser *)iContext)->OnCharacters(iData, iLength);
+ }
+
+protected:
+ virtual void OnStartElement(const XML_Char * iElement, const XML_Char ** iAttributes) = 0;
+ virtual void OnEndElement (const XML_Char * iElement) = 0;
+ virtual void OnCharacters (const XML_Char * iCharacters, int iLength) = 0;
+} ;
+
+
+
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// The following template has been modified from code available at
+// http://www.codeproject.com/Articles/1847/C-Wrappers-for-the-Expat-XML-Parser
+// It uses templates to remove the virtual function call penalty (both size and speed) for each callback
+
+/* Usage:
+1, Declare a subclass:
+ class CMyParser : public CExpatImpl<CMyParser>
+2, Declare handlers that you want in that subclass:
+ void CMyParser::OnEndElement(const XML_Char * iTagName);
+3, Create an instance of your class:
+ CMyParser Parser;
+4, Call Create():
+ Parser.Create(NULL, NULL);
+4, Call Parse(), repeatedly:
+ Parser.Parse(Buffer, Length);
+*/
+
+template <class _T>
+class CExpatImpl
+{
+
+// @access Constructors and destructors
+public:
+
+ // @cmember General constructor
+
+ CExpatImpl ()
+ {
+ m_p = NULL;
+ }
+
+ // @cmember Destructor
+
+ ~CExpatImpl ()
+ {
+ Destroy ();
+ }
+
+// @access Parser creation and deletion methods
+public:
+
+ // @cmember Create a parser
+
+ bool Create (const XML_Char * pszEncoding = NULL, const XML_Char * pszSep = NULL)
+ {
+ // Destroy the old parser
+ Destroy ();
+
+ // If the encoding or seperator are empty, then NULL
+ if (pszEncoding != NULL && pszEncoding [0] == 0)
+ {
+ pszEncoding = NULL;
+ }
+ if (pszSep != NULL && pszSep [0] == 0)
+ {
+ pszSep = NULL;
+ }
+
+ // Create the new parser
+ m_p = XML_ParserCreate_MM (pszEncoding, NULL, pszSep);
+ if (m_p == NULL)
+ {
+ return false;
+ }
+
+ // Invoke the post create routine
+ _T * pThis = static_cast <_T *> (this);
+ pThis ->OnPostCreate ();
+
+ // Set the user data used in callbacks
+ XML_SetUserData (m_p, (void *) this);
+ return true;
+ }
+
+ // @cmember Destroy the parser
+
+ void Destroy (void)
+ {
+ if (m_p != NULL)
+ {
+ XML_ParserFree (m_p);
+ }
+ m_p = NULL;
+ }
+
+
+ // @cmember Parse a block of data
+
+ bool Parse (const char *pszBuffer, int nLength, bool fIsFinal = true)
+ {
+ assert (m_p != NULL);
+ return XML_Parse (m_p, pszBuffer, nLength, fIsFinal) != 0;
+ }
+
+ // @cmember Parse internal buffer
+
+ bool ParseBuffer (int nLength, bool fIsFinal = true)
+ {
+ assert (m_p != NULL);
+ return XML_ParseBuffer (m_p, nLength, fIsFinal) != 0;
+ }
+
+ // @cmember Get the internal buffer
+
+ void *GetBuffer (int nLength)
+ {
+ assert (m_p != NULL);
+ return XML_GetBuffer (m_p, nLength);
+ }
+
+
+protected:
+ // Parser callback enable/disable methods:
+
+ // @cmember Enable/Disable the start element handler
+
+ void EnableStartElementHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetStartElementHandler (m_p, fEnable ? StartElementHandler : NULL);
+ }
+
+ // @cmember Enable/Disable the end element handler
+
+ void EnableEndElementHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetEndElementHandler (m_p, fEnable ? EndElementHandler : NULL);
+ }
+
+ // @cmember Enable/Disable the element handlers
+
+ void EnableElementHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ EnableStartElementHandler (fEnable);
+ EnableEndElementHandler (fEnable);
+ }
+
+ // @cmember Enable/Disable the character data handler
+
+ void EnableCharacterDataHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetCharacterDataHandler (m_p, fEnable ? CharacterDataHandler : NULL);
+ }
+
+ // @cmember Enable/Disable the processing instruction handler
+
+ void EnableProcessingInstructionHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetProcessingInstructionHandler (m_p, fEnable ? ProcessingInstructionHandler : NULL);
+ }
+
+ // @cmember Enable/Disable the comment handler
+
+ void EnableCommentHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetCommentHandler (m_p, fEnable ? CommentHandler : NULL);
+ }
+
+ // @cmember Enable/Disable the start CDATA section handler
+
+ void EnableStartCdataSectionHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetStartCdataSectionHandler (m_p, fEnable ? StartCdataSectionHandler : NULL);
+ }
+
+ // @cmember Enable/Disable the end CDATA section handler
+
+ void EnableEndCdataSectionHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetEndCdataSectionHandler (m_p, fEnable ? EndCdataSectionHandler : NULL);
+ }
+
+ // @cmember Enable/Disable the CDATA section handlers
+
+ void EnableCdataSectionHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ EnableStartCdataSectionHandler (fEnable);
+ EnableEndCdataSectionHandler (fEnable);
+ }
+
+ // @cmember Enable/Disable default handler
+
+ void EnableDefaultHandler (bool fEnable = true, bool fExpand = true)
+ {
+ assert (m_p != NULL);
+ if (fExpand)
+ {
+ XML_SetDefaultHandlerExpand (m_p, fEnable ? DefaultHandler : NULL);
+ }
+ else
+ XML_SetDefaultHandler (m_p, fEnable ? DefaultHandler : NULL);
+ }
+
+ // @cmember Enable/Disable external entity ref handler
+
+ void EnableExternalEntityRefHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetExternalEntityRefHandler (m_p, fEnable ? ExternalEntityRefHandler : NULL);
+ }
+
+ // @cmember Enable/Disable unknown encoding handler
+
+ void EnableUnknownEncodingHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetUnknownEncodingHandler (m_p, fEnable ? UnknownEncodingHandler : NULL);
+ }
+
+ // @cmember Enable/Disable start namespace handler
+
+ void EnableStartNamespaceDeclHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetStartNamespaceDeclHandler (m_p, fEnable ? StartNamespaceDeclHandler : NULL);
+ }
+
+ // @cmember Enable/Disable end namespace handler
+
+ void EnableEndNamespaceDeclHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetEndNamespaceDeclHandler (m_p, fEnable ? EndNamespaceDeclHandler : NULL);
+ }
+
+ // @cmember Enable/Disable namespace handlers
+
+ void EnableNamespaceDeclHandler (bool fEnable = true)
+ {
+ EnableStartNamespaceDeclHandler (fEnable);
+ EnableEndNamespaceDeclHandler (fEnable);
+ }
+
+ // @cmember Enable/Disable the XML declaration handler
+
+ void EnableXmlDeclHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetXmlDeclHandler (m_p, fEnable ? XmlDeclHandler : NULL);
+ }
+
+ // @cmember Enable/Disable the start DOCTYPE declaration handler
+
+ void EnableStartDoctypeDeclHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetStartDoctypeDeclHandler (m_p, fEnable ? StartDoctypeDeclHandler : NULL);
+ }
+
+ // @cmember Enable/Disable the end DOCTYPE declaration handler
+
+ void EnableEndDoctypeDeclHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ XML_SetEndDoctypeDeclHandler (m_p,
+ fEnable ? EndDoctypeDeclHandler : NULL);
+ }
+
+ // @cmember Enable/Disable the DOCTYPE declaration handler
+
+ void EnableDoctypeDeclHandler (bool fEnable = true)
+ {
+ assert (m_p != NULL);
+ EnableStartDoctypeDeclHandler (fEnable);
+ EnableEndDoctypeDeclHandler (fEnable);
+ }
+
+public:
+ // Parser error reporting methods
+
+ // @cmember Get last error
+
+ enum XML_Error GetErrorCode ()
+ {
+ assert (m_p != NULL);
+ return XML_GetErrorCode (m_p);
+ }
+
+ // @cmember Get the current byte index
+
+ long GetCurrentByteIndex ()
+ {
+ assert (m_p != NULL);
+ return XML_GetCurrentByteIndex (m_p);
+ }
+
+ // @cmember Get the current line number
+
+ int GetCurrentLineNumber ()
+ {
+ assert (m_p != NULL);
+ return XML_GetCurrentLineNumber (m_p);
+ }
+
+ // @cmember Get the current column number
+
+ int GetCurrentColumnNumber ()
+ {
+ assert (m_p != NULL);
+ return XML_GetCurrentColumnNumber (m_p);
+ }
+
+ // @cmember Get the current byte count
+
+ int GetCurrentByteCount ()
+ {
+ assert (m_p != NULL);
+ return XML_GetCurrentByteCount (m_p);
+ }
+
+ // @cmember Get the input context
+
+ const char *GetInputContext (int *pnOffset, int *pnSize)
+ {
+ assert (m_p != NULL);
+ return XML_GetInputContext (m_p, pnOffset, pnSize);
+ }
+
+ // @cmember Get last error string
+
+ const XML_LChar *GetErrorString ()
+ {
+ return XML_ErrorString (GetErrorCode ());
+ }
+
+ // @cmember Return the version string
+
+ static const XML_LChar *GetExpatVersion ()
+ {
+ return XML_ExpatVersion ();
+ }
+
+ // @cmember Get the version information
+
+ static void GetExpatVersion (int *pnMajor, int *pnMinor, int *pnMicro)
+ {
+ XML_expat_version v = XML_ExpatVersionInfo ();
+ if (pnMajor)
+ *pnMajor = v .major;
+ if (pnMinor)
+ *pnMinor = v .minor;
+ if (pnMicro)
+ *pnMicro = v .micro;
+ }
+
+ // @cmember Get last error string
+
+ static const XML_LChar *GetErrorString (enum XML_Error nError)
+ {
+ return XML_ErrorString (nError);
+ }
+
+
+ // Public handler methods:
+ // The template parameter should provide their own implementation for those handlers that they want
+
+ // @cmember Start element handler
+
+ void OnStartElement (const XML_Char *pszName, const XML_Char **papszAttrs)
+ {
+ return;
+ }
+
+ // @cmember End element handler
+
+ void OnEndElement (const XML_Char *pszName)
+ {
+ return;
+ }
+
+ // @cmember Character data handler
+
+ void OnCharacterData (const XML_Char *pszData, int nLength)
+ {
+ return;
+ }
+
+ // @cmember Processing instruction handler
+
+ void OnProcessingInstruction (const XML_Char *pszTarget,
+ const XML_Char *pszData)
+ {
+ return;
+ }
+
+ // @cmember Comment handler
+
+ void OnComment (const XML_Char *pszData)
+ {
+ return;
+ }
+
+ // @cmember Start CDATA section handler
+
+ void OnStartCdataSection ()
+ {
+ return;
+ }
+
+ // @cmember End CDATA section handler
+
+ void OnEndCdataSection ()
+ {
+ return;
+ }
+
+ // @cmember Default handler
+
+ void OnDefault (const XML_Char *pszData, int nLength)
+ {
+ return;
+ }
+
+ // @cmember External entity ref handler
+
+ bool OnExternalEntityRef (const XML_Char *pszContext,
+ const XML_Char *pszBase, const XML_Char *pszSystemID,
+ const XML_Char *pszPublicID)
+ {
+ return false;
+ }
+
+ // @cmember Unknown encoding handler
+
+ bool OnUnknownEncoding (const XML_Char *pszName, XML_Encoding *pInfo)
+ {
+ return false;
+ }
+
+ // @cmember Start namespace declaration handler
+
+ void OnStartNamespaceDecl (const XML_Char *pszPrefix,
+ const XML_Char *pszURI)
+ {
+ return;
+ }
+
+ // @cmember End namespace declaration handler
+
+ void OnEndNamespaceDecl (const XML_Char *pszPrefix)
+ {
+ return;
+ }
+
+ // @cmember XML declaration handler
+
+ void OnXmlDecl (const XML_Char *pszVersion, const XML_Char *pszEncoding,
+ bool fStandalone)
+ {
+ return;
+ }
+
+ // @cmember Start DOCTYPE declaration handler
+
+ void OnStartDoctypeDecl (const XML_Char *pszDoctypeName,
+ const XML_Char *pszSysID, const XML_Char *pszPubID,
+ bool fHasInternalSubset)
+ {
+ return;
+ }
+
+ // @cmember End DOCTYPE declaration handler
+
+ void OnEndDoctypeDecl ()
+ {
+ return;
+ }
+
+// @access Protected methods
+protected:
+
+ // @cmember Handle any post creation
+
+ void OnPostCreate ()
+ {
+ }
+
+// @access Protected static methods
+protected:
+
+ // @cmember Start element handler wrapper
+
+ static void __cdecl StartElementHandler (void *pUserData,
+ const XML_Char *pszName, const XML_Char **papszAttrs)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ pThis ->OnStartElement (pszName, papszAttrs);
+ }
+
+ // @cmember End element handler wrapper
+
+ static void __cdecl EndElementHandler (void *pUserData,
+ const XML_Char *pszName)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ pThis ->OnEndElement (pszName);
+ }
+
+ // @cmember Character data handler wrapper
+
+ static void __cdecl CharacterDataHandler (void *pUserData,
+ const XML_Char *pszData, int nLength)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ pThis ->OnCharacterData (pszData, nLength);
+ }
+
+ // @cmember Processing instruction handler wrapper
+
+ static void __cdecl ProcessingInstructionHandler (void *pUserData,
+ const XML_Char *pszTarget, const XML_Char *pszData)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ pThis ->OnProcessingInstruction (pszTarget, pszData);
+ }
+
+ // @cmember Comment handler wrapper
+
+ static void __cdecl CommentHandler (void *pUserData,
+ const XML_Char *pszData)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ pThis ->OnComment (pszData);
+ }
+
+ // @cmember Start CDATA section wrapper
+
+ static void __cdecl StartCdataSectionHandler (void *pUserData)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ pThis ->OnStartCdataSection ();
+ }
+
+ // @cmember End CDATA section wrapper
+
+ static void __cdecl EndCdataSectionHandler (void *pUserData)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ pThis ->OnEndCdataSection ();
+ }
+
+ // @cmember Default wrapper
+
+ static void __cdecl DefaultHandler (void *pUserData,
+ const XML_Char *pszData, int nLength)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ pThis ->OnDefault (pszData, nLength);
+ }
+
+ // @cmember External entity ref wrapper
+
+ static int __cdecl ExternalEntityRefHandler (void *pUserData,
+ const XML_Char *pszContext, const XML_Char *pszBase,
+ const XML_Char *pszSystemID, const XML_Char *pszPublicID)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ return pThis ->OnExternalEntityRef (pszContext,
+ pszBase, pszSystemID, pszPublicID) ? 1 : 0;
+ }
+
+ // @cmember Unknown encoding wrapper
+
+ static int __cdecl UnknownEncodingHandler (void * pUserData, const XML_Char * pszName, XML_Encoding * pInfo)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ return pThis ->OnUnknownEncoding (pszName, pInfo) ? 1 : 0;
+ }
+
+ // @cmember Start namespace decl wrapper
+
+ static void __cdecl StartNamespaceDeclHandler (void * pUserData, const XML_Char * pszPrefix, const XML_Char * pszURI)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ pThis ->OnStartNamespaceDecl (pszPrefix, pszURI);
+ }
+
+ // @cmember End namespace decl wrapper
+
+ static void __cdecl EndNamespaceDeclHandler (void * pUserData, const XML_Char * pszPrefix)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ pThis ->OnEndNamespaceDecl (pszPrefix);
+ }
+
+ // @cmember XML declaration wrapper
+
+ static void __cdecl XmlDeclHandler (void *pUserData, const XML_Char *pszVersion, const XML_Char *pszEncoding, int nStandalone)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ pThis ->OnXmlDecl (pszVersion, pszEncoding, nStandalone != 0);
+ }
+
+ // @cmember Start Doctype declaration wrapper
+
+ static void __cdecl StartDoctypeDeclHandler (
+ void *pUserData, const XML_Char *pszDoctypeName, const XML_Char *pszSysID,
+ const XML_Char *pszPubID, int nHasInternalSubset
+ )
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ pThis ->OnStartDoctypeDecl (pszDoctypeName, pszSysID,
+ pszPubID, nHasInternalSubset != 0);
+ }
+
+ // @cmember End Doctype declaration wrapper
+
+ static void __cdecl EndDoctypeDeclHandler (void *pUserData)
+ {
+ _T *pThis = static_cast <_T *> ((CExpatImpl <_T> *) pUserData);
+ pThis ->OnEndDoctypeDecl ();
+ }
+
+
+protected:
+
+ XML_Parser m_p;
+
+ /// Returns the value of the specified attribute, if found; NULL otherwise
+ static const XML_Char * FindAttr(const XML_Char ** iAttrs, const XML_Char * iAttrToFind)
+ {
+ for (const XML_Char ** Attr = iAttrs; *Attr != NULL; Attr += 2)
+ {
+ if (strcmp(*Attr, iAttrToFind) == 0)
+ {
+ return *(Attr + 1);
+ }
+ } // for Attr - iAttrs[]
+ return NULL;
+ }
+} ;
+
+
+
+