14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 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 7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_node.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <map> 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory> 11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <set> 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility> 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector> 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/autorestorer.h" 16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/cfx_decimal.h" 17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/cfx_memorystream.h" 18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_codepage.h" 19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_extension.h" 20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmlelement.h" 21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmlnode.h" 22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmltext.h" 23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/cfxjse_engine.h" 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fxjs/cfxjse_value.h" 25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/xfa/cjx_node.h" 26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "third_party/base/logging.h" 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h" 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h" 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/cxfa_eventparam.h" 30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffapp.h" 31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffdocview.h" 32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffnotify.h" 33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffwidget.h" 34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_arraynodelist.h" 35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_attachnodelist.h" 36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_bind.h" 37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_border.h" 38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_calculate.h" 39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_caption.h" 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_document.h" 41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_event.h" 42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_font.h" 43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_keep.h" 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_layoutprocessor.h" 45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_localevalue.h" 46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_margin.h" 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_measurement.h" 48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_nodeiteratortemplate.h" 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_occur.h" 50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_para.h" 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_simple_parser.h" 52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_subform.h" 53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_traversestrategy_xfacontainernode.h" 54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_validate.h" 55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_value.h" 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_basic_data.h" 57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/xfa_utils.h" 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace { 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconstexpr uint8_t kMaxExecuteRecursion = 2; 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::vector<CXFA_Node*> NodesSortedByDocumentIdx( 64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const std::set<CXFA_Node*>& rgNodeSet) { 65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (rgNodeSet.empty()) 66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return std::vector<CXFA_Node*>(); 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<CXFA_Node*> rgNodeArray; 69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pCommonParent = (*rgNodeSet.begin())->GetParent(); 70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = pCommonParent->GetFirstChild(); pNode; 71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = pNode->GetNextSibling()) { 72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pdfium::ContainsValue(rgNodeSet, pNode)) 73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann rgNodeArray.push_back(pNode); 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return rgNodeArray; 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannusing CXFA_NodeSetPair = std::pair<std::set<CXFA_Node*>, std::set<CXFA_Node*>>; 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannusing CXFA_NodeSetPairMap = 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::map<uint32_t, std::unique_ptr<CXFA_NodeSetPair>>; 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannusing CXFA_NodeSetPairMapMap = 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::map<CXFA_Node*, std::unique_ptr<CXFA_NodeSetPairMap>>; 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_NodeSetPair* NodeSetPairForNode(CXFA_Node* pNode, 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_NodeSetPairMapMap* pMap) { 86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pParentNode = pNode->GetParent(); 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwNameHash = pNode->GetNameHash(); 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pParentNode || !dwNameHash) 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!(*pMap)[pParentNode]) 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (*pMap)[pParentNode] = pdfium::MakeUnique<CXFA_NodeSetPairMap>(); 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_NodeSetPairMap* pNodeSetPairMap = (*pMap)[pParentNode].get(); 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!(*pNodeSetPairMap)[dwNameHash]) 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (*pNodeSetPairMap)[dwNameHash] = pdfium::MakeUnique<CXFA_NodeSetPair>(); 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (*pNodeSetPairMap)[dwNameHash].get(); 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid ReorderDataNodes(const std::set<CXFA_Node*>& sSet1, 102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const std::set<CXFA_Node*>& sSet2, 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bInsertBefore) { 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_NodeSetPairMapMap rgMap; 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (CXFA_Node* pNode : sSet1) { 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_NodeSetPair* pNodeSetPair = NodeSetPairForNode(pNode, &rgMap); 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNodeSetPair) 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNodeSetPair->first.insert(pNode); 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (CXFA_Node* pNode : sSet2) { 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_NodeSetPair* pNodeSetPair = NodeSetPairForNode(pNode, &rgMap); 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNodeSetPair) { 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pdfium::ContainsValue(pNodeSetPair->first, pNode)) 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNodeSetPair->first.erase(pNode); 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNodeSetPair->second.insert(pNode); 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& iter1 : rgMap) { 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_NodeSetPairMap* pNodeSetPairMap = iter1.second.get(); 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pNodeSetPairMap) 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& iter2 : *pNodeSetPairMap) { 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_NodeSetPair* pNodeSetPair = iter2.second.get(); 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pNodeSetPair) 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pNodeSetPair->first.empty() && !pNodeSetPair->second.empty()) { 129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<CXFA_Node*> rgNodeArray1 = 130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann NodesSortedByDocumentIdx(pNodeSetPair->first); 131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<CXFA_Node*> rgNodeArray2 = 132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann NodesSortedByDocumentIdx(pNodeSetPair->second); 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pParentNode = nullptr; 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pBeforeNode = nullptr; 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bInsertBefore) { 136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pBeforeNode = rgNodeArray2.front(); 137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pParentNode = pBeforeNode->GetParent(); 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pLastNode = rgNodeArray2.back(); 140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pParentNode = pLastNode->GetParent(); 141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pBeforeNode = pLastNode->GetNextSibling(); 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (auto* pCurNode : rgNodeArray1) { 144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pParentNode->RemoveChild(pCurNode, true); 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pParentNode->InsertChild(pCurNode, pBeforeNode); 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNodeSetPairMap->clear(); 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} // namespace 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// static 156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CXFA_Node::AttributeEnumToName(XFA_AttributeEnum item) { 157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return g_XFAEnumData[static_cast<int32_t>(item)].pName; 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// static 161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<XFA_AttributeEnum> CXFA_Node::NameToAttributeEnum( 162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideStringView& name) { 163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (name.IsEmpty()) 164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto* it = std::lower_bound(g_XFAEnumData, g_XFAEnumData + g_iXFAEnumCount, 167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FX_HashCode_GetW(name, false), 168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann [](const XFA_AttributeEnumInfo& arg, 169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t hash) { return arg.uHash < hash; }); 170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (it != g_XFAEnumData + g_iXFAEnumCount && name == it->pName) 171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {it->eName}; 172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node::CXFA_Node(CXFA_Document* pDoc, 176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_PacketType ePacket, 177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t validPackets, 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_ObjectType oType, 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_Element eType, 180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const PropertyData* properties, 181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const AttributeData* attributes, 182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideStringView& elementName, 183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::unique_ptr<CJX_Object> js_node) 184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann : CXFA_Object(pDoc, oType, eType, elementName, std::move(js_node)), 185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_Properties(properties), 186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_Attributes(attributes), 187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_ValidPackets(validPackets), 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pNext(nullptr), 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pChild(nullptr), 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLastChild(nullptr), 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pParent(nullptr), 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pXMLNode(nullptr), 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ePacket(ePacket), 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_uNodeFlags(XFA_NodeFlag_None), 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwNameHash(0), 196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pAuxNode(nullptr) { 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(m_pDocument); 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node::CXFA_Node(CXFA_Document* pDoc, 201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_PacketType ePacket, 202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t validPackets, 203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_ObjectType oType, 204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Element eType, 205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const PropertyData* properties, 206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const AttributeData* attributes, 207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideStringView& elementName) 208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann : CXFA_Node(pDoc, 209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ePacket, 210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann validPackets, 211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann oType, 212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann eType, 213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann properties, 214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann attributes, 215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann elementName, 216d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pdfium::MakeUnique<CJX_Node>(this)) {} 217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node::~CXFA_Node() { 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(!m_pParent); 220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pNode = m_pChild; 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (pNode) { 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pNext = pNode->m_pNext; 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNode->m_pParent = nullptr; 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann delete pNode; 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNode = pNext; 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pXMLNode && IsOwnXMLNode()) 22933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann delete m_pXMLNode; 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node* CXFA_Node::Clone(bool bRecursive) { 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pClone = m_pDocument->CreateNode(m_ePacket, m_elementType); 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pClone) 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann JSObject()->MergeAllData(pClone); 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pClone->UpdateNameHash(); 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (IsNeedSavingXMLNode()) { 240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::unique_ptr<CFX_XMLNode> pCloneXML; 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (IsAttributeInXML()) { 242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsName = JSObject() 243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ->TryAttribute(XFA_Attribute::Name, false) 244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann .value_or(WideString()); 245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto pCloneXMLElement = pdfium::MakeUnique<CFX_XMLElement>(wsName); 246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsValue = JSObject()->GetCData(XFA_Attribute::Value); 247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!wsValue.IsEmpty()) 248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pCloneXMLElement->SetTextData(WideString(wsValue)); 249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pCloneXML.reset(pCloneXMLElement.release()); 251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pClone->JSObject()->SetEnum(XFA_Attribute::Contains, 252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_AttributeEnum::Unknown, false); 2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pCloneXML = m_pXMLNode->Clone(); 2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pClone->SetXMLMappingNode(pCloneXML.release()); 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pClone->SetFlag(XFA_NodeFlag_OwnXMLNode, false); 2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bRecursive) { 260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pChild = GetFirstChild(); pChild; 261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pChild = pChild->GetNextSibling()) { 262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pClone->InsertChild(pChild->Clone(bRecursive), nullptr); 2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pClone->SetFlag(XFA_NodeFlag_Initialized, true); 266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pClone->SetBindingNode(nullptr); 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pClone; 2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetPrevSibling() const { 271d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!m_pParent || m_pParent->m_pChild == this) 272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 273d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = m_pParent->m_pChild; pNode; pNode = pNode->m_pNext) { 275d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNode->m_pNext == this) 276d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pNode; 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetNextContainerSibling() const { 282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pNode = m_pNext; 283d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann while (pNode && pNode->GetObjectType() != XFA_ObjectType::ContainerNode) 284d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = pNode->m_pNext; 285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pNode; 286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetPrevContainerSibling() const { 289d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!m_pParent || m_pParent->m_pChild == this) 290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* container = nullptr; 293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = m_pParent->m_pChild; pNode; pNode = pNode->m_pNext) { 294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNode->GetObjectType() == XFA_ObjectType::ContainerNode) 295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann container = pNode; 296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNode->m_pNext == this) 297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return container; 298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetFirstContainerChild() const { 303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pNode = m_pChild; 304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann while (pNode && pNode->GetObjectType() != XFA_ObjectType::ContainerNode) 305d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = pNode->m_pNext; 306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pNode; 307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 309d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetContainerParent() const { 310d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pNode = m_pParent; 311d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann while (pNode && pNode->GetObjectType() != XFA_ObjectType::ContainerNode) 312d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = pNode->m_pParent; 313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pNode; 314d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 315d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 316d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::IsValidInPacket(XFA_PacketType packet) const { 317d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return !!(m_ValidPackets & (1 << static_cast<uint8_t>(packet))); 318d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 319d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 320d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst CXFA_Node::PropertyData* CXFA_Node::GetPropertyData( 321d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Element property) const { 322d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (m_Properties == nullptr) 323d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 324d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 325d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (size_t i = 0;; ++i) { 326d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const PropertyData* data = m_Properties + i; 327d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (data->property == XFA_Element::Unknown) 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 329d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (data->property == property) 330d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return data; 331d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 332d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 333d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 334d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 335d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::HasProperty(XFA_Element property) const { 336d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return !!GetPropertyData(property); 337d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 338d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 339d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::HasPropertyFlags(XFA_Element property, uint8_t flags) const { 340d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const PropertyData* data = GetPropertyData(property); 341d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return data && !!(data->flags & flags); 342d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 343d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 344d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannuint8_t CXFA_Node::PropertyOccuranceCount(XFA_Element property) const { 345d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const PropertyData* data = GetPropertyData(property); 346d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return data ? data->occurance_count : 0; 347d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 348d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 349d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<XFA_Element> CXFA_Node::GetFirstPropertyWithFlag(uint8_t flag) { 350d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (m_Properties == nullptr) 351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 352d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 353d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (size_t i = 0;; ++i) { 354d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const PropertyData* data = m_Properties + i; 355d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (data->property == XFA_Element::Unknown) 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 357d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (data->flags & flag) 358d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {data->property}; 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 360d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 363d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst CXFA_Node::AttributeData* CXFA_Node::GetAttributeData( 364d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute attr) const { 365d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (m_Attributes == nullptr) 366d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 367d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 368d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (size_t i = 0;; ++i) { 369d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const AttributeData* cur_attr = &m_Attributes[i]; 370d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (cur_attr->attribute == XFA_Attribute::Unknown) 371d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 372d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (cur_attr->attribute == attr) 373d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return cur_attr; 3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 375d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 376d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 378d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::HasAttribute(XFA_Attribute attr) const { 379d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return !!GetAttributeData(attr); 380d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 381d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 382d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Note: This Method assumes that i is a valid index .... 383d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannXFA_Attribute CXFA_Node::GetAttribute(size_t i) const { 384d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (m_Attributes == nullptr) 385d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_Attribute::Unknown; 386d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return m_Attributes[i].attribute; 387d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 388d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 389d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannXFA_AttributeType CXFA_Node::GetAttributeType(XFA_Attribute type) const { 390d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const AttributeData* data = GetAttributeData(type); 391d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return data ? data->type : XFA_AttributeType::CData; 392d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 393d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 394d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::vector<CXFA_Node*> CXFA_Node::GetNodeList(uint32_t dwTypeFilter, 395d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Element eTypeFilter) { 3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eTypeFilter != XFA_Element::Unknown) { 397d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<CXFA_Node*> nodes; 398d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pChild = m_pChild; pChild; pChild = pChild->m_pNext) { 399d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pChild->GetElementType() == eTypeFilter) 400d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nodes.push_back(pChild); 401d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 402d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nodes; 403d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 404d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 405d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (dwTypeFilter == (XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties)) { 406d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<CXFA_Node*> nodes; 407d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pChild = m_pChild; pChild; pChild = pChild->m_pNext) 408d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nodes.push_back(pChild); 409d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nodes; 410d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 411d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 412d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (dwTypeFilter == 0) 413d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return std::vector<CXFA_Node*>(); 414d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 415d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bFilterChildren = !!(dwTypeFilter & XFA_NODEFILTER_Children); 416d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bFilterProperties = !!(dwTypeFilter & XFA_NODEFILTER_Properties); 417d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bFilterOneOfProperties = !!(dwTypeFilter & XFA_NODEFILTER_OneOfProperty); 418d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<CXFA_Node*> nodes; 419d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pChild = m_pChild; pChild; pChild = pChild->m_pNext) { 420d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!HasProperty(pChild->GetElementType())) { 421d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bFilterProperties) { 422d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nodes.push_back(pChild); 423d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (bFilterOneOfProperties && 424d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann HasPropertyFlags(pChild->GetElementType(), 425d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_PROPERTYFLAG_OneOf)) { 426d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nodes.push_back(pChild); 427d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (bFilterChildren && 428d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (pChild->GetElementType() == XFA_Element::Variables || 429d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pChild->GetElementType() == XFA_Element::PageSet)) { 430d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nodes.push_back(pChild); 431d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 432d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (bFilterChildren) { 433d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nodes.push_back(pChild); 434d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 435d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 436d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 437d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!bFilterOneOfProperties || !nodes.empty()) 438d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nodes; 439d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (m_Properties == nullptr) 440d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nodes; 441d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 442d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<XFA_Element> property = 443d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetFirstPropertyWithFlag(XFA_PROPERTYFLAG_DefaultOneOf); 444d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!property) 445d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nodes; 446d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 447d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pNewNode = m_pDocument->CreateNode(GetPacketType(), *property); 448d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNewNode) { 449d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann InsertChild(pNewNode, nullptr); 450d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNewNode->SetFlag(XFA_NodeFlag_Initialized, true); 451d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nodes.push_back(pNewNode); 4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 453d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nodes; 4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 456d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::CreateSamePacketNode(XFA_Element eType) { 4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pNode = m_pDocument->CreateNode(m_ePacket, eType); 458d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->SetFlag(XFA_NodeFlag_Initialized, true); 4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pNode; 4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node* CXFA_Node::CloneTemplateToForm(bool bRecursive) { 463d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(m_ePacket == XFA_PacketType::Template); 4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pClone = 465d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pDocument->CreateNode(XFA_PacketType::Form, m_elementType); 4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pClone) 4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pClone->SetTemplateNode(this); 4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pClone->UpdateNameHash(); 4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pClone->SetXMLMappingNode(GetXMLMappingNode()); 4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bRecursive) { 473d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pChild = GetFirstChild(); pChild; 474d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pChild = pChild->GetNextSibling()) { 475d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pClone->InsertChild(pChild->CloneTemplateToForm(bRecursive), nullptr); 4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pClone->SetFlag(XFA_NodeFlag_Initialized, true); 4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pClone; 4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 482d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetTemplateNodeIfExists() const { 4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_pAuxNode; 4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_Node::SetTemplateNode(CXFA_Node* pTemplateNode) { 4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pAuxNode = pTemplateNode; 4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node* CXFA_Node::GetBindData() { 491d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(GetPacketType() == XFA_PacketType::Form); 492d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return GetBindingNode(); 4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 495d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::vector<UnownedPtr<CXFA_Node>>* CXFA_Node::GetBindItems() { 496d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return GetBindingNodes(); 4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_Node::AddBindItem(CXFA_Node* pFormNode) { 5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pFormNode); 501d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (BindsFormItems()) { 503d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool found = false; 504d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (auto& v : binding_nodes_) { 505d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (v.Get() == pFormNode) { 506d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann found = true; 507d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 508d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 510d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!found) 511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann binding_nodes_.emplace_back(pFormNode); 512d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pdfium::CollectionSize<int32_t>(binding_nodes_); 5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 514d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 515d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pOldFormItem = GetBindingNode(); 5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pOldFormItem) { 517d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann SetBindingNode(pFormNode); 5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 1; 5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 520d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pOldFormItem == pFormNode) 521d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return 1; 522d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 523d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<UnownedPtr<CXFA_Node>> items; 524d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann items.emplace_back(pOldFormItem); 525d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann items.emplace_back(pFormNode); 526d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann SetBindingNodes(std::move(items)); 527d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_uNodeFlags |= XFA_NodeFlag_BindFormItems; 5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 2; 5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_Node::RemoveBindItem(CXFA_Node* pFormNode) { 5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (BindsFormItems()) { 534d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto it = std::find_if(binding_nodes_.begin(), binding_nodes_.end(), 535d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann [&pFormNode](const UnownedPtr<CXFA_Node>& node) { 536d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return node.Get() == pFormNode; 537d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann }); 538d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (it != binding_nodes_.end()) 539d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann binding_nodes_.erase(it); 540d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 541d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (binding_nodes_.size() == 1) { 542d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_uNodeFlags &= ~XFA_NodeFlag_BindFormItems; 543d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return 1; 5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 545d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pdfium::CollectionSize<int32_t>(binding_nodes_); 5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 548d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pOldFormItem = GetBindingNode(); 549d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pOldFormItem != pFormNode) 550d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pOldFormItem ? 1 : 0; 551d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 552d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann SetBindingNode(nullptr); 553d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return 0; 5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 556d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::HasBindItem() { 557d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return GetPacketType() == XFA_PacketType::Datasets && GetBindingNode(); 5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 560d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_WidgetAcc* CXFA_Node::GetContainerWidgetAcc() { 561d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (GetPacketType() != XFA_PacketType::Form) 5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_Element eType = GetElementType(); 5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eType == XFA_Element::ExclGroup) 5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 566d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pParentNode = GetParent(); 5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pParentNode && pParentNode->GetElementType() == XFA_Element::ExclGroup) 5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eType == XFA_Element::Field) { 571d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_WidgetAcc* pFieldWidgetAcc = GetWidgetAcc(); 572d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pFieldWidgetAcc && pFieldWidgetAcc->IsChoiceListMultiSelect()) 5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 574d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 575d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsPicture; 576d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pFieldWidgetAcc) { 577d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsPicture = pFieldWidgetAcc->GetPictureContent(XFA_VALUEPICTURE_DataBind); 578d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 579d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!wsPicture.IsEmpty()) 580d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pFieldWidgetAcc; 581d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 582d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pDataNode = GetBindData(); 583d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pDataNode) 584d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 585d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pFieldWidgetAcc = nullptr; 586d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (const auto& pFormNode : *(pDataNode->GetBindItems())) { 587d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pFormNode || pFormNode->HasRemovedChildren()) 588d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 589d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pFieldWidgetAcc = pFormNode->GetWidgetAcc(); 590d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pFieldWidgetAcc) { 591d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsPicture = 592d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pFieldWidgetAcc->GetPictureContent(XFA_VALUEPICTURE_DataBind); 5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!wsPicture.IsEmpty()) 595d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 596d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pFieldWidgetAcc = nullptr; 5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 598d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pFieldWidgetAcc; 5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 600d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 601d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pGrandNode = pParentNode ? pParentNode->GetParent() : nullptr; 6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pValueNode = 6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (pParentNode && pParentNode->GetElementType() == XFA_Element::Value) 6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ? pParentNode 6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : nullptr; 6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pValueNode) { 6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pValueNode = 6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (pGrandNode && pGrandNode->GetElementType() == XFA_Element::Value) 6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ? pGrandNode 6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : nullptr; 6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pParentOfValueNode = 613d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pValueNode ? pValueNode->GetParent() : nullptr; 614d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pParentOfValueNode ? pParentOfValueNode->GetContainerWidgetAcc() 6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : nullptr; 6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 618d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannIFX_Locale* CXFA_Node::GetLocale() { 619d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<WideString> localeName = GetLocaleName(); 620d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!localeName) 621d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 622d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (localeName.value() == L"ambient") 623d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return GetDocument()->GetLocalMgr()->GetDefLocale(); 624d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return GetDocument()->GetLocalMgr()->GetLocaleByName(localeName.value()); 625d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 626d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 627d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<WideString> CXFA_Node::GetLocaleName() { 6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pForm = GetDocument()->GetXFAObject(XFA_HASHCODE_Form)->AsNode(); 629d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Subform* pTopSubform = 630d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pForm->GetFirstChildByClass<CXFA_Subform>(XFA_Element::Subform); 6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pTopSubform); 632d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pLocaleNode = this; 6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann do { 635d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<WideString> localeName = 636d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pLocaleNode->JSObject()->TryCData(XFA_Attribute::Locale, false); 637d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (localeName) 638d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return localeName; 639d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 640d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pLocaleNode = pLocaleNode->GetParent(); 641d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } while (pLocaleNode && pLocaleNode != pTopSubform); 642d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pConfig = ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Config)); 644d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<WideString> localeName = { 645d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString(GetDocument()->GetLocalMgr()->GetConfigLocaleName(pConfig))}; 646d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (localeName && !localeName->IsEmpty()) 647d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return localeName; 648d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 649d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pTopSubform) { 650d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localeName = 651d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pTopSubform->JSObject()->TryCData(XFA_Attribute::Locale, false); 652d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (localeName) 653d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return localeName; 6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 655d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann IFX_Locale* pLocale = GetDocument()->GetLocalMgr()->GetDefLocale(); 657d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pLocale) 658d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 659d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 660d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {pLocale->GetName()}; 6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 663d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannXFA_AttributeEnum CXFA_Node::GetIntact() { 664d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Keep* pKeep = GetFirstChildByClass<CXFA_Keep>(XFA_Element::Keep); 665d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_AttributeEnum eLayoutType = JSObject() 666d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ->TryEnum(XFA_Attribute::Layout, true) 667d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann .value_or(XFA_AttributeEnum::Position); 6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pKeep) { 669d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<XFA_AttributeEnum> intact = 670d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pKeep->JSObject()->TryEnum(XFA_Attribute::Intact, false); 671d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (intact) { 672d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (*intact == XFA_AttributeEnum::None && 673d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann eLayoutType == XFA_AttributeEnum::Row && 6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDocument->GetCurVersionMode() < XFA_VERSION_208) { 675d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pPreviewRow = GetPrevContainerSibling(); 6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pPreviewRow && 677d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pPreviewRow->JSObject()->GetEnum(XFA_Attribute::Layout) == 678d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_AttributeEnum::Row) { 679d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<XFA_AttributeEnum> value = 680d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pKeep->JSObject()->TryEnum(XFA_Attribute::Previous, false); 681d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (value && (*value == XFA_AttributeEnum::ContentArea || 682d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *value == XFA_AttributeEnum::PageArea)) { 683d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_AttributeEnum::ContentArea; 6844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 685d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 686d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Keep* pNode = 687d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pPreviewRow->GetFirstChildByClass<CXFA_Keep>(XFA_Element::Keep); 688d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<XFA_AttributeEnum> ret; 689d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNode) 690d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ret = pNode->JSObject()->TryEnum(XFA_Attribute::Next, false); 691d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (ret && (*ret == XFA_AttributeEnum::ContentArea || 692d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *ret == XFA_AttributeEnum::PageArea)) { 693d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_AttributeEnum::ContentArea; 6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 697d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return *intact; 6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 700d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 7014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (GetElementType()) { 7024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Subform: 7034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (eLayoutType) { 704d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Position: 705d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Row: 706d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_AttributeEnum::ContentArea; 7074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: 708d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_AttributeEnum::None; 7094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Field: { 711d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* parent = GetParent(); 712d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!parent || parent->GetElementType() == XFA_Element::PageArea) 713d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_AttributeEnum::ContentArea; 714d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (parent->GetIntact() != XFA_AttributeEnum::None) 715d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_AttributeEnum::ContentArea; 716d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 717d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_AttributeEnum eParLayout = parent->JSObject() 718d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ->TryEnum(XFA_Attribute::Layout, true) 719d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann .value_or(XFA_AttributeEnum::Position); 720d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (eParLayout == XFA_AttributeEnum::Position || 721d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann eParLayout == XFA_AttributeEnum::Row || 722d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann eParLayout == XFA_AttributeEnum::Table) { 723d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_AttributeEnum::None; 724d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 725d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 726d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_VERSION version = m_pDocument->GetCurVersionMode(); 727d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (eParLayout == XFA_AttributeEnum::Tb && version < XFA_VERSION_208) { 728d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<CXFA_Measurement> measureH = 729d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann JSObject()->TryMeasure(XFA_Attribute::H, false); 730d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (measureH) 731d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_AttributeEnum::ContentArea; 732d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 733d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_AttributeEnum::None; 7344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Draw: 736d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_AttributeEnum::ContentArea; 7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: 738d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_AttributeEnum::None; 7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node* CXFA_Node::GetDataDescriptionNode() { 743d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (m_ePacket == XFA_PacketType::Datasets) 7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_pAuxNode; 7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 7464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 7474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_Node::SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode) { 749d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(m_ePacket == XFA_PacketType::Datasets); 7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pAuxNode = pDataDescriptionNode; 7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 7524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 753d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetModelNode() { 754d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann switch (GetPacketType()) { 755d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_PacketType::Xdp: 756d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return m_pDocument->GetRoot(); 757d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_PacketType::Config: 758d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Config)); 759d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_PacketType::Template: 760d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Template)); 761d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_PacketType::Form: 762d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form)); 763d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_PacketType::Datasets: 764d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Datasets)); 765d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_PacketType::LocaleSet: 766d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_LocaleSet)); 767d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_PacketType::ConnectionSet: 768d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_ConnectionSet)); 769d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_PacketType::SourceSet: 770d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_SourceSet)); 771d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_PacketType::Xdc: 772d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Xdc)); 773d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann default: 774d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return this; 7754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 778d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannsize_t CXFA_Node::CountChildren(XFA_Element eType, bool bOnlyChild) { 779d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t count = 0; 780d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = m_pChild; pNode; pNode = pNode->GetNextSibling()) { 781d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNode->GetElementType() != eType && eType != XFA_Element::Unknown) 782d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 783d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bOnlyChild && HasProperty(pNode->GetElementType())) 784d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 785d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ++count; 7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 787d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return count; 7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 7894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 790d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetChildInternal(size_t index, 791d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Element eType, 792d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bOnlyChild) { 793d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t count = 0; 794d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = m_pChild; pNode; pNode = pNode->GetNextSibling()) { 795d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNode->GetElementType() != eType && eType != XFA_Element::Unknown) 796d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 797d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bOnlyChild && HasProperty(pNode->GetElementType())) 798d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 799d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (count == index) 800d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pNode; 8014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 802d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ++count; 8034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 804d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 8064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 807d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::InsertChild(int32_t index, CXFA_Node* pNode) { 808d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(!pNode->m_pNext); 809d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->m_pParent = this; 810d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool ret = m_pDocument->RemovePurgeNode(pNode); 811d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(ret); 812d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (void)ret; // Avoid unused variable warning. 8134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 814d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!m_pChild || index == 0) { 815d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (index > 0) { 816d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return -1; 817d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 818d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->m_pNext = m_pChild; 819d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pChild = pNode; 820d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann index = 0; 821d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (index < 0) { 822d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLastChild->m_pNext = pNode; 8234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 824d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pPrev = m_pChild; 825d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iCount = 0; 826d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann while (++iCount != index && pPrev->m_pNext) { 827d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pPrev = pPrev->m_pNext; 828d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 829d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (index > 0 && index != iCount) { 830d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return -1; 831d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 832d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->m_pNext = pPrev->m_pNext; 833d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pPrev->m_pNext = pNode; 834d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann index = iCount; 8354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 836d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pNode->m_pNext) { 837d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLastChild = pNode; 8384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 839d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(m_pLastChild); 840d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(!m_pLastChild->m_pNext); 841d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->ClearFlag(XFA_NodeFlag_HasRemovedChildren); 842d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FFNotify* pNotify = m_pDocument->GetNotify(); 843d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNotify) 844d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNotify->OnChildAdded(this); 8454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 846d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) { 847d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(!pNode->m_pXMLNode->GetNodeItem(CFX_XMLNode::Parent)); 848d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, index); 849d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->ClearFlag(XFA_NodeFlag_OwnXMLNode); 8504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 851d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return index; 8524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 8534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 854d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::InsertChild(CXFA_Node* pNode, CXFA_Node* pBeforeNode) { 855d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pNode || pNode->m_pParent || 856d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (pBeforeNode && pBeforeNode->m_pParent != this)) { 857d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann NOTREACHED(); 858d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return false; 8594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 860d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool ret = m_pDocument->RemovePurgeNode(pNode); 861d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(ret); 862d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (void)ret; // Avoid unused variable warning. 8634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 864d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t nIndex = -1; 865d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->m_pParent = this; 866d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!m_pChild || pBeforeNode == m_pChild) { 867d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->m_pNext = m_pChild; 868d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pChild = pNode; 869d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nIndex = 0; 870d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (!pBeforeNode) { 871d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->m_pNext = m_pLastChild->m_pNext; 872d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLastChild->m_pNext = pNode; 873d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else { 874d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nIndex = 1; 875d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pPrev = m_pChild; 876d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann while (pPrev->m_pNext != pBeforeNode) { 877d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pPrev = pPrev->m_pNext; 878d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nIndex++; 879d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 880d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->m_pNext = pPrev->m_pNext; 881d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pPrev->m_pNext = pNode; 8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 883d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pNode->m_pNext) { 884d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLastChild = pNode; 8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 886d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(m_pLastChild); 887d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(!m_pLastChild->m_pNext); 888d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->ClearFlag(XFA_NodeFlag_HasRemovedChildren); 889d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FFNotify* pNotify = m_pDocument->GetNotify(); 890d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNotify) 891d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNotify->OnChildAdded(this); 892d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 893d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) { 894d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(!pNode->m_pXMLNode->GetNodeItem(CFX_XMLNode::Parent)); 895d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, nIndex); 896d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->ClearFlag(XFA_NodeFlag_OwnXMLNode); 8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 898d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return true; 8994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 901d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::Deprecated_GetPrevSibling() { 902d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!m_pParent) { 903d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 9044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 905d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pSibling = m_pParent->m_pChild; pSibling; 906d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pSibling = pSibling->m_pNext) { 907d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pSibling->m_pNext == this) { 908d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pSibling; 9094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 911d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 9124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 914d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::RemoveChild(CXFA_Node* pNode, bool bNotify) { 915d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pNode || pNode->m_pParent != this) { 916d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann NOTREACHED(); 917d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return false; 9184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 919d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (m_pChild == pNode) { 920d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pChild = pNode->m_pNext; 921d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (m_pLastChild == pNode) { 922d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLastChild = pNode->m_pNext; 9234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 924d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->m_pNext = nullptr; 925d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->m_pParent = nullptr; 9264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 927d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pPrev = pNode->Deprecated_GetPrevSibling(); 928d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pPrev->m_pNext = pNode->m_pNext; 929d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (m_pLastChild == pNode) { 930d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pLastChild = pNode->m_pNext ? pNode->m_pNext : pPrev; 9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 932d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->m_pNext = nullptr; 933d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->m_pParent = nullptr; 9344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 935d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(!m_pLastChild || !m_pLastChild->m_pNext); 936d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann OnRemoved(bNotify); 937d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->SetFlag(XFA_NodeFlag_HasRemovedChildren, true); 938d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pDocument->AddPurgeNode(pNode); 939d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) { 940d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNode->IsAttributeInXML()) { 941d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(pNode->m_pXMLNode == m_pXMLNode && 942d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pXMLNode->GetType() == FX_XMLNODE_Element); 943d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNode->m_pXMLNode->GetType() == FX_XMLNODE_Element) { 944d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLElement* pXMLElement = 945d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static_cast<CFX_XMLElement*>(pNode->m_pXMLNode); 946d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsAttributeName = 947d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->JSObject()->GetCData(XFA_Attribute::QualifiedName); 948d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pXMLElement->RemoveAttribute(wsAttributeName.c_str()); 9494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 950d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 951d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsName = pNode->JSObject() 952d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ->TryAttribute(XFA_Attribute::Name, false) 953d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann .value_or(WideString()); 954d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_XMLElement* pNewXMLElement = new CFX_XMLElement(wsName); 955d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsValue = JSObject()->GetCData(XFA_Attribute::Value); 956d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!wsValue.IsEmpty()) 957d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNewXMLElement->SetTextData(WideString(wsValue)); 958d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 959d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->m_pXMLNode = pNewXMLElement; 960d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->JSObject()->SetEnum(XFA_Attribute::Contains, 961d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_AttributeEnum::Unknown, false); 9624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 963d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pXMLNode->RemoveChildNode(pNode->m_pXMLNode); 9644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 965d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->SetFlag(XFA_NodeFlag_OwnXMLNode, false); 9664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 967d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return true; 9684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 970d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetFirstChildByName(const WideStringView& wsName) const { 971d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return GetFirstChildByName(FX_HashCode_GetW(wsName, false)); 9724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 974d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetFirstChildByName(uint32_t dwNameHash) const { 975d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = GetFirstChild(); pNode; 976d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = pNode->GetNextSibling()) { 977d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNode->GetNameHash() == dwNameHash) { 978d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pNode; 9794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 981d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 982d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 9834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 984d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetFirstChildByClassInternal(XFA_Element eType) const { 985d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = GetFirstChild(); pNode; 986d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = pNode->GetNextSibling()) { 987d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNode->GetElementType() == eType) { 988d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pNode; 9894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 991d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 9924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 994d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetNextSameNameSibling(uint32_t dwNameHash) const { 995d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = GetNextSibling(); pNode; 996d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = pNode->GetNextSibling()) { 997d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNode->GetNameHash() == dwNameHash) { 998d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pNode; 999d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 10004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1001d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 10024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 10034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1004d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetNextSameNameSiblingInternal( 1005d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideStringView& wsNodeName) const { 1006d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return GetNextSameNameSibling(FX_HashCode_GetW(wsNodeName, false)); 10074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 10084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1009d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetNextSameClassSiblingInternal(XFA_Element eType) const { 1010d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = GetNextSibling(); pNode; 1011d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = pNode->GetNextSibling()) { 1012d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNode->GetElementType() == eType) { 1013d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pNode; 1014d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 10154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1016d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 10174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 10184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1019d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::GetNodeSameNameIndex() const { 1020d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Engine* pScriptContext = m_pDocument->GetScriptContext(); 1021d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pScriptContext) { 1022d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return -1; 10234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1024d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pScriptContext->GetIndexByName(const_cast<CXFA_Node*>(this)); 10254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 10264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1027d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::GetNodeSameClassIndex() const { 1028d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Engine* pScriptContext = m_pDocument->GetScriptContext(); 1029d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pScriptContext) { 1030d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return -1; 10314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1032d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pScriptContext->GetIndexByClassName(const_cast<CXFA_Node*>(this)); 10334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 10344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1035d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetInstanceMgrOfSubform() { 1036d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pInstanceMgr = nullptr; 1037d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (m_ePacket == XFA_PacketType::Form) { 1038d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pParentNode = GetParent(); 1039d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pParentNode || pParentNode->GetElementType() == XFA_Element::Area) { 1040d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pInstanceMgr; 1041d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1042d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = GetPrevSibling(); pNode; 1043d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = pNode->GetPrevSibling()) { 1044d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Element eType = pNode->GetElementType(); 1045d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if ((eType == XFA_Element::Subform || eType == XFA_Element::SubformSet) && 1046d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->m_dwNameHash != m_dwNameHash) { 1047d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1048d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1049d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (eType == XFA_Element::InstanceManager) { 1050d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsName = JSObject()->GetCData(XFA_Attribute::Name); 1051d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsInstName = 1052d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->JSObject()->GetCData(XFA_Attribute::Name); 1053d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsInstName.GetLength() > 0 && wsInstName[0] == '_' && 1054d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsInstName.Right(wsInstName.GetLength() - 1) == wsName) { 1055d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pInstanceMgr = pNode; 1056d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1057d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1058d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1059d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 10604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1061d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pInstanceMgr; 1062d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 10634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1064d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Occur* CXFA_Node::GetOccurIfExists() { 1065d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return GetFirstChildByClass<CXFA_Occur>(XFA_Element::Occur); 1066d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1067d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1068d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::HasFlag(XFA_NodeFlag dwFlag) const { 1069d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (m_uNodeFlags & dwFlag) 1070d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return true; 1071d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (dwFlag == XFA_NodeFlag_HasRemovedChildren) 1072d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return m_pParent && m_pParent->HasFlag(dwFlag); 1073d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return false; 10744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 10754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1076d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::SetFlag(uint32_t dwFlag, bool bNotify) { 1077d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (dwFlag == XFA_NodeFlag_Initialized && bNotify && !IsInitialized()) { 1078d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FFNotify* pNotify = m_pDocument->GetNotify(); 1079d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNotify) { 1080d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNotify->OnNodeReady(this); 1081d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1082d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1083d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_uNodeFlags |= dwFlag; 1084d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 10854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1086d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::ClearFlag(uint32_t dwFlag) { 1087d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_uNodeFlags &= ~dwFlag; 10884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1089d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1090d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::ReleaseBindingNodes() { 1091d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // Clear any binding nodes as we don't necessarily destruct in an order that 1092d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // makes sense. 1093d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (auto& node : binding_nodes_) 1094d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann node.Release(); 1095d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1096d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = m_pChild; pNode; pNode = pNode->m_pNext) 1097d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->ReleaseBindingNodes(); 10984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 10994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::IsAttributeInXML() { 1101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetEnum(XFA_Attribute::Contains) == 1102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_AttributeEnum::MetaData; 11034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::OnRemoved(bool bNotify) { 1106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!bNotify) 11074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FFNotify* pNotify = m_pDocument->GetNotify(); 1110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pNotify) 1111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNotify->OnChildRemoved(); 1112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::UpdateNameHash() { 1115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsName = JSObject()->GetCData(XFA_Attribute::Name); 1116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_dwNameHash = FX_HashCode_GetW(wsName.AsStringView(), false); 1117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_XMLNode* CXFA_Node::CreateXMLMappingNode() { 1120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!m_pXMLNode) { 1121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsTag(JSObject()->GetCData(XFA_Attribute::Name)); 1122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pXMLNode = new CFX_XMLElement(wsTag); 1123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann SetFlag(XFA_NodeFlag_OwnXMLNode, false); 11244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return m_pXMLNode; 1126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::IsNeedSavingXMLNode() { 1129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return m_pXMLNode && (GetPacketType() == XFA_PacketType::Datasets || 1130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetElementType() == XFA_Element::Xfa); 1131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetItemIfExists(int32_t iIndex) { 1134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iCount = 0; 1135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t dwNameHash = 0; 1136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = GetNextSibling(); pNode; 1137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = pNode->GetNextSibling()) { 1138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Element eCurType = pNode->GetElementType(); 1139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (eCurType == XFA_Element::InstanceManager) 1140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if ((eCurType != XFA_Element::Subform) && 1142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (eCurType != XFA_Element::SubformSet)) { 1143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 1144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iCount == 0) { 1146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsName = pNode->JSObject()->GetCData(XFA_Attribute::Name); 1147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsInstName = JSObject()->GetCData(XFA_Attribute::Name); 1148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsInstName.GetLength() < 1 || wsInstName[0] != '_' || 1149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsInstName.Right(wsInstName.GetLength() - 1) != wsName) { 1150d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 1151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann dwNameHash = pNode->GetNameHash(); 1153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (dwNameHash != pNode->GetNameHash()) 1155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iCount++; 1158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iCount > iIndex) 1159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pNode; 11604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 11624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::GetCount() { 1165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iCount = 0; 1166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t dwNameHash = 0; 1167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = GetNextSibling(); pNode; 1168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = pNode->GetNextSibling()) { 1169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Element eCurType = pNode->GetElementType(); 1170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (eCurType == XFA_Element::InstanceManager) 1171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if ((eCurType != XFA_Element::Subform) && 1173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (eCurType != XFA_Element::SubformSet)) { 1174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 1175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iCount == 0) { 1177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsName = pNode->JSObject()->GetCData(XFA_Attribute::Name); 1178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsInstName = JSObject()->GetCData(XFA_Attribute::Name); 1179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsInstName.GetLength() < 1 || wsInstName[0] != '_' || 1180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsInstName.Right(wsInstName.GetLength() - 1) != wsName) { 1181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return iCount; 1182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann dwNameHash = pNode->GetNameHash(); 1184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (dwNameHash != pNode->GetNameHash()) 1186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1188d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iCount++; 11894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return iCount; 11914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::InsertItem(CXFA_Node* pNewInstance, 1194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iPos, 1195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iCount, 1196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bMoveDataBindingNodes) { 1197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iCount < 0) 1198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iCount = GetCount(); 1199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iPos < 0) 1200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iPos = iCount; 1201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iPos == iCount) { 1202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* item = GetItemIfExists(iCount - 1); 1203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!item) 1204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return; 1205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pNextSibling = 1207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iCount > 0 ? item->GetNextSibling() : GetNextSibling(); 1208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetParent()->InsertChild(pNewInstance, pNextSibling); 1209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bMoveDataBindingNodes) { 1210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::set<CXFA_Node*> sNew; 1211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::set<CXFA_Node*> sAfter; 1212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_NodeIteratorTemplate<CXFA_Node, 1213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_TraverseStrategy_XFAContainerNode> 1214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann sIteratorNew(pNewInstance); 1215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode; 1216d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = sIteratorNew.MoveToNext()) { 1217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pDataNode = pNode->GetBindData(); 1218d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pDataNode) 1219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 1220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann sNew.insert(pDataNode); 1222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_NodeIteratorTemplate<CXFA_Node, 1224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_TraverseStrategy_XFAContainerNode> 1225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann sIteratorAfter(pNextSibling); 1226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = sIteratorAfter.GetCurrent(); pNode; 1227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = sIteratorAfter.MoveToNext()) { 1228d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pDataNode = pNode->GetBindData(); 1229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pDataNode) 1230d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 1231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann sAfter.insert(pDataNode); 1233d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ReorderDataNodes(sNew, sAfter, false); 1235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 12364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pBeforeInstance = GetItemIfExists(iPos); 1238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pBeforeInstance) { 1239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // TODO(dsinclair): What should happen here? 1240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return; 1241d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetParent()->InsertChild(pNewInstance, pBeforeInstance); 1244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bMoveDataBindingNodes) { 1245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::set<CXFA_Node*> sNew; 1246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::set<CXFA_Node*> sBefore; 1247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_NodeIteratorTemplate<CXFA_Node, 1248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_TraverseStrategy_XFAContainerNode> 1249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann sIteratorNew(pNewInstance); 1250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode; 1251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = sIteratorNew.MoveToNext()) { 1252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pDataNode = pNode->GetBindData(); 1253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pDataNode) 1254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 1255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann sNew.insert(pDataNode); 1257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_NodeIteratorTemplate<CXFA_Node, 1259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_TraverseStrategy_XFAContainerNode> 1260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann sIteratorBefore(pBeforeInstance); 1261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pNode = sIteratorBefore.GetCurrent(); pNode; 1262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = sIteratorBefore.MoveToNext()) { 1263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pDataNode = pNode->GetBindData(); 1264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pDataNode) 1265d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 1266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1267d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann sBefore.insert(pDataNode); 1268d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1269d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ReorderDataNodes(sNew, sBefore, true); 1270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 12714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 12734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::RemoveItem(CXFA_Node* pRemoveInstance, 1275d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bRemoveDataBinding) { 1276d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetParent()->RemoveChild(pRemoveInstance, true); 1277d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!bRemoveDataBinding) 12784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1280d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode> 1281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann sIterator(pRemoveInstance); 1282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pFormNode = sIterator.GetCurrent(); pFormNode; 1283d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pFormNode = sIterator.MoveToNext()) { 1284d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pDataNode = pFormNode->GetBindData(); 1285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pDataNode) 1286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 1287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pDataNode->RemoveBindItem(pFormNode) == 0) { 1289d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (CXFA_Node* pDataParent = pDataNode->GetParent()) { 1290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pDataParent->RemoveChild(pDataNode, true); 1291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pFormNode->SetBindingNode(nullptr); 1294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::CreateInstanceIfPossible(bool bDataMerge) { 1298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Document* pDocument = GetDocument(); 1299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pTemplateNode = GetTemplateNodeIfExists(); 1300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pTemplateNode) 1301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 1302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pFormParent = GetParent(); 1304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pDataScope = nullptr; 1305d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pRootBoundNode = pFormParent; 1306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pRootBoundNode && pRootBoundNode->IsContainerNode(); 1307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pRootBoundNode = pRootBoundNode->GetParent()) { 1308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pDataScope = pRootBoundNode->GetBindData(); 1309d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pDataScope) 1310d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 13114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1312d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pDataScope) { 1313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pDataScope = ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record)); 1314d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(pDataScope); 1315d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1316d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1317d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pInstance = pDocument->DataMerge_CopyContainer( 1318d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pTemplateNode, pFormParent, pDataScope, true, bDataMerge, true); 1319d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pInstance) { 1320d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pDocument->DataMerge_UpdateBindingRelations(pInstance); 1321d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pFormParent->RemoveChild(pInstance, true); 1322d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1323d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pInstance; 1324d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1325d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1326d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<bool> CXFA_Node::GetDefaultBoolean(XFA_Attribute attr) const { 1327d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Boolean); 1328d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!value) 1329d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 1330d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {!!*value}; 1331d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1332d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1333d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<int32_t> CXFA_Node::GetDefaultInteger(XFA_Attribute attr) const { 1334d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Integer); 1335d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!value) 1336d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 1337d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {static_cast<int32_t>(reinterpret_cast<uintptr_t>(*value))}; 1338d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1339d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1340d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<CXFA_Measurement> CXFA_Node::GetDefaultMeasurement( 1341d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute attr) const { 1342d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Measure); 1343d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!value) 1344d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 1345d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1346d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString str = WideString(static_cast<const wchar_t*>(*value)); 1347d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {CXFA_Measurement(str.AsStringView())}; 1348d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1349d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1350d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<WideString> CXFA_Node::GetDefaultCData(XFA_Attribute attr) const { 1351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::CData); 1352d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!value) 1353d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 1354d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1355d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {WideString(static_cast<const wchar_t*>(*value))}; 1356d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1357d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1358d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<XFA_AttributeEnum> CXFA_Node::GetDefaultEnum( 1359d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute attr) const { 1360d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Enum); 1361d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!value) 1362d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 1363d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {static_cast<XFA_AttributeEnum>(reinterpret_cast<uintptr_t>(*value))}; 1364d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1365d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1366d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<void*> CXFA_Node::GetDefaultValue(XFA_Attribute attr, 1367d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_AttributeType eType) const { 1368d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const AttributeData* data = GetAttributeData(attr); 1369d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!data) 1370d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 1371d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (data->type == eType) 1372d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {data->default_value}; 1373d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 13744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 13754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1376d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::SendAttributeChangeMessage(XFA_Attribute eAttribute, 1377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bScriptModify) { 1378d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_LayoutProcessor* pLayoutPro = GetDocument()->GetLayoutProcessor(); 13794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pLayoutPro) 13804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 13814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1382d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); 13834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pNotify) 13844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 13854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1386d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (GetPacketType() != XFA_PacketType::Form) { 13874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNotify->OnValueChanged(this, eAttribute, this, this); 13884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 13894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bNeedFindContainer = false; 13924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (GetElementType()) { 13934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Caption: 13944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bNeedFindContainer = true; 1395d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNotify->OnValueChanged(this, eAttribute, this, GetParent()); 13964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 13974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Font: 13984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Para: { 13994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bNeedFindContainer = true; 1400d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pParentNode = GetParent(); 14014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pParentNode->GetElementType() == XFA_Element::Caption) { 14024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNotify->OnValueChanged(this, eAttribute, pParentNode, 1403d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pParentNode->GetParent()); 14044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNotify->OnValueChanged(this, eAttribute, this, pParentNode); 14064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1407d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1408d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 14094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Margin: { 14104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bNeedFindContainer = true; 1411d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pParentNode = GetParent(); 14124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_Element eParentType = pParentNode->GetElementType(); 14134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pParentNode->IsContainerNode()) { 14144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNotify->OnValueChanged(this, eAttribute, this, pParentNode); 14154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (eParentType == XFA_Element::Caption) { 14164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNotify->OnValueChanged(this, eAttribute, pParentNode, 1417d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pParentNode->GetParent()); 14184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1419d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pNode = pParentNode->GetParent(); 14204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNode && pNode->GetElementType() == XFA_Element::Ui) { 1421d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNotify->OnValueChanged(this, eAttribute, pNode, pNode->GetParent()); 14224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1424d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1425d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 14264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Comb: { 1427d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pEditNode = GetParent(); 14284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_Element eUIType = pEditNode->GetElementType(); 14294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pEditNode && (eUIType == XFA_Element::DateTimeEdit || 14304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eUIType == XFA_Element::NumericEdit || 14314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eUIType == XFA_Element::TextEdit)) { 1432d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pUINode = pEditNode->GetParent(); 14334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pUINode) { 14344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNotify->OnValueChanged(this, eAttribute, pUINode, 1435d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pUINode->GetParent()); 14364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1438d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1439d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 14404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Button: 14414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Barcode: 14424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::ChoiceList: 14434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::DateTimeEdit: 14444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::NumericEdit: 14454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::PasswordEdit: 14464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::TextEdit: { 1447d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pUINode = GetParent(); 14484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pUINode) { 14494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNotify->OnValueChanged(this, eAttribute, pUINode, 1450d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pUINode->GetParent()); 14514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1452d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1453d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 14544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::CheckButton: { 14554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bNeedFindContainer = true; 1456d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pUINode = GetParent(); 14574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pUINode) { 14584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNotify->OnValueChanged(this, eAttribute, pUINode, 1459d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pUINode->GetParent()); 14604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1461d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1462d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 14634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Keep: 14644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Bookend: 14654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Break: 14664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::BreakAfter: 14674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::BreakBefore: 14684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Overflow: 14694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bNeedFindContainer = true; 14704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 14714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Area: 14724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Draw: 14734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::ExclGroup: 14744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Field: 14754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Subform: 14764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::SubformSet: 14774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLayoutPro->AddChangedContainer(this); 14784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNotify->OnValueChanged(this, eAttribute, this, this); 14794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 14804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Sharptext: 14814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::Sharpxml: 14824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_Element::SharpxHTML: { 1483d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pTextNode = GetParent(); 1484d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pTextNode) 14854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1486d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1487d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pValueNode = pTextNode->GetParent(); 1488d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pValueNode) 14894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1490d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 14914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_Element eType = pValueNode->GetElementType(); 14924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eType == XFA_Element::Value) { 14934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bNeedFindContainer = true; 1494d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pNode = pValueNode->GetParent(); 14954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNode && pNode->IsContainerNode()) { 1496d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bScriptModify) 14974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pValueNode = pNode; 1498d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 14994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNotify->OnValueChanged(this, eAttribute, pValueNode, pNode); 15004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1501d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNotify->OnValueChanged(this, eAttribute, pNode, pNode->GetParent()); 15024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 15044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eType == XFA_Element::Items) { 1505d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pNode = pValueNode->GetParent(); 15064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNode && pNode->IsContainerNode()) { 1507d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNotify->OnValueChanged(this, eAttribute, pValueNode, pNode); 1508d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1509d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 15104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 15124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1513d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann default: 1514d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 15154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1516d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1517d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!bNeedFindContainer) 1518d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return; 1519d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1520d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pParent = this; 1521d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann while (pParent && !pParent->IsContainerNode()) 1522d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pParent = pParent->GetParent(); 1523d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1524d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pParent) 1525d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pLayoutPro->AddChangedContainer(pParent); 15264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1528d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::SyncValue(const WideString& wsValue, bool bNotify) { 1529d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsFormatValue = wsValue; 1530d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_WidgetAcc* pContainerWidgetAcc = GetContainerWidgetAcc(); 1531d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pContainerWidgetAcc) 1532d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsFormatValue = pContainerWidgetAcc->GetFormatDataValue(wsValue); 1533d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1534d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann JSObject()->SetContent(wsValue, wsFormatValue, bNotify, false, true); 15354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1537d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CXFA_Node::GetRawValue() { 1538d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetContent(false); 15394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1541d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::GetRotate() { 1542d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<int32_t> degrees = 1543d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann JSObject()->TryInteger(XFA_Attribute::Rotate, false); 1544d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return degrees ? XFA_MapRotation(*degrees) / 90 * 90 : 0; 15454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1547d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Border* CXFA_Node::GetBorderIfExists() const { 1548d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetProperty<CXFA_Border>(0, XFA_Element::Border); 15494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1551d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Border* CXFA_Node::GetOrCreateBorderIfPossible() { 1552d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetOrCreateProperty<CXFA_Border>(0, XFA_Element::Border); 15534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1555d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Caption* CXFA_Node::GetCaptionIfExists() const { 1556d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetProperty<CXFA_Caption>(0, XFA_Element::Caption); 15574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1559d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Font* CXFA_Node::GetOrCreateFontIfPossible() { 1560d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetOrCreateProperty<CXFA_Font>(0, XFA_Element::Font); 15614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1563d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Font* CXFA_Node::GetFontIfExists() const { 1564d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetProperty<CXFA_Font>(0, XFA_Element::Font); 15654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1567d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannfloat CXFA_Node::GetFontSize() const { 1568d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Font* font = GetFontIfExists(); 1569d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fFontSize = font ? font->GetFontSize() : 10.0f; 1570d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return fFontSize < 0.1f ? 10.0f : fFontSize; 15714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1573d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannfloat CXFA_Node::GetLineHeight() const { 1574d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fLineHeight = 0; 1575d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Para* para = GetParaIfExists(); 1576d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (para) 1577d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann fLineHeight = para->GetLineHeight(); 1578d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1579d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (fLineHeight < 1) 1580d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann fLineHeight = GetFontSize() * 1.2f; 1581d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return fLineHeight; 15824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1584d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFX_ARGB CXFA_Node::GetTextColor() const { 1585d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Font* font = GetFontIfExists(); 1586d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return font ? font->GetColor() : 0xFF000000; 15874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1589d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Margin* CXFA_Node::GetMarginIfExists() const { 1590d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetProperty<CXFA_Margin>(0, XFA_Element::Margin); 15914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1593d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Para* CXFA_Node::GetParaIfExists() const { 1594d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetProperty<CXFA_Para>(0, XFA_Element::Para); 1595d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1596d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1597d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::IsOpenAccess() { 1598d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (auto* pNode = this; pNode; pNode = pNode->GetContainerParent()) { 1599d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_AttributeEnum iAcc = pNode->JSObject()->GetEnum(XFA_Attribute::Access); 1600d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iAcc != XFA_AttributeEnum::Open) 1601d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return false; 16024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1603d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return true; 16044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1606d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Value* CXFA_Node::GetDefaultValueIfExists() { 1607d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pTemNode = GetTemplateNodeIfExists(); 1608d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pTemNode ? pTemNode->JSObject()->GetProperty<CXFA_Value>( 1609d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 0, XFA_Element::Value) 1610d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann : nullptr; 16114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1613d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Value* CXFA_Node::GetFormValueIfExists() const { 1614d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetProperty<CXFA_Value>(0, XFA_Element::Value); 16154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1617d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Calculate* CXFA_Node::GetCalculateIfExists() const { 1618d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetProperty<CXFA_Calculate>(0, XFA_Element::Calculate); 1619d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 16204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1621d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Validate* CXFA_Node::GetValidateIfExists() const { 1622d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetProperty<CXFA_Validate>(0, XFA_Element::Validate); 16234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1625d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Validate* CXFA_Node::GetOrCreateValidateIfPossible() { 1626d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetOrCreateProperty<CXFA_Validate>(0, 1627d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Element::Validate); 16284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1630d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Bind* CXFA_Node::GetBindIfExists() const { 1631d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetProperty<CXFA_Bind>(0, XFA_Element::Bind); 16324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1634d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<float> CXFA_Node::TryWidth() { 1635d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->TryMeasureAsFloat(XFA_Attribute::W); 16364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1638d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<float> CXFA_Node::TryHeight() { 1639d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->TryMeasureAsFloat(XFA_Attribute::H); 16404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1642d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<float> CXFA_Node::TryMinWidth() { 1643d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->TryMeasureAsFloat(XFA_Attribute::MinW); 16444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1646d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<float> CXFA_Node::TryMinHeight() { 1647d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->TryMeasureAsFloat(XFA_Attribute::MinH); 16484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1650d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<float> CXFA_Node::TryMaxWidth() { 1651d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->TryMeasureAsFloat(XFA_Attribute::MaxW); 16524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1654d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<float> CXFA_Node::TryMaxHeight() { 1655d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->TryMeasureAsFloat(XFA_Attribute::MaxH); 16564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1658d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetExclGroupIfExists() { 1659d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pExcl = GetParent(); 1660d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pExcl || pExcl->GetElementType() != XFA_Element::ExclGroup) 1661d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 1662d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pExcl; 16634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1665d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ProcessEvent(CXFA_FFDocView* docView, 1666d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_AttributeEnum iActivity, 1667d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_EventParam* pEventParam) { 1668d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (GetElementType() == XFA_Element::Draw) 1669d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 1670d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1671d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<CXFA_Event*> eventArray = GetWidgetAcc()->GetEventByActivity( 1672d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iActivity, pEventParam->m_bIsFormReady); 1673d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool first = true; 1674d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iRet = XFA_EVENTERROR_NotExist; 1675d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Event* event : eventArray) { 1676d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t result = ProcessEvent(docView, event, pEventParam); 1677d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (first || result == XFA_EVENTERROR_Success) 1678d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iRet = result; 1679d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann first = false; 1680d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1681d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return iRet; 1682d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1683d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1684d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ProcessEvent(CXFA_FFDocView* docView, 1685d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Event* event, 1686d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_EventParam* pEventParam) { 1687d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!event) 1688d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 1689d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1690d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann switch (event->GetEventType()) { 1691d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_Element::Execute: 1692d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1693d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_Element::Script: 1694d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ExecuteScript(docView, event->GetScriptIfExists(), pEventParam); 1695d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_Element::SignData: 1696d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 1697d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_Element::Submit: { 1698d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Submit* submit = event->GetSubmitIfExists(); 1699d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!submit) 1700d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 1701d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return docView->GetDoc()->GetDocEnvironment()->Submit(docView->GetDoc(), 1702d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann submit); 17034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1704d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann default: 17054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 17064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1707d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 17084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 17094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1710d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ProcessCalculate(CXFA_FFDocView* docView) { 1711d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (GetElementType() == XFA_Element::Draw) 1712d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 17134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1714d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Calculate* calc = GetCalculateIfExists(); 1715d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!calc) 1716d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 1717d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (IsUserInteractive()) 1718d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_Disabled; 1719d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1720d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_EventParam EventParam; 1721d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EventParam.m_eType = XFA_EVENT_Calculate; 1722d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iRet = ExecuteScript(docView, calc->GetScriptIfExists(), &EventParam); 1723d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iRet != XFA_EVENTERROR_Success) 1724d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return iRet; 1725d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1726d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (GetRawValue() != EventParam.m_wsResult) { 1727d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetWidgetAcc()->SetValue(XFA_VALUEPICTURE_Raw, EventParam.m_wsResult); 1728d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetWidgetAcc()->UpdateUIDisplay(docView, nullptr); 17294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1730d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_Success; 17314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 17324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1733d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::ProcessScriptTestValidate(CXFA_FFDocView* docView, 1734d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Validate* validate, 1735d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iRet, 1736d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bRetValue, 1737d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bVersionFlag) { 1738d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iRet != XFA_EVENTERROR_Success) 1739d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return; 1740d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bRetValue) 17414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 17424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1743d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IXFA_AppProvider* pAppProvider = 1744d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann docView->GetDoc()->GetApp()->GetAppProvider(); 1745d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pAppProvider) 1746d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return; 1747d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1748d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsTitle = pAppProvider->GetAppTitle(); 1749d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsScriptMsg = validate->GetScriptMessageText(); 1750d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (validate->GetScriptTest() == XFA_AttributeEnum::Warning) { 1751d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (IsUserInteractive()) 1752d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return; 1753d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsScriptMsg.IsEmpty()) 1754d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsScriptMsg = GetValidateMessage(false, bVersionFlag); 1755d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1756d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bVersionFlag) { 1757d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Warning, XFA_MB_OK); 1758d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return; 17594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1760d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Warning, 1761d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_MB_YesNo) == XFA_IDYes) { 1762d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann SetFlag(XFA_NodeFlag_UserInteractive, false); 1763d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1764d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return; 17654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 17664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1767d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsScriptMsg.IsEmpty()) 1768d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsScriptMsg = GetValidateMessage(true, bVersionFlag); 1769d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Error, XFA_MB_OK); 17704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 17714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1772d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ProcessFormatTestValidate(CXFA_FFDocView* docView, 1773d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Validate* validate, 1774d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bVersionFlag) { 1775d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsRawValue = GetRawValue(); 1776d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!wsRawValue.IsEmpty()) { 1777d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsPicture = validate->GetPicture(); 1778d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsPicture.IsEmpty()) 1779d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 17804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1781d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_Locale* pLocale = GetLocale(); 1782d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pLocale) 1783d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 1784d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1785d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_LocaleValue lcValue = XFA_GetLocaleValue(this); 1786d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!lcValue.ValidateValue(lcValue.GetValue(), wsPicture, pLocale, 1787d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nullptr)) { 1788d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IXFA_AppProvider* pAppProvider = 1789d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann docView->GetDoc()->GetApp()->GetAppProvider(); 1790d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pAppProvider) 1791d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 1792d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1793d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsFormatMsg = validate->GetFormatMessageText(); 1794d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsTitle = pAppProvider->GetAppTitle(); 1795d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (validate->GetFormatTest() == XFA_AttributeEnum::Error) { 1796d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsFormatMsg.IsEmpty()) 1797d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsFormatMsg = GetValidateMessage(true, bVersionFlag); 1798d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Error, XFA_MB_OK); 1799d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_Success; 1800d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1801d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (IsUserInteractive()) 1802d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 1803d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsFormatMsg.IsEmpty()) 1804d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsFormatMsg = GetValidateMessage(false, bVersionFlag); 1805d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1806d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bVersionFlag) { 1807d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Warning, 1808d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_MB_OK); 1809d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_Success; 1810d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1811d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Warning, 1812d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_MB_YesNo) == XFA_IDYes) { 1813d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann SetFlag(XFA_NodeFlag_UserInteractive, false); 1814d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1815d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_Success; 18164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 18174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1818d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 18194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 18204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1821d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ProcessNullTestValidate(CXFA_FFDocView* docView, 1822d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Validate* validate, 1823d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iFlags, 1824d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bVersionFlag) { 1825d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!GetWidgetAcc()->GetValue(XFA_VALUEPICTURE_Raw).IsEmpty()) 1826d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_Success; 1827d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (GetWidgetAcc()->IsNull() && GetWidgetAcc()->IsPreNull()) 1828d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_Success; 1829d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1830d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_AttributeEnum eNullTest = validate->GetNullTest(); 1831d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsNullMsg = validate->GetNullMessageText(); 1832d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iFlags & 0x01) { 1833d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iRet = XFA_EVENTERROR_Success; 1834d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (eNullTest != XFA_AttributeEnum::Disabled) 1835d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iRet = XFA_EVENTERROR_Error; 18364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1837d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!wsNullMsg.IsEmpty()) { 1838d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (eNullTest != XFA_AttributeEnum::Disabled) { 1839d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann docView->m_arrNullTestMsg.push_back(wsNullMsg); 1840d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_Error; 18414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1842d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_Success; 18434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1844d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return iRet; 18454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1846d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsNullMsg.IsEmpty() && bVersionFlag && 1847d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann eNullTest != XFA_AttributeEnum::Disabled) { 1848d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_Error; 18494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1850d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IXFA_AppProvider* pAppProvider = 1851d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann docView->GetDoc()->GetApp()->GetAppProvider(); 1852d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pAppProvider) 1853d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 18544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1855d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsCaptionName; 1856d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsTitle = pAppProvider->GetAppTitle(); 1857d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann switch (eNullTest) { 1858d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Error: { 1859d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsNullMsg.IsEmpty()) { 1860d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsCaptionName = GetValidateCaptionName(bVersionFlag); 1861d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsNullMsg = 1862d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::Format(L"%ls cannot be blank.", wsCaptionName.c_str()); 1863d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1864d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pAppProvider->MsgBox(wsNullMsg, wsTitle, XFA_MBICON_Status, XFA_MB_OK); 1865d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_Error; 1866d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1867d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Warning: { 1868d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (IsUserInteractive()) 1869d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return true; 18704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1871d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsNullMsg.IsEmpty()) { 1872d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsCaptionName = GetValidateCaptionName(bVersionFlag); 1873d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsNullMsg = WideString::Format( 1874d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L"%ls cannot be blank. To ignore validations for %ls, click " 1875d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L"Ignore.", 1876d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsCaptionName.c_str(), wsCaptionName.c_str()); 18774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1878d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pAppProvider->MsgBox(wsNullMsg, wsTitle, XFA_MBICON_Warning, 1879d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_MB_YesNo) == XFA_IDYes) { 1880d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann SetFlag(XFA_NodeFlag_UserInteractive, false); 18814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1882d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_Error; 18834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1884d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Disabled: 1885d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann default: 1886d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 18874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1888d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_Success; 18894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 18904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1891d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ProcessValidate(CXFA_FFDocView* docView, int32_t iFlags) { 1892d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (GetElementType() == XFA_Element::Draw) 1893d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 1894d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1895d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Validate* validate = GetValidateIfExists(); 1896d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!validate) 1897d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return XFA_EVENTERROR_NotExist; 1898d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1899d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bInitDoc = validate->NeedsInitApp(); 1900d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bStatus = docView->GetLayoutStatus() < XFA_DOCVIEW_LAYOUTSTATUS_End; 1901d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iFormat = 0; 1902d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iRet = XFA_EVENTERROR_NotExist; 1903d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Script* script = validate->GetScriptIfExists(); 1904d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bRet = false; 1905d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool hasBoolResult = (bInitDoc || bStatus) && GetRawValue().IsEmpty(); 1906d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (script) { 1907d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_EventParam eParam; 1908d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann eParam.m_eType = XFA_EVENT_Validate; 1909d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann eParam.m_pTarget = GetWidgetAcc(); 1910d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::tie(iRet, bRet) = ExecuteBoolScript(docView, script, &eParam); 1911d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1912d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1913d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_VERSION version = docView->GetDoc()->GetXFADoc()->GetCurVersionMode(); 1914d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bVersionFlag = false; 1915d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (version < XFA_VERSION_208) 1916d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bVersionFlag = true; 1917d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1918d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bInitDoc) { 1919d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann validate->ClearFlag(XFA_NodeFlag_NeedsInitApp); 1920d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else { 1921d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iFormat = ProcessFormatTestValidate(docView, validate, bVersionFlag); 1922d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!bVersionFlag) { 1923d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bVersionFlag = 1924d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann docView->GetDoc()->GetXFADoc()->HasFlag(XFA_DOCFLAG_Scripting); 19254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1926d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1927d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iRet |= ProcessNullTestValidate(docView, validate, iFlags, bVersionFlag); 19284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1929d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1930d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iFormat != XFA_EVENTERROR_Success && hasBoolResult) 1931d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ProcessScriptTestValidate(docView, validate, iRet, bRet, bVersionFlag); 1932d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1933d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return iRet | iFormat; 1934d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1935d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1936d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CXFA_Node::GetValidateCaptionName(bool bVersionFlag) { 1937d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsCaptionName; 1938d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1939d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!bVersionFlag) { 1940d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Caption* caption = GetCaptionIfExists(); 1941d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (caption) { 1942d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Value* capValue = caption->GetValueIfExists(); 1943d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (capValue) { 1944d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Text* captionText = capValue->GetTextIfExists(); 1945d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (captionText) 1946d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsCaptionName = captionText->GetContent(); 19474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 19484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 19494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1950d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!wsCaptionName.IsEmpty()) 1951d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return wsCaptionName; 1952d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return JSObject()->GetCData(XFA_Attribute::Name); 1953d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1954d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1955d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CXFA_Node::GetValidateMessage(bool bError, bool bVersionFlag) { 1956d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsCaptionName = GetValidateCaptionName(bVersionFlag); 1957d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bVersionFlag) 1958d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString::Format(L"%ls validation failed", wsCaptionName.c_str()); 1959d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bError) { 1960d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString::Format(L"The value you entered for %ls is invalid.", 1961d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsCaptionName.c_str()); 1962d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1963d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString::Format( 1964d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L"The value you entered for %ls is invalid. To ignore " 1965d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L"validations for %ls, click Ignore.", 1966d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsCaptionName.c_str(), wsCaptionName.c_str()); 1967d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1968d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1969d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ExecuteScript(CXFA_FFDocView* docView, 1970d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Script* script, 1971d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_EventParam* pEventParam) { 1972d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bRet; 1973d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iRet; 1974d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::tie(iRet, bRet) = ExecuteBoolScript(docView, script, pEventParam); 1975d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return iRet; 1976d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 1977d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1978d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::pair<int32_t, bool> CXFA_Node::ExecuteBoolScript( 1979d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FFDocView* docView, 1980d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Script* script, 1981d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_EventParam* pEventParam) { 1982d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (m_ExecuteRecursionDepth > kMaxExecuteRecursion) 1983d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {XFA_EVENTERROR_Success, false}; 1984d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1985d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(pEventParam); 1986d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!script) 1987d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {XFA_EVENTERROR_NotExist, false}; 1988d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (script->GetRunAt() == XFA_AttributeEnum::Server) 1989d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {XFA_EVENTERROR_Disabled, false}; 1990d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1991d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsExpression = script->GetExpression(); 1992d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsExpression.IsEmpty()) 1993d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {XFA_EVENTERROR_NotExist, false}; 1994d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1995d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Script::Type eScriptType = script->GetContentType(); 1996d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (eScriptType == CXFA_Script::Type::Unknown) 1997d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {XFA_EVENTERROR_Success, false}; 1998d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1999d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FFDoc* pDoc = docView->GetDoc(); 2000d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Engine* pContext = pDoc->GetXFADoc()->GetScriptContext(); 2001d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pContext->SetEventParam(*pEventParam); 2002d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pContext->SetRunAtType(script->GetRunAt()); 2003d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2004d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<CXFA_Node*> refNodes; 2005d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pEventParam->m_eType == XFA_EVENT_InitCalculate || 2006d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pEventParam->m_eType == XFA_EVENT_Calculate) { 2007d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pContext->SetNodesOfRunScript(&refNodes); 2008d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 2009d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2010d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto pTmpRetValue = pdfium::MakeUnique<CFXJSE_Value>(pContext->GetIsolate()); 2011d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bRet = false; 2012d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 2013d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann AutoRestorer<uint8_t> restorer(&m_ExecuteRecursionDepth); 2014d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ++m_ExecuteRecursionDepth; 2015d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bRet = pContext->RunScript(eScriptType, wsExpression.AsStringView(), 2016d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pTmpRetValue.get(), this); 2017d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 2018d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2019d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iRet = XFA_EVENTERROR_Error; 2020d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bRet) { 2021d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iRet = XFA_EVENTERROR_Success; 2022d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pEventParam->m_eType == XFA_EVENT_Calculate || 2023d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pEventParam->m_eType == XFA_EVENT_InitCalculate) { 2024d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pTmpRetValue->IsUndefined()) { 2025d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pTmpRetValue->IsNull()) 2026d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pEventParam->m_wsResult = pTmpRetValue->ToWideString(); 2027d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2028d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iRet = XFA_EVENTERROR_Success; 2029d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else { 2030d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iRet = XFA_EVENTERROR_Error; 2031d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 2032d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pEventParam->m_eType == XFA_EVENT_InitCalculate) { 2033d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if ((iRet == XFA_EVENTERROR_Success) && 2034d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (GetRawValue() != pEventParam->m_wsResult)) { 2035d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetWidgetAcc()->SetValue(XFA_VALUEPICTURE_Raw, 2036d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pEventParam->m_wsResult); 2037d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann docView->AddValidateWidget(GetWidgetAcc()); 2038d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 2039d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 2040d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* pRefNode : refNodes) { 2041d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pRefNode == this) 2042d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 2043d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2044d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_CalcData* pGlobalData = pRefNode->JSObject()->GetCalcData(); 2045d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pGlobalData) { 2046d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pRefNode->JSObject()->SetCalcData( 2047d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pdfium::MakeUnique<CXFA_CalcData>()); 2048d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pGlobalData = pRefNode->JSObject()->GetCalcData(); 2049d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 2050d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pdfium::ContainsValue(pGlobalData->m_Globals, this)) 2051d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pGlobalData->m_Globals.push_back(this); 2052d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 20534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 20544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2055d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pContext->SetNodesOfRunScript(nullptr); 2056d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2057d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {iRet, pTmpRetValue->IsBoolean() ? pTmpRetValue->ToBoolean() : false}; 20584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 20594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2060d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CXFA_Node::GetBarcodeType() { 2061d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pUIChild = GetWidgetAcc()->GetUIChild(); 2062d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pUIChild 2063d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ? WideString(pUIChild->JSObject()->GetCData(XFA_Attribute::Type)) 2064d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann : WideString(); 2065d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 2066d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2067d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<BC_CHAR_ENCODING> CXFA_Node::GetBarcodeAttribute_CharEncoding() { 2068d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<WideString> wsCharEncoding = 2069d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetWidgetAcc()->GetUIChild()->JSObject()->TryCData( 2070d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute::CharEncoding, true); 2071d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!wsCharEncoding) 2072d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 2073d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsCharEncoding->CompareNoCase(L"UTF-16")) 2074d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {CHAR_ENCODING_UNICODE}; 2075d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsCharEncoding->CompareNoCase(L"UTF-8")) 2076d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {CHAR_ENCODING_UTF8}; 2077d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 2078d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 2079d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2080d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<bool> CXFA_Node::GetBarcodeAttribute_Checksum() { 2081d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<XFA_AttributeEnum> checksum = 2082d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetWidgetAcc()->GetUIChild()->JSObject()->TryEnum(XFA_Attribute::Checksum, 2083d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann true); 2084d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!checksum) 2085d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 2086d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2087d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann switch (*checksum) { 2088d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::None: 2089d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {false}; 2090d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Auto: 2091d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {true}; 2092d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Checksum_1mod10: 2093d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Checksum_1mod10_1mod11: 2094d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Checksum_2mod10: 2095d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann default: 2096d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 20974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2098d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 2099d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 2100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<int32_t> CXFA_Node::GetBarcodeAttribute_DataLength() { 2102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<WideString> wsDataLength = 2103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetWidgetAcc()->GetUIChild()->JSObject()->TryCData( 2104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute::DataLength, true); 2105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!wsDataLength) 2106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 2107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {FXSYS_wtoi(wsDataLength->c_str())}; 2109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 2110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<char> CXFA_Node::GetBarcodeAttribute_StartChar() { 2112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<WideString> wsStartEndChar = 2113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetWidgetAcc()->GetUIChild()->JSObject()->TryCData( 2114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute::StartChar, true); 2115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!wsStartEndChar || wsStartEndChar->IsEmpty()) 2116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 2117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {static_cast<char>((*wsStartEndChar)[0])}; 2119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 2120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<char> CXFA_Node::GetBarcodeAttribute_EndChar() { 2122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<WideString> wsStartEndChar = 2123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetWidgetAcc()->GetUIChild()->JSObject()->TryCData(XFA_Attribute::EndChar, 2124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann true); 2125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!wsStartEndChar || wsStartEndChar->IsEmpty()) 2126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 2127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {static_cast<char>((*wsStartEndChar)[0])}; 2129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 2130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<int32_t> CXFA_Node::GetBarcodeAttribute_ECLevel() { 2132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<WideString> wsECLevel = 2133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetWidgetAcc()->GetUIChild()->JSObject()->TryCData( 2134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute::ErrorCorrectionLevel, true); 2135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!wsECLevel) 2136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 2137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {FXSYS_wtoi(wsECLevel->c_str())}; 2138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 2139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<int32_t> CXFA_Node::GetBarcodeAttribute_ModuleWidth() { 2141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<CXFA_Measurement> moduleWidthHeight = 2142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetWidgetAcc()->GetUIChild()->JSObject()->TryMeasure( 2143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute::ModuleWidth, true); 2144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!moduleWidthHeight) 2145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 2146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {static_cast<int32_t>(moduleWidthHeight->ToUnit(XFA_Unit::Pt))}; 2148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 2149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2150d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<int32_t> CXFA_Node::GetBarcodeAttribute_ModuleHeight() { 2151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<CXFA_Measurement> moduleWidthHeight = 2152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetWidgetAcc()->GetUIChild()->JSObject()->TryMeasure( 2153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute::ModuleHeight, true); 2154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!moduleWidthHeight) 2155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 2156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {static_cast<int32_t>(moduleWidthHeight->ToUnit(XFA_Unit::Pt))}; 2158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 2159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<bool> CXFA_Node::GetBarcodeAttribute_PrintChecksum() { 2161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return GetWidgetAcc()->GetUIChild()->JSObject()->TryBoolean( 2162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute::PrintCheckDigit, true); 2163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 2164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<BC_TEXT_LOC> CXFA_Node::GetBarcodeAttribute_TextLocation() { 2166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<XFA_AttributeEnum> textLocation = 2167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetWidgetAcc()->GetUIChild()->JSObject()->TryEnum( 2168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute::TextLocation, true); 2169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!textLocation) 2170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 2171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann switch (*textLocation) { 2173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::None: 2174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {BC_TEXT_LOC_NONE}; 2175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Above: 2176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {BC_TEXT_LOC_ABOVE}; 2177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::Below: 2178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {BC_TEXT_LOC_BELOW}; 2179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::AboveEmbedded: 2180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {BC_TEXT_LOC_ABOVEEMBED}; 2181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case XFA_AttributeEnum::BelowEmbedded: 2182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {BC_TEXT_LOC_BELOWEMBED}; 2183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann default: 2184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 21854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 21874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 21884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<bool> CXFA_Node::GetBarcodeAttribute_Truncate() { 2190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return GetWidgetAcc()->GetUIChild()->JSObject()->TryBoolean( 2191d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute::Truncate, true); 21924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 21934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<int8_t> CXFA_Node::GetBarcodeAttribute_WideNarrowRatio() { 2195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<WideString> wsWideNarrowRatio = 2196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetWidgetAcc()->GetUIChild()->JSObject()->TryCData( 2197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute::WideNarrowRatio, true); 2198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!wsWideNarrowRatio) 2199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {}; 2200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<size_t> ptPos = wsWideNarrowRatio->Find(':'); 2202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!ptPos) 2203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {static_cast<int8_t>(FXSYS_wtoi(wsWideNarrowRatio->c_str()))}; 2204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t fB = FXSYS_wtoi( 2206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsWideNarrowRatio->Right(wsWideNarrowRatio->GetLength() - (*ptPos + 1)) 2207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann .c_str()); 2208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!fB) 2209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {0}; 2210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t fA = FXSYS_wtoi(wsWideNarrowRatio->Left(*ptPos).c_str()); 2212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float result = static_cast<float>(fA) / static_cast<float>(fB); 2213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {static_cast<int8_t>(result)}; 22144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2215