summaryrefslogtreecommitdiff
path: root/xfa/fxfa/parser/cxfa_simple_parser.cpp
diff options
context:
space:
mode:
authorDan Sinclair <dsinclair@chromium.org>2018-04-12 13:15:59 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-04-12 13:15:59 +0000
commita995d6fd9b862dbd37aebb9c323766bb5d11d389 (patch)
treedb204479d0c854d1e30840794972d5115cbe80f4 /xfa/fxfa/parser/cxfa_simple_parser.cpp
parent332139df2c3c0826069fa61bcd436309fcdf5a6f (diff)
downloadpdfium-a995d6fd9b862dbd37aebb9c323766bb5d11d389.tar.xz
Allow retrieving the XML tree from the CFX_XMLDoc
This CL allows the CXFA_SimpleParser to retrieve the XML tree from the CFX_XMLDoc. This way, we don't have to keep the doc around and can store the pointer to the tree in the CXFA_SimpleParser. Change-Id: I5b478acbe61e6f1ca5fa04d03133a2b327a0cb1c Reviewed-on: https://pdfium-review.googlesource.com/30210 Reviewed-by: Henrique Nakashima <hnakashima@chromium.org> Commit-Queue: dsinclair <dsinclair@chromium.org>
Diffstat (limited to 'xfa/fxfa/parser/cxfa_simple_parser.cpp')
-rw-r--r--xfa/fxfa/parser/cxfa_simple_parser.cpp60
1 files changed, 18 insertions, 42 deletions
diff --git a/xfa/fxfa/parser/cxfa_simple_parser.cpp b/xfa/fxfa/parser/cxfa_simple_parser.cpp
index 225271fae8..232f1fbec8 100644
--- a/xfa/fxfa/parser/cxfa_simple_parser.cpp
+++ b/xfa/fxfa/parser/cxfa_simple_parser.cpp
@@ -100,11 +100,8 @@ const PacketInfo* GetPacketByName(const WideStringView& wsName) {
return nullptr;
}
-CFX_XMLNode* GetDocumentNode(CFX_XMLDoc* pXMLDoc) {
- if (!pXMLDoc)
- return nullptr;
-
- for (CFX_XMLNode* pXMLNode = pXMLDoc->GetRoot()->GetFirstChild(); pXMLNode;
+CFX_XMLNode* GetDocumentNode(CFX_XMLNode* pRootNode) {
+ for (CFX_XMLNode* pXMLNode = pRootNode->GetFirstChild(); pXMLNode;
pXMLNode = pXMLNode->GetNextSibling()) {
if (pXMLNode->GetType() != FX_XMLNODE_Element)
continue;
@@ -338,49 +335,33 @@ void CXFA_SimpleParser::SetFactory(CXFA_Document* pFactory) {
m_pFactory = pFactory;
}
-int32_t CXFA_SimpleParser::Parse(const RetainPtr<IFX_SeekableStream>& pStream,
- XFA_PacketType ePacketID) {
- CloseParser();
-
- m_pFileRead = pStream;
- m_pStream = pdfium::MakeRetain<CFX_SeekableStreamProxy>(pStream, false);
- uint16_t wCodePage = m_pStream->GetCodePage();
+bool CXFA_SimpleParser::Parse(const RetainPtr<IFX_SeekableStream>& pStream,
+ XFA_PacketType ePacketID) {
+ auto pStreamProxy =
+ pdfium::MakeRetain<CFX_SeekableStreamProxy>(pStream, false);
+ uint16_t wCodePage = pStreamProxy->GetCodePage();
if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE &&
wCodePage != FX_CODEPAGE_UTF8) {
- m_pStream->SetCodePage(FX_CODEPAGE_UTF8);
+ pStreamProxy->SetCodePage(FX_CODEPAGE_UTF8);
}
- m_pXMLDoc = pdfium::MakeUnique<CFX_XMLDoc>(m_pStream);
- if (!m_pXMLDoc)
- return XFA_PARSESTATUS_StatusErr;
-
- int32_t iRet = m_pXMLDoc->Load();
- if (iRet < 0)
- return XFA_PARSESTATUS_SyntaxErr;
- if (iRet < 100)
- return iRet / 2;
-
- m_pRootNode = ParseAsXDPPacket(GetDocumentNode(m_pXMLDoc.get()), ePacketID);
- m_pXMLDoc->CloseXML();
- m_pStream.Reset();
-
- if (!m_pRootNode)
- return XFA_PARSESTATUS_StatusErr;
+ CFX_XMLDoc doc;
+ if (!doc.Load(pStreamProxy))
+ return false;
- return XFA_PARSESTATUS_Done;
+ m_pNodeTree = doc.GetTree();
+ m_pRootNode = ParseAsXDPPacket(GetDocumentNode(m_pNodeTree.get()), ePacketID);
+ return !!m_pRootNode;
}
CFX_XMLNode* CXFA_SimpleParser::ParseXMLData(const ByteString& wsXML) {
- CloseParser();
-
auto pStream = pdfium::MakeRetain<CFX_SeekableStreamProxy>(
const_cast<uint8_t*>(wsXML.raw_str()), wsXML.GetLength());
- m_pXMLDoc = pdfium::MakeUnique<CFX_XMLDoc>(pStream);
+ CFX_XMLDoc doc;
+ if (doc.Load(pStream))
+ m_pNodeTree = doc.GetTree();
- int32_t iRet = m_pXMLDoc->Load();
- if (iRet < 0 || iRet >= 100)
- m_pXMLDoc->CloseXML();
- return iRet < 100 ? nullptr : GetDocumentNode(m_pXMLDoc.get());
+ return m_pNodeTree ? GetDocumentNode(m_pNodeTree.get()) : nullptr;
}
void CXFA_SimpleParser::ConstructXFANode(CXFA_Node* pXFANode,
@@ -1180,8 +1161,3 @@ void CXFA_SimpleParser::ParseInstruction(CXFA_Node* pXFANode,
}
}
}
-
-void CXFA_SimpleParser::CloseParser() {
- m_pXMLDoc.reset();
- m_pStream.Reset();
-}