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 _FDE_XML_IMP 8 #define _FDE_XML_IMP 9 #define _FDE_BLOCK_BUFFER 10 #ifdef _FDE_BLOCK_BUFFER 11 class CFDE_BlockBuffer; 12 #endif 13 class CFDE_XMLNode; 14 class CFDE_XMLInstruction; 15 class CFDE_XMLElement; 16 class CFDE_XMLText; 17 class CFDE_XMLDoc; 18 class IFDE_XMLParser; 19 class CFDE_XMLDOMParser; 20 class CFDE_XMLSAXParser; 21 class CFDE_XMLSyntaxParser; 22 class CFDE_XMLNode : public CFX_Target { 23 public: 24 CFDE_XMLNode(); 25 virtual void Release() { delete this; } 26 virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_Unknown; } 27 virtual int32_t CountChildNodes() const; 28 virtual CFDE_XMLNode* GetChildNode(int32_t index) const; 29 virtual int32_t GetChildNodeIndex(CFDE_XMLNode* pNode) const; 30 virtual CFDE_XMLNode* GetPath(const FX_WCHAR* pPath, 31 int32_t iLength = -1, 32 FX_BOOL bQualifiedName = TRUE) const; 33 virtual int32_t InsertChildNode(CFDE_XMLNode* pNode, int32_t index = -1); 34 virtual void RemoveChildNode(CFDE_XMLNode* pNode); 35 virtual void DeleteChildren(); 36 virtual CFDE_XMLNode* GetNodeItem(IFDE_XMLNode::NodeItem eItem) const; 37 virtual int32_t GetNodeLevel() const; 38 virtual FX_BOOL InsertNodeItem(IFDE_XMLNode::NodeItem eItem, 39 CFDE_XMLNode* pNode); 40 virtual CFDE_XMLNode* RemoveNodeItem(IFDE_XMLNode::NodeItem eItem); 41 virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive); 42 virtual void SaveXMLNode(IFX_Stream* pXMLStream); 43 44 public: 45 ~CFDE_XMLNode(); 46 void CloneChildren(CFDE_XMLNode* pClone); 47 CFDE_XMLNode* m_pParent; 48 CFDE_XMLNode* m_pChild; 49 CFDE_XMLNode* m_pPrior; 50 CFDE_XMLNode* m_pNext; 51 }; 52 class CFDE_XMLInstruction : public CFDE_XMLNode { 53 public: 54 CFDE_XMLInstruction(const CFX_WideString& wsTarget); 55 virtual void Release() { delete this; } 56 virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_Instruction; } 57 virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive); 58 virtual void GetTargetName(CFX_WideString& wsTarget) const { 59 wsTarget = m_wsTarget; 60 } 61 virtual int32_t CountAttributes() const; 62 virtual FX_BOOL GetAttribute(int32_t index, 63 CFX_WideString& wsAttriName, 64 CFX_WideString& wsAttriValue) const; 65 virtual FX_BOOL HasAttribute(const FX_WCHAR* pwsAttriName) const; 66 virtual void GetString(const FX_WCHAR* pwsAttriName, 67 CFX_WideString& wsAttriValue, 68 const FX_WCHAR* pwsDefValue = NULL) const; 69 virtual void SetString(const CFX_WideString& wsAttriName, 70 const CFX_WideString& wsAttriValue); 71 virtual int32_t GetInteger(const FX_WCHAR* pwsAttriName, 72 int32_t iDefValue = 0) const; 73 virtual void SetInteger(const FX_WCHAR* pwsAttriName, int32_t iAttriValue); 74 virtual FX_FLOAT GetFloat(const FX_WCHAR* pwsAttriName, 75 FX_FLOAT fDefValue = 0) const; 76 virtual void SetFloat(const FX_WCHAR* pwsAttriName, FX_FLOAT fAttriValue); 77 virtual void RemoveAttribute(const FX_WCHAR* pwsAttriName); 78 virtual int32_t CountData() const; 79 virtual FX_BOOL GetData(int32_t index, CFX_WideString& wsData) const; 80 virtual void AppendData(const CFX_WideString& wsData); 81 virtual void RemoveData(int32_t index); 82 83 public: 84 ~CFDE_XMLInstruction() {} 85 CFX_WideString m_wsTarget; 86 CFX_WideStringArray m_Attributes; 87 CFX_WideStringArray m_TargetData; 88 }; 89 class CFDE_XMLElement : public CFDE_XMLNode { 90 public: 91 CFDE_XMLElement(const CFX_WideString& wsTag); 92 virtual void Release() { delete this; } 93 virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_Element; } 94 virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive); 95 virtual void GetTagName(CFX_WideString& wsTag) const; 96 virtual void GetLocalTagName(CFX_WideString& wsTag) const; 97 virtual void GetNamespacePrefix(CFX_WideString& wsPrefix) const; 98 virtual void GetNamespaceURI(CFX_WideString& wsNamespace) const; 99 virtual int32_t CountAttributes() const; 100 virtual FX_BOOL GetAttribute(int32_t index, 101 CFX_WideString& wsAttriName, 102 CFX_WideString& wsAttriValue) const; 103 virtual FX_BOOL HasAttribute(const FX_WCHAR* pwsAttriName) const; 104 virtual void GetString(const FX_WCHAR* pwsAttriName, 105 CFX_WideString& wsAttriValue, 106 const FX_WCHAR* pwsDefValue = NULL) const; 107 virtual void SetString(const CFX_WideString& wsAttriName, 108 const CFX_WideString& wsAttriValue); 109 virtual int32_t GetInteger(const FX_WCHAR* pwsAttriName, 110 int32_t iDefValue = 0) const; 111 virtual void SetInteger(const FX_WCHAR* pwsAttriName, int32_t iAttriValue); 112 virtual FX_FLOAT GetFloat(const FX_WCHAR* pwsAttriName, 113 FX_FLOAT fDefValue = 0) const; 114 virtual void SetFloat(const FX_WCHAR* pwsAttriName, FX_FLOAT fAttriValue); 115 virtual void RemoveAttribute(const FX_WCHAR* pwsAttriName); 116 virtual void GetTextData(CFX_WideString& wsText) const; 117 virtual void SetTextData(const CFX_WideString& wsText); 118 119 public: 120 ~CFDE_XMLElement(); 121 CFX_WideString m_wsTag; 122 CFX_WideStringArray m_Attributes; 123 }; 124 class CFDE_XMLText : public CFDE_XMLNode { 125 public: 126 CFDE_XMLText(const CFX_WideString& wsText); 127 virtual void Release() { delete this; } 128 virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_Text; } 129 virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive); 130 virtual void GetText(CFX_WideString& wsText) const { wsText = m_wsText; } 131 virtual void SetText(const CFX_WideString& wsText) { m_wsText = wsText; } 132 133 public: 134 ~CFDE_XMLText() {} 135 CFX_WideString m_wsText; 136 }; 137 class CFDE_XMLDeclaration : public CFDE_XMLNode { 138 public: 139 CFDE_XMLDeclaration() : CFDE_XMLNode() {} 140 }; 141 class CFDE_XMLCharData : public CFDE_XMLDeclaration { 142 public: 143 CFDE_XMLCharData(const CFX_WideString& wsCData); 144 145 virtual void Release() { delete this; } 146 virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_CharData; } 147 virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive); 148 virtual void GetCharData(CFX_WideString& wsCharData) const { 149 wsCharData = m_wsCharData; 150 } 151 virtual void SetCharData(const CFX_WideString& wsCData) { 152 m_wsCharData = wsCData; 153 } 154 155 public: 156 ~CFDE_XMLCharData() {} 157 158 CFX_WideString m_wsCharData; 159 }; 160 class CFDE_XMLDoc : public CFX_Target { 161 public: 162 CFDE_XMLDoc(); 163 ~CFDE_XMLDoc(); 164 virtual void Release() { delete this; } 165 virtual FX_BOOL LoadXML(IFX_Stream* pXMLStream, 166 int32_t iXMLPlaneSize = 8192, 167 int32_t iTextDataSize = 256, 168 FDE_LPXMLREADERHANDLER pHandler = NULL); 169 virtual FX_BOOL LoadXML(IFDE_XMLParser* pXMLParser); 170 virtual int32_t DoLoad(IFX_Pause* pPause = NULL); 171 virtual void CloseXML(); 172 virtual CFDE_XMLNode* GetRoot() const { return m_pRoot; } 173 virtual void SaveXML(IFX_Stream* pXMLStream = NULL, FX_BOOL bSaveBOM = TRUE); 174 virtual void SaveXMLNode(IFX_Stream* pXMLStream, IFDE_XMLNode* pNode); 175 176 protected: 177 IFX_Stream* m_pStream; 178 int32_t m_iStatus; 179 CFDE_XMLNode* m_pRoot; 180 IFDE_XMLSyntaxParser* m_pSyntaxParser; 181 IFDE_XMLParser* m_pXMLParser; 182 void Reset(FX_BOOL bInitRoot); 183 void ReleaseParser(); 184 }; 185 typedef CFX_StackTemplate<CFDE_XMLNode*> CFDE_XMLDOMNodeStack; 186 class CFDE_XMLDOMParser : public IFDE_XMLParser, public CFX_Target { 187 public: 188 CFDE_XMLDOMParser(CFDE_XMLNode* pRoot, IFDE_XMLSyntaxParser* pParser); 189 ~CFDE_XMLDOMParser(); 190 191 virtual void Release() { delete this; } 192 virtual int32_t DoParser(IFX_Pause* pPause); 193 194 private: 195 IFDE_XMLSyntaxParser* m_pParser; 196 CFDE_XMLNode* m_pParent; 197 CFDE_XMLNode* m_pChild; 198 CFDE_XMLDOMNodeStack m_NodeStack; 199 CFX_WideString m_ws1; 200 CFX_WideString m_ws2; 201 }; 202 class CFDE_XMLTAG : public CFX_Target { 203 public: 204 CFDE_XMLTAG() : eType(FDE_XMLNODE_Unknown) {} 205 CFDE_XMLTAG(const CFDE_XMLTAG& src) 206 : wsTagName(src.wsTagName), eType(src.eType) {} 207 CFX_WideString wsTagName; 208 FDE_XMLNODETYPE eType; 209 }; 210 typedef CFX_ObjectStackTemplate<CFDE_XMLTAG> CFDE_XMLTagStack; 211 class CFDE_XMLSAXParser : public IFDE_XMLParser, public CFX_Target { 212 public: 213 CFDE_XMLSAXParser(FDE_LPXMLREADERHANDLER pHandler, 214 IFDE_XMLSyntaxParser* pParser); 215 ~CFDE_XMLSAXParser(); 216 217 virtual void Release() { delete this; } 218 virtual int32_t DoParser(IFX_Pause* pPause); 219 220 private: 221 void Push(const CFDE_XMLTAG& xmlTag); 222 void Pop(); 223 FDE_LPXMLREADERHANDLER m_pHandler; 224 IFDE_XMLSyntaxParser* m_pParser; 225 CFDE_XMLTagStack m_TagStack; 226 CFDE_XMLTAG* m_pTagTop; 227 CFX_WideString m_ws1; 228 CFX_WideString m_ws2; 229 }; 230 #ifdef _FDE_BLOCK_BUFFER 231 class CFDE_BlockBuffer : public CFX_Target { 232 public: 233 CFDE_BlockBuffer(int32_t iAllocStep = 1024 * 1024); 234 ~CFDE_BlockBuffer(); 235 236 FX_BOOL InitBuffer(int32_t iBufferSize = 1024 * 1024); 237 FX_BOOL IsInitialized() { return m_iBufferSize / m_iAllocStep >= 1; } 238 void ReleaseBuffer() { delete this; } 239 FX_WCHAR* GetAvailableBlock(int32_t& iIndexInBlock); 240 inline int32_t GetAllocStep() const { return m_iAllocStep; } 241 inline int32_t& GetDataLengthRef() { return m_iDataLength; } 242 inline void Reset(FX_BOOL bReserveData = TRUE) { 243 if (!bReserveData) { 244 m_iStartPosition = 0; 245 } 246 m_iDataLength = 0; 247 } 248 void SetTextChar(int32_t iIndex, FX_WCHAR ch); 249 int32_t DeleteTextChars(int32_t iCount, FX_BOOL bDirection = TRUE); 250 void GetTextData(CFX_WideString& wsTextData, 251 int32_t iStart = 0, 252 int32_t iLength = -1) const; 253 254 protected: 255 inline void TextDataIndex2BufIndex(const int32_t iIndex, 256 int32_t& iBlockIndex, 257 int32_t& iInnerIndex) const; 258 void ClearBuffer(); 259 CFX_PtrArray m_BlockArray; 260 int32_t m_iDataLength; 261 int32_t m_iBufferSize; 262 int32_t m_iAllocStep; 263 int32_t m_iStartPosition; 264 }; 265 #endif 266 #define FDE_XMLSYNTAXMODE_Text 0 267 #define FDE_XMLSYNTAXMODE_Node 1 268 #define FDE_XMLSYNTAXMODE_Target 2 269 #define FDE_XMLSYNTAXMODE_Tag 3 270 #define FDE_XMLSYNTAXMODE_AttriName 4 271 #define FDE_XMLSYNTAXMODE_AttriEqualSign 5 272 #define FDE_XMLSYNTAXMODE_AttriQuotation 6 273 #define FDE_XMLSYNTAXMODE_AttriValue 7 274 #define FDE_XMLSYNTAXMODE_Entity 8 275 #define FDE_XMLSYNTAXMODE_EntityDecimal 9 276 #define FDE_XMLSYNTAXMODE_EntityHex 10 277 #define FDE_XMLSYNTAXMODE_CloseInstruction 11 278 #define FDE_XMLSYNTAXMODE_BreakElement 12 279 #define FDE_XMLSYNTAXMODE_CloseElement 13 280 #define FDE_XMLSYNTAXMODE_SkipDeclNode 14 281 #define FDE_XMLSYNTAXMODE_DeclCharData 15 282 #define FDE_XMLSYNTAXMODE_SkipComment 16 283 #define FDE_XMLSYNTAXMODE_SkipCommentOrDecl 17 284 #define FDE_XMLSYNTAXMODE_TargetData 18 285 class CFDE_XMLSyntaxParser : public IFDE_XMLSyntaxParser, public CFX_Target { 286 public: 287 CFDE_XMLSyntaxParser(); 288 ~CFDE_XMLSyntaxParser(); 289 virtual void Release() { delete this; } 290 virtual void Init(IFX_Stream* pStream, 291 int32_t iXMLPlaneSize, 292 int32_t iTextDataSize = 256); 293 virtual FX_DWORD DoSyntaxParse(); 294 virtual int32_t GetStatus() const; 295 virtual int32_t GetCurrentPos() const { 296 return m_iParsedChars + (m_pStart - m_pBuffer); 297 } 298 virtual FX_FILESIZE GetCurrentBinaryPos() const; 299 virtual int32_t GetCurrentNodeNumber() const { return m_iCurrentNodeNum; } 300 virtual int32_t GetLastNodeNumber() const { return m_iLastNodeNum; } 301 #ifdef _FDE_BLOCK_BUFFER 302 virtual void GetTargetName(CFX_WideString& wsTarget) const { 303 m_BlockBuffer.GetTextData(wsTarget, 0, m_iTextDataLength); 304 } 305 virtual void GetTagName(CFX_WideString& wsTag) const { 306 m_BlockBuffer.GetTextData(wsTag, 0, m_iTextDataLength); 307 } 308 virtual void GetAttributeName(CFX_WideString& wsAttriName) const { 309 m_BlockBuffer.GetTextData(wsAttriName, 0, m_iTextDataLength); 310 } 311 virtual void GetAttributeValue(CFX_WideString& wsAttriValue) const { 312 m_BlockBuffer.GetTextData(wsAttriValue, 0, m_iTextDataLength); 313 } 314 virtual void GetTextData(CFX_WideString& wsText) const { 315 m_BlockBuffer.GetTextData(wsText, 0, m_iTextDataLength); 316 } 317 virtual void GetTargetData(CFX_WideString& wsData) const { 318 m_BlockBuffer.GetTextData(wsData, 0, m_iTextDataLength); 319 } 320 #else 321 virtual void GetTargetName(CFX_WideString& wsTarget) const { 322 GetData(wsTarget); 323 } 324 virtual void GetTagName(CFX_WideString& wsTag) const { GetData(wsTag); } 325 virtual void GetAttributeName(CFX_WideString& wsAttriName) const { 326 GetData(wsAttriName); 327 } 328 virtual void GetAttributeValue(CFX_WideString& wsAttriValue) const { 329 GetData(wsAttriValue); 330 } 331 virtual void GetTextData(CFX_WideString& wsText) const { GetData(wsText); } 332 virtual void GetTargetData(CFX_WideString& wsData) const { GetData(wsData); } 333 #endif 334 protected: 335 IFX_Stream* m_pStream; 336 int32_t m_iXMLPlaneSize; 337 int32_t m_iCurrentPos; 338 int32_t m_iCurrentNodeNum; 339 int32_t m_iLastNodeNum; 340 int32_t m_iParsedChars; 341 int32_t m_iParsedBytes; 342 FX_WCHAR* m_pBuffer; 343 int32_t m_iBufferChars; 344 FX_BOOL m_bEOS; 345 FX_WCHAR* m_pStart; 346 FX_WCHAR* m_pEnd; 347 FDE_XMLNODE m_CurNode; 348 CFDE_XMLNodeStack m_XMLNodeStack; 349 #ifdef _FDE_BLOCK_BUFFER 350 CFDE_BlockBuffer m_BlockBuffer; 351 int32_t m_iAllocStep; 352 int32_t& m_iDataLength; 353 FX_WCHAR* m_pCurrentBlock; 354 int32_t m_iIndexInBlock; 355 #else 356 int32_t m_iTextDataSize; 357 FX_WCHAR* m_pwsTextData; 358 int32_t m_iDataPos; 359 #endif 360 int32_t m_iTextDataLength; 361 FX_DWORD m_dwStatus; 362 FX_DWORD m_dwMode; 363 FX_WCHAR m_wQuotationMark; 364 int32_t m_iEntityStart; 365 CFX_DWordStack m_SkipStack; 366 FX_WCHAR m_SkipChar; 367 inline void ParseTextChar(FX_WCHAR ch); 368 #ifndef _FDE_BLOCK_BUFFER 369 void ReallocTextDataBuffer(); 370 void GetData(CFX_WideString& wsData) const; 371 #endif 372 }; 373 #endif 374