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