Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(100)

Side by Side Diff: xfa/fxfa/parser/cxfa_xml_parser.cpp

Issue 2129963002: Break xfa_parser_imp apart (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@ixfa_parser
Patch Set: Missing fuzzer headers Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698