OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 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/xfa_parser_imp.h" |
8 | 8 |
9 #include "xfa/fde/xml/fde_xml_imp.h" | 9 #include "xfa/fde/xml/fde_xml_imp.h" |
10 #include "xfa/fgas/crt/fgas_codepage.h" | 10 #include "xfa/fgas/crt/fgas_codepage.h" |
(...skipping 1388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1399 CXFA_XMLParser::CXFA_XMLParser(CFDE_XMLNode* pRoot, IFX_Stream* pStream) | 1399 CXFA_XMLParser::CXFA_XMLParser(CFDE_XMLNode* pRoot, IFX_Stream* pStream) |
1400 : m_nElementStart(0), | 1400 : m_nElementStart(0), |
1401 m_dwCheckStatus(0), | 1401 m_dwCheckStatus(0), |
1402 m_dwCurrentCheckStatus(0), | 1402 m_dwCurrentCheckStatus(0), |
1403 m_pRoot(pRoot), | 1403 m_pRoot(pRoot), |
1404 m_pStream(pStream), | 1404 m_pStream(pStream), |
1405 m_pParser(nullptr), | 1405 m_pParser(nullptr), |
1406 m_pParent(pRoot), | 1406 m_pParent(pRoot), |
1407 m_pChild(nullptr), | 1407 m_pChild(nullptr), |
1408 m_NodeStack(16), | 1408 m_NodeStack(16), |
1409 m_dwStatus(FDE_XMLSYNTAXSTATUS_None) { | 1409 m_syntaxParserResult(FDE_XmlSyntaxResult::None) { |
1410 ASSERT(m_pParent && m_pStream); | 1410 ASSERT(m_pParent && m_pStream); |
1411 m_NodeStack.Push(m_pParent); | 1411 m_NodeStack.Push(m_pParent); |
1412 m_pParser = new CFDE_XMLSyntaxParser; | 1412 m_pParser = new CFDE_XMLSyntaxParser; |
1413 m_pParser->Init(m_pStream, 32 * 1024, 1024 * 1024); | 1413 m_pParser->Init(m_pStream, 32 * 1024, 1024 * 1024); |
1414 } | 1414 } |
1415 CXFA_XMLParser::~CXFA_XMLParser() { | 1415 CXFA_XMLParser::~CXFA_XMLParser() { |
1416 if (m_pParser) { | 1416 if (m_pParser) { |
1417 m_pParser->Release(); | 1417 m_pParser->Release(); |
1418 } | 1418 } |
1419 m_NodeStack.RemoveAll(); | 1419 m_NodeStack.RemoveAll(); |
1420 m_ws1.Empty(); | 1420 m_ws1.Empty(); |
1421 m_ws2.Empty(); | 1421 m_ws2.Empty(); |
1422 } | 1422 } |
1423 int32_t CXFA_XMLParser::DoParser(IFX_Pause* pPause) { | 1423 int32_t CXFA_XMLParser::DoParser(IFX_Pause* pPause) { |
1424 if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error) { | 1424 if (m_syntaxParserResult == FDE_XmlSyntaxResult::Error) |
1425 return -1; | 1425 return -1; |
1426 } | 1426 if (m_syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) |
1427 if (m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { | |
1428 return 100; | 1427 return 100; |
1429 } | 1428 |
1430 int32_t iCount = 0; | 1429 int32_t iCount = 0; |
1431 while (TRUE) { | 1430 while (TRUE) { |
1432 m_dwStatus = m_pParser->DoSyntaxParse(); | 1431 m_syntaxParserResult = m_pParser->DoSyntaxParse(); |
1433 switch (m_dwStatus) { | 1432 switch (m_syntaxParserResult) { |
1434 case FDE_XMLSYNTAXSTATUS_InstructionOpen: | 1433 case FDE_XmlSyntaxResult::InstructionOpen: |
1435 break; | 1434 break; |
1436 case FDE_XMLSYNTAXSTATUS_InstructionClose: | 1435 case FDE_XmlSyntaxResult::InstructionClose: |
1437 if (m_pChild) { | 1436 if (m_pChild) { |
1438 if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { | 1437 if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { |
1439 m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; | 1438 m_syntaxParserResult = FDE_XmlSyntaxResult::Error; |
1440 break; | 1439 break; |
1441 } | 1440 } |
1442 } | 1441 } |
1443 m_pChild = m_pParent; | 1442 m_pChild = m_pParent; |
1444 break; | 1443 break; |
1445 case FDE_XMLSYNTAXSTATUS_ElementOpen: | 1444 case FDE_XmlSyntaxResult::ElementOpen: |
1446 if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 2) { | 1445 if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 2) { |
1447 m_nElementStart = m_pParser->GetCurrentPos() - 1; | 1446 m_nElementStart = m_pParser->GetCurrentPos() - 1; |
1448 } | 1447 } |
1449 break; | 1448 break; |
1450 case FDE_XMLSYNTAXSTATUS_ElementBreak: | 1449 case FDE_XmlSyntaxResult::ElementBreak: |
1451 break; | 1450 break; |
1452 case FDE_XMLSYNTAXSTATUS_ElementClose: | 1451 case FDE_XmlSyntaxResult::ElementClose: |
1453 if (m_pChild->GetType() != FDE_XMLNODE_Element) { | 1452 if (m_pChild->GetType() != FDE_XMLNODE_Element) { |
1454 m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; | 1453 m_syntaxParserResult = FDE_XmlSyntaxResult::Error; |
1455 break; | 1454 break; |
1456 } | 1455 } |
1457 m_pParser->GetTagName(m_ws1); | 1456 m_pParser->GetTagName(m_ws1); |
1458 static_cast<CFDE_XMLElement*>(m_pChild)->GetTagName(m_ws2); | 1457 static_cast<CFDE_XMLElement*>(m_pChild)->GetTagName(m_ws2); |
1459 if (m_ws1.GetLength() > 0 && m_ws1 != m_ws2) { | 1458 if (m_ws1.GetLength() > 0 && m_ws1 != m_ws2) { |
1460 m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; | 1459 m_syntaxParserResult = FDE_XmlSyntaxResult::Error; |
1461 break; | 1460 break; |
1462 } | 1461 } |
1463 m_NodeStack.Pop(); | 1462 m_NodeStack.Pop(); |
1464 if (m_NodeStack.GetSize() < 1) { | 1463 if (m_NodeStack.GetSize() < 1) { |
1465 m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; | 1464 m_syntaxParserResult = FDE_XmlSyntaxResult::Error; |
1466 break; | 1465 break; |
1467 } else if (m_dwCurrentCheckStatus != 0 && m_NodeStack.GetSize() == 2) { | 1466 } else if (m_dwCurrentCheckStatus != 0 && m_NodeStack.GetSize() == 2) { |
1468 m_nSize[m_dwCurrentCheckStatus - 1] = | 1467 m_nSize[m_dwCurrentCheckStatus - 1] = |
1469 m_pParser->GetCurrentBinaryPos() - | 1468 m_pParser->GetCurrentBinaryPos() - |
1470 m_nStart[m_dwCurrentCheckStatus - 1]; | 1469 m_nStart[m_dwCurrentCheckStatus - 1]; |
1471 m_dwCurrentCheckStatus = 0; | 1470 m_dwCurrentCheckStatus = 0; |
1472 } | 1471 } |
1473 | 1472 |
1474 m_pParent = static_cast<CFDE_XMLNode*>(*m_NodeStack.GetTopElement()); | 1473 m_pParent = static_cast<CFDE_XMLNode*>(*m_NodeStack.GetTopElement()); |
1475 m_pChild = m_pParent; | 1474 m_pChild = m_pParent; |
1476 iCount++; | 1475 iCount++; |
1477 break; | 1476 break; |
1478 case FDE_XMLSYNTAXSTATUS_TargetName: | 1477 case FDE_XmlSyntaxResult::TargetName: |
1479 m_pParser->GetTargetName(m_ws1); | 1478 m_pParser->GetTargetName(m_ws1); |
1480 if (m_ws1 == FX_WSTRC(L"originalXFAVersion") || | 1479 if (m_ws1 == FX_WSTRC(L"originalXFAVersion") || |
1481 m_ws1 == FX_WSTRC(L"acrobat")) { | 1480 m_ws1 == FX_WSTRC(L"acrobat")) { |
1482 m_pChild = new CFDE_XMLInstruction(m_ws1); | 1481 m_pChild = new CFDE_XMLInstruction(m_ws1); |
1483 m_pParent->InsertChildNode(m_pChild); | 1482 m_pParent->InsertChildNode(m_pChild); |
1484 } else { | 1483 } else { |
1485 m_pChild = NULL; | 1484 m_pChild = NULL; |
1486 } | 1485 } |
1487 m_ws1.Empty(); | 1486 m_ws1.Empty(); |
1488 break; | 1487 break; |
1489 case FDE_XMLSYNTAXSTATUS_TagName: | 1488 case FDE_XmlSyntaxResult::TagName: |
1490 m_pParser->GetTagName(m_ws1); | 1489 m_pParser->GetTagName(m_ws1); |
1491 m_pChild = new CFDE_XMLElement(m_ws1); | 1490 m_pChild = new CFDE_XMLElement(m_ws1); |
1492 m_pParent->InsertChildNode(m_pChild); | 1491 m_pParent->InsertChildNode(m_pChild); |
1493 m_NodeStack.Push(m_pChild); | 1492 m_NodeStack.Push(m_pChild); |
1494 m_pParent = m_pChild; | 1493 m_pParent = m_pChild; |
1495 | 1494 |
1496 if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 3) { | 1495 if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 3) { |
1497 CFX_WideString wsTag; | 1496 CFX_WideString wsTag; |
1498 static_cast<CFDE_XMLElement*>(m_pChild)->GetLocalTagName(wsTag); | 1497 static_cast<CFDE_XMLElement*>(m_pChild)->GetLocalTagName(wsTag); |
1499 if (wsTag == FX_WSTRC(L"template")) { | 1498 if (wsTag == FX_WSTRC(L"template")) { |
1500 m_dwCheckStatus |= 0x01; | 1499 m_dwCheckStatus |= 0x01; |
1501 m_dwCurrentCheckStatus = 0x01; | 1500 m_dwCurrentCheckStatus = 0x01; |
1502 m_nStart[0] = m_pParser->GetCurrentBinaryPos() - | 1501 m_nStart[0] = m_pParser->GetCurrentBinaryPos() - |
1503 (m_pParser->GetCurrentPos() - m_nElementStart); | 1502 (m_pParser->GetCurrentPos() - m_nElementStart); |
1504 } else if (wsTag == FX_WSTRC(L"datasets")) { | 1503 } else if (wsTag == FX_WSTRC(L"datasets")) { |
1505 m_dwCheckStatus |= 0x02; | 1504 m_dwCheckStatus |= 0x02; |
1506 m_dwCurrentCheckStatus = 0x02; | 1505 m_dwCurrentCheckStatus = 0x02; |
1507 m_nStart[1] = m_pParser->GetCurrentBinaryPos() - | 1506 m_nStart[1] = m_pParser->GetCurrentBinaryPos() - |
1508 (m_pParser->GetCurrentPos() - m_nElementStart); | 1507 (m_pParser->GetCurrentPos() - m_nElementStart); |
1509 } | 1508 } |
1510 } | 1509 } |
1511 break; | 1510 break; |
1512 case FDE_XMLSYNTAXSTATUS_AttriName: | 1511 case FDE_XmlSyntaxResult::AttriName: |
1513 m_pParser->GetAttributeName(m_ws1); | 1512 m_pParser->GetAttributeName(m_ws1); |
1514 break; | 1513 break; |
1515 case FDE_XMLSYNTAXSTATUS_AttriValue: | 1514 case FDE_XmlSyntaxResult::AttriValue: |
1516 if (m_pChild) { | 1515 if (m_pChild) { |
1517 m_pParser->GetAttributeName(m_ws2); | 1516 m_pParser->GetAttributeName(m_ws2); |
1518 if (m_pChild->GetType() == FDE_XMLNODE_Element) { | 1517 if (m_pChild->GetType() == FDE_XMLNODE_Element) { |
1519 static_cast<CFDE_XMLElement*>(m_pChild)->SetString(m_ws1, m_ws2); | 1518 static_cast<CFDE_XMLElement*>(m_pChild)->SetString(m_ws1, m_ws2); |
1520 } | 1519 } |
1521 } | 1520 } |
1522 m_ws1.Empty(); | 1521 m_ws1.Empty(); |
1523 break; | 1522 break; |
1524 case FDE_XMLSYNTAXSTATUS_Text: | 1523 case FDE_XmlSyntaxResult::Text: |
1525 m_pParser->GetTextData(m_ws1); | 1524 m_pParser->GetTextData(m_ws1); |
1526 m_pChild = new CFDE_XMLText(m_ws1); | 1525 m_pChild = new CFDE_XMLText(m_ws1); |
1527 m_pParent->InsertChildNode(m_pChild); | 1526 m_pParent->InsertChildNode(m_pChild); |
1528 m_pChild = m_pParent; | 1527 m_pChild = m_pParent; |
1529 break; | 1528 break; |
1530 case FDE_XMLSYNTAXSTATUS_CData: | 1529 case FDE_XmlSyntaxResult::CData: |
1531 m_pParser->GetTextData(m_ws1); | 1530 m_pParser->GetTextData(m_ws1); |
1532 m_pChild = new CFDE_XMLCharData(m_ws1); | 1531 m_pChild = new CFDE_XMLCharData(m_ws1); |
1533 m_pParent->InsertChildNode(m_pChild); | 1532 m_pParent->InsertChildNode(m_pChild); |
1534 m_pChild = m_pParent; | 1533 m_pChild = m_pParent; |
1535 break; | 1534 break; |
1536 case FDE_XMLSYNTAXSTATUS_TargetData: | 1535 case FDE_XmlSyntaxResult::TargetData: |
1537 if (m_pChild) { | 1536 if (m_pChild) { |
1538 if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { | 1537 if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { |
1539 m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; | 1538 m_syntaxParserResult = FDE_XmlSyntaxResult::Error; |
1540 break; | 1539 break; |
1541 } | 1540 } |
1542 if (!m_ws1.IsEmpty()) { | 1541 if (!m_ws1.IsEmpty()) { |
1543 static_cast<CFDE_XMLInstruction*>(m_pChild)->AppendData(m_ws1); | 1542 static_cast<CFDE_XMLInstruction*>(m_pChild)->AppendData(m_ws1); |
1544 } | 1543 } |
1545 m_pParser->GetTargetData(m_ws1); | 1544 m_pParser->GetTargetData(m_ws1); |
1546 static_cast<CFDE_XMLInstruction*>(m_pChild)->AppendData(m_ws1); | 1545 static_cast<CFDE_XMLInstruction*>(m_pChild)->AppendData(m_ws1); |
1547 } | 1546 } |
1548 m_ws1.Empty(); | 1547 m_ws1.Empty(); |
1549 break; | 1548 break; |
1550 default: | 1549 default: |
1551 break; | 1550 break; |
1552 } | 1551 } |
1553 if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || | 1552 if (m_syntaxParserResult == FDE_XmlSyntaxResult::Error || |
1554 m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { | 1553 m_syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) { |
1555 break; | 1554 break; |
1556 } | 1555 } |
1557 if (pPause && iCount > 500 && pPause->NeedToPauseNow()) { | 1556 if (pPause && iCount > 500 && pPause->NeedToPauseNow()) { |
1558 break; | 1557 break; |
1559 } | 1558 } |
1560 } | 1559 } |
1561 return (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || m_NodeStack.GetSize() != 1) | 1560 return (m_syntaxParserResult == FDE_XmlSyntaxResult::Error || |
| 1561 m_NodeStack.GetSize() != 1) |
1562 ? -1 | 1562 ? -1 |
1563 : m_pParser->GetStatus(); | 1563 : m_pParser->GetStatus(); |
1564 } | 1564 } |
OLD | NEW |