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"&"; 58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case '<': 60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann textBuf << L"<"; 61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case '>': 63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann textBuf << L">"; 64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case '\'': 66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann textBuf << L"'"; 67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case '\"': 69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann textBuf << L"""; 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"&"; 93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (ch == '<') { 94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann textBuf << L"<"; 95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (ch == '>') { 96d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann textBuf << L">"; 97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (ch == '\'') { 98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann textBuf << L"'"; 99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (ch == '\"') { 100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann textBuf << L"""; 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" "; 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