diff options
Diffstat (limited to 'xfa/fxfa/parser')
-rw-r--r-- | xfa/fxfa/parser/xfa_document_datamerger_imp.cpp | 90 |
1 files changed, 40 insertions, 50 deletions
diff --git a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp index cfc54a11d9..b5b2f3c406 100644 --- a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp +++ b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp @@ -467,7 +467,7 @@ CXFA_Node* FindDataRefDataNode(CXFA_Document* pDocument, } if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) { - CXFA_Object* pObject = !rs.objects.empty() ? rs.objects[0] : nullptr; + CXFA_Object* pObject = !rs.objects.empty() ? rs.objects.front() : nullptr; CXFA_Node* pNode = ToNode(pObject); return (bForceBind || !pNode || !pNode->HasBindItem()) ? pNode : nullptr; } @@ -651,39 +651,31 @@ CXFA_Node* FindMatchingDataNode( return pResult; } -void SortRecurseRecord(CFX_ArrayTemplate<RecurseRecord>& rgRecords, +void SortRecurseRecord(std::vector<RecurseRecord>* rgRecords, CXFA_Node* pDataScope, bool bChoiceMode) { - int32_t iCount = rgRecords.GetSize(); - CFX_ArrayTemplate<RecurseRecord> rgResultRecord; - for (CXFA_Node* pChildNode = pDataScope->GetNodeItem(XFA_NODEITEM_FirstChild); - pChildNode; - pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { - for (int32_t i = 0; i < iCount; i++) { - CXFA_Node* pNode = rgRecords[i].pDataChild; - if (pChildNode == pNode) { - RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild, pNode}; - rgResultRecord.Add(sNewRecord); - rgRecords.RemoveAt(i); - iCount--; + std::vector<RecurseRecord> rgResultRecord; + for (CXFA_Node* pNode = pDataScope->GetNodeItem(XFA_NODEITEM_FirstChild); + pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + auto it = std::find_if(rgRecords->begin(), rgRecords->end(), + [pNode](const RecurseRecord& record) { + return pNode == record.pDataChild; + }); + if (it != rgRecords->end()) { + rgResultRecord.push_back(*it); + rgRecords->erase(it); + if (bChoiceMode) break; - } } - if (bChoiceMode && rgResultRecord.GetSize() > 0) - break; } + if (rgResultRecord.empty()) + return; - if (rgResultRecord.GetSize() > 0) { - if (!bChoiceMode) { - for (int32_t i = 0; i < iCount; i++) { - RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild, - rgRecords[i].pDataChild}; - rgResultRecord.Add(sNewRecord); - } - } - rgRecords.RemoveAll(); - rgRecords.Copy(rgResultRecord); + if (!bChoiceMode) { + rgResultRecord.insert(rgResultRecord.end(), rgRecords->begin(), + rgRecords->end()); } + *rgRecords = rgResultRecord; } CXFA_Node* CopyContainer_SubformSet(CXFA_Document* pDocument, @@ -814,8 +806,8 @@ CXFA_Node* CopyContainer_SubformSet(CXFA_Document* pDocument, if (!pFirstInstance) pFirstInstance = pSubformSetNode; - CFX_ArrayTemplate<RecurseRecord> rgItemMatchList; - CFX_ArrayTemplate<CXFA_Node*> rgItemUnmatchList; + std::vector<RecurseRecord> rgItemMatchList; + std::vector<CXFA_Node*> rgItemUnmatchList; for (CXFA_Node* pTemplateChild = pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( @@ -833,42 +825,39 @@ CXFA_Node* CopyContainer_SubformSet(CXFA_Document* pDocument, if (pDataMatch) { RecurseRecord sNewRecord = {pTemplateChild, pDataMatch}; if (bSelfMatch) - rgItemMatchList.InsertAt(0, sNewRecord); + rgItemMatchList.insert(rgItemMatchList.begin(), sNewRecord); else - rgItemMatchList.Add(sNewRecord); + rgItemMatchList.push_back(sNewRecord); } else { - rgItemUnmatchList.Add(pTemplateChild); + rgItemUnmatchList.push_back(pTemplateChild); } } else { - rgItemUnmatchList.Add(pTemplateChild); + rgItemUnmatchList.push_back(pTemplateChild); } } } switch (eRelation) { case XFA_ATTRIBUTEENUM_Choice: { - ASSERT(rgItemMatchList.GetSize()); - SortRecurseRecord(rgItemMatchList, pDataScope, true); + ASSERT(!rgItemMatchList.empty()); + SortRecurseRecord(&rgItemMatchList, pDataScope, true); pDocument->DataMerge_CopyContainer( - rgItemMatchList[0].pTemplateChild, pSubformSetNode, pDataScope, - false, true, true); + rgItemMatchList.front().pTemplateChild, pSubformSetNode, + pDataScope, false, true, true); break; } case XFA_ATTRIBUTEENUM_Unordered: { - if (rgItemMatchList.GetSize()) { - SortRecurseRecord(rgItemMatchList, pDataScope, false); - for (int32_t i = 0, count = rgItemMatchList.GetSize(); i < count; - i++) { - pDocument->DataMerge_CopyContainer( - rgItemMatchList[i].pTemplateChild, pSubformSetNode, - pDataScope, false, true, true); + if (!rgItemMatchList.empty()) { + SortRecurseRecord(&rgItemMatchList, pDataScope, false); + for (const auto& matched : rgItemMatchList) { + pDocument->DataMerge_CopyContainer(matched.pTemplateChild, + pSubformSetNode, pDataScope, + false, true, true); } } - for (int32_t i = 0, count = rgItemUnmatchList.GetSize(); i < count; - i++) { - pDocument->DataMerge_CopyContainer(rgItemUnmatchList[i], - pSubformSetNode, pDataScope, - false, true, true); + for (auto* unmatched : rgItemUnmatchList) { + pDocument->DataMerge_CopyContainer(unmatched, pSubformSetNode, + pDataScope, false, true, true); } break; } @@ -1153,7 +1142,8 @@ void UpdateBindingRelations(CXFA_Document* pDocument, XFA_RESOLVENODE_RS rs; pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs, dFlags, pTemplateNode); - CXFA_Object* pObject = !rs.objects.empty() ? rs.objects[0] : nullptr; + CXFA_Object* pObject = + !rs.objects.empty() ? rs.objects.front() : nullptr; pDataNode = ToNode(pObject); if (pDataNode) { CreateDataBinding(pFormNode, pDataNode, |