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"&amp;";
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case '<':
3033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        textBuf << L"&lt;";
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case '>':
3333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        textBuf << L"&gt;";
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case '\'':
3633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        textBuf << L"&apos;";
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case '\"':
3933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        textBuf << L"&quot;";
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"&amp;";
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (ch == '<') {
5933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      textBuf << L"&lt;";
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (ch == '>') {
6133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      textBuf << L"&gt;";
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (ch == '\'') {
6333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      textBuf << L"&apos;";
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (ch == '\"') {
6533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      textBuf << L"&quot;";
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"&#x20;";
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