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 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector> 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_basic.h" 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h" 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fde/xml/fde_xml_imp.h" 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fgas/crt/fgas_codepage.h" 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_document.h" 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_widgetdata.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_object.h" 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace { 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_WideString ExportEncodeAttribute(const CFX_WideString& str) { 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf textBuf; 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLen = str.GetLength(); 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iLen; i++) { 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (str[i]) { 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case '&': 2733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann textBuf << L"&"; 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case '<': 3033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann textBuf << L"<"; 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case '>': 3333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann textBuf << L">"; 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case '\'': 3633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann textBuf << L"'"; 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case '\"': 3933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann textBuf << L"""; 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann textBuf.AppendChar(str[i]); 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return textBuf.MakeString(); 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_WideString ExportEncodeContent(const CFX_WideStringC& str) { 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf textBuf; 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLen = str.GetLength(); 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iLen; i++) { 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR ch = str.GetAt(i); 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!FDE_IsXMLValidChar(ch)) 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch == '&') { 5733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann textBuf << L"&"; 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == '<') { 5933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann textBuf << L"<"; 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == '>') { 6133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann textBuf << L">"; 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == '\'') { 6333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann textBuf << L"'"; 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == '\"') { 6533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann textBuf << L"""; 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == ' ') { 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i && str.GetAt(i - 1) != ' ') { 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann textBuf.AppendChar(' '); 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 7033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann textBuf << L" "; 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann textBuf.AppendChar(str.GetAt(i)); 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return textBuf.MakeString(); 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid SaveAttribute(CXFA_Node* pNode, 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_ATTRIBUTE eName, 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_WideStringC& wsName, 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bProto, 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString& wsOutput) { 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsValue; 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((!bProto && !pNode->HasAttribute((XFA_ATTRIBUTE)eName, bProto)) || 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann !pNode->GetAttribute((XFA_ATTRIBUTE)eName, wsValue, false)) { 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsValue = ExportEncodeAttribute(wsValue); 9033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsOutput += L" "; 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsOutput += wsName; 9233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsOutput += L"=\""; 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsOutput += wsValue; 9433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsOutput += L"\""; 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool AttributeSaveInDataModel(CXFA_Node* pNode, XFA_ATTRIBUTE eAttribute) { 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSaveInDataModel = false; 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNode->GetElementType() != XFA_Element::Image) 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return bSaveInDataModel; 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pValueNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pValueNode || pValueNode->GetElementType() != XFA_Element::Value) 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return bSaveInDataModel; 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pFieldNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent); 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pFieldNode && pFieldNode->GetBindData() && 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eAttribute == XFA_ATTRIBUTE_Href) { 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bSaveInDataModel = true; 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return bSaveInDataModel; 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool ContentNodeNeedtoExport(CXFA_Node* pContentNode) { 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsContent; 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pContentNode->TryContent(wsContent, false, false)) 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pContentNode->IsContentNode()); 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pParentNode = pContentNode->GetNodeItem(XFA_NODEITEM_Parent); 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pParentNode || pParentNode->GetElementType() != XFA_Element::Value) 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pGrandParentNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent); 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pGrandParentNode || !pGrandParentNode->IsContainerNode()) 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pGrandParentNode->GetBindData()) 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_WidgetData* pWidgetData = pGrandParentNode->GetWidgetData(); 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_Element eUIType = pWidgetData->GetUIType(); 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eUIType == XFA_Element::PasswordEdit) 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid RecognizeXFAVersionNumber(CXFA_Node* pTemplateRoot, 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString& wsVersionNumber) { 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsVersionNumber.clear(); 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pTemplateRoot) 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsTemplateNS; 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pTemplateRoot->TryNamespace(wsTemplateNS)) 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_VERSION eVersion = 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTemplateRoot->GetDocument()->RecognizeXFAVersionNumber(wsTemplateNS); 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eVersion == XFA_VERSION_UNKNOWN) 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eVersion = XFA_VERSION_DEFAULT; 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsVersionNumber.Format(L"%i.%i", eVersion / 100, eVersion % 100); 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid RegenerateFormFile_Changed(CXFA_Node* pNode, 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf& buf, 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSaveXML) { 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsAttrs; 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iAttrs = 0; 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t* pAttrs = 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_GetElementAttributes(pNode->GetElementType(), iAttrs); 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iAttrs--) { 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const XFA_ATTRIBUTEINFO* pAttr = 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_GetAttributeByID((XFA_ATTRIBUTE)pAttrs[iAttrs]); 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pAttr->eName == XFA_ATTRIBUTE_Name || 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (AttributeSaveInDataModel(pNode, pAttr->eName) && !bSaveXML)) { 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsAttr; 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann SaveAttribute(pNode, pAttr->eName, pAttr->pName, bSaveXML, wsAttr); 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsAttrs += wsAttr; 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsChildren; 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (pNode->GetObjectType()) { 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_ObjectType::ContentNode: { 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bSaveXML && !ContentNodeNeedtoExport(pNode)) 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pRawValueNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (pRawValueNode && 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pRawValueNode->GetElementType() != XFA_Element::SharpxHTML && 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pRawValueNode->GetElementType() != XFA_Element::Sharptext && 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pRawValueNode->GetElementType() != XFA_Element::Sharpxml) { 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pRawValueNode = pRawValueNode->GetNodeItem(XFA_NODEITEM_NextSibling); 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pRawValueNode) 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsContentType; 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, false); 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pRawValueNode->GetElementType() == XFA_Element::SharpxHTML && 19333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsContentType == L"text/html") { 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLNode* pExDataXML = pNode->GetXMLMappingNode(); 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pExDataXML) 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLNode* pRichTextXML = 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pExDataXML->GetNodeItem(CFDE_XMLNode::FirstChild); 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pRichTextXML) 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_RetainPtr<IFX_MemoryStream> pMemStream = 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann IFX_MemoryStream::Create(true); 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Note: ambiguous without cast below. 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_RetainPtr<IFGAS_Stream> pTempStream = IFGAS_Stream::CreateStream( 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_RetainPtr<IFX_SeekableWriteStream>(pMemStream), 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_STREAMACCESS_Append); 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTempStream->SetCodePage(FX_CODEPAGE_UTF8); 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pRichTextXML->SaveXMLNode(pTempStream); 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsChildren += CFX_WideString::FromUTF8( 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteStringC(pMemStream->GetBuffer(), pMemStream->GetSize())); 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (pRawValueNode->GetElementType() == XFA_Element::Sharpxml && 21733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsContentType == L"text/xml") { 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsRawValue; 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pRawValueNode->GetAttribute(XFA_ATTRIBUTE_Value, wsRawValue, false); 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wsRawValue.IsEmpty()) 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<CFX_WideString> wsSelTextArray; 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStart = 0; 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iEnd = wsRawValue.Find(L'\n', iStart); 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iEnd = (iEnd == -1) ? wsRawValue.GetLength() : iEnd; 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iEnd >= iStart) { 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsSelTextArray.push_back(wsRawValue.Mid(iStart, iEnd - iStart)); 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStart = iEnd + 1; 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iStart >= wsRawValue.GetLength()) 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iEnd = wsRawValue.Find(L'\n', iStart); 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pParentNode); 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pGrandparentNode = 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pParentNode->GetNodeItem(XFA_NODEITEM_Parent); 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pGrandparentNode); 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString bodyTagName; 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bodyTagName = pGrandparentNode->GetCData(XFA_ATTRIBUTE_Name); 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bodyTagName.IsEmpty()) 24333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann bodyTagName = L"ListBox1"; 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 24533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann buf << L"<"; 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf << bodyTagName; 24733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann buf << L" xmlns=\"\"\n>"; 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < pdfium::CollectionSize<int32_t>(wsSelTextArray); 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++) { 25033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann buf << L"<value\n>"; 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf << ExportEncodeContent(wsSelTextArray[i].AsStringC()); 25233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann buf << L"</value\n>"; 2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 25433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann buf << L"</"; 2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf << bodyTagName; 25633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann buf << L"\n>"; 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsChildren += buf.AsStringC(); 2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.Clear(); 2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideStringC wsValue = pRawValueNode->GetCData(XFA_ATTRIBUTE_Value); 2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsChildren += ExportEncodeContent(wsValue); 2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_ObjectType::TextNode: 2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_ObjectType::NodeC: 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_ObjectType::NodeV: { 2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideStringC wsValue = pNode->GetCData(XFA_ATTRIBUTE_Value); 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsChildren += ExportEncodeContent(wsValue); 2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: 2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNode->GetElementType() == XFA_Element::Items) { 2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pTemplateNode = pNode->GetTemplateNode(); 2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pTemplateNode || 2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTemplateNode->CountChildren(XFA_Element::Unknown) != 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNode->CountChildren(XFA_Element::Unknown)) { 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bSaveXML = true; 2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf newBuf; 2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); 2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (pChildNode) { 2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann RegenerateFormFile_Changed(pChildNode, newBuf, bSaveXML); 2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsChildren += newBuf.AsStringC(); 2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann newBuf.Clear(); 2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); 2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bSaveXML && !wsChildren.IsEmpty() && 2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNode->GetElementType() == XFA_Element::Items) { 2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsChildren.clear(); 2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bSaveXML = true; 2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); 2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (pChild) { 2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann RegenerateFormFile_Changed(pChild, newBuf, bSaveXML); 2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsChildren += newBuf.AsStringC(); 2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann newBuf.Clear(); 2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); 2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!wsChildren.IsEmpty() || !wsAttrs.IsEmpty() || 3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNode->HasAttribute(XFA_ATTRIBUTE_Name)) { 3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideStringC wsElement = pNode->GetClassName(); 3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsName; 30833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann SaveAttribute(pNode, XFA_ATTRIBUTE_Name, L"name", true, wsName); 30933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann buf << L"<"; 3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf << wsElement; 3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf << wsName; 3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf << wsAttrs; 3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wsChildren.IsEmpty()) { 31433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann buf << L"\n/>"; 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 31633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann buf << L"\n>"; 3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf << wsChildren; 31833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann buf << L"</"; 3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf << wsElement; 32033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann buf << L"\n>"; 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid RegenerateFormFile_Container(CXFA_Node* pNode, 3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_RetainPtr<IFGAS_Stream>& pStream, 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSaveXML = false) { 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_Element eType = pNode->GetElementType(); 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eType == XFA_Element::Field || eType == XFA_Element::Draw || 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann !pNode->IsContainerNode()) { 3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf buf; 3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann RegenerateFormFile_Changed(pNode, buf, bSaveXML); 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_STRSIZE nLen = buf.GetLength(); 3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nLen > 0) 3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString((const FX_WCHAR*)buf.GetBuffer(), nLen); 3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideStringC wsElement = pNode->GetClassName(); 3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(L"<", 1); 3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(wsElement.c_str(), wsElement.GetLength()); 3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsOutput; 34333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann SaveAttribute(pNode, XFA_ATTRIBUTE_Name, L"name", true, wsOutput); 3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsAttrs; 3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iAttrs = 0; 3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t* pAttrs = 3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_GetElementAttributes(pNode->GetElementType(), iAttrs); 3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iAttrs--) { 3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const XFA_ATTRIBUTEINFO* pAttr = 3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_GetAttributeByID((XFA_ATTRIBUTE)pAttrs[iAttrs]); 3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pAttr->eName == XFA_ATTRIBUTE_Name) 3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsAttr; 3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann SaveAttribute(pNode, pAttr->eName, pAttr->pName, false, wsAttr); 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsOutput += wsAttr; 3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!wsOutput.IsEmpty()) 3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(wsOutput.c_str(), wsOutput.GetLength()); 3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pChildNode) { 3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(L"\n>", 2); 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (pChildNode) { 3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann RegenerateFormFile_Container(pChildNode, pStream, bSaveXML); 3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(L"</", 2); 3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(wsElement.c_str(), wsElement.GetLength()); 3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(L"\n>", 2); 3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(L"\n/>", 3); 3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} // namespace 3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid XFA_DataExporter_RegenerateFormFile( 3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pNode, 3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_RetainPtr<IFGAS_Stream>& pStream, 3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FX_CHAR* pChecksum, 3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSaveXML) { 3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNode->IsModelNode()) { 3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static const FX_WCHAR s_pwsTagName[] = L"<form"; 3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static const FX_WCHAR s_pwsClose[] = L"</form\n>"; 3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(s_pwsTagName, FXSYS_wcslen(s_pwsTagName)); 3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pChecksum) { 3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static const FX_WCHAR s_pwChecksum[] = L" checksum=\""; 3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsChecksum = CFX_WideString::FromUTF8(pChecksum); 3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(s_pwChecksum, FXSYS_wcslen(s_pwChecksum)); 3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(wsChecksum.c_str(), wsChecksum.GetLength()); 3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(L"\"", 1); 3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(L" xmlns=\"", FXSYS_wcslen(L" xmlns=\"")); 3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FX_WCHAR* pURI = XFA_GetPacketByIndex(XFA_PACKET_Form)->pURI; 3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(pURI, FXSYS_wcslen(pURI)); 3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString wsVersionNumber; 3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann RecognizeXFAVersionNumber( 4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToNode(pNode->GetDocument()->GetXFAObject(XFA_HASHCODE_Template)), 4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsVersionNumber); 40233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (wsVersionNumber.IsEmpty()) 40333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsVersionNumber = L"2.8"; 40433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann 40533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsVersionNumber += L"/\"\n>"; 4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(wsVersionNumber.c_str(), wsVersionNumber.GetLength()); 4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); 4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (pChildNode) { 4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann RegenerateFormFile_Container(pChildNode, pStream); 4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); 4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(s_pwsClose, FXSYS_wcslen(s_pwsClose)); 4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann RegenerateFormFile_Container(pNode, pStream, bSaveXML); 4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid XFA_DataExporter_DealWithDataGroupNode(CXFA_Node* pDataNode) { 4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDataNode || pDataNode->GetElementType() == XFA_Element::DataValue) 4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iChildNum = 0; 4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (CXFA_Node* pChildNode = pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild); 4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pChildNode; 4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { 4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iChildNum++; 4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_DataExporter_DealWithDataGroupNode(pChildNode); 4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pDataNode->GetElementType() != XFA_Element::DataGroup) 4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iChildNum > 0) { 4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode(); 4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pXMLNode->GetType() == FDE_XMLNODE_Element); 4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLElement* pXMLElement = static_cast<CFDE_XMLElement*>(pXMLNode); 4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pXMLElement->HasAttribute(L"xfa:dataNode")) 4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLElement->RemoveAttribute(L"xfa:dataNode"); 4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode(); 4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pXMLNode->GetType() == FDE_XMLNODE_Element); 4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static_cast<CFDE_XMLElement*>(pXMLNode)->SetString(L"xfa:dataNode", 4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann L"dataGroup"); 4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_DataExporter::CXFA_DataExporter(CXFA_Document* pDocument) 4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_pDocument(pDocument) { 4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(m_pDocument); 4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_DataExporter::Export( 4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_RetainPtr<IFX_SeekableWriteStream>& pWrite) { 4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Export(pWrite, m_pDocument->GetRoot(), 0, nullptr); 4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_DataExporter::Export( 4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_RetainPtr<IFX_SeekableWriteStream>& pWrite, 4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pNode, 4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwFlag, 4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FX_CHAR* pChecksum) { 4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pWrite); 4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pWrite) 4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_RetainPtr<IFGAS_Stream> pStream = IFGAS_Stream::CreateStream( 4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pWrite, 4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append); 4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pStream) 4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->SetCodePage(FX_CODEPAGE_UTF8); 4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Export(pStream, pNode, dwFlag, pChecksum); 4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_DataExporter::Export(const CFX_RetainPtr<IFGAS_Stream>& pStream, 4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pNode, 4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwFlag, 4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FX_CHAR* pChecksum) { 4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLDoc* pXMLDoc = m_pDocument->GetXMLDoc(); 4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNode->IsModelNode()) { 4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (pNode->GetPacketID()) { 4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_XDPPACKET_XDP: { 4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static const FX_WCHAR s_pwsPreamble[] = 4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann L"<xdp:xdp xmlns:xdp=\"http://ns.adobe.com/xdp/\">"; 4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(s_pwsPreamble, FXSYS_wcslen(s_pwsPreamble)); 4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); 4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { 4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Export(pStream, pChild, dwFlag, pChecksum); 4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static const FX_WCHAR s_pwsPostamble[] = L"</xdp:xdp\n>"; 4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->WriteString(s_pwsPostamble, FXSYS_wcslen(s_pwsPostamble)); 4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_XDPPACKET_Datasets: { 4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLElement* pElement = 4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static_cast<CFDE_XMLElement*>(pNode->GetXMLMappingNode()); 5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) 5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pDataNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); 5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pDataNode); 5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_DataExporter_DealWithDataGroupNode(pDataNode); 5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLDoc->SaveXMLNode(pStream, pElement); 5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_XDPPACKET_Form: { 5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_DataExporter_RegenerateFormFile(pNode, pStream, pChecksum); 5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_XDPPACKET_Template: 5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: { 5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLElement* pElement = 5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static_cast<CFDE_XMLElement*>(pNode->GetXMLMappingNode()); 5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) 5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLDoc->SaveXMLNode(pStream, pElement); 5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pDataNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); 5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pExportNode = pNode; 5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (CXFA_Node* pChildNode = pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild); 5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pChildNode; 5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { 5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pChildNode != pNode) { 5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pExportNode = pDataNode; 5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFDE_XMLElement* pElement = 5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static_cast<CFDE_XMLElement*>(pExportNode->GetXMLMappingNode()); 5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) 5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_DataExporter_DealWithDataGroupNode(pExportNode); 5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pElement->SetString(L"xmlns:xfa", L"http://www.xfa.org/schema/xfa-data/1.0/"); 5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pXMLDoc->SaveXMLNode(pStream, pElement); 5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pElement->RemoveAttribute(L"xmlns:xfa"); 5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 549