| 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 <map> | 
|     9 #include <vector> |    10 #include <vector> | 
|    10  |    11  | 
|    11 #include "core/fxcrt/fx_ext.h" |    12 #include "core/fxcrt/fx_ext.h" | 
|    12 #include "third_party/base/stl_util.h" |    13 #include "third_party/base/stl_util.h" | 
|    13 #include "xfa/fde/xml/fde_xml_imp.h" |    14 #include "xfa/fde/xml/fde_xml_imp.h" | 
|    14 #include "xfa/fxfa/parser/cxfa_document.h" |    15 #include "xfa/fxfa/parser/cxfa_document.h" | 
|    15 #include "xfa/fxfa/parser/cxfa_layoutprocessor.h" |    16 #include "xfa/fxfa/parser/cxfa_layoutprocessor.h" | 
|    16 #include "xfa/fxfa/parser/cxfa_occur.h" |    17 #include "xfa/fxfa/parser/cxfa_occur.h" | 
|    17 #include "xfa/fxfa/parser/cxfa_scriptcontext.h" |    18 #include "xfa/fxfa/parser/cxfa_scriptcontext.h" | 
|    18 #include "xfa/fxfa/parser/xfa_localemgr.h" |    19 #include "xfa/fxfa/parser/xfa_localemgr.h" | 
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   349     case XFA_Element::Signature: |   350     case XFA_Element::Signature: | 
|   350     case XFA_Element::TextEdit: |   351     case XFA_Element::TextEdit: | 
|   351     default: |   352     default: | 
|   352       FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, |   353       FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, | 
|   353                                     XFA_Element::Text); |   354                                     XFA_Element::Text); | 
|   354       break; |   355       break; | 
|   355   } |   356   } | 
|   356 } |   357 } | 
|   357  |   358  | 
|   358 CXFA_Node* GetGlobalBinding(CXFA_Document* pDocument, uint32_t dwNameHash) { |   359 CXFA_Node* GetGlobalBinding(CXFA_Document* pDocument, uint32_t dwNameHash) { | 
|   359   CXFA_Node* pNode = nullptr; |   360   auto it = pDocument->m_rgGlobalBinding.find(dwNameHash); | 
|   360   pDocument->m_rgGlobalBinding.Lookup(dwNameHash, pNode); |   361   return it != pDocument->m_rgGlobalBinding.end() ? it->second : nullptr; | 
|   361   return pNode; |  | 
|   362 } |   362 } | 
|   363  |   363  | 
|   364 void RegisterGlobalBinding(CXFA_Document* pDocument, |   364 void RegisterGlobalBinding(CXFA_Document* pDocument, | 
|   365                            uint32_t dwNameHash, |   365                            uint32_t dwNameHash, | 
|   366                            CXFA_Node* pDataNode) { |   366                            CXFA_Node* pDataNode) { | 
|   367   pDocument->m_rgGlobalBinding.SetAt(dwNameHash, pDataNode); |   367   pDocument->m_rgGlobalBinding[dwNameHash] = pDataNode; | 
|   368 } |   368 } | 
|   369  |   369  | 
|   370 CXFA_Node* ScopeMatchGlobalBinding(CXFA_Node* pDataScope, |   370 CXFA_Node* ScopeMatchGlobalBinding(CXFA_Node* pDataScope, | 
|   371                                    uint32_t dwNameHash, |   371                                    uint32_t dwNameHash, | 
|   372                                    XFA_Element eMatchDataNodeType, |   372                                    XFA_Element eMatchDataNodeType, | 
|   373                                    bool bUpLevel) { |   373                                    bool bUpLevel) { | 
|   374   for (CXFA_Node *pCurDataScope = pDataScope, *pLastDataScope = nullptr; |   374   for (CXFA_Node *pCurDataScope = pDataScope, *pLastDataScope = nullptr; | 
|   375        pCurDataScope && pCurDataScope->GetPacketID() == XFA_XDPPACKET_Datasets; |   375        pCurDataScope && pCurDataScope->GetPacketID() == XFA_XDPPACKET_Datasets; | 
|   376        pLastDataScope = pCurDataScope, |   376        pLastDataScope = pCurDataScope, | 
|   377                  pCurDataScope = |   377                  pCurDataScope = | 
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   746           : XFA_ATTRIBUTEENUM_Ordered; |   746           : XFA_ATTRIBUTEENUM_Ordered; | 
|   747   int32_t iCurRepeatIndex = 0; |   747   int32_t iCurRepeatIndex = 0; | 
|   748   XFA_ATTRIBUTEENUM eParentBindMatch = XFA_ATTRIBUTEENUM_None; |   748   XFA_ATTRIBUTEENUM eParentBindMatch = XFA_ATTRIBUTEENUM_None; | 
|   749   if (bDataMerge) { |   749   if (bDataMerge) { | 
|   750     CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode> |   750     CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode> | 
|   751         sNodeIterator(pTemplateNode); |   751         sNodeIterator(pTemplateNode); | 
|   752     bool bAccessedDataDOM = false; |   752     bool bAccessedDataDOM = false; | 
|   753     if (eType == XFA_Element::SubformSet || eType == XFA_Element::Area) { |   753     if (eType == XFA_Element::SubformSet || eType == XFA_Element::Area) { | 
|   754       sNodeIterator.MoveToNext(); |   754       sNodeIterator.MoveToNext(); | 
|   755     } else { |   755     } else { | 
|   756       CFX_MapPtrTemplate<CXFA_Node*, CXFA_Node*> subformMapArray; |   756       std::map<CXFA_Node*, CXFA_Node*> subformMapArray; | 
|   757       CXFA_NodeArray nodeArray; |   757       CXFA_NodeArray nodeArray; | 
|   758       for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { |   758       for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { | 
|   759         bool bSelfMatch = false; |   759         bool bSelfMatch = false; | 
|   760         XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None; |   760         XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None; | 
|   761         CXFA_Node* pDataNode = FindMatchingDataNode( |   761         CXFA_Node* pDataNode = FindMatchingDataNode( | 
|   762             pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, false, |   762             pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, false, | 
|   763             &sNodeIterator, bSelfMatch, eBindMatch, true); |   763             &sNodeIterator, bSelfMatch, eBindMatch, true); | 
|   764         if (!pDataNode || sNodeIterator.GetCurrent() != pTemplateNode) |   764         if (!pDataNode || sNodeIterator.GetCurrent() != pTemplateNode) | 
|   765           break; |   765           break; | 
|   766  |   766  | 
|   767         eParentBindMatch = eBindMatch; |   767         eParentBindMatch = eBindMatch; | 
|   768         CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer( |   768         CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer( | 
|   769             pDocument, pFormParentNode, pTemplateNode, false, pSearchArray); |   769             pDocument, pFormParentNode, pTemplateNode, false, pSearchArray); | 
|   770         if (!pFirstInstance) |   770         if (!pFirstInstance) | 
|   771           pFirstInstance = pSubformNode; |   771           pFirstInstance = pSubformNode; | 
|   772  |   772  | 
|   773         CreateDataBinding(pSubformNode, pDataNode, true); |   773         CreateDataBinding(pSubformNode, pDataNode, true); | 
|   774         ASSERT(pSubformNode); |   774         ASSERT(pSubformNode); | 
|   775         subformMapArray.SetAt(pSubformNode, pDataNode); |   775         subformMapArray[pSubformNode] = pDataNode; | 
|   776         nodeArray.Add(pSubformNode); |   776         nodeArray.Add(pSubformNode); | 
|   777       } |   777       } | 
|   778  |   778  | 
|   779       subformMapArray.GetStartPosition(); |  | 
|   780       for (int32_t iIndex = 0; iIndex < nodeArray.GetSize(); iIndex++) { |   779       for (int32_t iIndex = 0; iIndex < nodeArray.GetSize(); iIndex++) { | 
|   781         CXFA_Node* pSubform = nodeArray[iIndex]; |   780         CXFA_Node* pSubform = nodeArray[iIndex]; | 
|   782         CXFA_Node* pDataNode = |   781         CXFA_Node* pDataNode = nullptr; | 
|   783             reinterpret_cast<CXFA_Node*>(subformMapArray.GetValueAt(pSubform)); |   782         auto it = subformMapArray.find(pSubform); | 
 |   783         if (it != subformMapArray.end()) | 
 |   784           pDataNode = it->second; | 
|   784         for (CXFA_Node* pTemplateChild = |   785         for (CXFA_Node* pTemplateChild = | 
|   785                  pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |   786                  pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 
|   786              pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |   787              pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 
|   787                                  XFA_NODEITEM_NextSibling)) { |   788                                  XFA_NODEITEM_NextSibling)) { | 
|   788           if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |   789           if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 
|   789             XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubform, |   790             XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubform, | 
|   790                                                 pTemplateChild, true, nullptr); |   791                                                 pTemplateChild, true, nullptr); | 
|   791           } else if (pTemplateChild->IsContainerNode()) { |   792           } else if (pTemplateChild->IsContainerNode()) { | 
|   792             pDocument->DataMerge_CopyContainer(pTemplateChild, pSubform, |   793             pDocument->DataMerge_CopyContainer(pTemplateChild, pSubform, | 
|   793                                                pDataNode, false, true, false); |   794                                                pDataNode, false, true, false); | 
|   794           } |   795           } | 
|   795         } |   796         } | 
|   796       } |   797       } | 
|   797       subformMapArray.RemoveAll(); |   798       subformMapArray.clear(); | 
|   798     } |   799     } | 
|   799  |   800  | 
|   800     for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { |   801     for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { | 
|   801       bool bSelfMatch = false; |   802       bool bSelfMatch = false; | 
|   802       XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None; |   803       XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None; | 
|   803       if (!FindMatchingDataNode(pDocument, pTemplateNode, pDataScope, |   804       if (!FindMatchingDataNode(pDocument, pTemplateNode, pDataScope, | 
|   804                                 bAccessedDataDOM, false, &sNodeIterator, |   805                                 bAccessedDataDOM, false, &sNodeIterator, | 
|   805                                 bSelfMatch, eBindMatch, true)) { |   806                                 bSelfMatch, eBindMatch, true)) { | 
|   806         break; |   807         break; | 
|   807       } |   808       } | 
| (...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1514   } |  1515   } | 
|  1515 } |  1516 } | 
|  1516  |  1517  | 
|  1517 void CXFA_Document::DoDataRemerge(bool bDoDataMerge) { |  1518 void CXFA_Document::DoDataRemerge(bool bDoDataMerge) { | 
|  1518   CXFA_Node* pFormRoot = ToNode(GetXFAObject(XFA_HASHCODE_Form)); |  1519   CXFA_Node* pFormRoot = ToNode(GetXFAObject(XFA_HASHCODE_Form)); | 
|  1519   if (pFormRoot) { |  1520   if (pFormRoot) { | 
|  1520     while (CXFA_Node* pNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) |  1521     while (CXFA_Node* pNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) | 
|  1521       pFormRoot->RemoveChild(pNode); |  1522       pFormRoot->RemoveChild(pNode); | 
|  1522     pFormRoot->SetObject(XFA_ATTRIBUTE_BindingNode, nullptr); |  1523     pFormRoot->SetObject(XFA_ATTRIBUTE_BindingNode, nullptr); | 
|  1523   } |  1524   } | 
|  1524   m_rgGlobalBinding.RemoveAll(); |  1525   m_rgGlobalBinding.clear(); | 
|  1525   if (bDoDataMerge) |  1526   if (bDoDataMerge) | 
|  1526     DoDataMerge(); |  1527     DoDataMerge(); | 
|  1527  |  1528  | 
|  1528   CXFA_LayoutProcessor* pLayoutProcessor = GetLayoutProcessor(); |  1529   CXFA_LayoutProcessor* pLayoutProcessor = GetLayoutProcessor(); | 
|  1529   pLayoutProcessor->SetForceReLayout(true); |  1530   pLayoutProcessor->SetForceReLayout(true); | 
|  1530 } |  1531 } | 
| OLD | NEW |