| OLD | NEW |
| (Empty) |
| 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 | |
| OLD | NEW |