xref: /aosp_15_r20/external/pdfium/xfa/fxfa/parser/cxfa_dataexporter.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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)21 bool 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