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