| Index: xfa/fxfa/parser/cxfa_node.cpp
|
| diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
|
| index 1bde816d3d66c0be1656acd6c49465b052f8bdf5..bc2a10c08b9d15aadf6ad7c657926d30e31a2cfe 100644
|
| --- a/xfa/fxfa/parser/cxfa_node.cpp
|
| +++ b/xfa/fxfa/parser/cxfa_node.cpp
|
| @@ -4901,19 +4901,21 @@ XFA_MAPMODULEDATA* CXFA_Node::GetMapModuleData() const {
|
|
|
| void CXFA_Node::SetMapModuleValue(void* pKey, void* pValue) {
|
| XFA_MAPMODULEDATA* pModule = CreateMapModuleData();
|
| - pModule->m_ValueMap.SetAt(pKey, pValue);
|
| + pModule->m_ValueMap[pKey] = pValue;
|
| }
|
|
|
| bool CXFA_Node::GetMapModuleValue(void* pKey, void*& pValue) {
|
| - CXFA_Node* pNode = this;
|
| - while (pNode) {
|
| + for (CXFA_Node* pNode = this; pNode; pNode = pNode->GetTemplateNode()) {
|
| XFA_MAPMODULEDATA* pModule = pNode->GetMapModuleData();
|
| - if (pModule && pModule->m_ValueMap.Lookup(pKey, pValue)) {
|
| - return true;
|
| + if (pModule) {
|
| + auto it = pModule->m_ValueMap.find(pKey);
|
| + if (it != pModule->m_ValueMap.end()) {
|
| + pValue = it->second;
|
| + return true;
|
| + }
|
| }
|
| - pNode = pNode->GetPacketID() != XFA_XDPPACKET_Datasets
|
| - ? pNode->GetTemplateNode()
|
| - : nullptr;
|
| + if (pNode->GetPacketID() == XFA_XDPPACKET_Datasets)
|
| + break;
|
| }
|
| return false;
|
| }
|
| @@ -4965,37 +4967,40 @@ bool CXFA_Node::GetMapModuleBuffer(void* pKey,
|
| int32_t& iBytes,
|
| bool bProtoAlso) const {
|
| XFA_MAPDATABLOCK* pBuffer = nullptr;
|
| - const CXFA_Node* pNode = this;
|
| - while (pNode) {
|
| + for (const CXFA_Node* pNode = this; pNode; pNode = pNode->GetTemplateNode()) {
|
| XFA_MAPMODULEDATA* pModule = pNode->GetMapModuleData();
|
| - if (pModule && pModule->m_BufferMap.Lookup(pKey, pBuffer)) {
|
| - break;
|
| + if (pModule) {
|
| + auto it = pModule->m_BufferMap.find(pKey);
|
| + if (it != pModule->m_BufferMap.end()) {
|
| + pBuffer = it->second;
|
| + break;
|
| + }
|
| }
|
| - pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets)
|
| - ? pNode->GetTemplateNode()
|
| - : nullptr;
|
| + if (!bProtoAlso || pNode->GetPacketID() == XFA_XDPPACKET_Datasets)
|
| + break;
|
| }
|
| - if (!pBuffer) {
|
| + if (!pBuffer)
|
| return false;
|
| - }
|
| +
|
| pValue = pBuffer->GetData();
|
| iBytes = pBuffer->iBytes;
|
| return true;
|
| }
|
|
|
| bool CXFA_Node::HasMapModuleKey(void* pKey, bool bProtoAlso) {
|
| - CXFA_Node* pNode = this;
|
| - while (pNode) {
|
| - void* pVal;
|
| + for (CXFA_Node* pNode = this; pNode; pNode = pNode->GetTemplateNode()) {
|
| XFA_MAPMODULEDATA* pModule = pNode->GetMapModuleData();
|
| - if (pModule &&
|
| - (pModule->m_ValueMap.Lookup(pKey, pVal) ||
|
| - pModule->m_BufferMap.Lookup(pKey, (XFA_MAPDATABLOCK*&)pVal))) {
|
| - return true;
|
| + if (pModule) {
|
| + auto it1 = pModule->m_ValueMap.find(pKey);
|
| + if (it1 != pModule->m_ValueMap.end())
|
| + return true;
|
| +
|
| + auto it2 = pModule->m_BufferMap.find(pKey);
|
| + if (it2 != pModule->m_BufferMap.end())
|
| + return true;
|
| }
|
| - pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets)
|
| - ? pNode->GetTemplateNode()
|
| - : nullptr;
|
| + if (!bProtoAlso || pNode->GetPacketID() == XFA_XDPPACKET_Datasets)
|
| + break;
|
| }
|
| return false;
|
| }
|
| @@ -5006,87 +5011,75 @@ void CXFA_Node::RemoveMapModuleKey(void* pKey) {
|
| return;
|
|
|
| if (pKey) {
|
| - XFA_MAPDATABLOCK* pBuffer = nullptr;
|
| - pModule->m_BufferMap.Lookup(pKey, pBuffer);
|
| - if (pBuffer) {
|
| - if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
|
| - pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
|
| - }
|
| - FX_Free(pBuffer);
|
| - }
|
| - pModule->m_BufferMap.RemoveKey(pKey);
|
| - pModule->m_ValueMap.RemoveKey(pKey);
|
| - } else {
|
| - XFA_MAPDATABLOCK* pBuffer;
|
| - FX_POSITION posBuffer = pModule->m_BufferMap.GetStartPosition();
|
| - while (posBuffer) {
|
| - pModule->m_BufferMap.GetNextAssoc(posBuffer, pKey, pBuffer);
|
| + auto it = pModule->m_BufferMap.find(pKey);
|
| + if (it != pModule->m_BufferMap.end()) {
|
| + XFA_MAPDATABLOCK* pBuffer = it->second;
|
| if (pBuffer) {
|
| - if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
|
| + if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree)
|
| pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
|
| - }
|
| FX_Free(pBuffer);
|
| }
|
| + pModule->m_BufferMap.erase(it);
|
| }
|
| - pModule->m_BufferMap.RemoveAll();
|
| - pModule->m_ValueMap.RemoveAll();
|
| - delete pModule;
|
| + pModule->m_ValueMap.erase(pKey);
|
| + return;
|
| }
|
| +
|
| + for (auto& pair : pModule->m_BufferMap) {
|
| + XFA_MAPDATABLOCK* pBuffer = pair.second;
|
| + if (pBuffer) {
|
| + if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree)
|
| + pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
|
| + FX_Free(pBuffer);
|
| + }
|
| + }
|
| + pModule->m_BufferMap.clear();
|
| + pModule->m_ValueMap.clear();
|
| + delete pModule;
|
| }
|
|
|
| -void CXFA_Node::MergeAllData(void* pDstModule, bool bUseSrcAttr) {
|
| +void CXFA_Node::MergeAllData(void* pDstModule) {
|
| XFA_MAPMODULEDATA* pDstModuleData =
|
| static_cast<CXFA_Node*>(pDstModule)->CreateMapModuleData();
|
| XFA_MAPMODULEDATA* pSrcModuleData = GetMapModuleData();
|
| - if (!pSrcModuleData) {
|
| + if (!pSrcModuleData)
|
| return;
|
| - }
|
| - FX_POSITION psValue = pSrcModuleData->m_ValueMap.GetStartPosition();
|
| - while (psValue) {
|
| - void* pKey;
|
| - void* pValue;
|
| - pSrcModuleData->m_ValueMap.GetNextAssoc(psValue, pKey, pValue);
|
| - if (bUseSrcAttr || !pDstModuleData->m_ValueMap.GetValueAt(pKey)) {
|
| - pDstModuleData->m_ValueMap.SetAt(pKey, pValue);
|
| - }
|
| - }
|
| - FX_POSITION psBuffer = pSrcModuleData->m_BufferMap.GetStartPosition();
|
| - while (psBuffer) {
|
| - void* pKey;
|
| - XFA_MAPDATABLOCK* pSrcBuffer;
|
| - pSrcModuleData->m_BufferMap.GetNextAssoc(psBuffer, pKey, pSrcBuffer);
|
| - XFA_MAPDATABLOCK*& pBuffer = pDstModuleData->m_BufferMap[pKey];
|
| - if (pBuffer && !bUseSrcAttr) {
|
| - continue;
|
| - }
|
| +
|
| + for (const auto& pair : pSrcModuleData->m_ValueMap)
|
| + pDstModuleData->m_ValueMap[pair.first] = pair.second;
|
| +
|
| + for (const auto& pair : pSrcModuleData->m_BufferMap) {
|
| + XFA_MAPDATABLOCK* pSrcBuffer = pair.second;
|
| + XFA_MAPDATABLOCK*& pDstBuffer = pDstModuleData->m_BufferMap[pair.first];
|
| if (pSrcBuffer->pCallbackInfo && pSrcBuffer->pCallbackInfo->pFree &&
|
| !pSrcBuffer->pCallbackInfo->pCopy) {
|
| - if (pBuffer) {
|
| - pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
|
| - pDstModuleData->m_BufferMap.RemoveKey(pKey);
|
| + if (pDstBuffer) {
|
| + pDstBuffer->pCallbackInfo->pFree(*(void**)pDstBuffer->GetData());
|
| + pDstModuleData->m_BufferMap.erase(pair.first);
|
| }
|
| continue;
|
| }
|
| - if (!pBuffer) {
|
| - pBuffer = (XFA_MAPDATABLOCK*)FX_Alloc(
|
| + if (!pDstBuffer) {
|
| + pDstBuffer = (XFA_MAPDATABLOCK*)FX_Alloc(
|
| uint8_t, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes);
|
| - } else if (pBuffer->iBytes != pSrcBuffer->iBytes) {
|
| - if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
|
| - pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
|
| + } else if (pDstBuffer->iBytes != pSrcBuffer->iBytes) {
|
| + if (pDstBuffer->pCallbackInfo && pDstBuffer->pCallbackInfo->pFree) {
|
| + pDstBuffer->pCallbackInfo->pFree(*(void**)pDstBuffer->GetData());
|
| }
|
| - pBuffer = (XFA_MAPDATABLOCK*)FX_Realloc(
|
| - uint8_t, pBuffer, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes);
|
| - } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
|
| - pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
|
| + pDstBuffer = (XFA_MAPDATABLOCK*)FX_Realloc(
|
| + uint8_t, pDstBuffer, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes);
|
| + } else if (pDstBuffer->pCallbackInfo && pDstBuffer->pCallbackInfo->pFree) {
|
| + pDstBuffer->pCallbackInfo->pFree(*(void**)pDstBuffer->GetData());
|
| }
|
| - if (!pBuffer) {
|
| + if (!pDstBuffer) {
|
| continue;
|
| }
|
| - pBuffer->pCallbackInfo = pSrcBuffer->pCallbackInfo;
|
| - pBuffer->iBytes = pSrcBuffer->iBytes;
|
| - FXSYS_memcpy(pBuffer->GetData(), pSrcBuffer->GetData(), pSrcBuffer->iBytes);
|
| - if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pCopy) {
|
| - pBuffer->pCallbackInfo->pCopy(*(void**)pBuffer->GetData());
|
| + pDstBuffer->pCallbackInfo = pSrcBuffer->pCallbackInfo;
|
| + pDstBuffer->iBytes = pSrcBuffer->iBytes;
|
| + FXSYS_memcpy(pDstBuffer->GetData(), pSrcBuffer->GetData(),
|
| + pSrcBuffer->iBytes);
|
| + if (pDstBuffer->pCallbackInfo && pDstBuffer->pCallbackInfo->pCopy) {
|
| + pDstBuffer->pCallbackInfo->pCopy(*(void**)pDstBuffer->GetData());
|
| }
|
| }
|
| }
|
| @@ -5112,12 +5105,13 @@ void CXFA_Node::MoveBufferMapData(CXFA_Node* pDstModule, void* pKey) {
|
| pDstModuleData = pDstModule->CreateMapModuleData();
|
| }
|
| if (bNeedMove) {
|
| - void* pBufferBlockData = pSrcModuleData->m_BufferMap.GetValueAt(pKey);
|
| - if (pBufferBlockData) {
|
| - pSrcModuleData->m_BufferMap.RemoveKey(pKey);
|
| - pDstModuleData->m_BufferMap.RemoveKey(pKey);
|
| - pDstModuleData->m_BufferMap.SetAt(pKey,
|
| - (XFA_MAPDATABLOCK*)pBufferBlockData);
|
| + auto it = pSrcModuleData->m_BufferMap.find(pKey);
|
| + if (it != pSrcModuleData->m_BufferMap.end()) {
|
| + XFA_MAPDATABLOCK* pBufferBlockData = it->second;
|
| + if (pBufferBlockData) {
|
| + pSrcModuleData->m_BufferMap.erase(pKey);
|
| + pDstModuleData->m_BufferMap[pKey] = pBufferBlockData;
|
| + }
|
| }
|
| }
|
| if (pDstModule->IsNodeV()) {
|
|
|