1 // Copyright 2014 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #ifndef _FX_SAX_IMP_ 8 #define _FX_SAX_IMP_ 9 10 class CFX_SAXFile { 11 public: 12 CFX_SAXFile(); 13 FX_BOOL StartFile(IFX_FileRead* pFile, FX_DWORD dwStart, FX_DWORD dwLen); 14 FX_BOOL ReadNextBlock(); 15 void Reset(); 16 IFX_FileRead* m_pFile; 17 FX_DWORD m_dwStart; 18 FX_DWORD m_dwEnd; 19 FX_DWORD m_dwCur; 20 uint8_t* m_pBuf; 21 FX_DWORD m_dwBufSize; 22 FX_DWORD m_dwBufIndex; 23 }; 24 enum FX_SAXMODE { 25 FX_SAXMODE_Text = 0, 26 FX_SAXMODE_NodeStart, 27 FX_SAXMODE_DeclOrComment, 28 FX_SAXMODE_DeclNode, 29 FX_SAXMODE_Comment, 30 FX_SAXMODE_CommentContent, 31 FX_SAXMODE_TagName, 32 FX_SAXMODE_TagAttributeName, 33 FX_SAXMODE_TagAttributeEqual, 34 FX_SAXMODE_TagAttributeValue, 35 FX_SAXMODE_TagMaybeClose, 36 FX_SAXMODE_TagClose, 37 FX_SAXMODE_TagEnd, 38 FX_SAXMODE_TargetData, 39 FX_SAXMODE_MAX, 40 }; 41 class CFX_SAXItem { 42 public: CFX_SAXItem()43 CFX_SAXItem() 44 : m_pNode(NULL), 45 m_eNode(FX_SAXNODE_Unknown), 46 m_dwID(0), 47 m_bSkip(FALSE), 48 m_pPrev(NULL), 49 m_pNext(NULL) {} 50 void* m_pNode; 51 FX_SAXNODE m_eNode; 52 FX_DWORD m_dwID; 53 FX_BOOL m_bSkip; 54 CFX_SAXItem* m_pPrev; 55 CFX_SAXItem* m_pNext; 56 }; 57 class CFX_SAXCommentContext { 58 public: CFX_SAXCommentContext()59 CFX_SAXCommentContext() : m_iHeaderCount(0), m_iTailCount(0) {} 60 int32_t m_iHeaderCount; 61 int32_t m_iTailCount; 62 }; 63 class CFX_SAXReader : public IFX_SAXReader { 64 public: 65 CFX_SAXReader(); 66 ~CFX_SAXReader(); Release()67 virtual void Release() { delete this; } 68 virtual int32_t StartParse(IFX_FileRead* pFile, 69 FX_DWORD dwStart = 0, 70 FX_DWORD dwLen = -1, 71 FX_DWORD dwParseMode = 0); 72 virtual int32_t ContinueParse(IFX_Pause* pPause = NULL); 73 virtual void SkipCurrentNode(); 74 virtual void SetHandler(IFX_SAXReaderHandler* pHandler); 75 void AppendData(uint8_t ch); 76 void AppendName(uint8_t ch); 77 void ParseText(); 78 void ParseNodeStart(); 79 void ParseInstruction(); 80 void ParseDeclOrComment(); 81 void ParseDeclNode(); 82 void ParseComment(); 83 void ParseCommentContent(); 84 void ParseTagName(); 85 void ParseTagAttributeName(); 86 void ParseTagAttributeEqual(); 87 void ParseTagAttributeValue(); 88 void ParseMaybeClose(); 89 void ParseTagClose(); 90 void ParseTagEnd(); 91 void ParseTargetData(); 92 93 protected: 94 CFX_SAXFile m_File; 95 IFX_SAXReaderHandler* m_pHandler; 96 int32_t m_iState; 97 CFX_SAXItem* m_pRoot; 98 CFX_SAXItem* m_pCurItem; 99 FX_DWORD m_dwItemID; 100 FX_SAXMODE m_eMode; 101 FX_SAXMODE m_ePrevMode; 102 FX_BOOL m_bCharData; 103 uint8_t m_CurByte; 104 FX_DWORD m_dwDataOffset; 105 CFX_ByteArray m_SkipStack; 106 uint8_t m_SkipChar; 107 FX_DWORD m_dwNodePos; 108 uint8_t* m_pszData; 109 int32_t m_iDataSize; 110 int32_t m_iDataLength; 111 int32_t m_iEntityStart; 112 int32_t m_iDataPos; 113 uint8_t* m_pszName; 114 int32_t m_iNameSize; 115 int32_t m_iNameLength; 116 FX_DWORD m_dwParseMode; 117 CFX_SAXCommentContext* m_pCommentContext; 118 void Reset(); 119 void Push(); 120 void Pop(); 121 FX_BOOL SkipSpace(uint8_t ch); 122 void SkipNode(); 123 void NotifyData(); 124 void NotifyEnter(); 125 void NotifyAttribute(); 126 void NotifyBreak(); 127 void NotifyClose(); 128 void NotifyEnd(); 129 void NotifyTargetData(); 130 void ReallocDataBuffer(); 131 void ReallocNameBuffer(); 132 void ParseChar(uint8_t ch); 133 }; 134 #endif 135