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

Unified 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: Rebase to master 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « xfa/fxfa/parser/cxfa_xml_parser.h ('k') | xfa/fxfa/parser/xfa_document.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: xfa/fxfa/parser/cxfa_xml_parser.cpp
diff --git a/xfa/fxfa/parser/cxfa_xml_parser.cpp b/xfa/fxfa/parser/cxfa_xml_parser.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..268c8b1416a1a62da881696f603f3ad4aeaaeea7
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_xml_parser.cpp
@@ -0,0 +1,176 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_xml_parser.h"
+
+CXFA_XMLParser::CXFA_XMLParser(CFDE_XMLNode* pRoot, IFX_Stream* pStream)
+ : m_nElementStart(0),
+ m_dwCheckStatus(0),
+ m_dwCurrentCheckStatus(0),
+ m_pRoot(pRoot),
+ m_pStream(pStream),
+ m_pParser(new CFDE_XMLSyntaxParser),
+ m_pParent(pRoot),
+ m_pChild(nullptr),
+ m_NodeStack(16),
+ m_syntaxParserResult(FDE_XmlSyntaxResult::None) {
+ ASSERT(m_pParent && m_pStream);
+ m_NodeStack.Push(m_pParent);
+ m_pParser->Init(m_pStream, 32 * 1024, 1024 * 1024);
+}
+
+CXFA_XMLParser::~CXFA_XMLParser() {
+ m_NodeStack.RemoveAll();
+ m_ws1.clear();
+ m_ws2.clear();
+}
+
+void CXFA_XMLParser::Release() {
+ delete this;
+}
+
+int32_t CXFA_XMLParser::DoParser(IFX_Pause* pPause) {
+ if (m_syntaxParserResult == FDE_XmlSyntaxResult::Error)
+ return -1;
+ if (m_syntaxParserResult == FDE_XmlSyntaxResult::EndOfString)
+ return 100;
+
+ int32_t iCount = 0;
+ while (TRUE) {
+ m_syntaxParserResult = m_pParser->DoSyntaxParse();
+ switch (m_syntaxParserResult) {
+ case FDE_XmlSyntaxResult::InstructionOpen:
+ break;
+ case FDE_XmlSyntaxResult::InstructionClose:
+ if (m_pChild) {
+ if (m_pChild->GetType() != FDE_XMLNODE_Instruction) {
+ m_syntaxParserResult = FDE_XmlSyntaxResult::Error;
+ break;
+ }
+ }
+ m_pChild = m_pParent;
+ break;
+ case FDE_XmlSyntaxResult::ElementOpen:
+ if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 2) {
+ m_nElementStart = m_pParser->GetCurrentPos() - 1;
+ }
+ break;
+ case FDE_XmlSyntaxResult::ElementBreak:
+ break;
+ case FDE_XmlSyntaxResult::ElementClose:
+ if (m_pChild->GetType() != FDE_XMLNODE_Element) {
+ m_syntaxParserResult = FDE_XmlSyntaxResult::Error;
+ break;
+ }
+ m_pParser->GetTagName(m_ws1);
+ static_cast<CFDE_XMLElement*>(m_pChild)->GetTagName(m_ws2);
+ if (m_ws1.GetLength() > 0 && m_ws1 != m_ws2) {
+ m_syntaxParserResult = FDE_XmlSyntaxResult::Error;
+ break;
+ }
+ m_NodeStack.Pop();
+ if (m_NodeStack.GetSize() < 1) {
+ m_syntaxParserResult = FDE_XmlSyntaxResult::Error;
+ break;
+ } else if (m_dwCurrentCheckStatus != 0 && m_NodeStack.GetSize() == 2) {
+ m_nSize[m_dwCurrentCheckStatus - 1] =
+ m_pParser->GetCurrentBinaryPos() -
+ m_nStart[m_dwCurrentCheckStatus - 1];
+ m_dwCurrentCheckStatus = 0;
+ }
+
+ m_pParent = static_cast<CFDE_XMLNode*>(*m_NodeStack.GetTopElement());
+ m_pChild = m_pParent;
+ iCount++;
+ break;
+ case FDE_XmlSyntaxResult::TargetName:
+ m_pParser->GetTargetName(m_ws1);
+ if (m_ws1 == FX_WSTRC(L"originalXFAVersion") ||
+ m_ws1 == FX_WSTRC(L"acrobat")) {
+ m_pChild = new CFDE_XMLInstruction(m_ws1);
+ m_pParent->InsertChildNode(m_pChild);
+ } else {
+ m_pChild = nullptr;
+ }
+ m_ws1.clear();
+ break;
+ case FDE_XmlSyntaxResult::TagName:
+ m_pParser->GetTagName(m_ws1);
+ m_pChild = new CFDE_XMLElement(m_ws1);
+ m_pParent->InsertChildNode(m_pChild);
+ m_NodeStack.Push(m_pChild);
+ m_pParent = m_pChild;
+
+ if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 3) {
+ CFX_WideString wsTag;
+ static_cast<CFDE_XMLElement*>(m_pChild)->GetLocalTagName(wsTag);
+ if (wsTag == FX_WSTRC(L"template")) {
+ m_dwCheckStatus |= 0x01;
+ m_dwCurrentCheckStatus = 0x01;
+ m_nStart[0] = m_pParser->GetCurrentBinaryPos() -
+ (m_pParser->GetCurrentPos() - m_nElementStart);
+ } else if (wsTag == FX_WSTRC(L"datasets")) {
+ m_dwCheckStatus |= 0x02;
+ m_dwCurrentCheckStatus = 0x02;
+ m_nStart[1] = m_pParser->GetCurrentBinaryPos() -
+ (m_pParser->GetCurrentPos() - m_nElementStart);
+ }
+ }
+ break;
+ case FDE_XmlSyntaxResult::AttriName:
+ m_pParser->GetAttributeName(m_ws1);
+ break;
+ case FDE_XmlSyntaxResult::AttriValue:
+ if (m_pChild) {
+ m_pParser->GetAttributeName(m_ws2);
+ if (m_pChild->GetType() == FDE_XMLNODE_Element) {
+ static_cast<CFDE_XMLElement*>(m_pChild)->SetString(m_ws1, m_ws2);
+ }
+ }
+ m_ws1.clear();
+ break;
+ case FDE_XmlSyntaxResult::Text:
+ m_pParser->GetTextData(m_ws1);
+ m_pChild = new CFDE_XMLText(m_ws1);
+ m_pParent->InsertChildNode(m_pChild);
+ m_pChild = m_pParent;
+ break;
+ case FDE_XmlSyntaxResult::CData:
+ m_pParser->GetTextData(m_ws1);
+ m_pChild = new CFDE_XMLCharData(m_ws1);
+ m_pParent->InsertChildNode(m_pChild);
+ m_pChild = m_pParent;
+ break;
+ case FDE_XmlSyntaxResult::TargetData:
+ if (m_pChild) {
+ if (m_pChild->GetType() != FDE_XMLNODE_Instruction) {
+ m_syntaxParserResult = FDE_XmlSyntaxResult::Error;
+ break;
+ }
+ if (!m_ws1.IsEmpty()) {
+ static_cast<CFDE_XMLInstruction*>(m_pChild)->AppendData(m_ws1);
+ }
+ m_pParser->GetTargetData(m_ws1);
+ static_cast<CFDE_XMLInstruction*>(m_pChild)->AppendData(m_ws1);
+ }
+ m_ws1.clear();
+ break;
+ default:
+ break;
+ }
+ if (m_syntaxParserResult == FDE_XmlSyntaxResult::Error ||
+ m_syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) {
+ break;
+ }
+ if (pPause && iCount > 500 && pPause->NeedToPauseNow()) {
+ break;
+ }
+ }
+ return (m_syntaxParserResult == FDE_XmlSyntaxResult::Error ||
+ m_NodeStack.GetSize() != 1)
+ ? -1
+ : m_pParser->GetStatus();
+}
« no previous file with comments | « xfa/fxfa/parser/cxfa_xml_parser.h ('k') | xfa/fxfa/parser/xfa_document.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698