Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

#ifndef __XMLPARSER_H__
#define __XMLPARSER_H__

#include "Common.h"

#include "PerfTimer.h"

struct PFILE;

namespace Sexy
{

class XMLParam
{
public:
        std::string                             mKey;
        std::string                             mValue;
};

typedef std::map<SexyString, SexyString>        XMLParamMap;
typedef std::list<XMLParamMap::iterator>        XMLParamMapIteratorList;

typedef std::vector<wchar_t> XMLParserBuffer;

class XMLElement
{
public:
        enum
        {
                TYPE_NONE,
                TYPE_START,
                TYPE_END,
                TYPE_ELEMENT,
                TYPE_INSTRUCTION,
                TYPE_COMMENT
        };
public:
       
        int                                             mType;
        SexyString                              mSection;
        SexyString                              mValue;
        SexyString                              mInstruction;
        XMLParamMap                             mAttributes;
        XMLParamMapIteratorList mAttributeIteratorList; // stores attribute iterators in their original order
};

class XMLParser
{
protected:
        std::string                             mFileName;
        SexyString                              mErrorText;
        int                                             mLineNum;
        PFILE*                                  mFile;
        bool                                    mHasFailed;
        bool                                    mAllowComments;
        XMLParserBuffer                 mBufferedText;
        SexyString                              mSection;
        bool                                    (XMLParser::*mGetCharFunc)(wchar_t* theChar, bool* error);
        bool                                    mForcedEncodingType;
        bool                                    mFirstChar;
        bool                                    mByteSwap;

protected:
        void                                    Fail(const SexyString& theErrorText);
        void                                    Init();

        bool                                    AddAttribute(XMLElement* theElement, const SexyString& aAttributeKey, const SexyString& aAttributeValue);

        bool                                    GetAsciiChar(wchar_t* theChar, bool* error);
        bool                                    GetUTF8Char(wchar_t* theChar, bool* error);
        bool                                    GetUTF16Char(wchar_t* theChar, bool* error);
        bool                                    GetUTF16LEChar(wchar_t* theChar, bool* error);
        bool                                    GetUTF16BEChar(wchar_t* theChar, bool* error);

public:
        enum XMLEncodingType
        {
                ASCII,
                UTF_8,
                UTF_16,
                UTF_16_LE,
                UTF_16_BE
        };

public:
        XMLParser();
        virtual ~XMLParser();

        void                                    SetEncodingType(XMLEncodingType theEncoding);
        bool                                    OpenFile(const std::string& theFilename);
        void                                    SetStringSource(const std::wstring& theString);
        void                                    SetStringSource(const std::string& theString);
        bool                                    NextElement(XMLElement* theElement);
        SexyString                              GetErrorText();
        int                                             GetCurrentLineNum();
        std::string                             GetFileName();

        inline void                             AllowComments(bool doAllow) { mAllowComments = doAllow; }

        bool                                    HasFailed();
        bool                                    EndOfFile();
};

};

#endif //__XMLPARSER_H__