Chromium Code Reviews| 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 |