1 // Copyright 2014 The PDFium Authors 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_dataexporter.h" 8 9 #include "core/fxcrt/fx_codepage.h" 10 #include "core/fxcrt/xml/cfx_xmlelement.h" 11 #include "core/fxcrt/xml/cfx_xmlnode.h" 12 #include "third_party/base/check.h" 13 #include "xfa/fxfa/parser/cxfa_document.h" 14 #include "xfa/fxfa/parser/cxfa_node.h" 15 #include "xfa/fxfa/parser/xfa_utils.h" 16 17 CXFA_DataExporter::CXFA_DataExporter() = default; 18 19 CXFA_DataExporter::~CXFA_DataExporter() = default; 20 Export(const RetainPtr<IFX_SeekableStream> & pStream,CXFA_Node * pNode)21bool CXFA_DataExporter::Export(const RetainPtr<IFX_SeekableStream>& pStream, 22 CXFA_Node* pNode) { 23 DCHECK(pStream); 24 25 if (pNode->IsModelNode()) { 26 switch (pNode->GetPacketType()) { 27 case XFA_PacketType::Xdp: { 28 pStream->WriteString( 29 "<xdp:xdp xmlns:xdp=\"http://ns.adobe.com/xdp/\">"); 30 for (CXFA_Node* pChild = pNode->GetFirstChild(); pChild; 31 pChild = pChild->GetNextSibling()) { 32 Export(pStream, pChild); 33 } 34 pStream->WriteString("</xdp:xdp>\n"); 35 break; 36 } 37 case XFA_PacketType::Datasets: { 38 CFX_XMLElement* pElement = ToXMLElement(pNode->GetXMLMappingNode()); 39 if (!pElement) 40 return false; 41 42 CXFA_Node* pDataNode = pNode->GetFirstChild(); 43 DCHECK(pDataNode); 44 XFA_DataExporter_DealWithDataGroupNode(pDataNode); 45 pElement->Save(pStream); 46 break; 47 } 48 case XFA_PacketType::Form: 49 XFA_DataExporter_RegenerateFormFile(pNode, pStream, false); 50 break; 51 case XFA_PacketType::Template: 52 default: { 53 CFX_XMLElement* pElement = ToXMLElement(pNode->GetXMLMappingNode()); 54 if (!pElement) 55 return false; 56 57 pElement->Save(pStream); 58 break; 59 } 60 } 61 return true; 62 } 63 64 CXFA_Node* pDataNode = pNode->GetParent(); 65 CXFA_Node* pExportNode = pNode; 66 for (CXFA_Node* pChildNode = pDataNode->GetFirstChild(); pChildNode; 67 pChildNode = pChildNode->GetNextSibling()) { 68 if (pChildNode != pNode) { 69 pExportNode = pDataNode; 70 break; 71 } 72 } 73 CFX_XMLElement* pElement = ToXMLElement(pExportNode->GetXMLMappingNode()); 74 if (!pElement) 75 return false; 76 77 XFA_DataExporter_DealWithDataGroupNode(pExportNode); 78 pElement->SetAttribute(L"xmlns:xfa", 79 L"http://www.xfa.org/schema/xfa-data/1.0/"); 80 pElement->Save(pStream); 81 pElement->RemoveAttribute(L"xmlns:xfa"); 82 return true; 83 } 84