| // Copyright 2014 PDFium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| |
| #ifndef XFA_FGAS_XML_FGAS_SAX_IMP_H_ |
| #define XFA_FGAS_XML_FGAS_SAX_IMP_H_ |
| |
| #include "xfa/fgas/xml/fgas_sax.h" |
| |
| 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; |
| }; |
| |
| 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 CFX_SAXItem { |
| public: |
| 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 CFX_SAXCommentContext { |
| public: |
| CFX_SAXCommentContext() : m_iHeaderCount(0), m_iTailCount(0) {} |
| int32_t m_iHeaderCount; |
| int32_t m_iTailCount; |
| }; |
| |
| class CFX_SAXReader : public IFX_SAXReader { |
| public: |
| CFX_SAXReader(); |
| ~CFX_SAXReader(); |
| virtual void Release() { delete this; } |
| virtual int32_t StartParse(IFX_FileRead* pFile, |
| uint32_t dwStart = 0, |
| uint32_t dwLen = -1, |
| uint32_t dwParseMode = 0); |
| virtual int32_t ContinueParse(IFX_Pause* pPause = NULL); |
| virtual void SkipCurrentNode(); |
| virtual void SetHandler(IFX_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: |
| CFX_SAXFile m_File; |
| IFX_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; |
| 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); |
| }; |
| |
| #endif // XFA_FGAS_XML_FGAS_SAX_IMP_H_ |