| Index: xfa/src/fxfa/src/parser/xfa_script_nodehelper.cpp
|
| diff --git a/xfa/src/fxfa/src/parser/xfa_script_nodehelper.cpp b/xfa/src/fxfa/src/parser/xfa_script_nodehelper.cpp
|
| index 96ceeb531821164de94f1216fadf51dfddc7e63a..ee256c5681cb31a316806b607fb7c2ffc48e10c9 100644
|
| --- a/xfa/src/fxfa/src/parser/xfa_script_nodehelper.cpp
|
| +++ b/xfa/src/fxfa/src/parser/xfa_script_nodehelper.cpp
|
| @@ -1,431 +1,431 @@
|
| -// Copyright 2014 PDFium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| -
|
| -#include "xfa/src/foxitlib.h"
|
| -#include "xfa/src/fxfa/src/common/xfa_utils.h"
|
| -#include "xfa/src/fxfa/src/common/xfa_object.h"
|
| -#include "xfa/src/fxfa/src/common/xfa_document.h"
|
| -#include "xfa/src/fxfa/src/common/xfa_parser.h"
|
| -#include "xfa/src/fxfa/src/common/xfa_script.h"
|
| -#include "xfa/src/fxfa/src/common/xfa_docdata.h"
|
| -#include "xfa/src/fxfa/src/common/xfa_doclayout.h"
|
| -#include "xfa/src/fxfa/src/common/xfa_localemgr.h"
|
| -#include "xfa/src/fxfa/src/common/xfa_fm2jsapi.h"
|
| -#include "xfa_script_nodehelper.h"
|
| -#include "xfa_script_imp.h"
|
| -CXFA_NodeHelper::CXFA_NodeHelper(void)
|
| - : m_eLastCreateType(XFA_ELEMENT_DataValue),
|
| - m_pCreateParent(NULL),
|
| - m_iCreateCount(0),
|
| - m_iCreateFlag(XFA_RESOLVENODE_RSTYPE_CreateNodeOne),
|
| - m_iCurAllStart(-1),
|
| - m_pAllStartParent(NULL) {}
|
| -CXFA_NodeHelper::~CXFA_NodeHelper(void) {}
|
| -CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetOneChild(
|
| - CXFA_Node* parent,
|
| - const FX_WCHAR* pwsName,
|
| - FX_BOOL bIsClassName) {
|
| - if (parent == NULL) {
|
| - return NULL;
|
| - }
|
| - CXFA_NodeArray siblings;
|
| - uint32_t uNameHash = FX_HashCode_String_GetW(pwsName, FXSYS_wcslen(pwsName));
|
| - XFA_NodeAcc_TraverseAnySiblings(parent, uNameHash, &siblings, bIsClassName);
|
| - if (siblings.GetSize() == 0) {
|
| - return NULL;
|
| - }
|
| - return siblings[0];
|
| -}
|
| -int32_t CXFA_NodeHelper::XFA_CountSiblings(CXFA_Node* pNode,
|
| - XFA_LOGIC_TYPE eLogicType,
|
| - CXFA_NodeArray* pSiblings,
|
| - FX_BOOL bIsClassName) {
|
| - CXFA_Node* parent =
|
| - XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent);
|
| - if (parent == NULL) {
|
| - return 0;
|
| - }
|
| - XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(
|
| - parent->GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
|
| - if (!pPropert && eLogicType == XFA_LOGIC_Transparent) {
|
| - parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent);
|
| - if (parent == NULL) {
|
| - return 0;
|
| - }
|
| - }
|
| - if (bIsClassName) {
|
| - return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetClassHashCode(),
|
| - pSiblings, eLogicType, bIsClassName);
|
| - } else {
|
| - return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetNameHash(), pSiblings,
|
| - eLogicType, bIsClassName);
|
| - }
|
| -}
|
| -int32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseAnySiblings(
|
| - CXFA_Node* parent,
|
| - FX_DWORD dNameHash,
|
| - CXFA_NodeArray* pSiblings,
|
| - FX_BOOL bIsClassName) {
|
| - if (parent == NULL || pSiblings == NULL) {
|
| - return 0;
|
| - }
|
| - int32_t nCount = 0;
|
| - int32_t i = 0;
|
| - CXFA_NodeArray properties;
|
| - parent->GetNodeList(properties, XFA_NODEFILTER_Properties);
|
| - int32_t nProperties = properties.GetSize();
|
| - for (i = 0; i < nProperties; ++i) {
|
| - CXFA_Node* child = properties[i];
|
| - if (bIsClassName) {
|
| - if (child->GetClassHashCode() == dNameHash) {
|
| - pSiblings->Add(child);
|
| - nCount++;
|
| - }
|
| - } else {
|
| - if (child->GetNameHash() == dNameHash) {
|
| - pSiblings->Add(child);
|
| - nCount++;
|
| - }
|
| - }
|
| - if (nCount > 0) {
|
| - return nCount;
|
| - }
|
| - nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings,
|
| - bIsClassName);
|
| - }
|
| - CXFA_NodeArray children;
|
| - parent->GetNodeList(children, XFA_NODEFILTER_Children);
|
| - int32_t nChildren = children.GetSize();
|
| - for (i = 0; i < nChildren; i++) {
|
| - CXFA_Node* child = children[i];
|
| - if (bIsClassName) {
|
| - if (child->GetClassHashCode() == dNameHash) {
|
| - if (pSiblings) {
|
| - pSiblings->Add(child);
|
| - }
|
| - nCount++;
|
| - }
|
| - } else {
|
| - if (child->GetNameHash() == dNameHash) {
|
| - if (pSiblings) {
|
| - pSiblings->Add(child);
|
| - }
|
| - nCount++;
|
| - }
|
| - }
|
| - if (nCount > 0) {
|
| - return nCount;
|
| - }
|
| - nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings,
|
| - bIsClassName);
|
| - }
|
| - return nCount;
|
| -}
|
| -int32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseSiblings(CXFA_Node* parent,
|
| - FX_DWORD dNameHash,
|
| - CXFA_NodeArray* pSiblings,
|
| - XFA_LOGIC_TYPE eLogicType,
|
| - FX_BOOL bIsClassName,
|
| - FX_BOOL bIsFindProperty) {
|
| - if (parent == NULL || pSiblings == NULL) {
|
| - return 0;
|
| - }
|
| - int32_t nCount = 0;
|
| - int32_t i = 0;
|
| - if (bIsFindProperty) {
|
| - CXFA_NodeArray properties;
|
| - parent->GetNodeList(properties, XFA_NODEFILTER_Properties);
|
| - int32_t nProperties = properties.GetSize();
|
| - for (i = 0; i < nProperties; ++i) {
|
| - CXFA_Node* child = properties[i];
|
| - if (bIsClassName) {
|
| - if (child->GetClassHashCode() == dNameHash) {
|
| - pSiblings->Add(child);
|
| - nCount++;
|
| - }
|
| - } else {
|
| - if (child->GetNameHash() == dNameHash) {
|
| - if (child->GetClassID() != XFA_ELEMENT_PageSet &&
|
| - child->GetClassID() != XFA_ELEMENT_Extras &&
|
| - child->GetClassID() != XFA_ELEMENT_Items) {
|
| - pSiblings->Add(child);
|
| - nCount++;
|
| - }
|
| - }
|
| - }
|
| - if (child->IsUnnamed() && child->GetClassID() == XFA_ELEMENT_PageSet) {
|
| - nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings,
|
| - eLogicType, bIsClassName, FALSE);
|
| - }
|
| - }
|
| - if (nCount > 0) {
|
| - return nCount;
|
| - }
|
| - }
|
| - CXFA_NodeArray children;
|
| - parent->GetNodeList(children, XFA_NODEFILTER_Children);
|
| - int32_t nChildren = children.GetSize();
|
| - for (i = 0; i < nChildren; i++) {
|
| - CXFA_Node* child = children[i];
|
| - if (child->GetClassID() == XFA_ELEMENT_Variables) {
|
| - continue;
|
| - }
|
| - if (bIsClassName) {
|
| - if (child->GetClassHashCode() == dNameHash) {
|
| - if (pSiblings) {
|
| - pSiblings->Add(child);
|
| - }
|
| - nCount++;
|
| - }
|
| - } else {
|
| - if (child->GetNameHash() == dNameHash) {
|
| - if (pSiblings) {
|
| - pSiblings->Add(child);
|
| - }
|
| - nCount++;
|
| - }
|
| - }
|
| - if (eLogicType == XFA_LOGIC_NoTransparent) {
|
| - continue;
|
| - }
|
| - if (XFA_NodeIsTransparent(child) &&
|
| - child->GetClassID() != XFA_ELEMENT_PageSet) {
|
| - nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings,
|
| - eLogicType, bIsClassName, FALSE);
|
| - }
|
| - }
|
| - return nCount;
|
| -}
|
| -CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetParent(
|
| - CXFA_Node* pNode,
|
| - XFA_LOGIC_TYPE eLogicType) {
|
| - if (!pNode) {
|
| - return NULL;
|
| - }
|
| - if (eLogicType == XFA_LOGIC_NoTransparent) {
|
| - return pNode->GetNodeItem(XFA_NODEITEM_Parent);
|
| - }
|
| - CXFA_Node* parent;
|
| - CXFA_Node* node = pNode;
|
| - while (TRUE) {
|
| - parent = XFA_ResolveNodes_GetParent(node);
|
| - if (parent == NULL) {
|
| - break;
|
| - }
|
| - XFA_ELEMENT parentElement = parent->GetClassID();
|
| - if ((!parent->IsUnnamed() && parentElement != XFA_ELEMENT_SubformSet) ||
|
| - parentElement == XFA_ELEMENT_Variables) {
|
| - break;
|
| - }
|
| - node = parent;
|
| - }
|
| - return parent;
|
| -}
|
| -int32_t CXFA_NodeHelper::XFA_GetIndex(CXFA_Node* pNode,
|
| - XFA_LOGIC_TYPE eLogicType,
|
| - FX_BOOL bIsProperty,
|
| - FX_BOOL bIsClassIndex) {
|
| - CXFA_Node* parent =
|
| - XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent);
|
| - if (parent == NULL) {
|
| - return 0;
|
| - }
|
| - if (!bIsProperty && eLogicType == XFA_LOGIC_Transparent) {
|
| - parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent);
|
| - if (parent == NULL) {
|
| - return 0;
|
| - }
|
| - }
|
| - FX_DWORD dwHashName = pNode->GetNameHash();
|
| - if (bIsClassIndex) {
|
| - dwHashName = pNode->GetClassHashCode();
|
| - }
|
| - CXFA_NodeArray siblings;
|
| - int32_t iSize = XFA_NodeAcc_TraverseSiblings(parent, dwHashName, &siblings,
|
| - eLogicType, bIsClassIndex);
|
| - for (int32_t i = 0; i < iSize; ++i) {
|
| - CXFA_Node* child = siblings[i];
|
| - if (child == pNode) {
|
| - return i;
|
| - }
|
| - }
|
| - return 0;
|
| -}
|
| -void CXFA_NodeHelper::XFA_GetNameExpression(CXFA_Node* refNode,
|
| - CFX_WideString& wsName,
|
| - FX_BOOL bIsAllPath,
|
| - XFA_LOGIC_TYPE eLogicType) {
|
| - wsName.Empty();
|
| - if (bIsAllPath) {
|
| - XFA_GetNameExpression(refNode, wsName, FALSE, eLogicType);
|
| - CFX_WideString wsParent;
|
| - CXFA_Node* parent =
|
| - XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent);
|
| - while (parent != NULL) {
|
| - XFA_GetNameExpression(parent, wsParent, FALSE, eLogicType);
|
| - wsParent += L".";
|
| - wsParent += wsName;
|
| - wsName = wsParent;
|
| - parent = XFA_ResolveNodes_GetParent(parent, XFA_LOGIC_NoTransparent);
|
| - }
|
| - return;
|
| - } else {
|
| - CFX_WideStringC wsTagName;
|
| - CFX_WideString ws;
|
| - FX_BOOL bIsProperty = XFA_NodeIsProperty(refNode);
|
| - if (refNode->IsUnnamed() ||
|
| - (bIsProperty && refNode->GetClassID() != XFA_ELEMENT_PageSet)) {
|
| - refNode->GetClassName(wsTagName);
|
| - ws = wsTagName;
|
| - wsName.Format(L"#%s[%d]", (const FX_WCHAR*)ws,
|
| - XFA_GetIndex(refNode, eLogicType, bIsProperty, TRUE));
|
| - return;
|
| - }
|
| - ws = refNode->GetCData(XFA_ATTRIBUTE_Name);
|
| - ws.Replace(L".", L"\\.");
|
| - wsName.Format(L"%s[%d]", (const FX_WCHAR*)ws,
|
| - XFA_GetIndex(refNode, eLogicType, bIsProperty, FALSE));
|
| - }
|
| -}
|
| -FX_BOOL CXFA_NodeHelper::XFA_NodeIsTransparent(CXFA_Node* refNode) {
|
| - if (refNode == NULL) {
|
| - return FALSE;
|
| - }
|
| - XFA_ELEMENT eRefNode = refNode->GetClassID();
|
| - if ((refNode->IsUnnamed() && refNode->IsContainerNode()) ||
|
| - eRefNode == XFA_ELEMENT_SubformSet || eRefNode == XFA_ELEMENT_Area ||
|
| - eRefNode == XFA_ELEMENT_Proto) {
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| -}
|
| -FX_BOOL CXFA_NodeHelper::XFA_CreateNode_ForCondition(
|
| - CFX_WideString& wsCondition) {
|
| - int32_t iLen = wsCondition.GetLength();
|
| - CFX_WideString wsIndex = FX_WSTRC(L"0");
|
| - ;
|
| - FX_BOOL bAll = FALSE;
|
| - if (iLen == 0) {
|
| - m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne;
|
| - return FALSE;
|
| - }
|
| - if (wsCondition.GetAt(0) == '[') {
|
| - int32_t i = 1;
|
| - for (; i < iLen; ++i) {
|
| - FX_WCHAR ch = wsCondition[i];
|
| - if (ch == ' ') {
|
| - continue;
|
| - }
|
| - if (ch == '+' || ch == '-') {
|
| - break;
|
| - } else if (ch == '*') {
|
| - bAll = TRUE;
|
| - break;
|
| - } else {
|
| - break;
|
| - }
|
| - }
|
| - if (bAll) {
|
| - wsIndex = FX_WSTRC(L"1");
|
| - m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeAll;
|
| - } else {
|
| - m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne;
|
| - wsIndex = wsCondition.Mid(i, iLen - 1 - i);
|
| - }
|
| - int32_t iIndex = wsIndex.GetInteger();
|
| - m_iCreateCount = iIndex;
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| -}
|
| -FX_BOOL CXFA_NodeHelper::XFA_ResolveNodes_CreateNode(
|
| - CFX_WideString wsName,
|
| - CFX_WideString wsCondition,
|
| - FX_BOOL bLastNode,
|
| - CXFA_ScriptContext* pScriptContext) {
|
| - if (m_pCreateParent == NULL) {
|
| - return FALSE;
|
| - }
|
| - FX_BOOL bIsClassName = FALSE;
|
| - FX_BOOL bResult = FALSE;
|
| - if (wsName.GetAt(0) == '!') {
|
| - wsName = wsName.Right(wsName.GetLength() - 1);
|
| - m_pCreateParent = (CXFA_Node*)pScriptContext->GetDocument()->GetXFANode(
|
| - XFA_HASHCODE_Datasets);
|
| - }
|
| - if (wsName.GetAt(0) == '#') {
|
| - bIsClassName = TRUE;
|
| - wsName = wsName.Right(wsName.GetLength() - 1);
|
| - }
|
| - if (m_iCreateCount == 0) {
|
| - XFA_CreateNode_ForCondition(wsCondition);
|
| - }
|
| - if (bIsClassName) {
|
| - XFA_LPCELEMENTINFO lpElement = XFA_GetElementByName(wsName);
|
| - if (lpElement == NULL) {
|
| - return FALSE;
|
| - }
|
| - for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) {
|
| - CXFA_Node* pNewNode =
|
| - m_pCreateParent->CreateSamePacketNode(lpElement->eName);
|
| - if (pNewNode) {
|
| - m_pCreateParent->InsertChild(pNewNode);
|
| - if (iIndex == m_iCreateCount - 1) {
|
| - m_pCreateParent = pNewNode;
|
| - }
|
| - bResult = TRUE;
|
| - }
|
| - }
|
| - } else {
|
| - XFA_ELEMENT eClassType = XFA_ELEMENT_DataGroup;
|
| - if (bLastNode) {
|
| - eClassType = m_eLastCreateType;
|
| - }
|
| - for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) {
|
| - CXFA_Node* pNewNode = m_pCreateParent->CreateSamePacketNode(eClassType);
|
| - if (pNewNode) {
|
| - pNewNode->SetAttribute(XFA_ATTRIBUTE_Name, wsName);
|
| - pNewNode->CreateXMLMappingNode();
|
| - m_pCreateParent->InsertChild(pNewNode);
|
| - if (iIndex == m_iCreateCount - 1) {
|
| - m_pCreateParent = pNewNode;
|
| - }
|
| - bResult = TRUE;
|
| - }
|
| - }
|
| - }
|
| - if (!bResult) {
|
| - m_pCreateParent = NULL;
|
| - }
|
| - return bResult;
|
| -}
|
| -void CXFA_NodeHelper::XFA_SetCreateNodeType(CXFA_Node* refNode) {
|
| - if (refNode == NULL) {
|
| - return;
|
| - }
|
| - if (refNode->GetClassID() == XFA_ELEMENT_Subform) {
|
| - m_eLastCreateType = XFA_ELEMENT_DataGroup;
|
| - } else if (refNode->GetClassID() == XFA_ELEMENT_Field) {
|
| - m_eLastCreateType = XFA_FieldIsMultiListBox(refNode)
|
| - ? XFA_ELEMENT_DataGroup
|
| - : XFA_ELEMENT_DataValue;
|
| - } else if (refNode->GetClassID() == XFA_ELEMENT_ExclGroup) {
|
| - m_eLastCreateType = XFA_ELEMENT_DataValue;
|
| - }
|
| -}
|
| -FX_BOOL CXFA_NodeHelper::XFA_NodeIsProperty(CXFA_Node* refNode) {
|
| - FX_BOOL bRes = FALSE;
|
| - CXFA_Node* parent =
|
| - XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent);
|
| - if (parent != NULL && refNode != NULL) {
|
| - XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(
|
| - parent->GetClassID(), refNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
|
| - if (pPropert) {
|
| - bRes = TRUE;
|
| - }
|
| - }
|
| - return bRes;
|
| -}
|
| +// Copyright 2014 PDFium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| +
|
| +#include "xfa/src/foxitlib.h"
|
| +#include "xfa/src/fxfa/src/common/xfa_utils.h"
|
| +#include "xfa/src/fxfa/src/common/xfa_object.h"
|
| +#include "xfa/src/fxfa/src/common/xfa_document.h"
|
| +#include "xfa/src/fxfa/src/common/xfa_parser.h"
|
| +#include "xfa/src/fxfa/src/common/xfa_script.h"
|
| +#include "xfa/src/fxfa/src/common/xfa_docdata.h"
|
| +#include "xfa/src/fxfa/src/common/xfa_doclayout.h"
|
| +#include "xfa/src/fxfa/src/common/xfa_localemgr.h"
|
| +#include "xfa/src/fxfa/src/common/xfa_fm2jsapi.h"
|
| +#include "xfa_script_nodehelper.h"
|
| +#include "xfa_script_imp.h"
|
| +CXFA_NodeHelper::CXFA_NodeHelper(void)
|
| + : m_eLastCreateType(XFA_ELEMENT_DataValue),
|
| + m_pCreateParent(NULL),
|
| + m_iCreateCount(0),
|
| + m_iCreateFlag(XFA_RESOLVENODE_RSTYPE_CreateNodeOne),
|
| + m_iCurAllStart(-1),
|
| + m_pAllStartParent(NULL) {}
|
| +CXFA_NodeHelper::~CXFA_NodeHelper(void) {}
|
| +CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetOneChild(
|
| + CXFA_Node* parent,
|
| + const FX_WCHAR* pwsName,
|
| + FX_BOOL bIsClassName) {
|
| + if (parent == NULL) {
|
| + return NULL;
|
| + }
|
| + CXFA_NodeArray siblings;
|
| + uint32_t uNameHash = FX_HashCode_String_GetW(pwsName, FXSYS_wcslen(pwsName));
|
| + XFA_NodeAcc_TraverseAnySiblings(parent, uNameHash, &siblings, bIsClassName);
|
| + if (siblings.GetSize() == 0) {
|
| + return NULL;
|
| + }
|
| + return siblings[0];
|
| +}
|
| +int32_t CXFA_NodeHelper::XFA_CountSiblings(CXFA_Node* pNode,
|
| + XFA_LOGIC_TYPE eLogicType,
|
| + CXFA_NodeArray* pSiblings,
|
| + FX_BOOL bIsClassName) {
|
| + CXFA_Node* parent =
|
| + XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent);
|
| + if (parent == NULL) {
|
| + return 0;
|
| + }
|
| + XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(
|
| + parent->GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
|
| + if (!pPropert && eLogicType == XFA_LOGIC_Transparent) {
|
| + parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent);
|
| + if (parent == NULL) {
|
| + return 0;
|
| + }
|
| + }
|
| + if (bIsClassName) {
|
| + return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetClassHashCode(),
|
| + pSiblings, eLogicType, bIsClassName);
|
| + } else {
|
| + return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetNameHash(), pSiblings,
|
| + eLogicType, bIsClassName);
|
| + }
|
| +}
|
| +int32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseAnySiblings(
|
| + CXFA_Node* parent,
|
| + FX_DWORD dNameHash,
|
| + CXFA_NodeArray* pSiblings,
|
| + FX_BOOL bIsClassName) {
|
| + if (parent == NULL || pSiblings == NULL) {
|
| + return 0;
|
| + }
|
| + int32_t nCount = 0;
|
| + int32_t i = 0;
|
| + CXFA_NodeArray properties;
|
| + parent->GetNodeList(properties, XFA_NODEFILTER_Properties);
|
| + int32_t nProperties = properties.GetSize();
|
| + for (i = 0; i < nProperties; ++i) {
|
| + CXFA_Node* child = properties[i];
|
| + if (bIsClassName) {
|
| + if (child->GetClassHashCode() == dNameHash) {
|
| + pSiblings->Add(child);
|
| + nCount++;
|
| + }
|
| + } else {
|
| + if (child->GetNameHash() == dNameHash) {
|
| + pSiblings->Add(child);
|
| + nCount++;
|
| + }
|
| + }
|
| + if (nCount > 0) {
|
| + return nCount;
|
| + }
|
| + nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings,
|
| + bIsClassName);
|
| + }
|
| + CXFA_NodeArray children;
|
| + parent->GetNodeList(children, XFA_NODEFILTER_Children);
|
| + int32_t nChildren = children.GetSize();
|
| + for (i = 0; i < nChildren; i++) {
|
| + CXFA_Node* child = children[i];
|
| + if (bIsClassName) {
|
| + if (child->GetClassHashCode() == dNameHash) {
|
| + if (pSiblings) {
|
| + pSiblings->Add(child);
|
| + }
|
| + nCount++;
|
| + }
|
| + } else {
|
| + if (child->GetNameHash() == dNameHash) {
|
| + if (pSiblings) {
|
| + pSiblings->Add(child);
|
| + }
|
| + nCount++;
|
| + }
|
| + }
|
| + if (nCount > 0) {
|
| + return nCount;
|
| + }
|
| + nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings,
|
| + bIsClassName);
|
| + }
|
| + return nCount;
|
| +}
|
| +int32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseSiblings(CXFA_Node* parent,
|
| + FX_DWORD dNameHash,
|
| + CXFA_NodeArray* pSiblings,
|
| + XFA_LOGIC_TYPE eLogicType,
|
| + FX_BOOL bIsClassName,
|
| + FX_BOOL bIsFindProperty) {
|
| + if (parent == NULL || pSiblings == NULL) {
|
| + return 0;
|
| + }
|
| + int32_t nCount = 0;
|
| + int32_t i = 0;
|
| + if (bIsFindProperty) {
|
| + CXFA_NodeArray properties;
|
| + parent->GetNodeList(properties, XFA_NODEFILTER_Properties);
|
| + int32_t nProperties = properties.GetSize();
|
| + for (i = 0; i < nProperties; ++i) {
|
| + CXFA_Node* child = properties[i];
|
| + if (bIsClassName) {
|
| + if (child->GetClassHashCode() == dNameHash) {
|
| + pSiblings->Add(child);
|
| + nCount++;
|
| + }
|
| + } else {
|
| + if (child->GetNameHash() == dNameHash) {
|
| + if (child->GetClassID() != XFA_ELEMENT_PageSet &&
|
| + child->GetClassID() != XFA_ELEMENT_Extras &&
|
| + child->GetClassID() != XFA_ELEMENT_Items) {
|
| + pSiblings->Add(child);
|
| + nCount++;
|
| + }
|
| + }
|
| + }
|
| + if (child->IsUnnamed() && child->GetClassID() == XFA_ELEMENT_PageSet) {
|
| + nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings,
|
| + eLogicType, bIsClassName, FALSE);
|
| + }
|
| + }
|
| + if (nCount > 0) {
|
| + return nCount;
|
| + }
|
| + }
|
| + CXFA_NodeArray children;
|
| + parent->GetNodeList(children, XFA_NODEFILTER_Children);
|
| + int32_t nChildren = children.GetSize();
|
| + for (i = 0; i < nChildren; i++) {
|
| + CXFA_Node* child = children[i];
|
| + if (child->GetClassID() == XFA_ELEMENT_Variables) {
|
| + continue;
|
| + }
|
| + if (bIsClassName) {
|
| + if (child->GetClassHashCode() == dNameHash) {
|
| + if (pSiblings) {
|
| + pSiblings->Add(child);
|
| + }
|
| + nCount++;
|
| + }
|
| + } else {
|
| + if (child->GetNameHash() == dNameHash) {
|
| + if (pSiblings) {
|
| + pSiblings->Add(child);
|
| + }
|
| + nCount++;
|
| + }
|
| + }
|
| + if (eLogicType == XFA_LOGIC_NoTransparent) {
|
| + continue;
|
| + }
|
| + if (XFA_NodeIsTransparent(child) &&
|
| + child->GetClassID() != XFA_ELEMENT_PageSet) {
|
| + nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings,
|
| + eLogicType, bIsClassName, FALSE);
|
| + }
|
| + }
|
| + return nCount;
|
| +}
|
| +CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetParent(
|
| + CXFA_Node* pNode,
|
| + XFA_LOGIC_TYPE eLogicType) {
|
| + if (!pNode) {
|
| + return NULL;
|
| + }
|
| + if (eLogicType == XFA_LOGIC_NoTransparent) {
|
| + return pNode->GetNodeItem(XFA_NODEITEM_Parent);
|
| + }
|
| + CXFA_Node* parent;
|
| + CXFA_Node* node = pNode;
|
| + while (TRUE) {
|
| + parent = XFA_ResolveNodes_GetParent(node);
|
| + if (parent == NULL) {
|
| + break;
|
| + }
|
| + XFA_ELEMENT parentElement = parent->GetClassID();
|
| + if ((!parent->IsUnnamed() && parentElement != XFA_ELEMENT_SubformSet) ||
|
| + parentElement == XFA_ELEMENT_Variables) {
|
| + break;
|
| + }
|
| + node = parent;
|
| + }
|
| + return parent;
|
| +}
|
| +int32_t CXFA_NodeHelper::XFA_GetIndex(CXFA_Node* pNode,
|
| + XFA_LOGIC_TYPE eLogicType,
|
| + FX_BOOL bIsProperty,
|
| + FX_BOOL bIsClassIndex) {
|
| + CXFA_Node* parent =
|
| + XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent);
|
| + if (parent == NULL) {
|
| + return 0;
|
| + }
|
| + if (!bIsProperty && eLogicType == XFA_LOGIC_Transparent) {
|
| + parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent);
|
| + if (parent == NULL) {
|
| + return 0;
|
| + }
|
| + }
|
| + FX_DWORD dwHashName = pNode->GetNameHash();
|
| + if (bIsClassIndex) {
|
| + dwHashName = pNode->GetClassHashCode();
|
| + }
|
| + CXFA_NodeArray siblings;
|
| + int32_t iSize = XFA_NodeAcc_TraverseSiblings(parent, dwHashName, &siblings,
|
| + eLogicType, bIsClassIndex);
|
| + for (int32_t i = 0; i < iSize; ++i) {
|
| + CXFA_Node* child = siblings[i];
|
| + if (child == pNode) {
|
| + return i;
|
| + }
|
| + }
|
| + return 0;
|
| +}
|
| +void CXFA_NodeHelper::XFA_GetNameExpression(CXFA_Node* refNode,
|
| + CFX_WideString& wsName,
|
| + FX_BOOL bIsAllPath,
|
| + XFA_LOGIC_TYPE eLogicType) {
|
| + wsName.Empty();
|
| + if (bIsAllPath) {
|
| + XFA_GetNameExpression(refNode, wsName, FALSE, eLogicType);
|
| + CFX_WideString wsParent;
|
| + CXFA_Node* parent =
|
| + XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent);
|
| + while (parent != NULL) {
|
| + XFA_GetNameExpression(parent, wsParent, FALSE, eLogicType);
|
| + wsParent += L".";
|
| + wsParent += wsName;
|
| + wsName = wsParent;
|
| + parent = XFA_ResolveNodes_GetParent(parent, XFA_LOGIC_NoTransparent);
|
| + }
|
| + return;
|
| + } else {
|
| + CFX_WideStringC wsTagName;
|
| + CFX_WideString ws;
|
| + FX_BOOL bIsProperty = XFA_NodeIsProperty(refNode);
|
| + if (refNode->IsUnnamed() ||
|
| + (bIsProperty && refNode->GetClassID() != XFA_ELEMENT_PageSet)) {
|
| + refNode->GetClassName(wsTagName);
|
| + ws = wsTagName;
|
| + wsName.Format(L"#%s[%d]", (const FX_WCHAR*)ws,
|
| + XFA_GetIndex(refNode, eLogicType, bIsProperty, TRUE));
|
| + return;
|
| + }
|
| + ws = refNode->GetCData(XFA_ATTRIBUTE_Name);
|
| + ws.Replace(L".", L"\\.");
|
| + wsName.Format(L"%s[%d]", (const FX_WCHAR*)ws,
|
| + XFA_GetIndex(refNode, eLogicType, bIsProperty, FALSE));
|
| + }
|
| +}
|
| +FX_BOOL CXFA_NodeHelper::XFA_NodeIsTransparent(CXFA_Node* refNode) {
|
| + if (refNode == NULL) {
|
| + return FALSE;
|
| + }
|
| + XFA_ELEMENT eRefNode = refNode->GetClassID();
|
| + if ((refNode->IsUnnamed() && refNode->IsContainerNode()) ||
|
| + eRefNode == XFA_ELEMENT_SubformSet || eRefNode == XFA_ELEMENT_Area ||
|
| + eRefNode == XFA_ELEMENT_Proto) {
|
| + return TRUE;
|
| + }
|
| + return FALSE;
|
| +}
|
| +FX_BOOL CXFA_NodeHelper::XFA_CreateNode_ForCondition(
|
| + CFX_WideString& wsCondition) {
|
| + int32_t iLen = wsCondition.GetLength();
|
| + CFX_WideString wsIndex = FX_WSTRC(L"0");
|
| + ;
|
| + FX_BOOL bAll = FALSE;
|
| + if (iLen == 0) {
|
| + m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne;
|
| + return FALSE;
|
| + }
|
| + if (wsCondition.GetAt(0) == '[') {
|
| + int32_t i = 1;
|
| + for (; i < iLen; ++i) {
|
| + FX_WCHAR ch = wsCondition[i];
|
| + if (ch == ' ') {
|
| + continue;
|
| + }
|
| + if (ch == '+' || ch == '-') {
|
| + break;
|
| + } else if (ch == '*') {
|
| + bAll = TRUE;
|
| + break;
|
| + } else {
|
| + break;
|
| + }
|
| + }
|
| + if (bAll) {
|
| + wsIndex = FX_WSTRC(L"1");
|
| + m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeAll;
|
| + } else {
|
| + m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne;
|
| + wsIndex = wsCondition.Mid(i, iLen - 1 - i);
|
| + }
|
| + int32_t iIndex = wsIndex.GetInteger();
|
| + m_iCreateCount = iIndex;
|
| + return TRUE;
|
| + }
|
| + return FALSE;
|
| +}
|
| +FX_BOOL CXFA_NodeHelper::XFA_ResolveNodes_CreateNode(
|
| + CFX_WideString wsName,
|
| + CFX_WideString wsCondition,
|
| + FX_BOOL bLastNode,
|
| + CXFA_ScriptContext* pScriptContext) {
|
| + if (m_pCreateParent == NULL) {
|
| + return FALSE;
|
| + }
|
| + FX_BOOL bIsClassName = FALSE;
|
| + FX_BOOL bResult = FALSE;
|
| + if (wsName.GetAt(0) == '!') {
|
| + wsName = wsName.Right(wsName.GetLength() - 1);
|
| + m_pCreateParent = (CXFA_Node*)pScriptContext->GetDocument()->GetXFANode(
|
| + XFA_HASHCODE_Datasets);
|
| + }
|
| + if (wsName.GetAt(0) == '#') {
|
| + bIsClassName = TRUE;
|
| + wsName = wsName.Right(wsName.GetLength() - 1);
|
| + }
|
| + if (m_iCreateCount == 0) {
|
| + XFA_CreateNode_ForCondition(wsCondition);
|
| + }
|
| + if (bIsClassName) {
|
| + XFA_LPCELEMENTINFO lpElement = XFA_GetElementByName(wsName);
|
| + if (lpElement == NULL) {
|
| + return FALSE;
|
| + }
|
| + for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) {
|
| + CXFA_Node* pNewNode =
|
| + m_pCreateParent->CreateSamePacketNode(lpElement->eName);
|
| + if (pNewNode) {
|
| + m_pCreateParent->InsertChild(pNewNode);
|
| + if (iIndex == m_iCreateCount - 1) {
|
| + m_pCreateParent = pNewNode;
|
| + }
|
| + bResult = TRUE;
|
| + }
|
| + }
|
| + } else {
|
| + XFA_ELEMENT eClassType = XFA_ELEMENT_DataGroup;
|
| + if (bLastNode) {
|
| + eClassType = m_eLastCreateType;
|
| + }
|
| + for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) {
|
| + CXFA_Node* pNewNode = m_pCreateParent->CreateSamePacketNode(eClassType);
|
| + if (pNewNode) {
|
| + pNewNode->SetAttribute(XFA_ATTRIBUTE_Name, wsName);
|
| + pNewNode->CreateXMLMappingNode();
|
| + m_pCreateParent->InsertChild(pNewNode);
|
| + if (iIndex == m_iCreateCount - 1) {
|
| + m_pCreateParent = pNewNode;
|
| + }
|
| + bResult = TRUE;
|
| + }
|
| + }
|
| + }
|
| + if (!bResult) {
|
| + m_pCreateParent = NULL;
|
| + }
|
| + return bResult;
|
| +}
|
| +void CXFA_NodeHelper::XFA_SetCreateNodeType(CXFA_Node* refNode) {
|
| + if (refNode == NULL) {
|
| + return;
|
| + }
|
| + if (refNode->GetClassID() == XFA_ELEMENT_Subform) {
|
| + m_eLastCreateType = XFA_ELEMENT_DataGroup;
|
| + } else if (refNode->GetClassID() == XFA_ELEMENT_Field) {
|
| + m_eLastCreateType = XFA_FieldIsMultiListBox(refNode)
|
| + ? XFA_ELEMENT_DataGroup
|
| + : XFA_ELEMENT_DataValue;
|
| + } else if (refNode->GetClassID() == XFA_ELEMENT_ExclGroup) {
|
| + m_eLastCreateType = XFA_ELEMENT_DataValue;
|
| + }
|
| +}
|
| +FX_BOOL CXFA_NodeHelper::XFA_NodeIsProperty(CXFA_Node* refNode) {
|
| + FX_BOOL bRes = FALSE;
|
| + CXFA_Node* parent =
|
| + XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent);
|
| + if (parent != NULL && refNode != NULL) {
|
| + XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(
|
| + parent->GetClassID(), refNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
|
| + if (pPropert) {
|
| + bRes = TRUE;
|
| + }
|
| + }
|
| + return bRes;
|
| +}
|
|
|