| 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_document_datamerger_imp.h" | 7 #include "xfa/fxfa/parser/xfa_document_datamerger_imp.h" | 
| 8 | 8 | 
| 9 #include "core/fxcrt/fx_ext.h" | 9 #include "core/fxcrt/fx_ext.h" | 
| 10 #include "xfa/fde/xml/fde_xml_imp.h" | 10 #include "xfa/fde/xml/fde_xml_imp.h" | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 30   static CXFA_Node* GetParent(CXFA_Node* pDDGroupNode) { | 30   static CXFA_Node* GetParent(CXFA_Node* pDDGroupNode) { | 
| 31     return pDDGroupNode->GetNodeItem(XFA_NODEITEM_Parent); | 31     return pDDGroupNode->GetNodeItem(XFA_NODEITEM_Parent); | 
| 32   } | 32   } | 
| 33 }; | 33 }; | 
| 34 | 34 | 
| 35 struct RecurseRecord { | 35 struct RecurseRecord { | 
| 36   CXFA_Node* pTemplateChild; | 36   CXFA_Node* pTemplateChild; | 
| 37   CXFA_Node* pDataChild; | 37   CXFA_Node* pDataChild; | 
| 38 }; | 38 }; | 
| 39 | 39 | 
| 40 FX_BOOL GetOccurInfo(CXFA_Node* pOccurNode, | 40 bool GetOccurInfo(CXFA_Node* pOccurNode, | 
| 41                      int32_t& iMin, | 41                   int32_t& iMin, | 
| 42                      int32_t& iMax, | 42                   int32_t& iMax, | 
| 43                      int32_t& iInit) { | 43                   int32_t& iInit) { | 
| 44   if (!pOccurNode) | 44   if (!pOccurNode) | 
| 45     return FALSE; | 45     return false; | 
| 46 | 46 | 
| 47   CXFA_Occur occur(pOccurNode); | 47   CXFA_Occur occur(pOccurNode); | 
| 48   return occur.GetOccurInfo(iMin, iMax, iInit); | 48   return occur.GetOccurInfo(iMin, iMax, iInit); | 
| 49 } | 49 } | 
| 50 | 50 | 
| 51 CXFA_Node* FormValueNode_CreateChild(CXFA_Node* pValueNode, XFA_Element iType) { | 51 CXFA_Node* FormValueNode_CreateChild(CXFA_Node* pValueNode, XFA_Element iType) { | 
| 52   CXFA_Node* pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 52   CXFA_Node* pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 
| 53   if (!pChildNode) { | 53   if (!pChildNode) { | 
| 54     if (iType == XFA_Element::Unknown) | 54     if (iType == XFA_Element::Unknown) | 
| 55       return nullptr; | 55       return nullptr; | 
| 56     pChildNode = pValueNode->GetProperty(0, iType); | 56     pChildNode = pValueNode->GetProperty(0, iType); | 
| 57   } | 57   } | 
| 58   return pChildNode; | 58   return pChildNode; | 
| 59 } | 59 } | 
| 60 | 60 | 
| 61 void FormValueNode_MatchNoneCreateChild(CXFA_Node* pFormNode) { | 61 void FormValueNode_MatchNoneCreateChild(CXFA_Node* pFormNode) { | 
| 62   CXFA_WidgetData* pWidgetData = pFormNode->GetWidgetData(); | 62   CXFA_WidgetData* pWidgetData = pFormNode->GetWidgetData(); | 
| 63   ASSERT(pWidgetData); | 63   ASSERT(pWidgetData); | 
| 64   pWidgetData->GetUIType(); | 64   pWidgetData->GetUIType(); | 
| 65 } | 65 } | 
| 66 | 66 | 
| 67 FX_BOOL FormValueNode_SetChildContent( | 67 bool FormValueNode_SetChildContent(CXFA_Node* pValueNode, | 
| 68     CXFA_Node* pValueNode, | 68                                    const CFX_WideString& wsContent, | 
| 69     const CFX_WideString& wsContent, | 69                                    XFA_Element iType = XFA_Element::Unknown) { | 
| 70     XFA_Element iType = XFA_Element::Unknown) { |  | 
| 71   if (!pValueNode) | 70   if (!pValueNode) | 
| 72     return FALSE; | 71     return false; | 
| 73 | 72 | 
| 74   ASSERT(pValueNode->GetPacketID() == XFA_XDPPACKET_Form); | 73   ASSERT(pValueNode->GetPacketID() == XFA_XDPPACKET_Form); | 
| 75   CXFA_Node* pChildNode = FormValueNode_CreateChild(pValueNode, iType); | 74   CXFA_Node* pChildNode = FormValueNode_CreateChild(pValueNode, iType); | 
| 76   if (!pChildNode) | 75   if (!pChildNode) | 
| 77     return FALSE; | 76     return false; | 
| 78 | 77 | 
| 79   switch (pChildNode->GetObjectType()) { | 78   switch (pChildNode->GetObjectType()) { | 
| 80     case XFA_ObjectType::ContentNode: { | 79     case XFA_ObjectType::ContentNode: { | 
| 81       CXFA_Node* pContentRawDataNode = | 80       CXFA_Node* pContentRawDataNode = | 
| 82           pChildNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 81           pChildNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 
| 83       if (!pContentRawDataNode) { | 82       if (!pContentRawDataNode) { | 
| 84         XFA_Element element = XFA_Element::Sharptext; | 83         XFA_Element element = XFA_Element::Sharptext; | 
| 85         if (pChildNode->GetElementType() == XFA_Element::ExData) { | 84         if (pChildNode->GetElementType() == XFA_Element::ExData) { | 
| 86           CFX_WideString wsContentType; | 85           CFX_WideString wsContentType; | 
| 87           pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, | 86           pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, | 
| 88                                    FALSE); | 87                                    false); | 
| 89           if (wsContentType == FX_WSTRC(L"text/html")) | 88           if (wsContentType == FX_WSTRC(L"text/html")) | 
| 90             element = XFA_Element::SharpxHTML; | 89             element = XFA_Element::SharpxHTML; | 
| 91           else if (wsContentType == FX_WSTRC(L"text/xml")) | 90           else if (wsContentType == FX_WSTRC(L"text/xml")) | 
| 92             element = XFA_Element::Sharpxml; | 91             element = XFA_Element::Sharpxml; | 
| 93         } | 92         } | 
| 94         pContentRawDataNode = pChildNode->CreateSamePacketNode(element); | 93         pContentRawDataNode = pChildNode->CreateSamePacketNode(element); | 
| 95         pChildNode->InsertChild(pContentRawDataNode); | 94         pChildNode->InsertChild(pContentRawDataNode); | 
| 96       } | 95       } | 
| 97       pContentRawDataNode->SetCData(XFA_ATTRIBUTE_Value, wsContent); | 96       pContentRawDataNode->SetCData(XFA_ATTRIBUTE_Value, wsContent); | 
| 98       break; | 97       break; | 
| 99     } | 98     } | 
| 100     case XFA_ObjectType::NodeC: | 99     case XFA_ObjectType::NodeC: | 
| 101     case XFA_ObjectType::TextNode: | 100     case XFA_ObjectType::TextNode: | 
| 102     case XFA_ObjectType::NodeV: { | 101     case XFA_ObjectType::NodeV: { | 
| 103       pChildNode->SetCData(XFA_ATTRIBUTE_Value, wsContent); | 102       pChildNode->SetCData(XFA_ATTRIBUTE_Value, wsContent); | 
| 104       break; | 103       break; | 
| 105     } | 104     } | 
| 106     default: | 105     default: | 
| 107       ASSERT(FALSE); | 106       ASSERT(false); | 
| 108       break; | 107       break; | 
| 109   } | 108   } | 
| 110   return TRUE; | 109   return true; | 
| 111 } | 110 } | 
| 112 | 111 | 
| 113 void CreateDataBinding(CXFA_Node* pFormNode, | 112 void CreateDataBinding(CXFA_Node* pFormNode, | 
| 114                        CXFA_Node* pDataNode, | 113                        CXFA_Node* pDataNode, | 
| 115                        FX_BOOL bDataToForm) { | 114                        bool bDataToForm) { | 
| 116   pFormNode->SetObject(XFA_ATTRIBUTE_BindingNode, pDataNode); | 115   pFormNode->SetObject(XFA_ATTRIBUTE_BindingNode, pDataNode); | 
| 117   pDataNode->AddBindItem(pFormNode); | 116   pDataNode->AddBindItem(pFormNode); | 
| 118   XFA_Element eType = pFormNode->GetElementType(); | 117   XFA_Element eType = pFormNode->GetElementType(); | 
| 119   if (eType != XFA_Element::Field && eType != XFA_Element::ExclGroup) | 118   if (eType != XFA_Element::Field && eType != XFA_Element::ExclGroup) | 
| 120     return; | 119     return; | 
| 121 | 120 | 
| 122   CXFA_WidgetData* pWidgetData = pFormNode->GetWidgetData(); | 121   CXFA_WidgetData* pWidgetData = pFormNode->GetWidgetData(); | 
| 123   ASSERT(pWidgetData); | 122   ASSERT(pWidgetData); | 
| 124   XFA_Element eUIType = pWidgetData->GetUIType(); | 123   XFA_Element eUIType = pWidgetData->GetUIType(); | 
| 125   CXFA_Value defValue(pFormNode->GetProperty(0, XFA_Element::Value)); | 124   CXFA_Value defValue(pFormNode->GetProperty(0, XFA_Element::Value)); | 
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 315         FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, | 314         FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, | 
| 316                                       XFA_Element::Text); | 315                                       XFA_Element::Text); | 
| 317       } | 316       } | 
| 318       break; | 317       break; | 
| 319     case XFA_Element::CheckButton: | 318     case XFA_Element::CheckButton: | 
| 320       FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, | 319       FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, | 
| 321                                     XFA_Element::Text); | 320                                     XFA_Element::Text); | 
| 322       break; | 321       break; | 
| 323     case XFA_Element::ExclGroup: { | 322     case XFA_Element::ExclGroup: { | 
| 324       pWidgetData->SetSelectedMemberByValue(wsNormalizeValue.AsStringC(), false, | 323       pWidgetData->SetSelectedMemberByValue(wsNormalizeValue.AsStringC(), false, | 
| 325                                             FALSE, FALSE); | 324                                             false, false); | 
| 326       break; | 325       break; | 
| 327     } | 326     } | 
| 328     case XFA_Element::DateTimeEdit: | 327     case XFA_Element::DateTimeEdit: | 
| 329       FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, | 328       FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, | 
| 330                                     XFA_Element::DateTime); | 329                                     XFA_Element::DateTime); | 
| 331       break; | 330       break; | 
| 332     case XFA_Element::NumericEdit: { | 331     case XFA_Element::NumericEdit: { | 
| 333       CFX_WideString wsPicture; | 332       CFX_WideString wsPicture; | 
| 334       pWidgetData->GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind); | 333       pWidgetData->GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind); | 
| 335       if (wsPicture.IsEmpty()) { | 334       if (wsPicture.IsEmpty()) { | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 361 | 360 | 
| 362 void RegisterGlobalBinding(CXFA_Document* pDocument, | 361 void RegisterGlobalBinding(CXFA_Document* pDocument, | 
| 363                            uint32_t dwNameHash, | 362                            uint32_t dwNameHash, | 
| 364                            CXFA_Node* pDataNode) { | 363                            CXFA_Node* pDataNode) { | 
| 365   pDocument->m_rgGlobalBinding.SetAt(dwNameHash, pDataNode); | 364   pDocument->m_rgGlobalBinding.SetAt(dwNameHash, pDataNode); | 
| 366 } | 365 } | 
| 367 | 366 | 
| 368 CXFA_Node* ScopeMatchGlobalBinding(CXFA_Node* pDataScope, | 367 CXFA_Node* ScopeMatchGlobalBinding(CXFA_Node* pDataScope, | 
| 369                                    uint32_t dwNameHash, | 368                                    uint32_t dwNameHash, | 
| 370                                    XFA_Element eMatchDataNodeType, | 369                                    XFA_Element eMatchDataNodeType, | 
| 371                                    FX_BOOL bUpLevel) { | 370                                    bool bUpLevel) { | 
| 372   for (CXFA_Node *pCurDataScope = pDataScope, *pLastDataScope = nullptr; | 371   for (CXFA_Node *pCurDataScope = pDataScope, *pLastDataScope = nullptr; | 
| 373        pCurDataScope && pCurDataScope->GetPacketID() == XFA_XDPPACKET_Datasets; | 372        pCurDataScope && pCurDataScope->GetPacketID() == XFA_XDPPACKET_Datasets; | 
| 374        pLastDataScope = pCurDataScope, | 373        pLastDataScope = pCurDataScope, | 
| 375                  pCurDataScope = | 374                  pCurDataScope = | 
| 376                      pCurDataScope->GetNodeItem(XFA_NODEITEM_Parent)) { | 375                      pCurDataScope->GetNodeItem(XFA_NODEITEM_Parent)) { | 
| 377     for (CXFA_Node* pDataChild = pCurDataScope->GetFirstChildByName(dwNameHash); | 376     for (CXFA_Node* pDataChild = pCurDataScope->GetFirstChildByName(dwNameHash); | 
| 378          pDataChild; | 377          pDataChild; | 
| 379          pDataChild = pDataChild->GetNextSameNameSibling(dwNameHash)) { | 378          pDataChild = pDataChild->GetNextSameNameSibling(dwNameHash)) { | 
| 380       if (pDataChild == pLastDataScope || | 379       if (pDataChild == pLastDataScope || | 
| 381           (eMatchDataNodeType != XFA_Element::DataModel && | 380           (eMatchDataNodeType != XFA_Element::DataModel && | 
| 382            pDataChild->GetElementType() != eMatchDataNodeType) || | 381            pDataChild->GetElementType() != eMatchDataNodeType) || | 
| 383           pDataChild->HasBindItem()) { | 382           pDataChild->HasBindItem()) { | 
| 384         continue; | 383         continue; | 
| 385       } | 384       } | 
| 386       return pDataChild; | 385       return pDataChild; | 
| 387     } | 386     } | 
| 388 | 387 | 
| 389     for (CXFA_Node* pDataChild = | 388     for (CXFA_Node* pDataChild = | 
| 390              pCurDataScope->GetFirstChildByClass(XFA_Element::DataGroup); | 389              pCurDataScope->GetFirstChildByClass(XFA_Element::DataGroup); | 
| 391          pDataChild; pDataChild = pDataChild->GetNextSameClassSibling( | 390          pDataChild; pDataChild = pDataChild->GetNextSameClassSibling( | 
| 392                          XFA_Element::DataGroup)) { | 391                          XFA_Element::DataGroup)) { | 
| 393       CXFA_Node* pDataNode = ScopeMatchGlobalBinding(pDataChild, dwNameHash, | 392       CXFA_Node* pDataNode = ScopeMatchGlobalBinding(pDataChild, dwNameHash, | 
| 394                                                      eMatchDataNodeType, FALSE); | 393                                                      eMatchDataNodeType, false); | 
| 395       if (pDataNode) | 394       if (pDataNode) | 
| 396         return pDataNode; | 395         return pDataNode; | 
| 397     } | 396     } | 
| 398     if (!bUpLevel) | 397     if (!bUpLevel) | 
| 399       break; | 398       break; | 
| 400   } | 399   } | 
| 401   return nullptr; | 400   return nullptr; | 
| 402 } | 401 } | 
| 403 | 402 | 
| 404 CXFA_Node* FindGlobalDataNode(CXFA_Document* pDocument, | 403 CXFA_Node* FindGlobalDataNode(CXFA_Document* pDocument, | 
| 405                               CFX_WideStringC wsName, | 404                               CFX_WideStringC wsName, | 
| 406                               CXFA_Node* pDataScope, | 405                               CXFA_Node* pDataScope, | 
| 407                               XFA_Element eMatchNodeType) { | 406                               XFA_Element eMatchNodeType) { | 
| 408   if (wsName.IsEmpty()) | 407   if (wsName.IsEmpty()) | 
| 409     return nullptr; | 408     return nullptr; | 
| 410 | 409 | 
| 411   uint32_t dwNameHash = FX_HashCode_GetW(wsName, false); | 410   uint32_t dwNameHash = FX_HashCode_GetW(wsName, false); | 
| 412   CXFA_Node* pBounded = GetGlobalBinding(pDocument, dwNameHash); | 411   CXFA_Node* pBounded = GetGlobalBinding(pDocument, dwNameHash); | 
| 413   if (!pBounded) { | 412   if (!pBounded) { | 
| 414     pBounded = | 413     pBounded = | 
| 415         ScopeMatchGlobalBinding(pDataScope, dwNameHash, eMatchNodeType, TRUE); | 414         ScopeMatchGlobalBinding(pDataScope, dwNameHash, eMatchNodeType, true); | 
| 416     if (pBounded) | 415     if (pBounded) | 
| 417       RegisterGlobalBinding(pDocument, dwNameHash, pBounded); | 416       RegisterGlobalBinding(pDocument, dwNameHash, pBounded); | 
| 418   } | 417   } | 
| 419   return pBounded; | 418   return pBounded; | 
| 420 } | 419 } | 
| 421 | 420 | 
| 422 CXFA_Node* FindOnceDataNode(CXFA_Document* pDocument, | 421 CXFA_Node* FindOnceDataNode(CXFA_Document* pDocument, | 
| 423                             CFX_WideStringC wsName, | 422                             CFX_WideStringC wsName, | 
| 424                             CXFA_Node* pDataScope, | 423                             CXFA_Node* pDataScope, | 
| 425                             XFA_Element eMatchNodeType) { | 424                             XFA_Element eMatchNodeType) { | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 444     pLastDataScope = pCurDataScope; | 443     pLastDataScope = pCurDataScope; | 
| 445   } | 444   } | 
| 446   return nullptr; | 445   return nullptr; | 
| 447 } | 446 } | 
| 448 | 447 | 
| 449 CXFA_Node* FindDataRefDataNode(CXFA_Document* pDocument, | 448 CXFA_Node* FindDataRefDataNode(CXFA_Document* pDocument, | 
| 450                                CFX_WideStringC wsRef, | 449                                CFX_WideStringC wsRef, | 
| 451                                CXFA_Node* pDataScope, | 450                                CXFA_Node* pDataScope, | 
| 452                                XFA_Element eMatchNodeType, | 451                                XFA_Element eMatchNodeType, | 
| 453                                CXFA_Node* pTemplateNode, | 452                                CXFA_Node* pTemplateNode, | 
| 454                                FX_BOOL bForceBind, | 453                                bool bForceBind, | 
| 455                                FX_BOOL bUpLevel) { | 454                                bool bUpLevel) { | 
| 456   uint32_t dFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_BindNew; | 455   uint32_t dFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_BindNew; | 
| 457   if (bUpLevel || wsRef != FX_WSTRC(L"name")) | 456   if (bUpLevel || wsRef != FX_WSTRC(L"name")) | 
| 458     dFlags |= (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings); | 457     dFlags |= (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings); | 
| 459 | 458 | 
| 460   XFA_RESOLVENODE_RS rs; | 459   XFA_RESOLVENODE_RS rs; | 
| 461   pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs, dFlags, | 460   pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs, dFlags, | 
| 462                                                 pTemplateNode); | 461                                                 pTemplateNode); | 
| 463   if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeAll || | 462   if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeAll || | 
| 464       rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll || | 463       rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll || | 
| 465       rs.nodes.GetSize() > 1) { | 464       rs.nodes.GetSize() > 1) { | 
| 466     return pDocument->GetNotBindNode(rs.nodes); | 465     return pDocument->GetNotBindNode(rs.nodes); | 
| 467   } | 466   } | 
| 468 | 467 | 
| 469   if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) { | 468   if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) { | 
| 470     CXFA_Object* pObject = (rs.nodes.GetSize() > 0) ? rs.nodes[0] : nullptr; | 469     CXFA_Object* pObject = (rs.nodes.GetSize() > 0) ? rs.nodes[0] : nullptr; | 
| 471     CXFA_Node* pNode = ToNode(pObject); | 470     CXFA_Node* pNode = ToNode(pObject); | 
| 472     return (bForceBind || !pNode || !pNode->HasBindItem()) ? pNode : nullptr; | 471     return (bForceBind || !pNode || !pNode->HasBindItem()) ? pNode : nullptr; | 
| 473   } | 472   } | 
| 474   return nullptr; | 473   return nullptr; | 
| 475 } | 474 } | 
| 476 | 475 | 
| 477 FX_BOOL NeedGenerateForm(CXFA_Node* pTemplateChild, | 476 bool NeedGenerateForm(CXFA_Node* pTemplateChild, bool bUseInstanceManager) { | 
| 478                          FX_BOOL bUseInstanceManager) { |  | 
| 479   XFA_Element eType = pTemplateChild->GetElementType(); | 477   XFA_Element eType = pTemplateChild->GetElementType(); | 
| 480   if (eType == XFA_Element::Variables) | 478   if (eType == XFA_Element::Variables) | 
| 481     return TRUE; | 479     return true; | 
| 482   if (pTemplateChild->IsContainerNode()) | 480   if (pTemplateChild->IsContainerNode()) | 
| 483     return FALSE; | 481     return false; | 
| 484   if (eType == XFA_Element::Proto || | 482   if (eType == XFA_Element::Proto || | 
| 485       (bUseInstanceManager && eType == XFA_Element::Occur)) { | 483       (bUseInstanceManager && eType == XFA_Element::Occur)) { | 
| 486     return FALSE; | 484     return false; | 
| 487   } | 485   } | 
| 488   return TRUE; | 486   return true; | 
| 489 } | 487 } | 
| 490 | 488 | 
| 491 CXFA_Node* CloneOrMergeInstanceManager(CXFA_Document* pDocument, | 489 CXFA_Node* CloneOrMergeInstanceManager(CXFA_Document* pDocument, | 
| 492                                        CXFA_Node* pFormParent, | 490                                        CXFA_Node* pFormParent, | 
| 493                                        CXFA_Node* pTemplateNode, | 491                                        CXFA_Node* pTemplateNode, | 
| 494                                        CXFA_NodeArray& subforms) { | 492                                        CXFA_NodeArray& subforms) { | 
| 495   CFX_WideStringC wsSubformName = pTemplateNode->GetCData(XFA_ATTRIBUTE_Name); | 493   CFX_WideStringC wsSubformName = pTemplateNode->GetCData(XFA_ATTRIBUTE_Name); | 
| 496   CFX_WideString wsInstMgrNodeName = FX_WSTRC(L"_") + wsSubformName; | 494   CFX_WideString wsInstMgrNodeName = FX_WSTRC(L"_") + wsSubformName; | 
| 497   uint32_t dwInstNameHash = | 495   uint32_t dwInstNameHash = | 
| 498       FX_HashCode_GetW(wsInstMgrNodeName.AsStringC(), false); | 496       FX_HashCode_GetW(wsInstMgrNodeName.AsStringC(), false); | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 534   pNewNode->SetCData(XFA_ATTRIBUTE_Name, wsInstMgrNodeName); | 532   pNewNode->SetCData(XFA_ATTRIBUTE_Name, wsInstMgrNodeName); | 
| 535   pFormParent->InsertChild(pNewNode, nullptr); | 533   pFormParent->InsertChild(pNewNode, nullptr); | 
| 536   pNewNode->SetTemplateNode(pTemplateNode); | 534   pNewNode->SetTemplateNode(pTemplateNode); | 
| 537   return pNewNode; | 535   return pNewNode; | 
| 538 } | 536 } | 
| 539 | 537 | 
| 540 CXFA_Node* FindMatchingDataNode( | 538 CXFA_Node* FindMatchingDataNode( | 
| 541     CXFA_Document* pDocument, | 539     CXFA_Document* pDocument, | 
| 542     CXFA_Node* pTemplateNode, | 540     CXFA_Node* pTemplateNode, | 
| 543     CXFA_Node* pDataScope, | 541     CXFA_Node* pDataScope, | 
| 544     FX_BOOL& bAccessedDataDOM, | 542     bool& bAccessedDataDOM, | 
| 545     FX_BOOL bForceBind, | 543     bool bForceBind, | 
| 546     CXFA_NodeIteratorTemplate<CXFA_Node, | 544     CXFA_NodeIteratorTemplate<CXFA_Node, | 
| 547                               CXFA_TraverseStrategy_XFAContainerNode>* | 545                               CXFA_TraverseStrategy_XFAContainerNode>* | 
| 548         pIterator, | 546         pIterator, | 
| 549     FX_BOOL& bSelfMatch, | 547     bool& bSelfMatch, | 
| 550     XFA_ATTRIBUTEENUM& eBindMatch, | 548     XFA_ATTRIBUTEENUM& eBindMatch, | 
| 551     FX_BOOL bUpLevel) { | 549     bool bUpLevel) { | 
| 552   FX_BOOL bOwnIterator = FALSE; | 550   bool bOwnIterator = false; | 
| 553   if (!pIterator) { | 551   if (!pIterator) { | 
| 554     bOwnIterator = TRUE; | 552     bOwnIterator = true; | 
| 555     pIterator = new CXFA_NodeIteratorTemplate< | 553     pIterator = new CXFA_NodeIteratorTemplate< | 
| 556         CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode>(pTemplateNode); | 554         CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode>(pTemplateNode); | 
| 557   } | 555   } | 
| 558 | 556 | 
| 559   CXFA_Node* pResult = nullptr; | 557   CXFA_Node* pResult = nullptr; | 
| 560   for (CXFA_Node* pCurTemplateNode = pIterator->GetCurrent(); | 558   for (CXFA_Node* pCurTemplateNode = pIterator->GetCurrent(); | 
| 561        pCurTemplateNode;) { | 559        pCurTemplateNode;) { | 
| 562     XFA_Element eMatchNodeType; | 560     XFA_Element eMatchNodeType; | 
| 563     switch (pCurTemplateNode->GetElementType()) { | 561     switch (pCurTemplateNode->GetElementType()) { | 
| 564       case XFA_Element::Subform: | 562       case XFA_Element::Subform: | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 589         pCurTemplateNode->GetFirstChildByClass(XFA_Element::Bind); | 587         pCurTemplateNode->GetFirstChildByClass(XFA_Element::Bind); | 
| 590     XFA_ATTRIBUTEENUM eMatch = | 588     XFA_ATTRIBUTEENUM eMatch = | 
| 591         pTemplateNodeBind ? pTemplateNodeBind->GetEnum(XFA_ATTRIBUTE_Match) | 589         pTemplateNodeBind ? pTemplateNodeBind->GetEnum(XFA_ATTRIBUTE_Match) | 
| 592                           : XFA_ATTRIBUTEENUM_Once; | 590                           : XFA_ATTRIBUTEENUM_Once; | 
| 593     eBindMatch = eMatch; | 591     eBindMatch = eMatch; | 
| 594     switch (eMatch) { | 592     switch (eMatch) { | 
| 595       case XFA_ATTRIBUTEENUM_None: | 593       case XFA_ATTRIBUTEENUM_None: | 
| 596         pCurTemplateNode = pIterator->MoveToNext(); | 594         pCurTemplateNode = pIterator->MoveToNext(); | 
| 597         continue; | 595         continue; | 
| 598       case XFA_ATTRIBUTEENUM_Global: | 596       case XFA_ATTRIBUTEENUM_Global: | 
| 599         bAccessedDataDOM = TRUE; | 597         bAccessedDataDOM = true; | 
| 600         if (!bForceBind) { | 598         if (!bForceBind) { | 
| 601           pCurTemplateNode = pIterator->MoveToNext(); | 599           pCurTemplateNode = pIterator->MoveToNext(); | 
| 602           continue; | 600           continue; | 
| 603         } | 601         } | 
| 604         if (eMatchNodeType == XFA_Element::DataValue || | 602         if (eMatchNodeType == XFA_Element::DataValue || | 
| 605             (eMatchNodeType == XFA_Element::DataGroup && | 603             (eMatchNodeType == XFA_Element::DataGroup && | 
| 606              XFA_FieldIsMultiListBox(pTemplateNodeBind))) { | 604              XFA_FieldIsMultiListBox(pTemplateNodeBind))) { | 
| 607           CXFA_Node* pGlobalBindNode = FindGlobalDataNode( | 605           CXFA_Node* pGlobalBindNode = FindGlobalDataNode( | 
| 608               pDocument, pCurTemplateNode->GetCData(XFA_ATTRIBUTE_Name), | 606               pDocument, pCurTemplateNode->GetCData(XFA_ATTRIBUTE_Name), | 
| 609               pDataScope, eMatchNodeType); | 607               pDataScope, eMatchNodeType); | 
| 610           if (!pGlobalBindNode) { | 608           if (!pGlobalBindNode) { | 
| 611             pCurTemplateNode = pIterator->MoveToNext(); | 609             pCurTemplateNode = pIterator->MoveToNext(); | 
| 612             continue; | 610             continue; | 
| 613           } | 611           } | 
| 614           pResult = pGlobalBindNode; | 612           pResult = pGlobalBindNode; | 
| 615           break; | 613           break; | 
| 616         } | 614         } | 
| 617       case XFA_ATTRIBUTEENUM_Once: { | 615       case XFA_ATTRIBUTEENUM_Once: { | 
| 618         bAccessedDataDOM = TRUE; | 616         bAccessedDataDOM = true; | 
| 619         CXFA_Node* pOnceBindNode = FindOnceDataNode( | 617         CXFA_Node* pOnceBindNode = FindOnceDataNode( | 
| 620             pDocument, pCurTemplateNode->GetCData(XFA_ATTRIBUTE_Name), | 618             pDocument, pCurTemplateNode->GetCData(XFA_ATTRIBUTE_Name), | 
| 621             pDataScope, eMatchNodeType); | 619             pDataScope, eMatchNodeType); | 
| 622         if (!pOnceBindNode) { | 620         if (!pOnceBindNode) { | 
| 623           pCurTemplateNode = pIterator->MoveToNext(); | 621           pCurTemplateNode = pIterator->MoveToNext(); | 
| 624           continue; | 622           continue; | 
| 625         } | 623         } | 
| 626         pResult = pOnceBindNode; | 624         pResult = pOnceBindNode; | 
| 627         break; | 625         break; | 
| 628       } | 626       } | 
| 629       case XFA_ATTRIBUTEENUM_DataRef: { | 627       case XFA_ATTRIBUTEENUM_DataRef: { | 
| 630         bAccessedDataDOM = TRUE; | 628         bAccessedDataDOM = true; | 
| 631         CXFA_Node* pDataRefBindNode = FindDataRefDataNode( | 629         CXFA_Node* pDataRefBindNode = FindDataRefDataNode( | 
| 632             pDocument, pTemplateNodeBind->GetCData(XFA_ATTRIBUTE_Ref), | 630             pDocument, pTemplateNodeBind->GetCData(XFA_ATTRIBUTE_Ref), | 
| 633             pDataScope, eMatchNodeType, pTemplateNode, bForceBind, bUpLevel); | 631             pDataScope, eMatchNodeType, pTemplateNode, bForceBind, bUpLevel); | 
| 634         if (pDataRefBindNode && | 632         if (pDataRefBindNode && | 
| 635             pDataRefBindNode->GetElementType() == eMatchNodeType) { | 633             pDataRefBindNode->GetElementType() == eMatchNodeType) { | 
| 636           pResult = pDataRefBindNode; | 634           pResult = pDataRefBindNode; | 
| 637         } | 635         } | 
| 638         if (!pResult) { | 636         if (!pResult) { | 
| 639           pCurTemplateNode = pIterator->SkipChildrenAndMoveToNext(); | 637           pCurTemplateNode = pIterator->SkipChildrenAndMoveToNext(); | 
| 640           continue; | 638           continue; | 
| 641         } | 639         } | 
| 642         break; | 640         break; | 
| 643       } | 641       } | 
| 644       default: | 642       default: | 
| 645         break; | 643         break; | 
| 646     } | 644     } | 
| 647     if (pCurTemplateNode == pTemplateNode && pResult) | 645     if (pCurTemplateNode == pTemplateNode && pResult) | 
| 648       bSelfMatch = TRUE; | 646       bSelfMatch = true; | 
| 649     break; | 647     break; | 
| 650   } | 648   } | 
| 651   if (bOwnIterator) | 649   if (bOwnIterator) | 
| 652     delete pIterator; | 650     delete pIterator; | 
| 653   return pResult; | 651   return pResult; | 
| 654 } | 652 } | 
| 655 | 653 | 
| 656 void SortRecurseRecord(CFX_ArrayTemplate<RecurseRecord>& rgRecords, | 654 void SortRecurseRecord(CFX_ArrayTemplate<RecurseRecord>& rgRecords, | 
| 657                        CXFA_Node* pDataScope, | 655                        CXFA_Node* pDataScope, | 
| 658                        FX_BOOL bChoiceMode) { | 656                        bool bChoiceMode) { | 
| 659   int32_t iCount = rgRecords.GetSize(); | 657   int32_t iCount = rgRecords.GetSize(); | 
| 660   CFX_ArrayTemplate<RecurseRecord> rgResultRecord; | 658   CFX_ArrayTemplate<RecurseRecord> rgResultRecord; | 
| 661   for (CXFA_Node* pChildNode = pDataScope->GetNodeItem(XFA_NODEITEM_FirstChild); | 659   for (CXFA_Node* pChildNode = pDataScope->GetNodeItem(XFA_NODEITEM_FirstChild); | 
| 662        pChildNode; | 660        pChildNode; | 
| 663        pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | 661        pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | 
| 664     for (int32_t i = 0; i < iCount; i++) { | 662     for (int32_t i = 0; i < iCount; i++) { | 
| 665       CXFA_Node* pNode = rgRecords[i].pDataChild; | 663       CXFA_Node* pNode = rgRecords[i].pDataChild; | 
| 666       if (pChildNode == pNode) { | 664       if (pChildNode == pNode) { | 
| 667         RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild, pNode}; | 665         RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild, pNode}; | 
| 668         rgResultRecord.Add(sNewRecord); | 666         rgResultRecord.Add(sNewRecord); | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 685     } | 683     } | 
| 686     rgRecords.RemoveAll(); | 684     rgRecords.RemoveAll(); | 
| 687     rgRecords.Copy(rgResultRecord); | 685     rgRecords.Copy(rgResultRecord); | 
| 688   } | 686   } | 
| 689 } | 687 } | 
| 690 | 688 | 
| 691 CXFA_Node* CopyContainer_SubformSet(CXFA_Document* pDocument, | 689 CXFA_Node* CopyContainer_SubformSet(CXFA_Document* pDocument, | 
| 692                                     CXFA_Node* pTemplateNode, | 690                                     CXFA_Node* pTemplateNode, | 
| 693                                     CXFA_Node* pFormParentNode, | 691                                     CXFA_Node* pFormParentNode, | 
| 694                                     CXFA_Node* pDataScope, | 692                                     CXFA_Node* pDataScope, | 
| 695                                     FX_BOOL bOneInstance, | 693                                     bool bOneInstance, | 
| 696                                     FX_BOOL bDataMerge) { | 694                                     bool bDataMerge) { | 
| 697   XFA_Element eType = pTemplateNode->GetElementType(); | 695   XFA_Element eType = pTemplateNode->GetElementType(); | 
| 698   CXFA_Node* pOccurNode = nullptr; | 696   CXFA_Node* pOccurNode = nullptr; | 
| 699   CXFA_Node* pFirstInstance = nullptr; | 697   CXFA_Node* pFirstInstance = nullptr; | 
| 700   FX_BOOL bUseInstanceManager = | 698   bool bUseInstanceManager = | 
| 701       pFormParentNode->GetElementType() != XFA_Element::Area; | 699       pFormParentNode->GetElementType() != XFA_Element::Area; | 
| 702   CXFA_Node* pInstMgrNode = nullptr; | 700   CXFA_Node* pInstMgrNode = nullptr; | 
| 703   CXFA_NodeArray subformArray; | 701   CXFA_NodeArray subformArray; | 
| 704   CXFA_NodeArray* pSearchArray = nullptr; | 702   CXFA_NodeArray* pSearchArray = nullptr; | 
| 705   if (!bOneInstance && | 703   if (!bOneInstance && | 
| 706       (eType == XFA_Element::SubformSet || eType == XFA_Element::Subform)) { | 704       (eType == XFA_Element::SubformSet || eType == XFA_Element::Subform)) { | 
| 707     pInstMgrNode = bUseInstanceManager ? CloneOrMergeInstanceManager( | 705     pInstMgrNode = bUseInstanceManager ? CloneOrMergeInstanceManager( | 
| 708                                              pDocument, pFormParentNode, | 706                                              pDocument, pFormParentNode, | 
| 709                                              pTemplateNode, subformArray) | 707                                              pTemplateNode, subformArray) | 
| 710                                        : nullptr; | 708                                        : nullptr; | 
| 711     if (CXFA_Node* pOccurTemplateNode = | 709     if (CXFA_Node* pOccurTemplateNode = | 
| 712             pTemplateNode->GetFirstChildByClass(XFA_Element::Occur)) { | 710             pTemplateNode->GetFirstChildByClass(XFA_Element::Occur)) { | 
| 713       pOccurNode = pInstMgrNode ? XFA_NodeMerge_CloneOrMergeContainer( | 711       pOccurNode = pInstMgrNode ? XFA_NodeMerge_CloneOrMergeContainer( | 
| 714                                       pDocument, pInstMgrNode, | 712                                       pDocument, pInstMgrNode, | 
| 715                                       pOccurTemplateNode, FALSE, nullptr) | 713                                       pOccurTemplateNode, false, nullptr) | 
| 716                                 : pOccurTemplateNode; | 714                                 : pOccurTemplateNode; | 
| 717     } else if (pInstMgrNode) { | 715     } else if (pInstMgrNode) { | 
| 718       pOccurNode = pInstMgrNode->GetFirstChildByClass(XFA_Element::Occur); | 716       pOccurNode = pInstMgrNode->GetFirstChildByClass(XFA_Element::Occur); | 
| 719       if (pOccurNode) | 717       if (pOccurNode) | 
| 720         pOccurNode->ClearFlag(XFA_NodeFlag_UnusedNode); | 718         pOccurNode->ClearFlag(XFA_NodeFlag_UnusedNode); | 
| 721     } | 719     } | 
| 722     if (pInstMgrNode) { | 720     if (pInstMgrNode) { | 
| 723       pInstMgrNode->SetFlag(XFA_NodeFlag_Initialized, true); | 721       pInstMgrNode->SetFlag(XFA_NodeFlag_Initialized, true); | 
| 724       pSearchArray = &subformArray; | 722       pSearchArray = &subformArray; | 
| 725       if (pFormParentNode->GetElementType() == XFA_Element::PageArea) { | 723       if (pFormParentNode->GetElementType() == XFA_Element::PageArea) { | 
| 726         bOneInstance = TRUE; | 724         bOneInstance = true; | 
| 727         if (subformArray.GetSize() < 1) | 725         if (subformArray.GetSize() < 1) | 
| 728           pSearchArray = nullptr; | 726           pSearchArray = nullptr; | 
| 729       } else if ((pTemplateNode->GetNameHash() == 0) && | 727       } else if ((pTemplateNode->GetNameHash() == 0) && | 
| 730                  (subformArray.GetSize() < 1)) { | 728                  (subformArray.GetSize() < 1)) { | 
| 731         pSearchArray = nullptr; | 729         pSearchArray = nullptr; | 
| 732       } | 730       } | 
| 733     } | 731     } | 
| 734   } | 732   } | 
| 735 | 733 | 
| 736   int32_t iMax = 1; | 734   int32_t iMax = 1; | 
| 737   int32_t iInit = 1; | 735   int32_t iInit = 1; | 
| 738   int32_t iMin = 1; | 736   int32_t iMin = 1; | 
| 739   if (!bOneInstance) | 737   if (!bOneInstance) | 
| 740     GetOccurInfo(pOccurNode, iMin, iMax, iInit); | 738     GetOccurInfo(pOccurNode, iMin, iMax, iInit); | 
| 741 | 739 | 
| 742   XFA_ATTRIBUTEENUM eRelation = | 740   XFA_ATTRIBUTEENUM eRelation = | 
| 743       eType == XFA_Element::SubformSet | 741       eType == XFA_Element::SubformSet | 
| 744           ? pTemplateNode->GetEnum(XFA_ATTRIBUTE_Relation) | 742           ? pTemplateNode->GetEnum(XFA_ATTRIBUTE_Relation) | 
| 745           : XFA_ATTRIBUTEENUM_Ordered; | 743           : XFA_ATTRIBUTEENUM_Ordered; | 
| 746   int32_t iCurRepeatIndex = 0; | 744   int32_t iCurRepeatIndex = 0; | 
| 747   XFA_ATTRIBUTEENUM eParentBindMatch = XFA_ATTRIBUTEENUM_None; | 745   XFA_ATTRIBUTEENUM eParentBindMatch = XFA_ATTRIBUTEENUM_None; | 
| 748   if (bDataMerge) { | 746   if (bDataMerge) { | 
| 749     CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode> | 747     CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode> | 
| 750         sNodeIterator(pTemplateNode); | 748         sNodeIterator(pTemplateNode); | 
| 751     FX_BOOL bAccessedDataDOM = FALSE; | 749     bool bAccessedDataDOM = false; | 
| 752     if (eType == XFA_Element::SubformSet || eType == XFA_Element::Area) { | 750     if (eType == XFA_Element::SubformSet || eType == XFA_Element::Area) { | 
| 753       sNodeIterator.MoveToNext(); | 751       sNodeIterator.MoveToNext(); | 
| 754     } else { | 752     } else { | 
| 755       CFX_MapPtrTemplate<CXFA_Node*, CXFA_Node*> subformMapArray; | 753       CFX_MapPtrTemplate<CXFA_Node*, CXFA_Node*> subformMapArray; | 
| 756       CXFA_NodeArray nodeArray; | 754       CXFA_NodeArray nodeArray; | 
| 757       for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { | 755       for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { | 
| 758         FX_BOOL bSelfMatch = FALSE; | 756         bool bSelfMatch = false; | 
| 759         XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None; | 757         XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None; | 
| 760         CXFA_Node* pDataNode = FindMatchingDataNode( | 758         CXFA_Node* pDataNode = FindMatchingDataNode( | 
| 761             pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, FALSE, | 759             pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, false, | 
| 762             &sNodeIterator, bSelfMatch, eBindMatch, TRUE); | 760             &sNodeIterator, bSelfMatch, eBindMatch, true); | 
| 763         if (!pDataNode || sNodeIterator.GetCurrent() != pTemplateNode) | 761         if (!pDataNode || sNodeIterator.GetCurrent() != pTemplateNode) | 
| 764           break; | 762           break; | 
| 765 | 763 | 
| 766         eParentBindMatch = eBindMatch; | 764         eParentBindMatch = eBindMatch; | 
| 767         CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer( | 765         CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer( | 
| 768             pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); | 766             pDocument, pFormParentNode, pTemplateNode, false, pSearchArray); | 
| 769         if (!pFirstInstance) | 767         if (!pFirstInstance) | 
| 770           pFirstInstance = pSubformNode; | 768           pFirstInstance = pSubformNode; | 
| 771 | 769 | 
| 772         CreateDataBinding(pSubformNode, pDataNode, TRUE); | 770         CreateDataBinding(pSubformNode, pDataNode, true); | 
| 773         ASSERT(pSubformNode); | 771         ASSERT(pSubformNode); | 
| 774         subformMapArray.SetAt(pSubformNode, pDataNode); | 772         subformMapArray.SetAt(pSubformNode, pDataNode); | 
| 775         nodeArray.Add(pSubformNode); | 773         nodeArray.Add(pSubformNode); | 
| 776       } | 774       } | 
| 777 | 775 | 
| 778       subformMapArray.GetStartPosition(); | 776       subformMapArray.GetStartPosition(); | 
| 779       for (int32_t iIndex = 0; iIndex < nodeArray.GetSize(); iIndex++) { | 777       for (int32_t iIndex = 0; iIndex < nodeArray.GetSize(); iIndex++) { | 
| 780         CXFA_Node* pSubform = nodeArray[iIndex]; | 778         CXFA_Node* pSubform = nodeArray[iIndex]; | 
| 781         CXFA_Node* pDataNode = | 779         CXFA_Node* pDataNode = | 
| 782             reinterpret_cast<CXFA_Node*>(subformMapArray.GetValueAt(pSubform)); | 780             reinterpret_cast<CXFA_Node*>(subformMapArray.GetValueAt(pSubform)); | 
| 783         for (CXFA_Node* pTemplateChild = | 781         for (CXFA_Node* pTemplateChild = | 
| 784                  pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 782                  pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 
| 785              pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 783              pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 
| 786                                  XFA_NODEITEM_NextSibling)) { | 784                                  XFA_NODEITEM_NextSibling)) { | 
| 787           if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 785           if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 
| 788             XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubform, | 786             XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubform, | 
| 789                                                 pTemplateChild, TRUE, nullptr); | 787                                                 pTemplateChild, true, nullptr); | 
| 790           } else if (pTemplateChild->IsContainerNode()) { | 788           } else if (pTemplateChild->IsContainerNode()) { | 
| 791             pDocument->DataMerge_CopyContainer(pTemplateChild, pSubform, | 789             pDocument->DataMerge_CopyContainer(pTemplateChild, pSubform, | 
| 792                                                pDataNode, FALSE, TRUE, FALSE); | 790                                                pDataNode, false, true, false); | 
| 793           } | 791           } | 
| 794         } | 792         } | 
| 795       } | 793       } | 
| 796       subformMapArray.RemoveAll(); | 794       subformMapArray.RemoveAll(); | 
| 797     } | 795     } | 
| 798 | 796 | 
| 799     for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { | 797     for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { | 
| 800       FX_BOOL bSelfMatch = FALSE; | 798       bool bSelfMatch = false; | 
| 801       XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None; | 799       XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None; | 
| 802       if (!FindMatchingDataNode(pDocument, pTemplateNode, pDataScope, | 800       if (!FindMatchingDataNode(pDocument, pTemplateNode, pDataScope, | 
| 803                                 bAccessedDataDOM, FALSE, &sNodeIterator, | 801                                 bAccessedDataDOM, false, &sNodeIterator, | 
| 804                                 bSelfMatch, eBindMatch, TRUE)) { | 802                                 bSelfMatch, eBindMatch, true)) { | 
| 805         break; | 803         break; | 
| 806       } | 804       } | 
| 807       if (eBindMatch == XFA_ATTRIBUTEENUM_DataRef && | 805       if (eBindMatch == XFA_ATTRIBUTEENUM_DataRef && | 
| 808           eParentBindMatch == XFA_ATTRIBUTEENUM_DataRef) { | 806           eParentBindMatch == XFA_ATTRIBUTEENUM_DataRef) { | 
| 809         break; | 807         break; | 
| 810       } | 808       } | 
| 811 | 809 | 
| 812       if (eRelation == XFA_ATTRIBUTEENUM_Choice || | 810       if (eRelation == XFA_ATTRIBUTEENUM_Choice || | 
| 813           eRelation == XFA_ATTRIBUTEENUM_Unordered) { | 811           eRelation == XFA_ATTRIBUTEENUM_Unordered) { | 
| 814         CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( | 812         CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( | 
| 815             pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); | 813             pDocument, pFormParentNode, pTemplateNode, false, pSearchArray); | 
| 816         ASSERT(pSubformSetNode); | 814         ASSERT(pSubformSetNode); | 
| 817         if (!pFirstInstance) | 815         if (!pFirstInstance) | 
| 818           pFirstInstance = pSubformSetNode; | 816           pFirstInstance = pSubformSetNode; | 
| 819 | 817 | 
| 820         CFX_ArrayTemplate<RecurseRecord> rgItemMatchList; | 818         CFX_ArrayTemplate<RecurseRecord> rgItemMatchList; | 
| 821         CFX_ArrayTemplate<CXFA_Node*> rgItemUnmatchList; | 819         CFX_ArrayTemplate<CXFA_Node*> rgItemUnmatchList; | 
| 822         for (CXFA_Node* pTemplateChild = | 820         for (CXFA_Node* pTemplateChild = | 
| 823                  pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 821                  pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 
| 824              pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 822              pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 
| 825                                  XFA_NODEITEM_NextSibling)) { | 823                                  XFA_NODEITEM_NextSibling)) { | 
| 826           if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 824           if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 
| 827             XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, | 825             XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, | 
| 828                                                 pTemplateChild, TRUE, nullptr); | 826                                                 pTemplateChild, true, nullptr); | 
| 829           } else if (pTemplateChild->IsContainerNode()) { | 827           } else if (pTemplateChild->IsContainerNode()) { | 
| 830             bSelfMatch = FALSE; | 828             bSelfMatch = false; | 
| 831             eBindMatch = XFA_ATTRIBUTEENUM_None; | 829             eBindMatch = XFA_ATTRIBUTEENUM_None; | 
| 832             if (eRelation != XFA_ATTRIBUTEENUM_Ordered) { | 830             if (eRelation != XFA_ATTRIBUTEENUM_Ordered) { | 
| 833               CXFA_Node* pDataMatch = FindMatchingDataNode( | 831               CXFA_Node* pDataMatch = FindMatchingDataNode( | 
| 834                   pDocument, pTemplateChild, pDataScope, bAccessedDataDOM, | 832                   pDocument, pTemplateChild, pDataScope, bAccessedDataDOM, | 
| 835                   FALSE, nullptr, bSelfMatch, eBindMatch, TRUE); | 833                   false, nullptr, bSelfMatch, eBindMatch, true); | 
| 836               if (pDataMatch) { | 834               if (pDataMatch) { | 
| 837                 RecurseRecord sNewRecord = {pTemplateChild, pDataMatch}; | 835                 RecurseRecord sNewRecord = {pTemplateChild, pDataMatch}; | 
| 838                 if (bSelfMatch) | 836                 if (bSelfMatch) | 
| 839                   rgItemMatchList.InsertAt(0, sNewRecord); | 837                   rgItemMatchList.InsertAt(0, sNewRecord); | 
| 840                 else | 838                 else | 
| 841                   rgItemMatchList.Add(sNewRecord); | 839                   rgItemMatchList.Add(sNewRecord); | 
| 842               } else { | 840               } else { | 
| 843                 rgItemUnmatchList.Add(pTemplateChild); | 841                 rgItemUnmatchList.Add(pTemplateChild); | 
| 844               } | 842               } | 
| 845             } else { | 843             } else { | 
| 846               rgItemUnmatchList.Add(pTemplateChild); | 844               rgItemUnmatchList.Add(pTemplateChild); | 
| 847             } | 845             } | 
| 848           } | 846           } | 
| 849         } | 847         } | 
| 850 | 848 | 
| 851         switch (eRelation) { | 849         switch (eRelation) { | 
| 852           case XFA_ATTRIBUTEENUM_Choice: { | 850           case XFA_ATTRIBUTEENUM_Choice: { | 
| 853             ASSERT(rgItemMatchList.GetSize()); | 851             ASSERT(rgItemMatchList.GetSize()); | 
| 854             SortRecurseRecord(rgItemMatchList, pDataScope, TRUE); | 852             SortRecurseRecord(rgItemMatchList, pDataScope, true); | 
| 855             pDocument->DataMerge_CopyContainer( | 853             pDocument->DataMerge_CopyContainer( | 
| 856                 rgItemMatchList[0].pTemplateChild, pSubformSetNode, pDataScope, | 854                 rgItemMatchList[0].pTemplateChild, pSubformSetNode, pDataScope, | 
| 857                 FALSE, TRUE, TRUE); | 855                 false, true, true); | 
| 858             break; | 856             break; | 
| 859           } | 857           } | 
| 860           case XFA_ATTRIBUTEENUM_Unordered: { | 858           case XFA_ATTRIBUTEENUM_Unordered: { | 
| 861             if (rgItemMatchList.GetSize()) { | 859             if (rgItemMatchList.GetSize()) { | 
| 862               SortRecurseRecord(rgItemMatchList, pDataScope, FALSE); | 860               SortRecurseRecord(rgItemMatchList, pDataScope, false); | 
| 863               for (int32_t i = 0, count = rgItemMatchList.GetSize(); i < count; | 861               for (int32_t i = 0, count = rgItemMatchList.GetSize(); i < count; | 
| 864                    i++) { | 862                    i++) { | 
| 865                 pDocument->DataMerge_CopyContainer( | 863                 pDocument->DataMerge_CopyContainer( | 
| 866                     rgItemMatchList[i].pTemplateChild, pSubformSetNode, | 864                     rgItemMatchList[i].pTemplateChild, pSubformSetNode, | 
| 867                     pDataScope, FALSE, TRUE, TRUE); | 865                     pDataScope, false, true, true); | 
| 868               } | 866               } | 
| 869             } | 867             } | 
| 870             for (int32_t i = 0, count = rgItemUnmatchList.GetSize(); i < count; | 868             for (int32_t i = 0, count = rgItemUnmatchList.GetSize(); i < count; | 
| 871                  i++) { | 869                  i++) { | 
| 872               pDocument->DataMerge_CopyContainer(rgItemUnmatchList[i], | 870               pDocument->DataMerge_CopyContainer(rgItemUnmatchList[i], | 
| 873                                                  pSubformSetNode, pDataScope, | 871                                                  pSubformSetNode, pDataScope, | 
| 874                                                  FALSE, TRUE, TRUE); | 872                                                  false, true, true); | 
| 875             } | 873             } | 
| 876             break; | 874             break; | 
| 877           } | 875           } | 
| 878           default: | 876           default: | 
| 879             break; | 877             break; | 
| 880         } | 878         } | 
| 881       } else { | 879       } else { | 
| 882         CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( | 880         CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( | 
| 883             pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); | 881             pDocument, pFormParentNode, pTemplateNode, false, pSearchArray); | 
| 884         ASSERT(pSubformSetNode); | 882         ASSERT(pSubformSetNode); | 
| 885         if (!pFirstInstance) | 883         if (!pFirstInstance) | 
| 886           pFirstInstance = pSubformSetNode; | 884           pFirstInstance = pSubformSetNode; | 
| 887 | 885 | 
| 888         for (CXFA_Node* pTemplateChild = | 886         for (CXFA_Node* pTemplateChild = | 
| 889                  pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 887                  pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 
| 890              pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 888              pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 
| 891                                  XFA_NODEITEM_NextSibling)) { | 889                                  XFA_NODEITEM_NextSibling)) { | 
| 892           if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 890           if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 
| 893             XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, | 891             XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, | 
| 894                                                 pTemplateChild, TRUE, nullptr); | 892                                                 pTemplateChild, true, nullptr); | 
| 895           } else if (pTemplateChild->IsContainerNode()) { | 893           } else if (pTemplateChild->IsContainerNode()) { | 
| 896             pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, | 894             pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, | 
| 897                                                pDataScope, FALSE, TRUE, TRUE); | 895                                                pDataScope, false, true, true); | 
| 898           } | 896           } | 
| 899         } | 897         } | 
| 900       } | 898       } | 
| 901     } | 899     } | 
| 902 | 900 | 
| 903     if (iCurRepeatIndex == 0 && bAccessedDataDOM == FALSE) { | 901     if (iCurRepeatIndex == 0 && bAccessedDataDOM == false) { | 
| 904       int32_t iLimit = iMax; | 902       int32_t iLimit = iMax; | 
| 905       if (pInstMgrNode && pTemplateNode->GetNameHash() == 0) { | 903       if (pInstMgrNode && pTemplateNode->GetNameHash() == 0) { | 
| 906         iLimit = subformArray.GetSize(); | 904         iLimit = subformArray.GetSize(); | 
| 907         if (iLimit < iMin) | 905         if (iLimit < iMin) | 
| 908           iLimit = iInit; | 906           iLimit = iInit; | 
| 909       } | 907       } | 
| 910 | 908 | 
| 911       for (; (iLimit < 0 || iCurRepeatIndex < iLimit); iCurRepeatIndex++) { | 909       for (; (iLimit < 0 || iCurRepeatIndex < iLimit); iCurRepeatIndex++) { | 
| 912         if (pInstMgrNode) { | 910         if (pInstMgrNode) { | 
| 913           if (pSearchArray && pSearchArray->GetSize() < 1) { | 911           if (pSearchArray && pSearchArray->GetSize() < 1) { | 
| 914             if (pTemplateNode->GetNameHash() != 0) | 912             if (pTemplateNode->GetNameHash() != 0) | 
| 915               break; | 913               break; | 
| 916             pSearchArray = nullptr; | 914             pSearchArray = nullptr; | 
| 917           } | 915           } | 
| 918         } else if (!XFA_DataMerge_FindFormDOMInstance( | 916         } else if (!XFA_DataMerge_FindFormDOMInstance( | 
| 919                        pDocument, pTemplateNode->GetElementType(), | 917                        pDocument, pTemplateNode->GetElementType(), | 
| 920                        pTemplateNode->GetNameHash(), pFormParentNode)) { | 918                        pTemplateNode->GetNameHash(), pFormParentNode)) { | 
| 921           break; | 919           break; | 
| 922         } | 920         } | 
| 923         CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer( | 921         CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer( | 
| 924             pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); | 922             pDocument, pFormParentNode, pTemplateNode, false, pSearchArray); | 
| 925         ASSERT(pSubformNode); | 923         ASSERT(pSubformNode); | 
| 926         if (!pFirstInstance) | 924         if (!pFirstInstance) | 
| 927           pFirstInstance = pSubformNode; | 925           pFirstInstance = pSubformNode; | 
| 928 | 926 | 
| 929         for (CXFA_Node* pTemplateChild = | 927         for (CXFA_Node* pTemplateChild = | 
| 930                  pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 928                  pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 
| 931              pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 929              pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 
| 932                                  XFA_NODEITEM_NextSibling)) { | 930                                  XFA_NODEITEM_NextSibling)) { | 
| 933           if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 931           if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 
| 934             XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformNode, | 932             XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformNode, | 
| 935                                                 pTemplateChild, TRUE, nullptr); | 933                                                 pTemplateChild, true, nullptr); | 
| 936           } else if (pTemplateChild->IsContainerNode()) { | 934           } else if (pTemplateChild->IsContainerNode()) { | 
| 937             pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformNode, | 935             pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformNode, | 
| 938                                                pDataScope, FALSE, TRUE, TRUE); | 936                                                pDataScope, false, true, true); | 
| 939           } | 937           } | 
| 940         } | 938         } | 
| 941       } | 939       } | 
| 942     } | 940     } | 
| 943   } | 941   } | 
| 944 | 942 | 
| 945   int32_t iMinimalLimit = iCurRepeatIndex == 0 ? iInit : iMin; | 943   int32_t iMinimalLimit = iCurRepeatIndex == 0 ? iInit : iMin; | 
| 946   for (; iCurRepeatIndex < iMinimalLimit; iCurRepeatIndex++) { | 944   for (; iCurRepeatIndex < iMinimalLimit; iCurRepeatIndex++) { | 
| 947     CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( | 945     CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( | 
| 948         pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); | 946         pDocument, pFormParentNode, pTemplateNode, false, pSearchArray); | 
| 949     ASSERT(pSubformSetNode); | 947     ASSERT(pSubformSetNode); | 
| 950     if (!pFirstInstance) | 948     if (!pFirstInstance) | 
| 951       pFirstInstance = pSubformSetNode; | 949       pFirstInstance = pSubformSetNode; | 
| 952 | 950 | 
| 953     FX_BOOL bFound = FALSE; | 951     bool bFound = false; | 
| 954     for (CXFA_Node* pTemplateChild = | 952     for (CXFA_Node* pTemplateChild = | 
| 955              pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 953              pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 
| 956          pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 954          pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 
| 957                              XFA_NODEITEM_NextSibling)) { | 955                              XFA_NODEITEM_NextSibling)) { | 
| 958       if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 956       if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 
| 959         XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, | 957         XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, | 
| 960                                             pTemplateChild, TRUE, nullptr); | 958                                             pTemplateChild, true, nullptr); | 
| 961       } else if (pTemplateChild->IsContainerNode()) { | 959       } else if (pTemplateChild->IsContainerNode()) { | 
| 962         if (bFound && eRelation == XFA_ATTRIBUTEENUM_Choice) | 960         if (bFound && eRelation == XFA_ATTRIBUTEENUM_Choice) | 
| 963           continue; | 961           continue; | 
| 964 | 962 | 
| 965         pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, | 963         pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, | 
| 966                                            pDataScope, FALSE, bDataMerge, TRUE); | 964                                            pDataScope, false, bDataMerge, true); | 
| 967         bFound = TRUE; | 965         bFound = true; | 
| 968       } | 966       } | 
| 969     } | 967     } | 
| 970   } | 968   } | 
| 971   return pFirstInstance; | 969   return pFirstInstance; | 
| 972 } | 970 } | 
| 973 | 971 | 
| 974 CXFA_Node* CopyContainer_Field(CXFA_Document* pDocument, | 972 CXFA_Node* CopyContainer_Field(CXFA_Document* pDocument, | 
| 975                                CXFA_Node* pTemplateNode, | 973                                CXFA_Node* pTemplateNode, | 
| 976                                CXFA_Node* pFormNode, | 974                                CXFA_Node* pFormNode, | 
| 977                                CXFA_Node* pDataScope, | 975                                CXFA_Node* pDataScope, | 
| 978                                FX_BOOL bDataMerge, | 976                                bool bDataMerge, | 
| 979                                FX_BOOL bUpLevel) { | 977                                bool bUpLevel) { | 
| 980   CXFA_Node* pFieldNode = XFA_NodeMerge_CloneOrMergeContainer( | 978   CXFA_Node* pFieldNode = XFA_NodeMerge_CloneOrMergeContainer( | 
| 981       pDocument, pFormNode, pTemplateNode, FALSE, nullptr); | 979       pDocument, pFormNode, pTemplateNode, false, nullptr); | 
| 982   ASSERT(pFieldNode); | 980   ASSERT(pFieldNode); | 
| 983   for (CXFA_Node* pTemplateChildNode = | 981   for (CXFA_Node* pTemplateChildNode = | 
| 984            pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 982            pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 
| 985        pTemplateChildNode; pTemplateChildNode = pTemplateChildNode->GetNodeItem( | 983        pTemplateChildNode; pTemplateChildNode = pTemplateChildNode->GetNodeItem( | 
| 986                                XFA_NODEITEM_NextSibling)) { | 984                                XFA_NODEITEM_NextSibling)) { | 
| 987     if (NeedGenerateForm(pTemplateChildNode, TRUE)) { | 985     if (NeedGenerateForm(pTemplateChildNode, true)) { | 
| 988       XFA_NodeMerge_CloneOrMergeContainer(pDocument, pFieldNode, | 986       XFA_NodeMerge_CloneOrMergeContainer(pDocument, pFieldNode, | 
| 989                                           pTemplateChildNode, TRUE, nullptr); | 987                                           pTemplateChildNode, true, nullptr); | 
| 990     } else if (pTemplateNode->GetElementType() == XFA_Element::ExclGroup && | 988     } else if (pTemplateNode->GetElementType() == XFA_Element::ExclGroup && | 
| 991                pTemplateChildNode->IsContainerNode()) { | 989                pTemplateChildNode->IsContainerNode()) { | 
| 992       if (pTemplateChildNode->GetElementType() == XFA_Element::Field) { | 990       if (pTemplateChildNode->GetElementType() == XFA_Element::Field) { | 
| 993         CopyContainer_Field(pDocument, pTemplateChildNode, pFieldNode, nullptr, | 991         CopyContainer_Field(pDocument, pTemplateChildNode, pFieldNode, nullptr, | 
| 994                             FALSE, TRUE); | 992                             false, true); | 
| 995       } | 993       } | 
| 996     } | 994     } | 
| 997   } | 995   } | 
| 998   if (bDataMerge) { | 996   if (bDataMerge) { | 
| 999     FX_BOOL bAccessedDataDOM = FALSE; | 997     bool bAccessedDataDOM = false; | 
| 1000     FX_BOOL bSelfMatch = FALSE; | 998     bool bSelfMatch = false; | 
| 1001     XFA_ATTRIBUTEENUM eBindMatch; | 999     XFA_ATTRIBUTEENUM eBindMatch; | 
| 1002     CXFA_Node* pDataNode = FindMatchingDataNode( | 1000     CXFA_Node* pDataNode = FindMatchingDataNode( | 
| 1003         pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, TRUE, nullptr, | 1001         pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, true, nullptr, | 
| 1004         bSelfMatch, eBindMatch, bUpLevel); | 1002         bSelfMatch, eBindMatch, bUpLevel); | 
| 1005     if (pDataNode) | 1003     if (pDataNode) | 
| 1006       CreateDataBinding(pFieldNode, pDataNode, TRUE); | 1004       CreateDataBinding(pFieldNode, pDataNode, true); | 
| 1007   } else { | 1005   } else { | 
| 1008     FormValueNode_MatchNoneCreateChild(pFieldNode); | 1006     FormValueNode_MatchNoneCreateChild(pFieldNode); | 
| 1009   } | 1007   } | 
| 1010   return pFieldNode; | 1008   return pFieldNode; | 
| 1011 } | 1009 } | 
| 1012 | 1010 | 
| 1013 CXFA_Node* MaybeCreateDataNode(CXFA_Document* pDocument, | 1011 CXFA_Node* MaybeCreateDataNode(CXFA_Document* pDocument, | 
| 1014                                CXFA_Node* pDataParent, | 1012                                CXFA_Node* pDataParent, | 
| 1015                                XFA_Element eNodeType, | 1013                                XFA_Element eNodeType, | 
| 1016                                const CFX_WideString& wsName) { | 1014                                const CFX_WideString& wsName) { | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1061     pDataNode->SetDataDescriptionNode(pDDNode); | 1059     pDataNode->SetDataDescriptionNode(pDDNode); | 
| 1062     pDataNode->SetFlag(XFA_NodeFlag_Initialized, false); | 1060     pDataNode->SetFlag(XFA_NodeFlag_Initialized, false); | 
| 1063     return pDataNode; | 1061     return pDataNode; | 
| 1064   } | 1062   } | 
| 1065   return nullptr; | 1063   return nullptr; | 
| 1066 } | 1064 } | 
| 1067 | 1065 | 
| 1068 void UpdateBindingRelations(CXFA_Document* pDocument, | 1066 void UpdateBindingRelations(CXFA_Document* pDocument, | 
| 1069                             CXFA_Node* pFormNode, | 1067                             CXFA_Node* pFormNode, | 
| 1070                             CXFA_Node* pDataScope, | 1068                             CXFA_Node* pDataScope, | 
| 1071                             FX_BOOL bDataRef, | 1069                             bool bDataRef, | 
| 1072                             FX_BOOL bParentDataRef) { | 1070                             bool bParentDataRef) { | 
| 1073   FX_BOOL bMatchRef = TRUE; | 1071   bool bMatchRef = true; | 
| 1074   XFA_Element eType = pFormNode->GetElementType(); | 1072   XFA_Element eType = pFormNode->GetElementType(); | 
| 1075   CXFA_Node* pDataNode = pFormNode->GetBindData(); | 1073   CXFA_Node* pDataNode = pFormNode->GetBindData(); | 
| 1076   if (eType == XFA_Element::Subform || eType == XFA_Element::ExclGroup || | 1074   if (eType == XFA_Element::Subform || eType == XFA_Element::ExclGroup || | 
| 1077       eType == XFA_Element::Field) { | 1075       eType == XFA_Element::Field) { | 
| 1078     CXFA_Node* pTemplateNode = pFormNode->GetTemplateNode(); | 1076     CXFA_Node* pTemplateNode = pFormNode->GetTemplateNode(); | 
| 1079     CXFA_Node* pTemplateNodeBind = | 1077     CXFA_Node* pTemplateNodeBind = | 
| 1080         pTemplateNode ? pTemplateNode->GetFirstChildByClass(XFA_Element::Bind) | 1078         pTemplateNode ? pTemplateNode->GetFirstChildByClass(XFA_Element::Bind) | 
| 1081                       : nullptr; | 1079                       : nullptr; | 
| 1082     XFA_ATTRIBUTEENUM eMatch = | 1080     XFA_ATTRIBUTEENUM eMatch = | 
| 1083         pTemplateNodeBind ? pTemplateNodeBind->GetEnum(XFA_ATTRIBUTE_Match) | 1081         pTemplateNodeBind ? pTemplateNodeBind->GetEnum(XFA_ATTRIBUTE_Match) | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 1094                 pFormNode->GetEnum(XFA_ATTRIBUTE_Scope) != | 1092                 pFormNode->GetEnum(XFA_ATTRIBUTE_Scope) != | 
| 1095                     XFA_ATTRIBUTEENUM_None) { | 1093                     XFA_ATTRIBUTEENUM_None) { | 
| 1096               XFA_Element eDataNodeType = (eType == XFA_Element::Subform || | 1094               XFA_Element eDataNodeType = (eType == XFA_Element::Subform || | 
| 1097                                            XFA_FieldIsMultiListBox(pFormNode)) | 1095                                            XFA_FieldIsMultiListBox(pFormNode)) | 
| 1098                                               ? XFA_Element::DataGroup | 1096                                               ? XFA_Element::DataGroup | 
| 1099                                               : XFA_Element::DataValue; | 1097                                               : XFA_Element::DataValue; | 
| 1100               pDataNode = MaybeCreateDataNode( | 1098               pDataNode = MaybeCreateDataNode( | 
| 1101                   pDocument, pDataScope, eDataNodeType, | 1099                   pDocument, pDataScope, eDataNodeType, | 
| 1102                   CFX_WideString(pFormNode->GetCData(XFA_ATTRIBUTE_Name))); | 1100                   CFX_WideString(pFormNode->GetCData(XFA_ATTRIBUTE_Name))); | 
| 1103               if (pDataNode) | 1101               if (pDataNode) | 
| 1104                 CreateDataBinding(pFormNode, pDataNode, FALSE); | 1102                 CreateDataBinding(pFormNode, pDataNode, false); | 
| 1105             } | 1103             } | 
| 1106             if (!pDataNode) | 1104             if (!pDataNode) | 
| 1107               FormValueNode_MatchNoneCreateChild(pFormNode); | 1105               FormValueNode_MatchNoneCreateChild(pFormNode); | 
| 1108 | 1106 | 
| 1109           } else { | 1107           } else { | 
| 1110             CXFA_Node* pDataParent = | 1108             CXFA_Node* pDataParent = | 
| 1111                 pDataNode->GetNodeItem(XFA_NODEITEM_Parent); | 1109                 pDataNode->GetNodeItem(XFA_NODEITEM_Parent); | 
| 1112             if (pDataParent != pDataScope) { | 1110             if (pDataParent != pDataScope) { | 
| 1113               ASSERT(pDataParent); | 1111               ASSERT(pDataParent); | 
| 1114               pDataParent->RemoveChild(pDataNode); | 1112               pDataParent->RemoveChild(pDataNode); | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 1126               XFA_Element eDataNodeType = (eType == XFA_Element::Subform || | 1124               XFA_Element eDataNodeType = (eType == XFA_Element::Subform || | 
| 1127                                            XFA_FieldIsMultiListBox(pFormNode)) | 1125                                            XFA_FieldIsMultiListBox(pFormNode)) | 
| 1128                                               ? XFA_Element::DataGroup | 1126                                               ? XFA_Element::DataGroup | 
| 1129                                               : XFA_Element::DataValue; | 1127                                               : XFA_Element::DataValue; | 
| 1130               CXFA_Node* pRecordNode = | 1128               CXFA_Node* pRecordNode = | 
| 1131                   ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record)); | 1129                   ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record)); | 
| 1132               pDataNode = MaybeCreateDataNode( | 1130               pDataNode = MaybeCreateDataNode( | 
| 1133                   pDocument, pRecordNode, eDataNodeType, | 1131                   pDocument, pRecordNode, eDataNodeType, | 
| 1134                   CFX_WideString(pFormNode->GetCData(XFA_ATTRIBUTE_Name))); | 1132                   CFX_WideString(pFormNode->GetCData(XFA_ATTRIBUTE_Name))); | 
| 1135               if (pDataNode) { | 1133               if (pDataNode) { | 
| 1136                 CreateDataBinding(pFormNode, pDataNode, FALSE); | 1134                 CreateDataBinding(pFormNode, pDataNode, false); | 
| 1137                 RegisterGlobalBinding(pDocument, pFormNode->GetNameHash(), | 1135                 RegisterGlobalBinding(pDocument, pFormNode->GetNameHash(), | 
| 1138                                       pDataNode); | 1136                                       pDataNode); | 
| 1139               } | 1137               } | 
| 1140             } else { | 1138             } else { | 
| 1141               CreateDataBinding(pFormNode, pDataNode, TRUE); | 1139               CreateDataBinding(pFormNode, pDataNode, true); | 
| 1142             } | 1140             } | 
| 1143           } | 1141           } | 
| 1144           if (!pDataNode) | 1142           if (!pDataNode) | 
| 1145             FormValueNode_MatchNoneCreateChild(pFormNode); | 1143             FormValueNode_MatchNoneCreateChild(pFormNode); | 
| 1146         } | 1144         } | 
| 1147         break; | 1145         break; | 
| 1148       case XFA_ATTRIBUTEENUM_DataRef: { | 1146       case XFA_ATTRIBUTEENUM_DataRef: { | 
| 1149         bMatchRef = bDataRef; | 1147         bMatchRef = bDataRef; | 
| 1150         bParentDataRef = TRUE; | 1148         bParentDataRef = true; | 
| 1151         if (!pDataNode && bDataRef) { | 1149         if (!pDataNode && bDataRef) { | 
| 1152           CFX_WideStringC wsRef = | 1150           CFX_WideStringC wsRef = | 
| 1153               pTemplateNodeBind->GetCData(XFA_ATTRIBUTE_Ref); | 1151               pTemplateNodeBind->GetCData(XFA_ATTRIBUTE_Ref); | 
| 1154           uint32_t dFlags = | 1152           uint32_t dFlags = | 
| 1155               XFA_RESOLVENODE_Children | XFA_RESOLVENODE_CreateNode; | 1153               XFA_RESOLVENODE_Children | XFA_RESOLVENODE_CreateNode; | 
| 1156           XFA_RESOLVENODE_RS rs; | 1154           XFA_RESOLVENODE_RS rs; | 
| 1157           pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs, | 1155           pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs, | 
| 1158                                                         dFlags, pTemplateNode); | 1156                                                         dFlags, pTemplateNode); | 
| 1159           CXFA_Object* pObject = | 1157           CXFA_Object* pObject = | 
| 1160               (rs.nodes.GetSize() > 0) ? rs.nodes[0] : nullptr; | 1158               (rs.nodes.GetSize() > 0) ? rs.nodes[0] : nullptr; | 
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1242         pFormChild->GetNameHash() == dwNameHash && pFormChild->IsUnusedNode()) { | 1240         pFormChild->GetNameHash() == dwNameHash && pFormChild->IsUnusedNode()) { | 
| 1243       return pFormChild; | 1241       return pFormChild; | 
| 1244     } | 1242     } | 
| 1245   } | 1243   } | 
| 1246   return nullptr; | 1244   return nullptr; | 
| 1247 } | 1245 } | 
| 1248 | 1246 | 
| 1249 CXFA_Node* XFA_NodeMerge_CloneOrMergeContainer(CXFA_Document* pDocument, | 1247 CXFA_Node* XFA_NodeMerge_CloneOrMergeContainer(CXFA_Document* pDocument, | 
| 1250                                                CXFA_Node* pFormParent, | 1248                                                CXFA_Node* pFormParent, | 
| 1251                                                CXFA_Node* pTemplateNode, | 1249                                                CXFA_Node* pTemplateNode, | 
| 1252                                                FX_BOOL bRecursive, | 1250                                                bool bRecursive, | 
| 1253                                                CXFA_NodeArray* pSubformArray) { | 1251                                                CXFA_NodeArray* pSubformArray) { | 
| 1254   CXFA_Node* pExistingNode = nullptr; | 1252   CXFA_Node* pExistingNode = nullptr; | 
| 1255   if (!pSubformArray) { | 1253   if (!pSubformArray) { | 
| 1256     pExistingNode = XFA_DataMerge_FindFormDOMInstance( | 1254     pExistingNode = XFA_DataMerge_FindFormDOMInstance( | 
| 1257         pDocument, pTemplateNode->GetElementType(), | 1255         pDocument, pTemplateNode->GetElementType(), | 
| 1258         pTemplateNode->GetNameHash(), pFormParent); | 1256         pTemplateNode->GetNameHash(), pFormParent); | 
| 1259   } else if (pSubformArray->GetSize() > 0) { | 1257   } else if (pSubformArray->GetSize() > 0) { | 
| 1260     pExistingNode = pSubformArray->GetAt(0); | 1258     pExistingNode = pSubformArray->GetAt(0); | 
| 1261     pSubformArray->RemoveAt(0); | 1259     pSubformArray->RemoveAt(0); | 
| 1262   } | 1260   } | 
| 1263 | 1261 | 
| 1264   if (pExistingNode) { | 1262   if (pExistingNode) { | 
| 1265     if (pSubformArray) { | 1263     if (pSubformArray) { | 
| 1266       pFormParent->InsertChild(pExistingNode); | 1264       pFormParent->InsertChild(pExistingNode); | 
| 1267     } else if (pExistingNode->IsContainerNode()) { | 1265     } else if (pExistingNode->IsContainerNode()) { | 
| 1268       pFormParent->RemoveChild(pExistingNode); | 1266       pFormParent->RemoveChild(pExistingNode); | 
| 1269       pFormParent->InsertChild(pExistingNode); | 1267       pFormParent->InsertChild(pExistingNode); | 
| 1270     } | 1268     } | 
| 1271     pExistingNode->ClearFlag(XFA_NodeFlag_UnusedNode); | 1269     pExistingNode->ClearFlag(XFA_NodeFlag_UnusedNode); | 
| 1272     pExistingNode->SetTemplateNode(pTemplateNode); | 1270     pExistingNode->SetTemplateNode(pTemplateNode); | 
| 1273     if (bRecursive && pExistingNode->GetElementType() != XFA_Element::Items) { | 1271     if (bRecursive && pExistingNode->GetElementType() != XFA_Element::Items) { | 
| 1274       for (CXFA_Node* pTemplateChild = | 1272       for (CXFA_Node* pTemplateChild = | 
| 1275                pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 1273                pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 
| 1276            pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 1274            pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 
| 1277                                XFA_NODEITEM_NextSibling)) { | 1275                                XFA_NODEITEM_NextSibling)) { | 
| 1278         if (NeedGenerateForm(pTemplateChild, TRUE)) { | 1276         if (NeedGenerateForm(pTemplateChild, true)) { | 
| 1279           XFA_NodeMerge_CloneOrMergeContainer( | 1277           XFA_NodeMerge_CloneOrMergeContainer( | 
| 1280               pDocument, pExistingNode, pTemplateChild, bRecursive, nullptr); | 1278               pDocument, pExistingNode, pTemplateChild, bRecursive, nullptr); | 
| 1281         } | 1279         } | 
| 1282       } | 1280       } | 
| 1283     } | 1281     } | 
| 1284     pExistingNode->SetFlag(XFA_NodeFlag_Initialized, true); | 1282     pExistingNode->SetFlag(XFA_NodeFlag_Initialized, true); | 
| 1285     return pExistingNode; | 1283     return pExistingNode; | 
| 1286   } | 1284   } | 
| 1287 | 1285 | 
| 1288   CXFA_Node* pNewNode = pTemplateNode->CloneTemplateToForm(FALSE); | 1286   CXFA_Node* pNewNode = pTemplateNode->CloneTemplateToForm(false); | 
| 1289   pFormParent->InsertChild(pNewNode, nullptr); | 1287   pFormParent->InsertChild(pNewNode, nullptr); | 
| 1290   if (bRecursive) { | 1288   if (bRecursive) { | 
| 1291     for (CXFA_Node* pTemplateChild = | 1289     for (CXFA_Node* pTemplateChild = | 
| 1292              pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 1290              pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 
| 1293          pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 1291          pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 
| 1294                              XFA_NODEITEM_NextSibling)) { | 1292                              XFA_NODEITEM_NextSibling)) { | 
| 1295       if (NeedGenerateForm(pTemplateChild, TRUE)) { | 1293       if (NeedGenerateForm(pTemplateChild, true)) { | 
| 1296         CXFA_Node* pNewChild = pTemplateChild->CloneTemplateToForm(TRUE); | 1294         CXFA_Node* pNewChild = pTemplateChild->CloneTemplateToForm(true); | 
| 1297         pNewNode->InsertChild(pNewChild, nullptr); | 1295         pNewNode->InsertChild(pNewChild, nullptr); | 
| 1298       } | 1296       } | 
| 1299     } | 1297     } | 
| 1300   } | 1298   } | 
| 1301   return pNewNode; | 1299   return pNewNode; | 
| 1302 } | 1300 } | 
| 1303 | 1301 | 
| 1304 CXFA_Node* XFA_DataMerge_FindDataScope(CXFA_Node* pParentFormNode) { | 1302 CXFA_Node* XFA_DataMerge_FindDataScope(CXFA_Node* pParentFormNode) { | 
| 1305   for (CXFA_Node* pRootBoundNode = pParentFormNode; | 1303   for (CXFA_Node* pRootBoundNode = pParentFormNode; | 
| 1306        pRootBoundNode && pRootBoundNode->IsContainerNode(); | 1304        pRootBoundNode && pRootBoundNode->IsContainerNode(); | 
| 1307        pRootBoundNode = pRootBoundNode->GetNodeItem(XFA_NODEITEM_Parent)) { | 1305        pRootBoundNode = pRootBoundNode->GetNodeItem(XFA_NODEITEM_Parent)) { | 
| 1308     CXFA_Node* pDataScope = pRootBoundNode->GetBindData(); | 1306     CXFA_Node* pDataScope = pRootBoundNode->GetBindData(); | 
| 1309     if (pDataScope) | 1307     if (pDataScope) | 
| 1310       return pDataScope; | 1308       return pDataScope; | 
| 1311   } | 1309   } | 
| 1312   return ToNode( | 1310   return ToNode( | 
| 1313       pParentFormNode->GetDocument()->GetXFAObject(XFA_HASHCODE_Data)); | 1311       pParentFormNode->GetDocument()->GetXFAObject(XFA_HASHCODE_Data)); | 
| 1314 } | 1312 } | 
| 1315 | 1313 | 
| 1316 CXFA_Node* CXFA_Document::DataMerge_CopyContainer(CXFA_Node* pTemplateNode, | 1314 CXFA_Node* CXFA_Document::DataMerge_CopyContainer(CXFA_Node* pTemplateNode, | 
| 1317                                                   CXFA_Node* pFormNode, | 1315                                                   CXFA_Node* pFormNode, | 
| 1318                                                   CXFA_Node* pDataScope, | 1316                                                   CXFA_Node* pDataScope, | 
| 1319                                                   FX_BOOL bOneInstance, | 1317                                                   bool bOneInstance, | 
| 1320                                                   FX_BOOL bDataMerge, | 1318                                                   bool bDataMerge, | 
| 1321                                                   FX_BOOL bUpLevel) { | 1319                                                   bool bUpLevel) { | 
| 1322   switch (pTemplateNode->GetElementType()) { | 1320   switch (pTemplateNode->GetElementType()) { | 
| 1323     case XFA_Element::SubformSet: | 1321     case XFA_Element::SubformSet: | 
| 1324     case XFA_Element::Subform: | 1322     case XFA_Element::Subform: | 
| 1325     case XFA_Element::Area: | 1323     case XFA_Element::Area: | 
| 1326     case XFA_Element::PageArea: | 1324     case XFA_Element::PageArea: | 
| 1327       return CopyContainer_SubformSet(this, pTemplateNode, pFormNode, | 1325       return CopyContainer_SubformSet(this, pTemplateNode, pFormNode, | 
| 1328                                       pDataScope, bOneInstance, bDataMerge); | 1326                                       pDataScope, bOneInstance, bDataMerge); | 
| 1329     case XFA_Element::ExclGroup: | 1327     case XFA_Element::ExclGroup: | 
| 1330     case XFA_Element::Field: | 1328     case XFA_Element::Field: | 
| 1331     case XFA_Element::Draw: | 1329     case XFA_Element::Draw: | 
| 1332     case XFA_Element::ContentArea: | 1330     case XFA_Element::ContentArea: | 
| 1333       return CopyContainer_Field(this, pTemplateNode, pFormNode, pDataScope, | 1331       return CopyContainer_Field(this, pTemplateNode, pFormNode, pDataScope, | 
| 1334                                  bDataMerge, bUpLevel); | 1332                                  bDataMerge, bUpLevel); | 
| 1335     case XFA_Element::PageSet: | 1333     case XFA_Element::PageSet: | 
| 1336     case XFA_Element::Variables: | 1334     case XFA_Element::Variables: | 
| 1337       break; | 1335       break; | 
| 1338     default: | 1336     default: | 
| 1339       ASSERT(FALSE); | 1337       ASSERT(false); | 
| 1340       break; | 1338       break; | 
| 1341   } | 1339   } | 
| 1342   return nullptr; | 1340   return nullptr; | 
| 1343 } | 1341 } | 
| 1344 | 1342 | 
| 1345 void CXFA_Document::DataMerge_UpdateBindingRelations( | 1343 void CXFA_Document::DataMerge_UpdateBindingRelations( | 
| 1346     CXFA_Node* pFormUpdateRoot) { | 1344     CXFA_Node* pFormUpdateRoot) { | 
| 1347   CXFA_Node* pDataScope = XFA_DataMerge_FindDataScope( | 1345   CXFA_Node* pDataScope = XFA_DataMerge_FindDataScope( | 
| 1348       pFormUpdateRoot->GetNodeItem(XFA_NODEITEM_Parent)); | 1346       pFormUpdateRoot->GetNodeItem(XFA_NODEITEM_Parent)); | 
| 1349   if (!pDataScope) | 1347   if (!pDataScope) | 
| 1350     return; | 1348     return; | 
| 1351 | 1349 | 
| 1352   UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, FALSE, FALSE); | 1350   UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, false, false); | 
| 1353   UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, TRUE, FALSE); | 1351   UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, true, false); | 
| 1354 } | 1352 } | 
| 1355 | 1353 | 
| 1356 CXFA_Node* CXFA_Document::GetNotBindNode(CXFA_ObjArray& arrayNodes) { | 1354 CXFA_Node* CXFA_Document::GetNotBindNode(CXFA_ObjArray& arrayNodes) { | 
| 1357   for (int32_t i = 0; i < arrayNodes.GetSize(); i++) { | 1355   for (int32_t i = 0; i < arrayNodes.GetSize(); i++) { | 
| 1358     CXFA_Node* pNode = arrayNodes[i]->AsNode(); | 1356     CXFA_Node* pNode = arrayNodes[i]->AsNode(); | 
| 1359     if (pNode && !pNode->HasBindItem()) | 1357     if (pNode && !pNode->HasBindItem()) | 
| 1360       return pNode; | 1358       return pNode; | 
| 1361   } | 1359   } | 
| 1362   return nullptr; | 1360   return nullptr; | 
| 1363 } | 1361 } | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1420       dwNameHash != 0 ? pTemplateRoot->GetFirstChildByName(dwNameHash) | 1418       dwNameHash != 0 ? pTemplateRoot->GetFirstChildByName(dwNameHash) | 
| 1421                       : nullptr; | 1419                       : nullptr; | 
| 1422   if (!pTemplateChosen || | 1420   if (!pTemplateChosen || | 
| 1423       pTemplateChosen->GetElementType() != XFA_Element::Subform) { | 1421       pTemplateChosen->GetElementType() != XFA_Element::Subform) { | 
| 1424     pTemplateChosen = pTemplateRoot->GetFirstChildByClass(XFA_Element::Subform); | 1422     pTemplateChosen = pTemplateRoot->GetFirstChildByClass(XFA_Element::Subform); | 
| 1425   } | 1423   } | 
| 1426   if (!pTemplateChosen) | 1424   if (!pTemplateChosen) | 
| 1427     return; | 1425     return; | 
| 1428 | 1426 | 
| 1429   CXFA_Node* pFormRoot = m_pRootNode->GetFirstChildByClass(XFA_Element::Form); | 1427   CXFA_Node* pFormRoot = m_pRootNode->GetFirstChildByClass(XFA_Element::Form); | 
| 1430   FX_BOOL bEmptyForm = FALSE; | 1428   bool bEmptyForm = false; | 
| 1431   if (!pFormRoot) { | 1429   if (!pFormRoot) { | 
| 1432     bEmptyForm = TRUE; | 1430     bEmptyForm = true; | 
| 1433     pFormRoot = CreateNode(XFA_XDPPACKET_Form, XFA_Element::Form); | 1431     pFormRoot = CreateNode(XFA_XDPPACKET_Form, XFA_Element::Form); | 
| 1434     ASSERT(pFormRoot); | 1432     ASSERT(pFormRoot); | 
| 1435     pFormRoot->SetCData(XFA_ATTRIBUTE_Name, L"form"); | 1433     pFormRoot->SetCData(XFA_ATTRIBUTE_Name, L"form"); | 
| 1436     m_pRootNode->InsertChild(pFormRoot, nullptr); | 1434     m_pRootNode->InsertChild(pFormRoot, nullptr); | 
| 1437   } else { | 1435   } else { | 
| 1438     CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> | 1436     CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> | 
| 1439         sIterator(pFormRoot); | 1437         sIterator(pFormRoot); | 
| 1440     for (CXFA_Node* pNode = sIterator.MoveToNext(); pNode; | 1438     for (CXFA_Node* pNode = sIterator.MoveToNext(); pNode; | 
| 1441          pNode = sIterator.MoveToNext()) { | 1439          pNode = sIterator.MoveToNext()) { | 
| 1442       pNode->SetFlag(XFA_NodeFlag_UnusedNode, true); | 1440       pNode->SetFlag(XFA_NodeFlag_UnusedNode, true); | 
| 1443     } | 1441     } | 
| 1444   } | 1442   } | 
| 1445 | 1443 | 
| 1446   CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( | 1444   CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( | 
| 1447       this, pFormRoot, pTemplateChosen, FALSE, nullptr); | 1445       this, pFormRoot, pTemplateChosen, false, nullptr); | 
| 1448   ASSERT(pSubformSetNode); | 1446   ASSERT(pSubformSetNode); | 
| 1449   if (!pDataTopLevel) { | 1447   if (!pDataTopLevel) { | 
| 1450     CFX_WideStringC wsFormName = pSubformSetNode->GetCData(XFA_ATTRIBUTE_Name); | 1448     CFX_WideStringC wsFormName = pSubformSetNode->GetCData(XFA_ATTRIBUTE_Name); | 
| 1451     CFX_WideString wsDataTopLevelName(wsFormName.IsEmpty() ? L"form" | 1449     CFX_WideString wsDataTopLevelName(wsFormName.IsEmpty() ? L"form" | 
| 1452                                                            : wsFormName); | 1450                                                            : wsFormName); | 
| 1453     CFDE_XMLElement* pDataTopLevelXMLNode = | 1451     CFDE_XMLElement* pDataTopLevelXMLNode = | 
| 1454         new CFDE_XMLElement(wsDataTopLevelName); | 1452         new CFDE_XMLElement(wsDataTopLevelName); | 
| 1455 | 1453 | 
| 1456     pDataTopLevel = CreateNode(XFA_XDPPACKET_Datasets, XFA_Element::DataGroup); | 1454     pDataTopLevel = CreateNode(XFA_XDPPACKET_Datasets, XFA_Element::DataGroup); | 
| 1457     pDataTopLevel->SetCData(XFA_ATTRIBUTE_Name, wsDataTopLevelName); | 1455     pDataTopLevel->SetCData(XFA_ATTRIBUTE_Name, wsDataTopLevelName); | 
| 1458     pDataTopLevel->SetXMLMappingNode(pDataTopLevelXMLNode); | 1456     pDataTopLevel->SetXMLMappingNode(pDataTopLevelXMLNode); | 
| 1459     CXFA_Node* pBeforeNode = pDataRoot->GetNodeItem(XFA_NODEITEM_FirstChild); | 1457     CXFA_Node* pBeforeNode = pDataRoot->GetNodeItem(XFA_NODEITEM_FirstChild); | 
| 1460     pDataRoot->InsertChild(pDataTopLevel, pBeforeNode); | 1458     pDataRoot->InsertChild(pDataTopLevel, pBeforeNode); | 
| 1461   } | 1459   } | 
| 1462 | 1460 | 
| 1463   ASSERT(pDataTopLevel); | 1461   ASSERT(pDataTopLevel); | 
| 1464   CreateDataBinding(pSubformSetNode, pDataTopLevel, TRUE); | 1462   CreateDataBinding(pSubformSetNode, pDataTopLevel, true); | 
| 1465   for (CXFA_Node* pTemplateChild = | 1463   for (CXFA_Node* pTemplateChild = | 
| 1466            pTemplateChosen->GetNodeItem(XFA_NODEITEM_FirstChild); | 1464            pTemplateChosen->GetNodeItem(XFA_NODEITEM_FirstChild); | 
| 1467        pTemplateChild; | 1465        pTemplateChild; | 
| 1468        pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { | 1466        pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { | 
| 1469     if (NeedGenerateForm(pTemplateChild, TRUE)) { | 1467     if (NeedGenerateForm(pTemplateChild, true)) { | 
| 1470       XFA_NodeMerge_CloneOrMergeContainer(this, pSubformSetNode, pTemplateChild, | 1468       XFA_NodeMerge_CloneOrMergeContainer(this, pSubformSetNode, pTemplateChild, | 
| 1471                                           TRUE, nullptr); | 1469                                           true, nullptr); | 
| 1472     } else if (pTemplateChild->IsContainerNode()) { | 1470     } else if (pTemplateChild->IsContainerNode()) { | 
| 1473       DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, pDataTopLevel, | 1471       DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, pDataTopLevel, | 
| 1474                               FALSE, TRUE, TRUE); | 1472                               false, true, true); | 
| 1475     } | 1473     } | 
| 1476   } | 1474   } | 
| 1477   if (pDDRoot) | 1475   if (pDDRoot) | 
| 1478     UpdateDataRelation(pDataRoot, pDDRoot); | 1476     UpdateDataRelation(pDataRoot, pDDRoot); | 
| 1479 | 1477 | 
| 1480   DataMerge_UpdateBindingRelations(pSubformSetNode); | 1478   DataMerge_UpdateBindingRelations(pSubformSetNode); | 
| 1481   CXFA_Node* pPageSetNode = | 1479   CXFA_Node* pPageSetNode = | 
| 1482       pSubformSetNode->GetFirstChildByClass(XFA_Element::PageSet); | 1480       pSubformSetNode->GetFirstChildByClass(XFA_Element::PageSet); | 
| 1483   while (pPageSetNode) { | 1481   while (pPageSetNode) { | 
| 1484     m_pPendingPageSet.Add(pPageSetNode); | 1482     m_pPendingPageSet.Add(pPageSetNode); | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 1506         pNode->SetFlag(XFA_NodeFlag_Initialized, true); | 1504         pNode->SetFlag(XFA_NodeFlag_Initialized, true); | 
| 1507         pNode = sIterator.MoveToNext(); | 1505         pNode = sIterator.MoveToNext(); | 
| 1508       } | 1506       } | 
| 1509     } else { | 1507     } else { | 
| 1510       pNode->SetFlag(XFA_NodeFlag_Initialized, true); | 1508       pNode->SetFlag(XFA_NodeFlag_Initialized, true); | 
| 1511       pNode = sIterator.MoveToNext(); | 1509       pNode = sIterator.MoveToNext(); | 
| 1512     } | 1510     } | 
| 1513   } | 1511   } | 
| 1514 } | 1512 } | 
| 1515 | 1513 | 
| 1516 void CXFA_Document::DoDataRemerge(FX_BOOL bDoDataMerge) { | 1514 void CXFA_Document::DoDataRemerge(bool bDoDataMerge) { | 
| 1517   CXFA_Node* pFormRoot = ToNode(GetXFAObject(XFA_HASHCODE_Form)); | 1515   CXFA_Node* pFormRoot = ToNode(GetXFAObject(XFA_HASHCODE_Form)); | 
| 1518   if (pFormRoot) { | 1516   if (pFormRoot) { | 
| 1519     while (CXFA_Node* pNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) | 1517     while (CXFA_Node* pNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) | 
| 1520       pFormRoot->RemoveChild(pNode); | 1518       pFormRoot->RemoveChild(pNode); | 
| 1521     pFormRoot->SetObject(XFA_ATTRIBUTE_BindingNode, nullptr); | 1519     pFormRoot->SetObject(XFA_ATTRIBUTE_BindingNode, nullptr); | 
| 1522   } | 1520   } | 
| 1523   m_rgGlobalBinding.RemoveAll(); | 1521   m_rgGlobalBinding.RemoveAll(); | 
| 1524   if (bDoDataMerge) | 1522   if (bDoDataMerge) | 
| 1525     DoDataMerge(); | 1523     DoDataMerge(); | 
| 1526 | 1524 | 
| 1527   CXFA_LayoutProcessor* pLayoutProcessor = GetLayoutProcessor(); | 1525   CXFA_LayoutProcessor* pLayoutProcessor = GetLayoutProcessor(); | 
| 1528   pLayoutProcessor->SetForceReLayout(TRUE); | 1526   pLayoutProcessor->SetForceReLayout(true); | 
| 1529 } | 1527 } | 
| OLD | NEW | 
|---|