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/xfa_utils.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <algorithm>
10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <vector>
11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/cfx_memorystream.h"
13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/cfx_widetextbuf.h"
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_codepage.h"
15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_extension.h"
16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmlchardata.h"
17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmlelement.h"
18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmlnode.h"
19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmltext.h"
20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/xfa/cjx_object.h"
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_document.h"
22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_localemgr.h"
23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_localevalue.h"
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_measurement.h"
25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_node.h"
26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_ui.h"
27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_value.h"
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_basic_data.h"
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace {
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconstexpr const wchar_t kFormNS[] = L"http://www.xfa.org/schema/xfa-form/";
33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst double fraction_scales[] = {0.1,
35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.01,
36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.001,
37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.0001,
38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.00001,
39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.000001,
40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.0000001,
41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.00000001,
42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.000000001,
43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.0000000001,
44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.00000000001,
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.000000000001,
46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.0000000000001,
47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.00000000000001,
48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.000000000000001,
49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  0.0000000000000001};
50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString ExportEncodeAttribute(const WideString& str) {
52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_WideTextBuf textBuf;
53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iLen = str.GetLength();
54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (int32_t i = 0; i < iLen; i++) {
55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    switch (str[i]) {
56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      case '&':
57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        textBuf << L"&amp;";
58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      case '<':
60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        textBuf << L"&lt;";
61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      case '>':
63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        textBuf << L"&gt;";
64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      case '\'':
66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        textBuf << L"&apos;";
67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      case '\"':
69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        textBuf << L"&quot;";
70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      default:
72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        textBuf.AppendChar(str[i]);
73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return textBuf.MakeString();
76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool IsXMLValidChar(wchar_t ch) {
79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return ch == 0x09 || ch == 0x0A || ch == 0x0D ||
80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann         (ch >= 0x20 && ch <= 0xD7FF) || (ch >= 0xE000 && ch <= 0xFFFD);
81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString ExportEncodeContent(const WideString& str) {
84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_WideTextBuf textBuf;
85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iLen = str.GetLength();
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (int32_t i = 0; i < iLen; i++) {
87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wchar_t ch = str[i];
88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!IsXMLValidChar(ch))
89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (ch == '&') {
92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      textBuf << L"&amp;";
93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    } else if (ch == '<') {
94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      textBuf << L"&lt;";
95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    } else if (ch == '>') {
96d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      textBuf << L"&gt;";
97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    } else if (ch == '\'') {
98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      textBuf << L"&apos;";
99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    } else if (ch == '\"') {
100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      textBuf << L"&quot;";
101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    } else if (ch == ' ') {
102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (i && str[i - 1] != ' ') {
103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        textBuf.AppendChar(' ');
104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      } else {
105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        textBuf << L"&#x20;";
106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    } else {
108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      textBuf.AppendChar(str[i]);
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return textBuf.MakeString();
112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool AttributeSaveInDataModel(CXFA_Node* pNode, XFA_Attribute eAttribute) {
115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bSaveInDataModel = false;
116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pNode->GetElementType() != XFA_Element::Image)
117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return bSaveInDataModel;
118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pValueNode = pNode->GetParent();
120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pValueNode || pValueNode->GetElementType() != XFA_Element::Value)
121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return bSaveInDataModel;
122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pFieldNode = pValueNode->GetParent();
124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pFieldNode && pFieldNode->GetBindData() &&
125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      eAttribute == XFA_Attribute::Href) {
126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bSaveInDataModel = true;
127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return bSaveInDataModel;
129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool ContentNodeNeedtoExport(CXFA_Node* pContentNode) {
132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<WideString> wsContent =
133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pContentNode->JSObject()->TryContent(false, false);
134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!wsContent)
135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(pContentNode->IsContentNode());
138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pParentNode = pContentNode->GetParent();
139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pParentNode || pParentNode->GetElementType() != XFA_Element::Value)
140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return true;
141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pGrandParentNode = pParentNode->GetParent();
143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pGrandParentNode || !pGrandParentNode->IsContainerNode())
144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return true;
145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pGrandParentNode->GetBindData())
146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_Element eUIType = pGrandParentNode->GetWidgetAcc()->GetUIType();
149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eUIType == XFA_Element::PasswordEdit)
150d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid SaveAttribute(CXFA_Node* pNode,
155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                   XFA_Attribute eName,
156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                   const WideString& wsName,
157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                   bool bProto,
158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                   WideString& wsOutput) {
159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bProto && !pNode->JSObject()->HasAttribute(eName))
160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<WideString> value = pNode->JSObject()->TryAttribute(eName, false);
163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!value)
164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  wsOutput += L" ";
167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  wsOutput += wsName;
168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  wsOutput += L"=\"";
169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  wsOutput += ExportEncodeAttribute(*value);
170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  wsOutput += L"\"";
171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid RegenerateFormFile_Changed(CXFA_Node* pNode,
174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                CFX_WideTextBuf& buf,
175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                bool bSaveXML) {
176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsAttrs;
177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (size_t i = 0;; ++i) {
178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_Attribute attr = pNode->GetAttribute(i);
179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (attr == XFA_Attribute::Unknown)
180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (attr == XFA_Attribute::Name ||
183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        (AttributeSaveInDataModel(pNode, attr) && !bSaveXML)) {
184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsAttr;
187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    SaveAttribute(pNode, attr, CXFA_Node::AttributeToName(attr), bSaveXML,
188d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                  wsAttr);
189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wsAttrs += wsAttr;
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
191d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsChildren;
193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (pNode->GetObjectType()) {
194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::ContentNode: {
195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!bSaveXML && !ContentNodeNeedtoExport(pNode))
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Node* pRawValueNode = pNode->GetFirstChild();
199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      while (pRawValueNode &&
200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann             pRawValueNode->GetElementType() != XFA_Element::SharpxHTML &&
201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann             pRawValueNode->GetElementType() != XFA_Element::Sharptext &&
202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann             pRawValueNode->GetElementType() != XFA_Element::Sharpxml) {
203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pRawValueNode = pRawValueNode->GetNextSibling();
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!pRawValueNode)
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      Optional<WideString> contentType =
209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pNode->JSObject()->TryAttribute(XFA_Attribute::ContentType, false);
210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pRawValueNode->GetElementType() == XFA_Element::SharpxHTML &&
211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          (contentType && *contentType == L"text/html")) {
212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CFX_XMLNode* pExDataXML = pNode->GetXMLMappingNode();
213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pExDataXML)
214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
216d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CFX_XMLNode* pRichTextXML =
217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pExDataXML->GetNodeItem(CFX_XMLNode::FirstChild);
218d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pRichTextXML)
219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        auto pMemStream = pdfium::MakeRetain<CFX_MemoryStream>(true);
222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        auto pTempStream =
223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pdfium::MakeRetain<CFX_SeekableStreamProxy>(pMemStream, true);
224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pTempStream->SetCodePage(FX_CODEPAGE_UTF8);
226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pRichTextXML->SaveXMLNode(pTempStream);
227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsChildren += WideString::FromUTF8(
228d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            ByteStringView(pMemStream->GetBuffer(), pMemStream->GetSize()));
229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      } else if (pRawValueNode->GetElementType() == XFA_Element::Sharpxml &&
230d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                 (contentType && *contentType == L"text/xml")) {
231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        Optional<WideString> rawValue = pRawValueNode->JSObject()->TryAttribute(
232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            XFA_Attribute::Value, false);
233d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!rawValue || rawValue->IsEmpty())
234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        std::vector<WideString> wsSelTextArray;
237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        size_t iStart = 0;
238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        auto iEnd = rawValue->Find(L'\n', iStart);
239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        iEnd = !iEnd.has_value() ? rawValue->GetLength() : iEnd;
240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        while (iEnd.has_value() && iEnd >= iStart) {
241d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          wsSelTextArray.push_back(
242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              rawValue->Mid(iStart, iEnd.value() - iStart));
243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          iStart = iEnd.value() + 1;
244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          if (iStart >= rawValue->GetLength())
245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            break;
246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          iEnd = rawValue->Find(L'\n', iStart);
247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pParentNode = pNode->GetParent();
250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        ASSERT(pParentNode);
251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pGrandparentNode = pParentNode->GetParent();
252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        ASSERT(pGrandparentNode);
253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        WideString bodyTagName;
254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        bodyTagName =
255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pGrandparentNode->JSObject()->GetCData(XFA_Attribute::Name);
256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (bodyTagName.IsEmpty())
257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          bodyTagName = L"ListBox1";
258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        buf << L"<";
260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        buf << bodyTagName;
261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        buf << L" xmlns=\"\"\n>";
262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        for (int32_t i = 0; i < pdfium::CollectionSize<int32_t>(wsSelTextArray);
263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann             i++) {
264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          buf << L"<value\n>";
265d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          buf << ExportEncodeContent(wsSelTextArray[i]);
266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          buf << L"</value\n>";
267d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
268d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        buf << L"</";
269d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        buf << bodyTagName;
270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        buf << L"\n>";
271d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsChildren += buf.AsStringView();
272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        buf.Clear();
273d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      } else {
274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        WideString wsValue =
275d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pRawValueNode->JSObject()->GetCData(XFA_Attribute::Value);
276d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsChildren += ExportEncodeContent(wsValue);
2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
278d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
280d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::TextNode:
281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::NodeC:
282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_ObjectType::NodeV: {
283d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsValue = pNode->JSObject()->GetCData(XFA_Attribute::Value);
284d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsChildren += ExportEncodeContent(wsValue);
285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pNode->GetElementType() == XFA_Element::Items) {
289d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pTemplateNode = pNode->GetTemplateNodeIfExists();
290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pTemplateNode ||
291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pTemplateNode->CountChildren(XFA_Element::Unknown, false) !=
292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                pNode->CountChildren(XFA_Element::Unknown, false)) {
293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          bSaveXML = true;
294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CFX_WideTextBuf newBuf;
297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Node* pChildNode = pNode->GetFirstChild();
298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      while (pChildNode) {
299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        RegenerateFormFile_Changed(pChildNode, newBuf, bSaveXML);
300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsChildren += newBuf.AsStringView();
301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        newBuf.Clear();
302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pChildNode = pChildNode->GetNextSibling();
303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!bSaveXML && !wsChildren.IsEmpty() &&
305d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pNode->GetElementType() == XFA_Element::Items) {
306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsChildren.clear();
307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        bSaveXML = true;
308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pChild = pNode->GetFirstChild();
309d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        while (pChild) {
310d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          RegenerateFormFile_Changed(pChild, newBuf, bSaveXML);
311d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          wsChildren += newBuf.AsStringView();
312d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          newBuf.Clear();
313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pChild = pChild->GetNextSibling();
314d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
316d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
317d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
318d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
319d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!wsChildren.IsEmpty() || !wsAttrs.IsEmpty() ||
320d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pNode->JSObject()->HasAttribute(XFA_Attribute::Name)) {
321d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideStringView wsElement = pNode->GetClassName();
322d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsName;
323d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    SaveAttribute(pNode, XFA_Attribute::Name, L"name", true, wsName);
324d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    buf << L"<";
325d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    buf << wsElement;
326d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    buf << wsName;
327d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    buf << wsAttrs;
328d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (wsChildren.IsEmpty()) {
329d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      buf << L"\n/>";
330d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    } else {
331d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      buf << L"\n>";
332d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      buf << wsChildren;
333d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      buf << L"</";
334d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      buf << wsElement;
335d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      buf << L"\n>";
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
338d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
339d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
340d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid RegenerateFormFile_Container(
341d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pNode,
342d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const RetainPtr<CFX_SeekableStreamProxy>& pStream,
343d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bool bSaveXML) {
344d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_Element eType = pNode->GetElementType();
345d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eType == XFA_Element::Field || eType == XFA_Element::Draw ||
346d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      !pNode->IsContainerNode()) {
347d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CFX_WideTextBuf buf;
348d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    RegenerateFormFile_Changed(pNode, buf, bSaveXML);
349d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    size_t nLen = buf.GetLength();
350d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (nLen > 0)
351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pStream->WriteString(buf.AsStringView());
352d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
353d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
354d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
355d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideStringView wsElement(pNode->GetClassName());
356d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pStream->WriteString(L"<");
357d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pStream->WriteString(wsElement);
358d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
359d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsOutput;
360d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  SaveAttribute(pNode, XFA_Attribute::Name, L"name", true, wsOutput);
361d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
362d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsAttrs;
363d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (size_t i = 0;; ++i) {
364d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_Attribute attr = pNode->GetAttribute(i);
365d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (attr == XFA_Attribute::Unknown)
366d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
367d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (attr == XFA_Attribute::Name)
368d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
369d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
370d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsAttr;
371d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    SaveAttribute(pNode, attr, CXFA_Node::AttributeToName(attr), false, wsAttr);
372d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wsOutput += wsAttr;
373d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
374d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
375d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!wsOutput.IsEmpty())
376d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pStream->WriteString(wsOutput.AsStringView());
377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
378d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pChildNode = pNode->GetFirstChild();
379d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pChildNode) {
380d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pStream->WriteString(L"\n>");
381d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    while (pChildNode) {
382d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      RegenerateFormFile_Container(pChildNode, pStream, bSaveXML);
383d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pChildNode = pChildNode->GetNextSibling();
384d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
385d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pStream->WriteString(L"</");
386d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pStream->WriteString(wsElement);
387d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pStream->WriteString(L"\n>");
388d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else {
389d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pStream->WriteString(L"\n/>");
3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
391d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
392d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
393d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString RecognizeXFAVersionNumber(CXFA_Node* pTemplateRoot) {
394d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pTemplateRoot)
395d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return WideString();
396d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
397d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<WideString> templateNS = pTemplateRoot->JSObject()->TryNamespace();
398d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!templateNS)
399d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return WideString();
400d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
401d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_VERSION eVersion =
402d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pTemplateRoot->GetDocument()->RecognizeXFAVersionNumber(*templateNS);
403d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eVersion == XFA_VERSION_UNKNOWN)
404d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    eVersion = XFA_VERSION_DEFAULT;
405d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
406d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return WideString::Format(L"%i.%i", eVersion / 100, eVersion % 100);
4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}  // namespace
4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
411d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanndouble XFA_GetFractionalScale(uint32_t idx) {
412d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return fraction_scales[idx];
413d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
414d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
415d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint XFA_GetMaxFractionalScale() {
416d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return FX_ArraySize(fraction_scales);
417d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
418d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
419d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_LocaleValue XFA_GetLocaleValue(CXFA_Node* pNode) {
420d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Value* pNodeValue =
421d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pNode->GetChild<CXFA_Value>(0, XFA_Element::Value, false);
422d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pNodeValue)
4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CXFA_LocaleValue();
424d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
425d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pValueChild = pNodeValue->GetFirstChild();
426d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pValueChild)
4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CXFA_LocaleValue();
428d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iVTType = XFA_VT_NULL;
4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (pValueChild->GetElementType()) {
4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Decimal:
4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iVTType = XFA_VT_DECIMAL;
4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Float:
4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iVTType = XFA_VT_FLOAT;
4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Date:
4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iVTType = XFA_VT_DATE;
4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Time:
4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iVTType = XFA_VT_TIME;
4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::DateTime:
4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iVTType = XFA_VT_DATETIME;
4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Boolean:
4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iVTType = XFA_VT_BOOLEAN;
4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Integer:
4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iVTType = XFA_VT_INTEGER;
4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Text:
4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iVTType = XFA_VT_TEXT;
4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default:
4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iVTType = XFA_VT_NULL;
4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
459d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return CXFA_LocaleValue(iVTType, pNode->GetRawValue(),
460d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                          pNode->GetDocument()->GetLocalMgr());
461d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
462d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
463d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool XFA_FDEExtension_ResolveNamespaceQualifier(CFX_XMLElement* pNode,
464d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                const WideString& wsQualifier,
465d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                WideString* wsNamespaceURI) {
466d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pNode)
467d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
468d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
469d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_XMLNode* pFakeRoot = pNode->GetNodeItem(CFX_XMLNode::Root);
470d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsNSAttribute;
471d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bRet = false;
472d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (wsQualifier.IsEmpty()) {
473d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wsNSAttribute = L"xmlns";
474d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bRet = true;
475d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else {
476d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wsNSAttribute = L"xmlns:" + wsQualifier;
477d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
478d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CFX_XMLNode* pParent = pNode; pParent != pFakeRoot;
479d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pParent = pParent->GetNodeItem(CFX_XMLNode::Parent)) {
480d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pParent->GetType() != FX_XMLNODE_Element)
481d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
482d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
483d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    auto* pElement = static_cast<CFX_XMLElement*>(pParent);
484d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pElement->HasAttribute(wsNSAttribute.c_str())) {
485d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      *wsNamespaceURI = pElement->GetString(wsNSAttribute.c_str());
486d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return true;
487d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
488d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
489d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  wsNamespaceURI->clear();
490d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return bRet;
4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
492d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
493d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid XFA_DataExporter_DealWithDataGroupNode(CXFA_Node* pDataNode) {
494d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pDataNode || pDataNode->GetElementType() == XFA_Element::DataValue)
4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
496d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
497d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iChildNum = 0;
498d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pChildNode = pDataNode->GetFirstChild(); pChildNode;
499d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pChildNode = pChildNode->GetNextSibling()) {
500d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    iChildNum++;
501d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_DataExporter_DealWithDataGroupNode(pChildNode);
5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
503d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
504d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pDataNode->GetElementType() != XFA_Element::DataGroup)
505d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
506d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
507d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (iChildNum > 0) {
508d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CFX_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode();
509d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ASSERT(pXMLNode->GetType() == FX_XMLNODE_Element);
510d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CFX_XMLElement* pXMLElement = static_cast<CFX_XMLElement*>(pXMLNode);
511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pXMLElement->HasAttribute(L"xfa:dataNode"))
512d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pXMLElement->RemoveAttribute(L"xfa:dataNode");
513d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
514d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
516d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
517d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode();
518d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(pXMLNode->GetType() == FX_XMLNODE_Element);
519d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  static_cast<CFX_XMLElement*>(pXMLNode)->SetString(L"xfa:dataNode",
520d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                    L"dataGroup");
521d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
522d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
523d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid XFA_DataExporter_RegenerateFormFile(
524d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pNode,
525d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const RetainPtr<CFX_SeekableStreamProxy>& pStream,
526d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const char* pChecksum,
527d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bool bSaveXML) {
528d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pNode->IsModelNode()) {
529d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pStream->WriteString(L"<form");
530d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pChecksum) {
531d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsChecksum = WideString::FromUTF8(pChecksum);
532d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pStream->WriteString(L" checksum=\"");
533d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pStream->WriteString(wsChecksum.AsStringView());
534d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pStream->WriteString(L"\"");
535d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
536d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pStream->WriteString(L" xmlns=\"");
537d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pStream->WriteString(WideStringView(kFormNS));
538d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
539d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsVersionNumber = RecognizeXFAVersionNumber(
540d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        ToNode(pNode->GetDocument()->GetXFAObject(XFA_HASHCODE_Template)));
541d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (wsVersionNumber.IsEmpty())
542d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsVersionNumber = L"2.8";
543d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
544d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wsVersionNumber += L"/\"\n>";
545d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pStream->WriteString(wsVersionNumber.AsStringView());
546d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
547d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pChildNode = pNode->GetFirstChild();
548d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    while (pChildNode) {
549d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      RegenerateFormFile_Container(pChildNode, pStream, false);
550d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pChildNode = pChildNode->GetNextSibling();
551d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
552d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pStream->WriteString(L"</form\n>");
553d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else {
554d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    RegenerateFormFile_Container(pNode, pStream, bSaveXML);
5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool XFA_FieldIsMultiListBox(CXFA_Node* pFieldNode) {
5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFieldNode)
560d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
561d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
562d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Ui* pUIChild = pFieldNode->GetChild<CXFA_Ui>(0, XFA_Element::Ui, false);
563d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pUIChild)
564d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
565d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
566d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pFirstChild = pUIChild->GetFirstChild();
567d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pFirstChild ||
568d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pFirstChild->GetElementType() != XFA_Element::ChoiceList) {
569d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
572d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pFirstChild->JSObject()->GetEnum(XFA_Attribute::Open) ==
573d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann         XFA_AttributeEnum::MultiSelect;
5744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t XFA_MapRotation(int32_t nRotation) {
5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  nRotation = nRotation % 360;
5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  nRotation = nRotation < 0 ? nRotation + 360 : nRotation;
5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return nRotation;
5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst XFA_SCRIPTATTRIBUTEINFO* XFA_GetScriptAttributeByName(
5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    XFA_Element eElement,
584d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const WideStringView& wsAttributeName) {
5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (wsAttributeName.IsEmpty())
5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iElementIndex = static_cast<int32_t>(eElement);
5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (iElementIndex != -1) {
5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const XFA_SCRIPTHIERARCHY* scriptIndex = g_XFAScriptIndex + iElementIndex;
5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t icount = scriptIndex->wAttributeCount;
5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (icount == 0) {
5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iElementIndex = scriptIndex->wParentIndex;
5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint32_t uHash = FX_HashCode_GetW(wsAttributeName, false);
5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t iStart = scriptIndex->wAttributeStart, iEnd = iStart + icount - 1;
5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    do {
5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int32_t iMid = (iStart + iEnd) / 2;
6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      const XFA_SCRIPTATTRIBUTEINFO* pInfo = g_SomAttributeData + iMid;
6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (uHash == pInfo->uHash)
6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return pInfo;
6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (uHash < pInfo->uHash)
6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        iEnd = iMid - 1;
6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        iStart = iMid + 1;
6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } while (iStart <= iEnd);
6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    iElementIndex = scriptIndex->wParentIndex;
6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return nullptr;
6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
612