diff options
Diffstat (limited to 'xfa/fgas/xml/fgas_sax.h')
-rw-r--r-- | xfa/fgas/xml/fgas_sax.h | 159 |
1 files changed, 127 insertions, 32 deletions
diff --git a/xfa/fgas/xml/fgas_sax.h b/xfa/fgas/xml/fgas_sax.h index 501c358e0f..57ff6b2470 100644 --- a/xfa/fgas/xml/fgas_sax.h +++ b/xfa/fgas/xml/fgas_sax.h @@ -27,42 +27,137 @@ enum FX_SAXNODE { FX_SAXNODE_CharData, }; -class IFX_SAXReaderHandler { +enum FX_SAXMODE { + FX_SAXMODE_Text = 0, + FX_SAXMODE_NodeStart, + FX_SAXMODE_DeclOrComment, + FX_SAXMODE_DeclNode, + FX_SAXMODE_Comment, + FX_SAXMODE_CommentContent, + FX_SAXMODE_TagName, + FX_SAXMODE_TagAttributeName, + FX_SAXMODE_TagAttributeEqual, + FX_SAXMODE_TagAttributeValue, + FX_SAXMODE_TagMaybeClose, + FX_SAXMODE_TagClose, + FX_SAXMODE_TagEnd, + FX_SAXMODE_TargetData, + FX_SAXMODE_MAX, +}; + +class CXFA_SAXReaderHandler; + +class CFX_SAXFile { + public: + CFX_SAXFile(); + FX_BOOL StartFile(IFX_FileRead* pFile, uint32_t dwStart, uint32_t dwLen); + FX_BOOL ReadNextBlock(); + void Reset(); + IFX_FileRead* m_pFile; + uint32_t m_dwStart; + uint32_t m_dwEnd; + uint32_t m_dwCur; + uint8_t* m_pBuf; + uint32_t m_dwBufSize; + uint32_t m_dwBufIndex; +}; + +class CFX_SAXItem { public: - virtual ~IFX_SAXReaderHandler() {} - virtual void* OnTagEnter(const CFX_ByteStringC& bsTagName, - FX_SAXNODE eType, - uint32_t dwStartPos) = 0; - virtual void OnTagAttribute(void* pTag, - const CFX_ByteStringC& bsAttri, - const CFX_ByteStringC& bsValue) = 0; - virtual void OnTagBreak(void* pTag) = 0; - virtual void OnTagData(void* pTag, - FX_SAXNODE eType, - const CFX_ByteStringC& bsData, - uint32_t dwStartPos) = 0; - virtual void OnTagClose(void* pTag, uint32_t dwEndPos) = 0; - virtual void OnTagEnd(void* pTag, - const CFX_ByteStringC& bsTagName, - uint32_t dwEndPos) = 0; - virtual void OnTargetData(void* pTag, - FX_SAXNODE eType, - const CFX_ByteStringC& bsData, - uint32_t dwStartPos) = 0; + CFX_SAXItem() + : m_pNode(NULL), + m_eNode(FX_SAXNODE_Unknown), + m_dwID(0), + m_bSkip(FALSE), + m_pPrev(NULL), + m_pNext(NULL) {} + void* m_pNode; + FX_SAXNODE m_eNode; + uint32_t m_dwID; + FX_BOOL m_bSkip; + CFX_SAXItem* m_pPrev; + CFX_SAXItem* m_pNext; }; -class IFX_SAXReader { +class CFX_SAXCommentContext { public: - virtual ~IFX_SAXReader() {} - virtual void Release() = 0; - virtual int32_t StartParse(IFX_FileRead* pFile, - uint32_t dwStart = 0, - uint32_t dwLen = -1, - uint32_t dwParseMode = 0) = 0; - virtual int32_t ContinueParse(IFX_Pause* pPause = NULL) = 0; - virtual void SkipCurrentNode() = 0; - virtual void SetHandler(IFX_SAXReaderHandler* pHandler) = 0; + CFX_SAXCommentContext() : m_iHeaderCount(0), m_iTailCount(0) {} + int32_t m_iHeaderCount; + int32_t m_iTailCount; +}; + +class CFX_SAXReader { + public: + CFX_SAXReader(); + ~CFX_SAXReader(); + + void Release() { delete this; } + int32_t StartParse(IFX_FileRead* pFile, + uint32_t dwStart = 0, + uint32_t dwLen = -1, + uint32_t dwParseMode = 0); + int32_t ContinueParse(IFX_Pause* pPause = NULL); + void SkipCurrentNode(); + void SetHandler(CXFA_SAXReaderHandler* pHandler); + void AppendData(uint8_t ch); + void AppendName(uint8_t ch); + void ParseText(); + void ParseNodeStart(); + void ParseInstruction(); + void ParseDeclOrComment(); + void ParseDeclNode(); + void ParseComment(); + void ParseCommentContent(); + void ParseTagName(); + void ParseTagAttributeName(); + void ParseTagAttributeEqual(); + void ParseTagAttributeValue(); + void ParseMaybeClose(); + void ParseTagClose(); + void ParseTagEnd(); + void ParseTargetData(); + + protected: + void Reset(); + void Push(); + void Pop(); + FX_BOOL SkipSpace(uint8_t ch); + void SkipNode(); + void NotifyData(); + void NotifyEnter(); + void NotifyAttribute(); + void NotifyBreak(); + void NotifyClose(); + void NotifyEnd(); + void NotifyTargetData(); + void ReallocDataBuffer(); + void ReallocNameBuffer(); + void ParseChar(uint8_t ch); + + CFX_SAXFile m_File; + CXFA_SAXReaderHandler* m_pHandler; + int32_t m_iState; + CFX_SAXItem* m_pRoot; + CFX_SAXItem* m_pCurItem; + uint32_t m_dwItemID; + FX_SAXMODE m_eMode; + FX_SAXMODE m_ePrevMode; + FX_BOOL m_bCharData; + uint8_t m_CurByte; + uint32_t m_dwDataOffset; + CFX_ByteArray m_SkipStack; + uint8_t m_SkipChar; + uint32_t m_dwNodePos; + uint8_t* m_pszData; + int32_t m_iDataSize; + int32_t m_iDataLength; + int32_t m_iEntityStart; + int32_t m_iDataPos; + uint8_t* m_pszName; + int32_t m_iNameSize; + int32_t m_iNameLength; + uint32_t m_dwParseMode; + CFX_SAXCommentContext* m_pCommentContext; }; -IFX_SAXReader* FX_SAXReader_Create(); #endif // XFA_FGAS_XML_FGAS_SAX_H_ |