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

Side by Side Diff: xfa/fxfa/parser/cxfa_simple_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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "xfa/fxfa/parser/xfa_parser_imp.h" 7 #include "xfa/fxfa/parser/cxfa_simple_parser.h"
8 8
9 #include <memory>
10
11 #include "xfa/fde/xml/fde_xml_imp.h"
12 #include "xfa/fgas/crt/fgas_codepage.h" 9 #include "xfa/fgas/crt/fgas_codepage.h"
10 #include "xfa/fxfa/include/fxfa.h"
13 #include "xfa/fxfa/include/xfa_checksum.h" 11 #include "xfa/fxfa/include/xfa_checksum.h"
14 #include "xfa/fxfa/parser/xfa_basic_imp.h" 12 #include "xfa/fxfa/parser/cxfa_xml_parser.h"
15 #include "xfa/fxfa/parser/xfa_doclayout.h"
16 #include "xfa/fxfa/parser/xfa_document.h" 13 #include "xfa/fxfa/parser/xfa_document.h"
17 #include "xfa/fxfa/parser/xfa_localemgr.h"
18 #include "xfa/fxfa/parser/xfa_object.h"
19 #include "xfa/fxfa/parser/xfa_script.h"
20 #include "xfa/fxfa/parser/xfa_utils.h"
21 14
22 CXFA_SimpleParser::CXFA_SimpleParser(CXFA_Document* pFactory, 15 CXFA_SimpleParser::CXFA_SimpleParser(CXFA_Document* pFactory,
23 bool bDocumentParser) 16 bool bDocumentParser)
24 : m_pXMLParser(nullptr), 17 : m_pXMLParser(nullptr),
25 m_pXMLDoc(nullptr), 18 m_pXMLDoc(nullptr),
26 m_pStream(nullptr), 19 m_pStream(nullptr),
27 m_pFileRead(nullptr), 20 m_pFileRead(nullptr),
28 m_pFactory(pFactory), 21 m_pFactory(pFactory),
29 m_pRootNode(nullptr), 22 m_pRootNode(nullptr),
30 m_ePacketID(XFA_XDPPACKET_UNKNOWN), 23 m_ePacketID(XFA_XDPPACKET_UNKNOWN),
(...skipping 1285 matching lines...) Expand 10 before | Expand all | Expand 10 after
1316 void CXFA_SimpleParser::CloseParser() { 1309 void CXFA_SimpleParser::CloseParser() {
1317 if (m_pXMLDoc) { 1310 if (m_pXMLDoc) {
1318 m_pXMLDoc->Release(); 1311 m_pXMLDoc->Release();
1319 m_pXMLDoc = nullptr; 1312 m_pXMLDoc = nullptr;
1320 } 1313 }
1321 if (m_pStream) { 1314 if (m_pStream) {
1322 m_pStream->Release(); 1315 m_pStream->Release();
1323 m_pStream = nullptr; 1316 m_pStream = nullptr;
1324 } 1317 }
1325 } 1318 }
1326
1327 CXFA_DocumentParser::CXFA_DocumentParser(CXFA_FFNotify* pNotify)
1328 : m_nodeParser(nullptr, TRUE), m_pNotify(pNotify), m_pDocument(nullptr) {}
1329
1330 CXFA_DocumentParser::~CXFA_DocumentParser() {
1331 CloseParser();
1332 }
1333
1334 int32_t CXFA_DocumentParser::StartParse(IFX_FileRead* pStream,
1335 XFA_XDPPACKET ePacketID) {
1336 CloseParser();
1337 int32_t nRetStatus = m_nodeParser.StartParse(pStream, ePacketID);
1338 if (nRetStatus == XFA_PARSESTATUS_Ready) {
1339 m_pDocument.reset(new CXFA_Document(this));
1340 m_nodeParser.SetFactory(m_pDocument.get());
1341 }
1342 return nRetStatus;
1343 }
1344
1345 int32_t CXFA_DocumentParser::DoParse(IFX_Pause* pPause) {
1346 int32_t nRetStatus = m_nodeParser.DoParse(pPause);
1347 if (nRetStatus >= XFA_PARSESTATUS_Done) {
1348 ASSERT(m_pDocument);
1349 m_pDocument->SetRoot(m_nodeParser.GetRootNode());
1350 }
1351 return nRetStatus;
1352 }
1353
1354 CFDE_XMLDoc* CXFA_DocumentParser::GetXMLDoc() const {
1355 return m_nodeParser.GetXMLDoc();
1356 }
1357
1358 CXFA_FFNotify* CXFA_DocumentParser::GetNotify() const {
1359 return m_pNotify;
1360 }
1361
1362 CXFA_Document* CXFA_DocumentParser::GetDocument() const {
1363 return m_pDocument.get();
1364 }
1365
1366 void CXFA_DocumentParser::CloseParser() {
1367 m_pDocument.reset();
1368 m_nodeParser.CloseParser();
1369 }
1370
1371 CXFA_XMLParser::CXFA_XMLParser(CFDE_XMLNode* pRoot, IFX_Stream* pStream)
1372 : m_nElementStart(0),
1373 m_dwCheckStatus(0),
1374 m_dwCurrentCheckStatus(0),
1375 m_pRoot(pRoot),
1376 m_pStream(pStream),
1377 m_pParser(nullptr),
1378 m_pParent(pRoot),
1379 m_pChild(nullptr),
1380 m_NodeStack(16),
1381 m_syntaxParserResult(FDE_XmlSyntaxResult::None) {
1382 ASSERT(m_pParent && m_pStream);
1383 m_NodeStack.Push(m_pParent);
1384 m_pParser = new CFDE_XMLSyntaxParser;
1385 m_pParser->Init(m_pStream, 32 * 1024, 1024 * 1024);
1386 }
1387
1388 CXFA_XMLParser::~CXFA_XMLParser() {
1389 if (m_pParser) {
1390 m_pParser->Release();
1391 }
1392 m_NodeStack.RemoveAll();
1393 m_ws1.clear();
1394 m_ws2.clear();
1395 }
1396
1397 void CXFA_XMLParser::Release() {
1398 delete this;
1399 }
1400
1401 int32_t CXFA_XMLParser::DoParser(IFX_Pause* pPause) {
1402 if (m_syntaxParserResult == FDE_XmlSyntaxResult::Error)
1403 return -1;
1404 if (m_syntaxParserResult == FDE_XmlSyntaxResult::EndOfString)
1405 return 100;
1406
1407 int32_t iCount = 0;
1408 while (TRUE) {
1409 m_syntaxParserResult = m_pParser->DoSyntaxParse();
1410 switch (m_syntaxParserResult) {
1411 case FDE_XmlSyntaxResult::InstructionOpen:
1412 break;
1413 case FDE_XmlSyntaxResult::InstructionClose:
1414 if (m_pChild) {
1415 if (m_pChild->GetType() != FDE_XMLNODE_Instruction) {
1416 m_syntaxParserResult = FDE_XmlSyntaxResult::Error;
1417 break;
1418 }
1419 }
1420 m_pChild = m_pParent;
1421 break;
1422 case FDE_XmlSyntaxResult::ElementOpen:
1423 if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 2) {
1424 m_nElementStart = m_pParser->GetCurrentPos() - 1;
1425 }
1426 break;
1427 case FDE_XmlSyntaxResult::ElementBreak:
1428 break;
1429 case FDE_XmlSyntaxResult::ElementClose:
1430 if (m_pChild->GetType() != FDE_XMLNODE_Element) {
1431 m_syntaxParserResult = FDE_XmlSyntaxResult::Error;
1432 break;
1433 }
1434 m_pParser->GetTagName(m_ws1);
1435 static_cast<CFDE_XMLElement*>(m_pChild)->GetTagName(m_ws2);
1436 if (m_ws1.GetLength() > 0 && m_ws1 != m_ws2) {
1437 m_syntaxParserResult = FDE_XmlSyntaxResult::Error;
1438 break;
1439 }
1440 m_NodeStack.Pop();
1441 if (m_NodeStack.GetSize() < 1) {
1442 m_syntaxParserResult = FDE_XmlSyntaxResult::Error;
1443 break;
1444 } else if (m_dwCurrentCheckStatus != 0 && m_NodeStack.GetSize() == 2) {
1445 m_nSize[m_dwCurrentCheckStatus - 1] =
1446 m_pParser->GetCurrentBinaryPos() -
1447 m_nStart[m_dwCurrentCheckStatus - 1];
1448 m_dwCurrentCheckStatus = 0;
1449 }
1450
1451 m_pParent = static_cast<CFDE_XMLNode*>(*m_NodeStack.GetTopElement());
1452 m_pChild = m_pParent;
1453 iCount++;
1454 break;
1455 case FDE_XmlSyntaxResult::TargetName:
1456 m_pParser->GetTargetName(m_ws1);
1457 if (m_ws1 == FX_WSTRC(L"originalXFAVersion") ||
1458 m_ws1 == FX_WSTRC(L"acrobat")) {
1459 m_pChild = new CFDE_XMLInstruction(m_ws1);
1460 m_pParent->InsertChildNode(m_pChild);
1461 } else {
1462 m_pChild = nullptr;
1463 }
1464 m_ws1.clear();
1465 break;
1466 case FDE_XmlSyntaxResult::TagName:
1467 m_pParser->GetTagName(m_ws1);
1468 m_pChild = new CFDE_XMLElement(m_ws1);
1469 m_pParent->InsertChildNode(m_pChild);
1470 m_NodeStack.Push(m_pChild);
1471 m_pParent = m_pChild;
1472
1473 if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 3) {
1474 CFX_WideString wsTag;
1475 static_cast<CFDE_XMLElement*>(m_pChild)->GetLocalTagName(wsTag);
1476 if (wsTag == FX_WSTRC(L"template")) {
1477 m_dwCheckStatus |= 0x01;
1478 m_dwCurrentCheckStatus = 0x01;
1479 m_nStart[0] = m_pParser->GetCurrentBinaryPos() -
1480 (m_pParser->GetCurrentPos() - m_nElementStart);
1481 } else if (wsTag == FX_WSTRC(L"datasets")) {
1482 m_dwCheckStatus |= 0x02;
1483 m_dwCurrentCheckStatus = 0x02;
1484 m_nStart[1] = m_pParser->GetCurrentBinaryPos() -
1485 (m_pParser->GetCurrentPos() - m_nElementStart);
1486 }
1487 }
1488 break;
1489 case FDE_XmlSyntaxResult::AttriName:
1490 m_pParser->GetAttributeName(m_ws1);
1491 break;
1492 case FDE_XmlSyntaxResult::AttriValue:
1493 if (m_pChild) {
1494 m_pParser->GetAttributeName(m_ws2);
1495 if (m_pChild->GetType() == FDE_XMLNODE_Element) {
1496 static_cast<CFDE_XMLElement*>(m_pChild)->SetString(m_ws1, m_ws2);
1497 }
1498 }
1499 m_ws1.clear();
1500 break;
1501 case FDE_XmlSyntaxResult::Text:
1502 m_pParser->GetTextData(m_ws1);
1503 m_pChild = new CFDE_XMLText(m_ws1);
1504 m_pParent->InsertChildNode(m_pChild);
1505 m_pChild = m_pParent;
1506 break;
1507 case FDE_XmlSyntaxResult::CData:
1508 m_pParser->GetTextData(m_ws1);
1509 m_pChild = new CFDE_XMLCharData(m_ws1);
1510 m_pParent->InsertChildNode(m_pChild);
1511 m_pChild = m_pParent;
1512 break;
1513 case FDE_XmlSyntaxResult::TargetData:
1514 if (m_pChild) {
1515 if (m_pChild->GetType() != FDE_XMLNODE_Instruction) {
1516 m_syntaxParserResult = FDE_XmlSyntaxResult::Error;
1517 break;
1518 }
1519 if (!m_ws1.IsEmpty()) {
1520 static_cast<CFDE_XMLInstruction*>(m_pChild)->AppendData(m_ws1);
1521 }
1522 m_pParser->GetTargetData(m_ws1);
1523 static_cast<CFDE_XMLInstruction*>(m_pChild)->AppendData(m_ws1);
1524 }
1525 m_ws1.clear();
1526 break;
1527 default:
1528 break;
1529 }
1530 if (m_syntaxParserResult == FDE_XmlSyntaxResult::Error ||
1531 m_syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) {
1532 break;
1533 }
1534 if (pPause && iCount > 500 && pPause->NeedToPauseNow()) {
1535 break;
1536 }
1537 }
1538 return (m_syntaxParserResult == FDE_XmlSyntaxResult::Error ||
1539 m_NodeStack.GetSize() != 1)
1540 ? -1
1541 : m_pParser->GetStatus();
1542 }
OLDNEW
« no previous file with comments | « xfa/fxfa/parser/cxfa_simple_parser.h ('k') | xfa/fxfa/parser/cxfa_simple_parser_embeddertest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698