14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_nodehelper.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_extension.h" 10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/cfxjse_engine.h" 11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/xfa/cjx_object.h" 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_document.h" 13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_localemgr.h" 14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_node.h" 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_resolvenode_rs.h" 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_utils.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_NodeHelper::CXFA_NodeHelper() 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_eLastCreateType(XFA_Element::DataValue), 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCreateParent(nullptr), 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCreateCount(0), 22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_iCreateFlag(XFA_ResolveNode_RSType_CreateNodeOne), 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCurAllStart(-1), 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pAllStartParent(nullptr) {} 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_NodeHelper::~CXFA_NodeHelper() {} 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node* CXFA_NodeHelper::ResolveNodes_GetOneChild(CXFA_Node* parent, 29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* pwsName, 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIsClassName) { 31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!parent) 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<CXFA_Node*> siblings; 35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t uNameHash = FX_HashCode_GetW(WideStringView(pwsName), false); 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann NodeAcc_TraverseAnySiblings(parent, uNameHash, &siblings, bIsClassName); 37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return !siblings.empty() ? siblings[0] : nullptr; 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_NodeHelper::CountSiblings(CXFA_Node* pNode, 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_LOGIC_TYPE eLogicType, 42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<CXFA_Node*>* pSiblings, 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIsClassName) { 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pNode) 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* parent = ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent); 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!parent) 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!parent->HasProperty(pNode->GetElementType()) && 50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann eLogicType == XFA_LOGIC_Transparent) { 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann parent = ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent); 52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!parent) 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIsClassName) { 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return NodeAcc_TraverseSiblings(parent, pNode->GetClassHashCode(), 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pSiblings, eLogicType, bIsClassName); 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return NodeAcc_TraverseSiblings(parent, pNode->GetNameHash(), pSiblings, 60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann eLogicType, bIsClassName); 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_NodeHelper::NodeAcc_TraverseAnySiblings( 64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* parent, 65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t dNameHash, 66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<CXFA_Node*>* pSiblings, 67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bIsClassName) { 68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!parent || !pSiblings) 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t nCount = 0; 72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* child : 73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann parent->GetNodeList(XFA_NODEFILTER_Properties, XFA_Element::Unknown)) { 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIsClassName) { 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (child->GetClassHashCode() == dNameHash) { 76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pSiblings->push_back(child); 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCount++; 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (child->GetNameHash() == dNameHash) { 81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pSiblings->push_back(child); 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCount++; 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (nCount > 0) 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nCount; 87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCount += 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings, bIsClassName); 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* child : 92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann parent->GetNodeList(XFA_NODEFILTER_Children, XFA_Element::Unknown)) { 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIsClassName) { 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (child->GetClassHashCode() == dNameHash) { 95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pSiblings->push_back(child); 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCount++; 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (child->GetNameHash() == dNameHash) { 100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pSiblings->push_back(child); 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCount++; 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (nCount > 0) 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nCount; 106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCount += 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings, bIsClassName); 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nCount; 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_NodeHelper::NodeAcc_TraverseSiblings( 114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* parent, 115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t dNameHash, 116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<CXFA_Node*>* pSiblings, 117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_LOGIC_TYPE eLogicType, 118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bIsClassName, 119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bIsFindProperty) { 120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!parent || !pSiblings) 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t nCount = 0; 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIsFindProperty) { 125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* child : 126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann parent->GetNodeList(XFA_NODEFILTER_Properties, XFA_Element::Unknown)) { 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIsClassName) { 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (child->GetClassHashCode() == dNameHash) { 129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pSiblings->push_back(child); 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCount++; 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (child->GetNameHash() == dNameHash) { 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (child->GetElementType() != XFA_Element::PageSet && 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann child->GetElementType() != XFA_Element::Extras && 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann child->GetElementType() != XFA_Element::Items) { 137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pSiblings->push_back(child); 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCount++; 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (child->IsUnnamed() && 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann child->GetElementType() == XFA_Element::PageSet) { 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCount += NodeAcc_TraverseSiblings(child, dNameHash, pSiblings, 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eLogicType, bIsClassName, false); 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (nCount > 0) 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nCount; 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Node* child : 152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann parent->GetNodeList(XFA_NODEFILTER_Children, XFA_Element::Unknown)) { 153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (child->GetElementType() == XFA_Element::Variables) 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIsClassName) { 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (child->GetClassHashCode() == dNameHash) { 158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pSiblings->push_back(child); 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCount++; 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (child->GetNameHash() == dNameHash) { 163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pSiblings->push_back(child); 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCount++; 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (eLogicType == XFA_LOGIC_NoTransparent) 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (NodeIsTransparent(child) && 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann child->GetElementType() != XFA_Element::PageSet) { 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCount += NodeAcc_TraverseSiblings(child, dNameHash, pSiblings, 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eLogicType, bIsClassName, false); 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nCount; 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node* CXFA_NodeHelper::ResolveNodes_GetParent(CXFA_Node* pNode, 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_LOGIC_TYPE eLogicType) { 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pNode) { 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eLogicType == XFA_LOGIC_NoTransparent) { 185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pNode->GetParent(); 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* parent; 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* node = pNode; 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (true) { 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann parent = ResolveNodes_GetParent(node); 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!parent) { 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_Element parentType = parent->GetElementType(); 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((!parent->IsUnnamed() && parentType != XFA_Element::SubformSet) || 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann parentType == XFA_Element::Variables) { 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann node = parent; 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return parent; 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_NodeHelper::GetIndex(CXFA_Node* pNode, 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_LOGIC_TYPE eLogicType, 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIsProperty, 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIsClassIndex) { 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* parent = ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent); 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!parent) { 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bIsProperty && eLogicType == XFA_LOGIC_Transparent) { 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann parent = ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent); 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!parent) { 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwHashName = pNode->GetNameHash(); 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIsClassIndex) { 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwHashName = pNode->GetClassHashCode(); 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<CXFA_Node*> siblings; 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iSize = NodeAcc_TraverseSiblings(parent, dwHashName, &siblings, 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eLogicType, bIsClassIndex); 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iSize; ++i) { 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* child = siblings[i]; 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (child == pNode) { 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return i; 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CXFA_NodeHelper::GetNameExpression(CXFA_Node* refNode, 235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bIsAllPath, 236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_LOGIC_TYPE eLogicType) { 237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsName; 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIsAllPath) { 239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsName = GetNameExpression(refNode, false, eLogicType); 240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsParent; 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* parent = 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent); 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (parent) { 244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsParent = GetNameExpression(parent, false, eLogicType); 2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsParent += L"."; 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsParent += wsName; 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsName = wsParent; 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann parent = ResolveNodes_GetParent(parent, XFA_LOGIC_NoTransparent); 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return wsName; 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString ws; 2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIsProperty = NodeIsProperty(refNode); 2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (refNode->IsUnnamed() || 2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (bIsProperty && refNode->GetElementType() != XFA_Element::PageSet)) { 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ws = refNode->GetClassName(); 258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString::Format(L"#%ls[%d]", ws.c_str(), 259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetIndex(refNode, eLogicType, bIsProperty, true)); 2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ws = refNode->JSObject()->GetCData(XFA_Attribute::Name); 2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ws.Replace(L".", L"\\."); 263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString::Format(L"%ls[%d]", ws.c_str(), 264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetIndex(refNode, eLogicType, bIsProperty, false)); 2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_NodeHelper::NodeIsTransparent(CXFA_Node* refNode) { 268d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!refNode) 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_Element refNodeType = refNode->GetElementType(); 272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return (refNode->IsUnnamed() && refNode->IsContainerNode()) || 273d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann refNodeType == XFA_Element::SubformSet || 274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann refNodeType == XFA_Element::Area || refNodeType == XFA_Element::Proto; 2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 277d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_NodeHelper::CreateNode_ForCondition(WideString& wsCondition) { 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLen = wsCondition.GetLength(); 279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsIndex(L"0"); 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bAll = false; 2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLen == 0) { 282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_iCreateFlag = XFA_ResolveNode_RSType_CreateNodeOne; 2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsCondition[0] != '[') 286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return false; 287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t i = 1; 289d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (; i < iLen; ++i) { 290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t ch = wsCondition[i]; 291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (ch == ' ') 292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann continue; 293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (ch == '*') 295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bAll = true; 296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bAll) { 299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsIndex = L"1"; 300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_iCreateFlag = XFA_ResolveNode_RSType_CreateNodeAll; 301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else { 302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_iCreateFlag = XFA_ResolveNode_RSType_CreateNodeOne; 303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsIndex = wsCondition.Mid(i, iLen - 1 - i); 3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 305d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iIndex = wsIndex.GetInteger(); 306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_iCreateCount = iIndex; 307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return true; 3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 310d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_NodeHelper::ResolveNodes_CreateNode(WideString wsName, 311d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsCondition, 312d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bLastNode, 313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Engine* pScriptContext) { 3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pCreateParent) { 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIsClassName = false; 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bResult = false; 319d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsName[0] == '!') { 3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsName = wsName.Right(wsName.GetLength() - 1); 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCreateParent = ToNode( 3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pScriptContext->GetDocument()->GetXFAObject(XFA_HASHCODE_Datasets)); 3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 324d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (wsName[0] == '#') { 3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bIsClassName = true; 3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsName = wsName.Right(wsName.GetLength() - 1); 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_iCreateCount == 0) { 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CreateNode_ForCondition(wsCondition); 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIsClassName) { 332d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Element eType = CXFA_Node::NameToElement(wsName); 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eType == XFA_Element::Unknown) 3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) { 3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pNewNode = m_pCreateParent->CreateSamePacketNode(eType); 3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNewNode) { 339d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pCreateParent->InsertChild(pNewNode, nullptr); 3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iIndex == m_iCreateCount - 1) { 3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCreateParent = pNewNode; 3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bResult = true; 3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_Element eClassType = XFA_Element::DataGroup; 3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bLastNode) { 3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eClassType = m_eLastCreateType; 3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) { 3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pNewNode = m_pCreateParent->CreateSamePacketNode(eClassType); 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pNewNode) { 354d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNewNode->JSObject()->SetAttribute(XFA_Attribute::Name, 355d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsName.AsStringView(), false); 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNewNode->CreateXMLMappingNode(); 357d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pCreateParent->InsertChild(pNewNode, nullptr); 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iIndex == m_iCreateCount - 1) { 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCreateParent = pNewNode; 3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bResult = true; 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bResult) { 3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCreateParent = nullptr; 3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return bResult; 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_NodeHelper::SetCreateNodeType(CXFA_Node* refNode) { 372d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!refNode) 3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 374d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (refNode->GetElementType() == XFA_Element::Subform) { 3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_eLastCreateType = XFA_Element::DataGroup; 3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (refNode->GetElementType() == XFA_Element::Field) { 3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_eLastCreateType = XFA_FieldIsMultiListBox(refNode) 3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ? XFA_Element::DataGroup 3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : XFA_Element::DataValue; 3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (refNode->GetElementType() == XFA_Element::ExclGroup) { 3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_eLastCreateType = XFA_Element::DataValue; 3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_NodeHelper::NodeIsProperty(CXFA_Node* refNode) { 3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* parent = ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent); 388d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return parent && refNode && parent->HasProperty(refNode->GetElementType()); 3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 390