| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fxfa/parser/xfa_script_nodehelper.h" | 7 #include "xfa/fxfa/parser/xfa_script_nodehelper.h" |
| 8 | 8 |
| 9 #include "core/fxcrt/include/fx_ext.h" | 9 #include "core/fxcrt/include/fx_ext.h" |
| 10 #include "xfa/fxfa/parser/xfa_doclayout.h" | 10 #include "xfa/fxfa/parser/xfa_doclayout.h" |
| 11 #include "xfa/fxfa/parser/xfa_document.h" | 11 #include "xfa/fxfa/parser/xfa_document.h" |
| 12 #include "xfa/fxfa/parser/xfa_localemgr.h" | 12 #include "xfa/fxfa/parser/xfa_localemgr.h" |
| 13 #include "xfa/fxfa/parser/xfa_object.h" | 13 #include "xfa/fxfa/parser/xfa_object.h" |
| 14 #include "xfa/fxfa/parser/xfa_parser.h" | 14 #include "xfa/fxfa/parser/xfa_parser.h" |
| 15 #include "xfa/fxfa/parser/xfa_script.h" | 15 #include "xfa/fxfa/parser/xfa_script.h" |
| 16 #include "xfa/fxfa/parser/xfa_script_imp.h" | 16 #include "xfa/fxfa/parser/xfa_script_imp.h" |
| 17 #include "xfa/fxfa/parser/xfa_utils.h" | 17 #include "xfa/fxfa/parser/xfa_utils.h" |
| 18 | 18 |
| 19 CXFA_NodeHelper::CXFA_NodeHelper(void) | 19 CXFA_NodeHelper::CXFA_NodeHelper() |
| 20 : m_eLastCreateType(XFA_ELEMENT_DataValue), | 20 : m_eLastCreateType(XFA_ELEMENT_DataValue), |
| 21 m_pCreateParent(NULL), | 21 m_pCreateParent(NULL), |
| 22 m_iCreateCount(0), | 22 m_iCreateCount(0), |
| 23 m_iCreateFlag(XFA_RESOLVENODE_RSTYPE_CreateNodeOne), | 23 m_iCreateFlag(XFA_RESOLVENODE_RSTYPE_CreateNodeOne), |
| 24 m_iCurAllStart(-1), | 24 m_iCurAllStart(-1), |
| 25 m_pAllStartParent(NULL) {} | 25 m_pAllStartParent(NULL) {} |
| 26 CXFA_NodeHelper::~CXFA_NodeHelper(void) {} | 26 |
| 27 CXFA_NodeHelper::~CXFA_NodeHelper() {} |
| 28 |
| 27 CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetOneChild( | 29 CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetOneChild( |
| 28 CXFA_Node* parent, | 30 CXFA_Node* parent, |
| 29 const FX_WCHAR* pwsName, | 31 const FX_WCHAR* pwsName, |
| 30 FX_BOOL bIsClassName) { | 32 FX_BOOL bIsClassName) { |
| 31 if (parent == NULL) { | 33 if (parent == NULL) { |
| 32 return NULL; | 34 return NULL; |
| 33 } | 35 } |
| 34 CXFA_NodeArray siblings; | 36 CXFA_NodeArray siblings; |
| 35 uint32_t uNameHash = FX_HashCode_GetW(CFX_WideStringC(pwsName), false); | 37 uint32_t uNameHash = FX_HashCode_GetW(CFX_WideStringC(pwsName), false); |
| 36 XFA_NodeAcc_TraverseAnySiblings(parent, uNameHash, &siblings, bIsClassName); | 38 XFA_NodeAcc_TraverseAnySiblings(parent, uNameHash, &siblings, bIsClassName); |
| 37 if (siblings.GetSize() == 0) { | 39 if (siblings.GetSize() == 0) { |
| 38 return NULL; | 40 return NULL; |
| 39 } | 41 } |
| 40 return siblings[0]; | 42 return siblings[0]; |
| 41 } | 43 } |
| 44 |
| 42 int32_t CXFA_NodeHelper::XFA_CountSiblings(CXFA_Node* pNode, | 45 int32_t CXFA_NodeHelper::XFA_CountSiblings(CXFA_Node* pNode, |
| 43 XFA_LOGIC_TYPE eLogicType, | 46 XFA_LOGIC_TYPE eLogicType, |
| 44 CXFA_NodeArray* pSiblings, | 47 CXFA_NodeArray* pSiblings, |
| 45 FX_BOOL bIsClassName) { | 48 FX_BOOL bIsClassName) { |
| 46 if (!pNode) | 49 if (!pNode) |
| 47 return 0; | 50 return 0; |
| 48 CXFA_Node* parent = | 51 CXFA_Node* parent = |
| 49 XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent); | 52 XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent); |
| 50 if (!parent) | 53 if (!parent) |
| 51 return 0; | 54 return 0; |
| 52 const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement( | 55 const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement( |
| 53 parent->GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN); | 56 parent->GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN); |
| 54 if (!pProperty && eLogicType == XFA_LOGIC_Transparent) { | 57 if (!pProperty && eLogicType == XFA_LOGIC_Transparent) { |
| 55 parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent); | 58 parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent); |
| 56 if (parent == NULL) { | 59 if (parent == NULL) { |
| 57 return 0; | 60 return 0; |
| 58 } | 61 } |
| 59 } | 62 } |
| 60 if (bIsClassName) { | 63 if (bIsClassName) { |
| 61 return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetClassHashCode(), | 64 return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetClassHashCode(), |
| 62 pSiblings, eLogicType, bIsClassName); | 65 pSiblings, eLogicType, bIsClassName); |
| 63 } else { | 66 } else { |
| 64 return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetNameHash(), pSiblings, | 67 return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetNameHash(), pSiblings, |
| 65 eLogicType, bIsClassName); | 68 eLogicType, bIsClassName); |
| 66 } | 69 } |
| 67 } | 70 } |
| 71 |
| 68 int32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseAnySiblings( | 72 int32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseAnySiblings( |
| 69 CXFA_Node* parent, | 73 CXFA_Node* parent, |
| 70 uint32_t dNameHash, | 74 uint32_t dNameHash, |
| 71 CXFA_NodeArray* pSiblings, | 75 CXFA_NodeArray* pSiblings, |
| 72 FX_BOOL bIsClassName) { | 76 FX_BOOL bIsClassName) { |
| 73 if (parent == NULL || pSiblings == NULL) { | 77 if (parent == NULL || pSiblings == NULL) { |
| 74 return 0; | 78 return 0; |
| 75 } | 79 } |
| 76 int32_t nCount = 0; | 80 int32_t nCount = 0; |
| 77 int32_t i = 0; | 81 int32_t i = 0; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 } | 122 } |
| 119 } | 123 } |
| 120 if (nCount > 0) { | 124 if (nCount > 0) { |
| 121 return nCount; | 125 return nCount; |
| 122 } | 126 } |
| 123 nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings, | 127 nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings, |
| 124 bIsClassName); | 128 bIsClassName); |
| 125 } | 129 } |
| 126 return nCount; | 130 return nCount; |
| 127 } | 131 } |
| 132 |
| 128 int32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseSiblings(CXFA_Node* parent, | 133 int32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseSiblings(CXFA_Node* parent, |
| 129 uint32_t dNameHash, | 134 uint32_t dNameHash, |
| 130 CXFA_NodeArray* pSiblings, | 135 CXFA_NodeArray* pSiblings, |
| 131 XFA_LOGIC_TYPE eLogicType, | 136 XFA_LOGIC_TYPE eLogicType, |
| 132 FX_BOOL bIsClassName, | 137 FX_BOOL bIsClassName, |
| 133 FX_BOOL bIsFindProperty) { | 138 FX_BOOL bIsFindProperty) { |
| 134 if (parent == NULL || pSiblings == NULL) { | 139 if (parent == NULL || pSiblings == NULL) { |
| 135 return 0; | 140 return 0; |
| 136 } | 141 } |
| 137 int32_t nCount = 0; | 142 int32_t nCount = 0; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 continue; | 198 continue; |
| 194 } | 199 } |
| 195 if (XFA_NodeIsTransparent(child) && | 200 if (XFA_NodeIsTransparent(child) && |
| 196 child->GetClassID() != XFA_ELEMENT_PageSet) { | 201 child->GetClassID() != XFA_ELEMENT_PageSet) { |
| 197 nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings, | 202 nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings, |
| 198 eLogicType, bIsClassName, FALSE); | 203 eLogicType, bIsClassName, FALSE); |
| 199 } | 204 } |
| 200 } | 205 } |
| 201 return nCount; | 206 return nCount; |
| 202 } | 207 } |
| 208 |
| 203 CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetParent( | 209 CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetParent( |
| 204 CXFA_Node* pNode, | 210 CXFA_Node* pNode, |
| 205 XFA_LOGIC_TYPE eLogicType) { | 211 XFA_LOGIC_TYPE eLogicType) { |
| 206 if (!pNode) { | 212 if (!pNode) { |
| 207 return NULL; | 213 return NULL; |
| 208 } | 214 } |
| 209 if (eLogicType == XFA_LOGIC_NoTransparent) { | 215 if (eLogicType == XFA_LOGIC_NoTransparent) { |
| 210 return pNode->GetNodeItem(XFA_NODEITEM_Parent); | 216 return pNode->GetNodeItem(XFA_NODEITEM_Parent); |
| 211 } | 217 } |
| 212 CXFA_Node* parent; | 218 CXFA_Node* parent; |
| 213 CXFA_Node* node = pNode; | 219 CXFA_Node* node = pNode; |
| 214 while (TRUE) { | 220 while (TRUE) { |
| 215 parent = XFA_ResolveNodes_GetParent(node); | 221 parent = XFA_ResolveNodes_GetParent(node); |
| 216 if (parent == NULL) { | 222 if (parent == NULL) { |
| 217 break; | 223 break; |
| 218 } | 224 } |
| 219 XFA_ELEMENT parentElement = parent->GetClassID(); | 225 XFA_ELEMENT parentElement = parent->GetClassID(); |
| 220 if ((!parent->IsUnnamed() && parentElement != XFA_ELEMENT_SubformSet) || | 226 if ((!parent->IsUnnamed() && parentElement != XFA_ELEMENT_SubformSet) || |
| 221 parentElement == XFA_ELEMENT_Variables) { | 227 parentElement == XFA_ELEMENT_Variables) { |
| 222 break; | 228 break; |
| 223 } | 229 } |
| 224 node = parent; | 230 node = parent; |
| 225 } | 231 } |
| 226 return parent; | 232 return parent; |
| 227 } | 233 } |
| 234 |
| 228 int32_t CXFA_NodeHelper::XFA_GetIndex(CXFA_Node* pNode, | 235 int32_t CXFA_NodeHelper::XFA_GetIndex(CXFA_Node* pNode, |
| 229 XFA_LOGIC_TYPE eLogicType, | 236 XFA_LOGIC_TYPE eLogicType, |
| 230 FX_BOOL bIsProperty, | 237 FX_BOOL bIsProperty, |
| 231 FX_BOOL bIsClassIndex) { | 238 FX_BOOL bIsClassIndex) { |
| 232 CXFA_Node* parent = | 239 CXFA_Node* parent = |
| 233 XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent); | 240 XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent); |
| 234 if (parent == NULL) { | 241 if (parent == NULL) { |
| 235 return 0; | 242 return 0; |
| 236 } | 243 } |
| 237 if (!bIsProperty && eLogicType == XFA_LOGIC_Transparent) { | 244 if (!bIsProperty && eLogicType == XFA_LOGIC_Transparent) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 248 int32_t iSize = XFA_NodeAcc_TraverseSiblings(parent, dwHashName, &siblings, | 255 int32_t iSize = XFA_NodeAcc_TraverseSiblings(parent, dwHashName, &siblings, |
| 249 eLogicType, bIsClassIndex); | 256 eLogicType, bIsClassIndex); |
| 250 for (int32_t i = 0; i < iSize; ++i) { | 257 for (int32_t i = 0; i < iSize; ++i) { |
| 251 CXFA_Node* child = siblings[i]; | 258 CXFA_Node* child = siblings[i]; |
| 252 if (child == pNode) { | 259 if (child == pNode) { |
| 253 return i; | 260 return i; |
| 254 } | 261 } |
| 255 } | 262 } |
| 256 return 0; | 263 return 0; |
| 257 } | 264 } |
| 265 |
| 258 void CXFA_NodeHelper::XFA_GetNameExpression(CXFA_Node* refNode, | 266 void CXFA_NodeHelper::XFA_GetNameExpression(CXFA_Node* refNode, |
| 259 CFX_WideString& wsName, | 267 CFX_WideString& wsName, |
| 260 FX_BOOL bIsAllPath, | 268 FX_BOOL bIsAllPath, |
| 261 XFA_LOGIC_TYPE eLogicType) { | 269 XFA_LOGIC_TYPE eLogicType) { |
| 262 wsName.clear(); | 270 wsName.clear(); |
| 263 if (bIsAllPath) { | 271 if (bIsAllPath) { |
| 264 XFA_GetNameExpression(refNode, wsName, FALSE, eLogicType); | 272 XFA_GetNameExpression(refNode, wsName, FALSE, eLogicType); |
| 265 CFX_WideString wsParent; | 273 CFX_WideString wsParent; |
| 266 CXFA_Node* parent = | 274 CXFA_Node* parent = |
| 267 XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent); | 275 XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 297 return FALSE; | 305 return FALSE; |
| 298 } | 306 } |
| 299 XFA_ELEMENT eRefNode = refNode->GetClassID(); | 307 XFA_ELEMENT eRefNode = refNode->GetClassID(); |
| 300 if ((refNode->IsUnnamed() && refNode->IsContainerNode()) || | 308 if ((refNode->IsUnnamed() && refNode->IsContainerNode()) || |
| 301 eRefNode == XFA_ELEMENT_SubformSet || eRefNode == XFA_ELEMENT_Area || | 309 eRefNode == XFA_ELEMENT_SubformSet || eRefNode == XFA_ELEMENT_Area || |
| 302 eRefNode == XFA_ELEMENT_Proto) { | 310 eRefNode == XFA_ELEMENT_Proto) { |
| 303 return TRUE; | 311 return TRUE; |
| 304 } | 312 } |
| 305 return FALSE; | 313 return FALSE; |
| 306 } | 314 } |
| 315 |
| 307 FX_BOOL CXFA_NodeHelper::XFA_CreateNode_ForCondition( | 316 FX_BOOL CXFA_NodeHelper::XFA_CreateNode_ForCondition( |
| 308 CFX_WideString& wsCondition) { | 317 CFX_WideString& wsCondition) { |
| 309 int32_t iLen = wsCondition.GetLength(); | 318 int32_t iLen = wsCondition.GetLength(); |
| 310 CFX_WideString wsIndex(L"0"); | 319 CFX_WideString wsIndex(L"0"); |
| 311 FX_BOOL bAll = FALSE; | 320 FX_BOOL bAll = FALSE; |
| 312 if (iLen == 0) { | 321 if (iLen == 0) { |
| 313 m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne; | 322 m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne; |
| 314 return FALSE; | 323 return FALSE; |
| 315 } | 324 } |
| 316 if (wsCondition.GetAt(0) == '[') { | 325 if (wsCondition.GetAt(0) == '[') { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 335 } else { | 344 } else { |
| 336 m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne; | 345 m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne; |
| 337 wsIndex = wsCondition.Mid(i, iLen - 1 - i); | 346 wsIndex = wsCondition.Mid(i, iLen - 1 - i); |
| 338 } | 347 } |
| 339 int32_t iIndex = wsIndex.GetInteger(); | 348 int32_t iIndex = wsIndex.GetInteger(); |
| 340 m_iCreateCount = iIndex; | 349 m_iCreateCount = iIndex; |
| 341 return TRUE; | 350 return TRUE; |
| 342 } | 351 } |
| 343 return FALSE; | 352 return FALSE; |
| 344 } | 353 } |
| 354 |
| 345 FX_BOOL CXFA_NodeHelper::XFA_ResolveNodes_CreateNode( | 355 FX_BOOL CXFA_NodeHelper::XFA_ResolveNodes_CreateNode( |
| 346 CFX_WideString wsName, | 356 CFX_WideString wsName, |
| 347 CFX_WideString wsCondition, | 357 CFX_WideString wsCondition, |
| 348 FX_BOOL bLastNode, | 358 FX_BOOL bLastNode, |
| 349 CXFA_ScriptContext* pScriptContext) { | 359 CXFA_ScriptContext* pScriptContext) { |
| 350 if (m_pCreateParent == NULL) { | 360 if (m_pCreateParent == NULL) { |
| 351 return FALSE; | 361 return FALSE; |
| 352 } | 362 } |
| 353 FX_BOOL bIsClassName = FALSE; | 363 FX_BOOL bIsClassName = FALSE; |
| 354 FX_BOOL bResult = FALSE; | 364 FX_BOOL bResult = FALSE; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 } | 406 } |
| 397 bResult = TRUE; | 407 bResult = TRUE; |
| 398 } | 408 } |
| 399 } | 409 } |
| 400 } | 410 } |
| 401 if (!bResult) { | 411 if (!bResult) { |
| 402 m_pCreateParent = NULL; | 412 m_pCreateParent = NULL; |
| 403 } | 413 } |
| 404 return bResult; | 414 return bResult; |
| 405 } | 415 } |
| 416 |
| 406 void CXFA_NodeHelper::XFA_SetCreateNodeType(CXFA_Node* refNode) { | 417 void CXFA_NodeHelper::XFA_SetCreateNodeType(CXFA_Node* refNode) { |
| 407 if (refNode == NULL) { | 418 if (refNode == NULL) { |
| 408 return; | 419 return; |
| 409 } | 420 } |
| 410 if (refNode->GetClassID() == XFA_ELEMENT_Subform) { | 421 if (refNode->GetClassID() == XFA_ELEMENT_Subform) { |
| 411 m_eLastCreateType = XFA_ELEMENT_DataGroup; | 422 m_eLastCreateType = XFA_ELEMENT_DataGroup; |
| 412 } else if (refNode->GetClassID() == XFA_ELEMENT_Field) { | 423 } else if (refNode->GetClassID() == XFA_ELEMENT_Field) { |
| 413 m_eLastCreateType = XFA_FieldIsMultiListBox(refNode) | 424 m_eLastCreateType = XFA_FieldIsMultiListBox(refNode) |
| 414 ? XFA_ELEMENT_DataGroup | 425 ? XFA_ELEMENT_DataGroup |
| 415 : XFA_ELEMENT_DataValue; | 426 : XFA_ELEMENT_DataValue; |
| 416 } else if (refNode->GetClassID() == XFA_ELEMENT_ExclGroup) { | 427 } else if (refNode->GetClassID() == XFA_ELEMENT_ExclGroup) { |
| 417 m_eLastCreateType = XFA_ELEMENT_DataValue; | 428 m_eLastCreateType = XFA_ELEMENT_DataValue; |
| 418 } | 429 } |
| 419 } | 430 } |
| 431 |
| 420 FX_BOOL CXFA_NodeHelper::XFA_NodeIsProperty(CXFA_Node* refNode) { | 432 FX_BOOL CXFA_NodeHelper::XFA_NodeIsProperty(CXFA_Node* refNode) { |
| 421 CXFA_Node* parent = | 433 CXFA_Node* parent = |
| 422 XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent); | 434 XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent); |
| 423 return parent && refNode && | 435 return parent && refNode && |
| 424 XFA_GetPropertyOfElement(parent->GetClassID(), refNode->GetClassID(), | 436 XFA_GetPropertyOfElement(parent->GetClassID(), refNode->GetClassID(), |
| 425 XFA_XDPPACKET_UNKNOWN); | 437 XFA_XDPPACKET_UNKNOWN); |
| 426 } | 438 } |
| OLD | NEW |