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