1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/foxitlib.h"
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_utils.h"
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_object.h"
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_document.h"
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_parser.h"
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_script.h"
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_docdata.h"
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_doclayout.h"
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_localemgr.h"
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_fm2jsapi.h"
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa_script_nodehelper.h"
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa_script_imp.h"
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCXFA_NodeHelper::CXFA_NodeHelper(void)
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_eLastCreateType(XFA_ELEMENT_DataValue),
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCreateParent(NULL),
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iCreateCount(0),
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iCreateFlag(XFA_RESOLVENODE_RSTYPE_CreateNodeOne),
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iCurAllStart(-1),
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pAllStartParent(NULL) {}
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCXFA_NodeHelper::~CXFA_NodeHelper(void) {}
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetOneChild(
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_Node* parent,
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const FX_WCHAR* pwsName,
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bIsClassName) {
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (parent == NULL) {
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_NodeArray siblings;
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint32_t uNameHash = FX_HashCode_String_GetW(pwsName, FXSYS_wcslen(pwsName));
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  XFA_NodeAcc_TraverseAnySiblings(parent, uNameHash, &siblings, bIsClassName);
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (siblings.GetSize() == 0) {
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return siblings[0];
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CXFA_NodeHelper::XFA_CountSiblings(CXFA_Node* pNode,
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           XFA_LOGIC_TYPE eLogicType,
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           CXFA_NodeArray* pSiblings,
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           FX_BOOL bIsClassName) {
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_Node* parent =
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent);
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (parent == NULL) {
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      parent->GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pPropert && eLogicType == XFA_LOGIC_Transparent) {
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent);
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (parent == NULL) {
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 0;
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bIsClassName) {
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetClassHashCode(),
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        pSiblings, eLogicType, bIsClassName);
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetNameHash(), pSiblings,
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        eLogicType, bIsClassName);
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseAnySiblings(
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_Node* parent,
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD dNameHash,
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_NodeArray* pSiblings,
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bIsClassName) {
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (parent == NULL || pSiblings == NULL) {
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nCount = 0;
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t i = 0;
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_NodeArray properties;
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  parent->GetNodeList(properties, XFA_NODEFILTER_Properties);
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nProperties = properties.GetSize();
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (i = 0; i < nProperties; ++i) {
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_Node* child = properties[i];
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bIsClassName) {
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (child->GetClassHashCode() == dNameHash) {
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pSiblings->Add(child);
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        nCount++;
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (child->GetNameHash() == dNameHash) {
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pSiblings->Add(child);
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        nCount++;
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (nCount > 0) {
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return nCount;
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings,
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              bIsClassName);
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_NodeArray children;
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  parent->GetNodeList(children, XFA_NODEFILTER_Children);
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nChildren = children.GetSize();
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (i = 0; i < nChildren; i++) {
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_Node* child = children[i];
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bIsClassName) {
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (child->GetClassHashCode() == dNameHash) {
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pSiblings) {
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pSiblings->Add(child);
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        nCount++;
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (child->GetNameHash() == dNameHash) {
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pSiblings) {
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pSiblings->Add(child);
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        nCount++;
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (nCount > 0) {
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return nCount;
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings,
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              bIsClassName);
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return nCount;
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseSiblings(CXFA_Node* parent,
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                      FX_DWORD dNameHash,
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                      CXFA_NodeArray* pSiblings,
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                      XFA_LOGIC_TYPE eLogicType,
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                      FX_BOOL bIsClassName,
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                      FX_BOOL bIsFindProperty) {
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (parent == NULL || pSiblings == NULL) {
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nCount = 0;
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t i = 0;
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bIsFindProperty) {
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_NodeArray properties;
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    parent->GetNodeList(properties, XFA_NODEFILTER_Properties);
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t nProperties = properties.GetSize();
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (i = 0; i < nProperties; ++i) {
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CXFA_Node* child = properties[i];
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bIsClassName) {
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (child->GetClassHashCode() == dNameHash) {
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pSiblings->Add(child);
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          nCount++;
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (child->GetNameHash() == dNameHash) {
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (child->GetClassID() != XFA_ELEMENT_PageSet &&
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              child->GetClassID() != XFA_ELEMENT_Extras &&
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              child->GetClassID() != XFA_ELEMENT_Items) {
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pSiblings->Add(child);
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            nCount++;
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (child->IsUnnamed() && child->GetClassID() == XFA_ELEMENT_PageSet) {
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings,
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               eLogicType, bIsClassName, FALSE);
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (nCount > 0) {
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return nCount;
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_NodeArray children;
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  parent->GetNodeList(children, XFA_NODEFILTER_Children);
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nChildren = children.GetSize();
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (i = 0; i < nChildren; i++) {
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_Node* child = children[i];
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (child->GetClassID() == XFA_ELEMENT_Variables) {
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bIsClassName) {
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (child->GetClassHashCode() == dNameHash) {
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pSiblings) {
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pSiblings->Add(child);
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        nCount++;
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (child->GetNameHash() == dNameHash) {
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pSiblings) {
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pSiblings->Add(child);
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        nCount++;
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (eLogicType == XFA_LOGIC_NoTransparent) {
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (XFA_NodeIsTransparent(child) &&
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        child->GetClassID() != XFA_ELEMENT_PageSet) {
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings,
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                             eLogicType, bIsClassName, FALSE);
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return nCount;
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetParent(
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_Node* pNode,
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_LOGIC_TYPE eLogicType) {
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pNode) {
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (eLogicType == XFA_LOGIC_NoTransparent) {
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pNode->GetNodeItem(XFA_NODEITEM_Parent);
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_Node* parent;
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_Node* node = pNode;
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (TRUE) {
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    parent = XFA_ResolveNodes_GetParent(node);
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (parent == NULL) {
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_ELEMENT parentElement = parent->GetClassID();
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if ((!parent->IsUnnamed() && parentElement != XFA_ELEMENT_SubformSet) ||
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        parentElement == XFA_ELEMENT_Variables) {
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    node = parent;
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return parent;
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CXFA_NodeHelper::XFA_GetIndex(CXFA_Node* pNode,
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      XFA_LOGIC_TYPE eLogicType,
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_BOOL bIsProperty,
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_BOOL bIsClassIndex) {
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_Node* parent =
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent);
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (parent == NULL) {
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bIsProperty && eLogicType == XFA_LOGIC_Transparent) {
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent);
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (parent == NULL) {
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 0;
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwHashName = pNode->GetNameHash();
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bIsClassIndex) {
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwHashName = pNode->GetClassHashCode();
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_NodeArray siblings;
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iSize = XFA_NodeAcc_TraverseSiblings(parent, dwHashName, &siblings,
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               eLogicType, bIsClassIndex);
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int32_t i = 0; i < iSize; ++i) {
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_Node* child = siblings[i];
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (child == pNode) {
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return i;
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CXFA_NodeHelper::XFA_GetNameExpression(CXFA_Node* refNode,
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            CFX_WideString& wsName,
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            FX_BOOL bIsAllPath,
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            XFA_LOGIC_TYPE eLogicType) {
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  wsName.Empty();
262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bIsAllPath) {
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_GetNameExpression(refNode, wsName, FALSE, eLogicType);
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideString wsParent;
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_Node* parent =
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent);
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (parent != NULL) {
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      XFA_GetNameExpression(parent, wsParent, FALSE, eLogicType);
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsParent += L".";
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsParent += wsName;
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsName = wsParent;
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      parent = XFA_ResolveNodes_GetParent(parent, XFA_LOGIC_NoTransparent);
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideStringC wsTagName;
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideString ws;
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bIsProperty = XFA_NodeIsProperty(refNode);
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (refNode->IsUnnamed() ||
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        (bIsProperty && refNode->GetClassID() != XFA_ELEMENT_PageSet)) {
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      refNode->GetClassName(wsTagName);
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ws = wsTagName;
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsName.Format(L"#%s[%d]", (const FX_WCHAR*)ws,
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                    XFA_GetIndex(refNode, eLogicType, bIsProperty, TRUE));
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ws = refNode->GetCData(XFA_ATTRIBUTE_Name);
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ws.Replace(L".", L"\\.");
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    wsName.Format(L"%s[%d]", (const FX_WCHAR*)ws,
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  XFA_GetIndex(refNode, eLogicType, bIsProperty, FALSE));
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CXFA_NodeHelper::XFA_NodeIsTransparent(CXFA_Node* refNode) {
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (refNode == NULL) {
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  XFA_ELEMENT eRefNode = refNode->GetClassID();
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if ((refNode->IsUnnamed() && refNode->IsContainerNode()) ||
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      eRefNode == XFA_ELEMENT_SubformSet || eRefNode == XFA_ELEMENT_Area ||
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      eRefNode == XFA_ELEMENT_Proto) {
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CXFA_NodeHelper::XFA_CreateNode_ForCondition(
306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideString& wsCondition) {
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLen = wsCondition.GetLength();
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_WideString wsIndex = FX_WSTRC(L"0");
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ;
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bAll = FALSE;
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLen == 0) {
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne;
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (wsCondition.GetAt(0) == '[') {
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t i = 1;
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (; i < iLen; ++i) {
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_WCHAR ch = wsCondition[i];
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (ch == ' ') {
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        continue;
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (ch == '+' || ch == '-') {
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else if (ch == '*') {
325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        bAll = TRUE;
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bAll) {
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsIndex = FX_WSTRC(L"1");
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeAll;
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne;
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsIndex = wsCondition.Mid(i, iLen - 1 - i);
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iIndex = wsIndex.GetInteger();
339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iCreateCount = iIndex;
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CXFA_NodeHelper::XFA_ResolveNodes_CreateNode(
345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideString wsName,
346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideString wsCondition,
347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bLastNode,
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_ScriptContext* pScriptContext) {
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pCreateParent == NULL) {
350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bIsClassName = FALSE;
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bResult = FALSE;
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (wsName.GetAt(0) == '!') {
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    wsName = wsName.Right(wsName.GetLength() - 1);
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCreateParent = (CXFA_Node*)pScriptContext->GetDocument()->GetXFANode(
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        XFA_HASHCODE_Datasets);
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (wsName.GetAt(0) == '#') {
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bIsClassName = TRUE;
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    wsName = wsName.Right(wsName.GetLength() - 1);
362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iCreateCount == 0) {
364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_CreateNode_ForCondition(wsCondition);
365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bIsClassName) {
367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_LPCELEMENTINFO lpElement = XFA_GetElementByName(wsName);
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (lpElement == NULL) {
369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) {
372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CXFA_Node* pNewNode =
373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_pCreateParent->CreateSamePacketNode(lpElement->eName);
374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pNewNode) {
375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pCreateParent->InsertChild(pNewNode);
376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iIndex == m_iCreateCount - 1) {
377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_pCreateParent = pNewNode;
378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        bResult = TRUE;
380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_ELEMENT eClassType = XFA_ELEMENT_DataGroup;
384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bLastNode) {
385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      eClassType = m_eLastCreateType;
386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) {
388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CXFA_Node* pNewNode = m_pCreateParent->CreateSamePacketNode(eClassType);
389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pNewNode) {
390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pNewNode->SetAttribute(XFA_ATTRIBUTE_Name, wsName);
391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pNewNode->CreateXMLMappingNode();
392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pCreateParent->InsertChild(pNewNode);
393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iIndex == m_iCreateCount - 1) {
394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_pCreateParent = pNewNode;
395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        bResult = TRUE;
397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bResult) {
401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCreateParent = NULL;
402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bResult;
404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CXFA_NodeHelper::XFA_SetCreateNodeType(CXFA_Node* refNode) {
406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (refNode == NULL) {
407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (refNode->GetClassID() == XFA_ELEMENT_Subform) {
410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_eLastCreateType = XFA_ELEMENT_DataGroup;
411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (refNode->GetClassID() == XFA_ELEMENT_Field) {
412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_eLastCreateType = XFA_FieldIsMultiListBox(refNode)
413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            ? XFA_ELEMENT_DataGroup
414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            : XFA_ELEMENT_DataValue;
415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (refNode->GetClassID() == XFA_ELEMENT_ExclGroup) {
416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_eLastCreateType = XFA_ELEMENT_DataValue;
417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CXFA_NodeHelper::XFA_NodeIsProperty(CXFA_Node* refNode) {
420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bRes = FALSE;
421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_Node* parent =
422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent);
423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (parent != NULL && refNode != NULL) {
424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(
425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        parent->GetClassID(), refNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pPropert) {
427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bRes = TRUE;
428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bRes;
431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
432