diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2018-04-23 18:14:16 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-04-23 18:14:16 +0000 |
commit | 9a3a7709103a872037dcea1f3cf0b7785a3da191 (patch) | |
tree | 262538d8f7f8e5b9703a7c37e7ec2f1b477aebe3 /xfa/fxfa/parser/cxfa_document_parser.cpp | |
parent | b557bdcbd1584a7e37f8883b0fc491e0641cfc9c (diff) | |
download | pdfium-9a3a7709103a872037dcea1f3cf0b7785a3da191.tar.xz |
Change CFX_XML Save to take a write stream
This CL changes CFX_XML to use an IFX_SeekableWriteStream instead of the more
generic IFX_SeekableStream.
Change-Id: I6e4def380c43eca755d91ad5cb6146c2dfdaee10
Reviewed-on: https://pdfium-review.googlesource.com/30877
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Diffstat (limited to 'xfa/fxfa/parser/cxfa_document_parser.cpp')
-rw-r--r-- | xfa/fxfa/parser/cxfa_document_parser.cpp | 115 |
1 files changed, 55 insertions, 60 deletions
diff --git a/xfa/fxfa/parser/cxfa_document_parser.cpp b/xfa/fxfa/parser/cxfa_document_parser.cpp index e4f85f2bac..21d531d9f9 100644 --- a/xfa/fxfa/parser/cxfa_document_parser.cpp +++ b/xfa/fxfa/parser/cxfa_document_parser.cpp @@ -100,12 +100,10 @@ const PacketInfo* GetPacketByName(const WideStringView& wsName) { } CFX_XMLNode* GetDocumentNode(CFX_XMLNode* pRootNode) { - for (CFX_XMLNode* pXMLNode = pRootNode->GetFirstChild(); pXMLNode; - pXMLNode = pXMLNode->GetNextSibling()) { + for (const auto& pXMLNode : *pRootNode) { if (pXMLNode->GetType() != FX_XMLNODE_Element) continue; - - return pXMLNode; + return pXMLNode.get(); } return nullptr; } @@ -232,11 +230,10 @@ CFX_XMLNode* GetDataSetsFromXDP(CFX_XMLNode* pXMLDocumentNode) { return nullptr; } - for (CFX_XMLNode* pDatasetsNode = pXMLDocumentNode->GetFirstChild(); - pDatasetsNode; pDatasetsNode = pDatasetsNode->GetNextSibling()) { - if (MatchNodeName(pDatasetsNode, datasets_packet->name, + for (const auto& pDatasetsNode : *pXMLDocumentNode) { + if (MatchNodeName(pDatasetsNode.get(), datasets_packet->name, datasets_packet->uri, datasets_packet->flags)) { - return pDatasetsNode; + return pDatasetsNode.get(); } } return nullptr; @@ -248,19 +245,19 @@ bool IsStringAllWhitespace(WideString wsText) { } void ConvertXMLToPlainText(CFX_XMLElement* pRootXMLNode, WideString& wsOutput) { - for (CFX_XMLNode* pXMLChild = pRootXMLNode->GetFirstChild(); pXMLChild; - pXMLChild = pXMLChild->GetNextSibling()) { + for (const auto& pXMLChild : *pRootXMLNode) { switch (pXMLChild->GetType()) { case FX_XMLNODE_Element: { WideString wsTextData = - static_cast<CFX_XMLElement*>(pXMLChild)->GetTextData(); + static_cast<CFX_XMLElement*>(pXMLChild.get())->GetTextData(); wsTextData += L"\n"; wsOutput += wsTextData; break; } case FX_XMLNODE_Text: case FX_XMLNODE_CharData: { - WideString wsText = static_cast<CFX_XMLText*>(pXMLChild)->GetText(); + WideString wsText = + static_cast<CFX_XMLText*>(pXMLChild.get())->GetText(); if (IsStringAllWhitespace(wsText)) continue; @@ -307,10 +304,9 @@ WideString GetPlainTextFromRichText(CFX_XMLNode* pXMLNode) { default: break; } - for (CFX_XMLNode* pChildXML = pXMLNode->GetFirstChild(); pChildXML; - pChildXML = pChildXML->GetNextSibling()) { - wsPlainText += GetPlainTextFromRichText(pChildXML); - } + + for (const auto& pChildXML : *pXMLNode) + wsPlainText += GetPlainTextFromRichText(pChildXML.get()); return wsPlainText; } @@ -360,8 +356,7 @@ void CXFA_DocumentParser::ConstructXFANode(CXFA_Node* pXFANode, XFA_PacketType ePacketID = pXFANode->GetPacketType(); if (ePacketID == XFA_PacketType::Datasets) { if (pXFANode->GetElementType() == XFA_Element::DataValue) { - for (CFX_XMLNode* pXMLChild = pXMLNode->GetFirstChild(); pXMLChild; - pXMLChild = pXMLChild->GetNextSibling()) { + for (const auto& pXMLChild : *pXMLNode) { FX_XMLNODETYPE eNodeType = pXMLChild->GetType(); if (eNodeType == FX_XMLNODE_Instruction) continue; @@ -372,7 +367,7 @@ void CXFA_DocumentParser::ConstructXFANode(CXFA_Node* pXFANode, if (!pXFAChild) return; - CFX_XMLElement* child = static_cast<CFX_XMLElement*>(pXMLChild); + CFX_XMLElement* child = static_cast<CFX_XMLElement*>(pXMLChild.get()); WideString wsNodeStr = child->GetLocalTagName(); pXFAChild->JSObject()->SetCData(XFA_Attribute::Name, wsNodeStr, false, false); @@ -382,7 +377,7 @@ void CXFA_DocumentParser::ConstructXFANode(CXFA_Node* pXFANode, false, false); pXFANode->InsertChild(pXFAChild, nullptr); - pXFAChild->SetXMLMappingNode(pXMLChild); + pXFAChild->SetXMLMappingNode(pXMLChild.get()); pXFAChild->SetFlag(XFA_NodeFlag_Initialized); break; } @@ -461,17 +456,16 @@ CXFA_Node* CXFA_DocumentParser::ParseAsXDPPacket_XDP( CFX_XMLNode* pXMLConfigDOMRoot = nullptr; CXFA_Node* pXFAConfigDOMRoot = nullptr; - for (CFX_XMLNode* pChildItem = pXMLDocumentNode->GetFirstChild(); pChildItem; - pChildItem = pChildItem->GetNextSibling()) { + for (const auto& pChildItem : *pXMLDocumentNode) { const PacketInfo* pPacketInfo = GetPacketByIndex(XFA_PacketType::Config); - if (!MatchNodeName(pChildItem, pPacketInfo->name, pPacketInfo->uri, + if (!MatchNodeName(pChildItem.get(), pPacketInfo->name, pPacketInfo->uri, pPacketInfo->flags)) { continue; } if (pXFARootNode->GetFirstChildByName(pPacketInfo->hash)) return nullptr; - pXMLConfigDOMRoot = pChildItem; + pXMLConfigDOMRoot = pChildItem.get(); pXFAConfigDOMRoot = ParseAsXDPPacket_Config(pXMLConfigDOMRoot); if (pXFAConfigDOMRoot) pXFARootNode->InsertChild(pXFAConfigDOMRoot, nullptr); @@ -480,14 +474,14 @@ CXFA_Node* CXFA_DocumentParser::ParseAsXDPPacket_XDP( CFX_XMLNode* pXMLDatasetsDOMRoot = nullptr; CFX_XMLNode* pXMLFormDOMRoot = nullptr; CFX_XMLNode* pXMLTemplateDOMRoot = nullptr; - for (CFX_XMLNode* pChildItem = pXMLDocumentNode->GetFirstChild(); pChildItem; - pChildItem = pChildItem->GetNextSibling()) { - if (!pChildItem || pChildItem->GetType() != FX_XMLNODE_Element) + for (const auto& pChildItem : *pXMLDocumentNode) { + if (pChildItem->GetType() != FX_XMLNODE_Element) continue; - if (pChildItem == pXMLConfigDOMRoot) + if (pChildItem.get() == pXMLConfigDOMRoot) continue; - CFX_XMLElement* pElement = reinterpret_cast<CFX_XMLElement*>(pChildItem); + CFX_XMLElement* pElement = + reinterpret_cast<CFX_XMLElement*>(pChildItem.get()); WideString wsPacketName = pElement->GetLocalTagName(); const PacketInfo* pPacketInfo = GetPacketByName(wsPacketName.AsStringView()); @@ -771,11 +765,11 @@ CXFA_Node* CXFA_DocumentParser::NormalLoader(CXFA_Node* pXFANode, XFA_PacketType ePacketID, bool bUseAttribute) { bool bOneOfPropertyFound = false; - for (CFX_XMLNode* pXMLChild = pXMLDoc->GetFirstChild(); pXMLChild; - pXMLChild = pXMLChild->GetNextSibling()) { + for (const auto& pXMLChild : *pXMLDoc) { switch (pXMLChild->GetType()) { case FX_XMLNODE_Element: { - CFX_XMLElement* pXMLElement = static_cast<CFX_XMLElement*>(pXMLChild); + CFX_XMLElement* pXMLElement = + static_cast<CFX_XMLElement*>(pXMLChild.get()); WideString wsTagName = pXMLElement->GetLocalTagName(); XFA_Element eType = CXFA_Node::NameToElement(wsTagName); if (eType == XFA_Element::Unknown) @@ -837,9 +831,11 @@ CXFA_Node* CXFA_DocumentParser::NormalLoader(CXFA_Node* pXFANode, NormalLoader(pXFAChild, pXMLElement, ePacketID, bUseAttribute); break; } - } break; + break; + } case FX_XMLNODE_Instruction: - ParseInstruction(pXFANode, static_cast<CFX_XMLInstruction*>(pXMLChild), + ParseInstruction(pXFANode, + static_cast<CFX_XMLInstruction*>(pXMLChild.get()), ePacketID); break; default: @@ -865,8 +861,7 @@ void CXFA_DocumentParser::ParseContentNode(CXFA_Node* pXFANode, pXFANode->SetXMLMappingNode(pXMLNode); WideString wsValue; - for (CFX_XMLNode* pXMLChild = pXMLNode->GetFirstChild(); pXMLChild; - pXMLChild = pXMLChild->GetNextSibling()) { + for (const auto& pXMLChild : *pXMLNode) { FX_XMLNODETYPE eNodeType = pXMLChild->GetType(); if (eNodeType == FX_XMLNODE_Instruction) continue; @@ -875,19 +870,20 @@ void CXFA_DocumentParser::ParseContentNode(CXFA_Node* pXFANode, if (eNodeType != FX_XMLNODE_Element) break; - if (XFA_RecognizeRichText(static_cast<CFX_XMLElement*>(pXMLChild))) - wsValue += - GetPlainTextFromRichText(static_cast<CFX_XMLElement*>(pXMLChild)); + if (XFA_RecognizeRichText(static_cast<CFX_XMLElement*>(pXMLChild.get()))) + wsValue += GetPlainTextFromRichText( + static_cast<CFX_XMLElement*>(pXMLChild.get())); } else if (element == XFA_Element::Sharpxml) { if (eNodeType != FX_XMLNODE_Element) break; - ConvertXMLToPlainText(static_cast<CFX_XMLElement*>(pXMLChild), wsValue); + ConvertXMLToPlainText(static_cast<CFX_XMLElement*>(pXMLChild.get()), + wsValue); } else { if (eNodeType == FX_XMLNODE_Element) break; if (eNodeType == FX_XMLNODE_Text || eNodeType == FX_XMLNODE_CharData) - wsValue = static_cast<CFX_XMLText*>(pXMLChild)->GetText(); + wsValue = static_cast<CFX_XMLText*>(pXMLChild.get())->GetText(); } break; } @@ -909,11 +905,11 @@ void CXFA_DocumentParser::ParseContentNode(CXFA_Node* pXFANode, void CXFA_DocumentParser::ParseDataGroup(CXFA_Node* pXFANode, CFX_XMLNode* pXMLNode, XFA_PacketType ePacketID) { - for (CFX_XMLNode* pXMLChild = pXMLNode->GetFirstChild(); pXMLChild; - pXMLChild = pXMLChild->GetNextSibling()) { + for (const auto& pXMLChild : *pXMLNode) { switch (pXMLChild->GetType()) { case FX_XMLNODE_Element: { - CFX_XMLElement* pXMLElement = static_cast<CFX_XMLElement*>(pXMLChild); + CFX_XMLElement* pXMLElement = + static_cast<CFX_XMLElement*>(pXMLChild.get()); { WideString wsNamespaceURI = GetElementTagNamespaceURI(pXMLElement); if (wsNamespaceURI == L"http://www.xfa.com/schema/xfa-package/" || @@ -945,11 +941,10 @@ void CXFA_DocumentParser::ParseDataGroup(CXFA_Node* pXFANode, } } if (eNodeType == XFA_Element::DataModel) { - for (CFX_XMLNode* pXMLDataChild = pXMLElement->GetFirstChild(); - pXMLDataChild; pXMLDataChild = pXMLDataChild->GetNextSibling()) { + for (const auto& pXMLDataChild : *pXMLElement) { if (pXMLDataChild->GetType() == FX_XMLNODE_Element) { if (!XFA_RecognizeRichText( - static_cast<CFX_XMLElement*>(pXMLDataChild))) { + static_cast<CFX_XMLElement*>(pXMLDataChild.get()))) { eNodeType = XFA_Element::DataGroup; break; } @@ -1010,7 +1005,7 @@ void CXFA_DocumentParser::ParseDataGroup(CXFA_Node* pXFANode, if (eNodeType == XFA_Element::DataGroup) ParseDataGroup(pXFAChild, pXMLElement, ePacketID); else if (bNeedValue) - ParseDataValue(pXFAChild, pXMLChild, XFA_PacketType::Datasets); + ParseDataValue(pXFAChild, pXMLChild.get(), XFA_PacketType::Datasets); pXFAChild->SetXMLMappingNode(pXMLElement); pXFAChild->SetFlag(XFA_NodeFlag_Initialized); @@ -1018,7 +1013,7 @@ void CXFA_DocumentParser::ParseDataGroup(CXFA_Node* pXFANode, } case FX_XMLNODE_CharData: case FX_XMLNODE_Text: { - CFX_XMLText* pXMLText = static_cast<CFX_XMLText*>(pXMLChild); + CFX_XMLText* pXMLText = static_cast<CFX_XMLText*>(pXMLChild.get()); WideString wsText = pXMLText->GetText(); if (IsStringAllWhitespace(wsText)) continue; @@ -1048,23 +1043,23 @@ void CXFA_DocumentParser::ParseDataValue(CXFA_Node* pXFANode, CFX_WideTextBuf wsCurValueTextBuf; bool bMarkAsCompound = false; CFX_XMLNode* pXMLCurValueNode = nullptr; - for (CFX_XMLNode* pXMLChild = pXMLNode->GetFirstChild(); pXMLChild; - pXMLChild = pXMLChild->GetNextSibling()) { + for (const auto& pXMLChild : *pXMLNode) { FX_XMLNODETYPE eNodeType = pXMLChild->GetType(); if (eNodeType == FX_XMLNODE_Instruction) continue; if (eNodeType == FX_XMLNODE_Text || eNodeType == FX_XMLNODE_CharData) { - WideString wsText = static_cast<CFX_XMLText*>(pXMLChild)->GetText(); + WideString wsText = static_cast<CFX_XMLText*>(pXMLChild.get())->GetText(); if (!pXMLCurValueNode) - pXMLCurValueNode = pXMLChild; + pXMLCurValueNode = pXMLChild.get(); wsCurValueTextBuf << wsText; - } else if (XFA_RecognizeRichText(static_cast<CFX_XMLElement*>(pXMLChild))) { - WideString wsText = - GetPlainTextFromRichText(static_cast<CFX_XMLElement*>(pXMLChild)); + } else if (XFA_RecognizeRichText( + static_cast<CFX_XMLElement*>(pXMLChild.get()))) { + WideString wsText = GetPlainTextFromRichText( + static_cast<CFX_XMLElement*>(pXMLChild.get())); if (!pXMLCurValueNode) - pXMLCurValueNode = pXMLChild; + pXMLCurValueNode = pXMLChild.get(); wsCurValueTextBuf << wsText; } else { @@ -1095,12 +1090,12 @@ void CXFA_DocumentParser::ParseDataValue(CXFA_Node* pXFANode, return; WideString wsNodeStr = - static_cast<CFX_XMLElement*>(pXMLChild)->GetLocalTagName(); + static_cast<CFX_XMLElement*>(pXMLChild.get())->GetLocalTagName(); pXFAChild->JSObject()->SetCData(XFA_Attribute::Name, wsNodeStr, false, false); - ParseDataValue(pXFAChild, pXMLChild, ePacketID); + ParseDataValue(pXFAChild, pXMLChild.get(), ePacketID); pXFANode->InsertChild(pXFAChild, nullptr); - pXFAChild->SetXMLMappingNode(pXMLChild); + pXFAChild->SetXMLMappingNode(pXMLChild.get()); pXFAChild->SetFlag(XFA_NodeFlag_Initialized); WideString wsCurValue = pXFAChild->JSObject()->GetCData(XFA_Attribute::Value); |