14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_dataexporter.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_codepage.h" 10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmldoc.h" 11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmlelement.h" 12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmlnode.h" 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h" 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_document.h" 15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_node.h" 16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/xfa_utils.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_DataExporter::CXFA_DataExporter(CXFA_Document* pDocument) 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_pDocument(pDocument) { 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(m_pDocument); 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_DataExporter::~CXFA_DataExporter() {} 24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_DataExporter::Export(const RetainPtr<IFX_SeekableStream>& pWrite) { 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Export(pWrite, m_pDocument->GetRoot(), 0, nullptr); 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_DataExporter::Export(const RetainPtr<IFX_SeekableStream>& pWrite, 30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pNode, 31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t dwFlag, 32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const char* pChecksum) { 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pWrite); 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pWrite) 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto pStream = pdfium::MakeRetain<CFX_SeekableStreamProxy>(pWrite, true); 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->SetCodePage(FX_CODEPAGE_UTF8); 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Export(pStream, pNode, dwFlag, pChecksum); 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_DataExporter::Export( 43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const RetainPtr<CFX_SeekableStreamProxy>& pStream, 44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pNode, 45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t dwFlag, 46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const char* pChecksum) { 47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLDoc* pXMLDoc = m_pDocument->GetXMLDoc(); 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNode->IsModelNode()) { 49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann switch (pNode->GetPacketType()) { 50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_PacketType::Xdp: { 51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pStream->WriteString( 52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L"<xdp:xdp xmlns:xdp=\"http://ns.adobe.com/xdp/\">"); 53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pChild = pNode->GetFirstChild(); pChild; 54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pChild = pChild->GetNextSibling()) { 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Export(pStream, pChild, dwFlag, pChecksum); 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pStream->WriteString(L"</xdp:xdp\n>"); 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_PacketType::Datasets: { 61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLElement* pElement = 62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static_cast<CFX_XMLElement*>(pNode->GetXMLMappingNode()); 63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pElement || pElement->GetType() != FX_XMLNODE_Element) 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pDataNode = pNode->GetFirstChild(); 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pDataNode); 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_DataExporter_DealWithDataGroupNode(pDataNode); 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLDoc->SaveXMLNode(pStream, pElement); 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_PacketType::Form: { 73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_DataExporter_RegenerateFormFile(pNode, pStream, pChecksum, false); 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_PacketType::Template: 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: { 78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLElement* pElement = 79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static_cast<CFX_XMLElement*>(pNode->GetXMLMappingNode()); 80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pElement || pElement->GetType() != FX_XMLNODE_Element) 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLDoc->SaveXMLNode(pStream, pElement); 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pDataNode = pNode->GetParent(); 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pExportNode = pNode; 92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pChildNode = pDataNode->GetFirstChild(); pChildNode; 93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pChildNode = pChildNode->GetNextSibling()) { 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pChildNode != pNode) { 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pExportNode = pDataNode; 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLElement* pElement = 100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static_cast<CFX_XMLElement*>(pExportNode->GetXMLMappingNode()); 101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pElement || pElement->GetType() != FX_XMLNODE_Element) 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_DataExporter_DealWithDataGroupNode(pExportNode); 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pElement->SetString(L"xmlns:xfa", L"http://www.xfa.org/schema/xfa-data/1.0/"); 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLDoc->SaveXMLNode(pStream, pElement); 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pElement->RemoveAttribute(L"xmlns:xfa"); 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 111