OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2014 PDFium Authors. All rights reserved. | |
Wei Li
2016/07/07 21:34:14
Ditto
dsinclair
2016/07/11 13:36:06
Done.
| |
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 #include "xfa/fxfa/parser/cxfa_xml_parser.h" | |
8 | |
9 CXFA_XMLParser::CXFA_XMLParser(CFDE_XMLNode* pRoot, IFX_Stream* pStream) | |
10 : m_nElementStart(0), | |
11 m_dwCheckStatus(0), | |
12 m_dwCurrentCheckStatus(0), | |
13 m_pRoot(pRoot), | |
14 m_pStream(pStream), | |
15 m_pParser(nullptr), | |
16 m_pParent(pRoot), | |
17 m_pChild(nullptr), | |
18 m_NodeStack(16), | |
19 m_syntaxParserResult(FDE_XmlSyntaxResult::None) { | |
20 ASSERT(m_pParent && m_pStream); | |
21 m_NodeStack.Push(m_pParent); | |
22 m_pParser = new CFDE_XMLSyntaxParser; | |
Wei Li
2016/07/07 21:34:14
unique_ptr for |m_pParser|?
dsinclair
2016/07/11 13:36:06
Done.
| |
23 m_pParser->Init(m_pStream, 32 * 1024, 1024 * 1024); | |
24 } | |
25 | |
26 CXFA_XMLParser::~CXFA_XMLParser() { | |
27 if (m_pParser) { | |
28 m_pParser->Release(); | |
29 } | |
30 m_NodeStack.RemoveAll(); | |
31 m_ws1.clear(); | |
32 m_ws2.clear(); | |
33 } | |
34 | |
35 void CXFA_XMLParser::Release() { | |
36 delete this; | |
37 } | |
38 | |
39 int32_t CXFA_XMLParser::DoParser(IFX_Pause* pPause) { | |
40 if (m_syntaxParserResult == FDE_XmlSyntaxResult::Error) | |
41 return -1; | |
42 if (m_syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) | |
43 return 100; | |
44 | |
45 int32_t iCount = 0; | |
46 while (TRUE) { | |
47 m_syntaxParserResult = m_pParser->DoSyntaxParse(); | |
48 switch (m_syntaxParserResult) { | |
49 case FDE_XmlSyntaxResult::InstructionOpen: | |
50 break; | |
51 case FDE_XmlSyntaxResult::InstructionClose: | |
52 if (m_pChild) { | |
53 if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { | |
54 m_syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
55 break; | |
56 } | |
57 } | |
58 m_pChild = m_pParent; | |
59 break; | |
60 case FDE_XmlSyntaxResult::ElementOpen: | |
61 if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 2) { | |
62 m_nElementStart = m_pParser->GetCurrentPos() - 1; | |
63 } | |
64 break; | |
65 case FDE_XmlSyntaxResult::ElementBreak: | |
66 break; | |
67 case FDE_XmlSyntaxResult::ElementClose: | |
68 if (m_pChild->GetType() != FDE_XMLNODE_Element) { | |
69 m_syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
70 break; | |
71 } | |
72 m_pParser->GetTagName(m_ws1); | |
73 static_cast<CFDE_XMLElement*>(m_pChild)->GetTagName(m_ws2); | |
74 if (m_ws1.GetLength() > 0 && m_ws1 != m_ws2) { | |
75 m_syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
76 break; | |
77 } | |
78 m_NodeStack.Pop(); | |
79 if (m_NodeStack.GetSize() < 1) { | |
80 m_syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
81 break; | |
82 } else if (m_dwCurrentCheckStatus != 0 && m_NodeStack.GetSize() == 2) { | |
83 m_nSize[m_dwCurrentCheckStatus - 1] = | |
84 m_pParser->GetCurrentBinaryPos() - | |
85 m_nStart[m_dwCurrentCheckStatus - 1]; | |
86 m_dwCurrentCheckStatus = 0; | |
87 } | |
88 | |
89 m_pParent = static_cast<CFDE_XMLNode*>(*m_NodeStack.GetTopElement()); | |
90 m_pChild = m_pParent; | |
91 iCount++; | |
92 break; | |
93 case FDE_XmlSyntaxResult::TargetName: | |
94 m_pParser->GetTargetName(m_ws1); | |
95 if (m_ws1 == FX_WSTRC(L"originalXFAVersion") || | |
96 m_ws1 == FX_WSTRC(L"acrobat")) { | |
97 m_pChild = new CFDE_XMLInstruction(m_ws1); | |
98 m_pParent->InsertChildNode(m_pChild); | |
99 } else { | |
100 m_pChild = nullptr; | |
101 } | |
102 m_ws1.clear(); | |
103 break; | |
104 case FDE_XmlSyntaxResult::TagName: | |
105 m_pParser->GetTagName(m_ws1); | |
106 m_pChild = new CFDE_XMLElement(m_ws1); | |
107 m_pParent->InsertChildNode(m_pChild); | |
108 m_NodeStack.Push(m_pChild); | |
109 m_pParent = m_pChild; | |
110 | |
111 if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 3) { | |
112 CFX_WideString wsTag; | |
113 static_cast<CFDE_XMLElement*>(m_pChild)->GetLocalTagName(wsTag); | |
114 if (wsTag == FX_WSTRC(L"template")) { | |
115 m_dwCheckStatus |= 0x01; | |
116 m_dwCurrentCheckStatus = 0x01; | |
117 m_nStart[0] = m_pParser->GetCurrentBinaryPos() - | |
118 (m_pParser->GetCurrentPos() - m_nElementStart); | |
119 } else if (wsTag == FX_WSTRC(L"datasets")) { | |
120 m_dwCheckStatus |= 0x02; | |
121 m_dwCurrentCheckStatus = 0x02; | |
122 m_nStart[1] = m_pParser->GetCurrentBinaryPos() - | |
123 (m_pParser->GetCurrentPos() - m_nElementStart); | |
124 } | |
125 } | |
126 break; | |
127 case FDE_XmlSyntaxResult::AttriName: | |
128 m_pParser->GetAttributeName(m_ws1); | |
129 break; | |
130 case FDE_XmlSyntaxResult::AttriValue: | |
131 if (m_pChild) { | |
132 m_pParser->GetAttributeName(m_ws2); | |
133 if (m_pChild->GetType() == FDE_XMLNODE_Element) { | |
134 static_cast<CFDE_XMLElement*>(m_pChild)->SetString(m_ws1, m_ws2); | |
135 } | |
136 } | |
137 m_ws1.clear(); | |
138 break; | |
139 case FDE_XmlSyntaxResult::Text: | |
140 m_pParser->GetTextData(m_ws1); | |
141 m_pChild = new CFDE_XMLText(m_ws1); | |
142 m_pParent->InsertChildNode(m_pChild); | |
143 m_pChild = m_pParent; | |
144 break; | |
145 case FDE_XmlSyntaxResult::CData: | |
146 m_pParser->GetTextData(m_ws1); | |
147 m_pChild = new CFDE_XMLCharData(m_ws1); | |
148 m_pParent->InsertChildNode(m_pChild); | |
149 m_pChild = m_pParent; | |
150 break; | |
151 case FDE_XmlSyntaxResult::TargetData: | |
152 if (m_pChild) { | |
153 if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { | |
154 m_syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
155 break; | |
156 } | |
157 if (!m_ws1.IsEmpty()) { | |
158 static_cast<CFDE_XMLInstruction*>(m_pChild)->AppendData(m_ws1); | |
159 } | |
160 m_pParser->GetTargetData(m_ws1); | |
161 static_cast<CFDE_XMLInstruction*>(m_pChild)->AppendData(m_ws1); | |
162 } | |
163 m_ws1.clear(); | |
164 break; | |
165 default: | |
166 break; | |
167 } | |
168 if (m_syntaxParserResult == FDE_XmlSyntaxResult::Error || | |
169 m_syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) { | |
170 break; | |
171 } | |
172 if (pPause && iCount > 500 && pPause->NeedToPauseNow()) { | |
173 break; | |
174 } | |
175 } | |
176 return (m_syntaxParserResult == FDE_XmlSyntaxResult::Error || | |
177 m_NodeStack.GetSize() != 1) | |
178 ? -1 | |
179 : m_pParser->GetStatus(); | |
180 } | |
OLD | NEW |