| // 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 CORE_FXCRT_XML_CFX_SAXREADER_H_ | |
| #define CORE_FXCRT_XML_CFX_SAXREADER_H_ | |
| #include <memory> | |
| #include <stack> | |
| #include <vector> | |
| #include "core/fxcrt/fx_basic.h" | |
| class CFX_SAXCommentContext; | |
| class CFX_SAXContext; | |
| enum class CFX_SaxMode; | |
| class CFX_SAXItem { | |
| public: | |
| enum class Type { | |
| Unknown = 0, | |
| Instruction, | |
| Declaration, | |
| Comment, | |
| Tag, | |
| Text, | |
| CharData, | |
| }; | |
| explicit CFX_SAXItem(uint32_t id) | |
| : m_pNode(nullptr), m_eNode(Type::Unknown), m_dwID(id), m_bSkip(false) {} | |
| CFX_SAXContext* m_pNode; | |
| Type m_eNode; | |
| const uint32_t m_dwID; | |
| bool m_bSkip; | |
| }; | |
| class CFX_SAXFile { | |
| public: | |
| CFX_SAXFile(); | |
| ~CFX_SAXFile(); | |
| bool StartFile(const CFX_RetainPtr<IFX_SeekableReadStream>& pFile, | |
| uint32_t dwStart, | |
| uint32_t dwLen); | |
| bool ReadNextBlock(); | |
| void Reset(); | |
| CFX_RetainPtr<IFX_SeekableReadStream> 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 CFX_SaxParseMode { | |
| CFX_SaxParseMode_NotConvert_amp = 1 << 0, | |
| CFX_SaxParseMode_NotConvert_lt = 1 << 1, | |
| CFX_SaxParseMode_NotConvert_gt = 1 << 2, | |
| CFX_SaxParseMode_NotConvert_apos = 1 << 3, | |
| CFX_SaxParseMode_NotConvert_quot = 1 << 4, | |
| CFX_SaxParseMode_NotConvert_sharp = 1 << 5, | |
| CFX_SaxParseMode_NotSkipSpace = 1 << 6 | |
| }; | |
| class CFX_SAXReader { | |
| public: | |
| class HandlerIface { | |
| public: | |
| virtual ~HandlerIface() {} | |
| virtual CFX_SAXContext* OnTagEnter(const CFX_ByteStringC& bsTagName, | |
| CFX_SAXItem::Type eType, | |
| uint32_t dwStartPos) = 0; | |
| virtual void OnTagAttribute(CFX_SAXContext* pTag, | |
| const CFX_ByteStringC& bsAttri, | |
| const CFX_ByteStringC& bsValue) = 0; | |
| virtual void OnTagBreak(CFX_SAXContext* pTag) = 0; | |
| virtual void OnTagData(CFX_SAXContext* pTag, | |
| CFX_SAXItem::Type eType, | |
| const CFX_ByteStringC& bsData, | |
| uint32_t dwStartPos) = 0; | |
| virtual void OnTagClose(CFX_SAXContext* pTag, uint32_t dwEndPos) = 0; | |
| virtual void OnTagEnd(CFX_SAXContext* pTag, | |
| const CFX_ByteStringC& bsTagName, | |
| uint32_t dwEndPos) = 0; | |
| virtual void OnTargetData(CFX_SAXContext* pTag, | |
| CFX_SAXItem::Type eType, | |
| const CFX_ByteStringC& bsData, | |
| uint32_t dwStartPos) = 0; | |
| }; | |
| CFX_SAXReader(); | |
| ~CFX_SAXReader(); | |
| int32_t StartParse(const CFX_RetainPtr<IFX_SeekableReadStream>& pFile, | |
| uint32_t dwStart = 0, | |
| uint32_t dwLen = -1, | |
| uint32_t dwParseMode = 0); | |
| int32_t ContinueParse(IFX_Pause* pPause = nullptr); | |
| void SetHandler(HandlerIface* pHandler) { m_pHandler = pHandler; } | |
| private: | |
| void ParseInternal(); | |
| void SkipCurrentNode(); | |
| 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(); | |
| void Reset(); | |
| void ClearData(); | |
| void ClearName(); | |
| void AppendToData(uint8_t ch); | |
| void AppendToName(uint8_t ch); | |
| void BackUpAndReplaceDataAt(int32_t index, uint8_t ch); | |
| bool IsEntityStart(uint8_t ch) const; | |
| bool IsEntityEnd(uint8_t ch) const; | |
| int32_t CurrentDataIndex() const; | |
| void Push(); | |
| void Pop(); | |
| CFX_SAXItem* GetCurrentItem() const; | |
| 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; | |
| HandlerIface* m_pHandler; | |
| int32_t m_iState; | |
| std::stack<std::unique_ptr<CFX_SAXItem>> m_Stack; | |
| uint32_t m_dwItemID; | |
| CFX_SaxMode m_eMode; | |
| CFX_SaxMode m_ePrevMode; | |
| bool m_bCharData; | |
| uint8_t m_CurByte; | |
| uint32_t m_dwDataOffset; | |
| std::stack<char> m_SkipStack; | |
| uint8_t m_SkipChar; | |
| uint32_t m_dwNodePos; | |
| std::vector<uint8_t> m_Data; | |
| int32_t m_iEntityStart; // Index into m_Data. | |
| std::vector<uint8_t> m_Name; | |
| uint32_t m_dwParseMode; | |
| std::unique_ptr<CFX_SAXCommentContext> m_pCommentContext; | |
| }; | |
| #endif // CORE_FXCRT_XML_CFX_SAXREADER_H_ |