diff options
Diffstat (limited to 'xfa/fxfa')
-rw-r--r-- | xfa/fxfa/app/xfa_textlayout.cpp | 62 | ||||
-rw-r--r-- | xfa/fxfa/app/xfa_textlayout.h | 3 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_document.cpp | 10 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_document.h | 4 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_layoutpagemgr.cpp | 19 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_layoutpagemgr.h | 6 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_node.cpp | 178 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_scriptcontext.cpp | 21 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_scriptcontext.h | 2 | ||||
-rw-r--r-- | xfa/fxfa/parser/xfa_document_datamerger_imp.cpp | 23 | ||||
-rw-r--r-- | xfa/fxfa/parser/xfa_object.h | 7 |
11 files changed, 169 insertions, 166 deletions
diff --git a/xfa/fxfa/app/xfa_textlayout.cpp b/xfa/fxfa/app/xfa_textlayout.cpp index 69b53eedb4..ea4ae4b2da 100644 --- a/xfa/fxfa/app/xfa_textlayout.cpp +++ b/xfa/fxfa/app/xfa_textlayout.cpp @@ -66,28 +66,22 @@ CXFA_TextParser::~CXFA_TextParser() { if (m_pUASheet) m_pUASheet->Release(); - FX_POSITION ps = m_mapXMLNodeToParseContext.GetStartPosition(); - while (ps) { - CFDE_XMLNode* pXMLNode; - CXFA_TextParseContext* pParseContext; - m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext); - if (pParseContext) + for (auto& pair : m_mapXMLNodeToParseContext) { + if (pair.second) { FXTARGET_DeleteWith(CXFA_TextParseContext, m_pAllocator.get(), - pParseContext); + pair.second); + } } - m_mapXMLNodeToParseContext.RemoveAll(); } + void CXFA_TextParser::Reset() { - FX_POSITION ps = m_mapXMLNodeToParseContext.GetStartPosition(); - while (ps) { - CFDE_XMLNode* pXMLNode; - CXFA_TextParseContext* pParseContext; - m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext); - if (pParseContext) + for (auto& pair : m_mapXMLNodeToParseContext) { + if (pair.second) { FXTARGET_DeleteWith(CXFA_TextParseContext, m_pAllocator.get(), - pParseContext); + pair.second); + } } - m_mapXMLNodeToParseContext.RemoveAll(); + m_mapXMLNodeToParseContext.clear(); m_pAllocator.reset(); } void CXFA_TextParser::InitCSSData(CXFA_TextProvider* pTextProvider) { @@ -227,19 +221,26 @@ IFDE_CSSComputedStyle* CXFA_TextParser::CreateStyle( } return pNewStyle; } + IFDE_CSSComputedStyle* CXFA_TextParser::ComputeStyle( CFDE_XMLNode* pXMLNode, IFDE_CSSComputedStyle* pParentStyle) { - CXFA_TextParseContext* pContext = static_cast<CXFA_TextParseContext*>( - m_mapXMLNodeToParseContext.GetValueAt(pXMLNode)); + auto it = m_mapXMLNodeToParseContext.find(pXMLNode); + if (it == m_mapXMLNodeToParseContext.end()) + return nullptr; + + CXFA_TextParseContext* pContext = it->second; if (!pContext) return nullptr; + pContext->m_pParentStyle = pParentStyle; pParentStyle->Retain(); + CXFA_CSSTagProvider tagProvider; ParseTagInfo(pXMLNode, tagProvider); if (tagProvider.m_bContent) return nullptr; + IFDE_CSSComputedStyle* pStyle = CreateStyle(pParentStyle); CFDE_CSSAccelerator* pCSSAccel = m_pSelector->InitAccelerator(); pCSSAccel->OnEnterTag(&tagProvider); @@ -294,7 +295,7 @@ void CXFA_TextParser::ParseRichText(CFDE_XMLNode* pXMLNode, eDisplay = pNewStyle->GetPositionStyles()->GetDisplay(); } pTextContext->SetDisplay(eDisplay); - m_mapXMLNodeToParseContext.SetAt(pXMLNode, pTextContext); + m_mapXMLNodeToParseContext[pXMLNode] = pTextContext; } for (CFDE_XMLNode* pXMLChild = pXMLNode->GetNodeItem(CFDE_XMLNode::FirstChild); @@ -423,17 +424,18 @@ int32_t CXFA_TextParser::GetHorScale(CXFA_TextProvider* pTextProvider, CFDE_XMLNode* pXMLNode) const { if (pStyle) { CFX_WideString wsValue; - if (pStyle->GetCustomStyle(FX_WSTRC(L"xfa-font-horizontal-scale"), - wsValue)) { + if (pStyle->GetCustomStyle(L"xfa-font-horizontal-scale", wsValue)) { return wsValue.GetInteger(); } while (pXMLNode) { - CXFA_TextParseContext* pContext = static_cast<CXFA_TextParseContext*>( - m_mapXMLNodeToParseContext.GetValueAt(pXMLNode)); - if (pContext && pContext->m_pParentStyle && - pContext->m_pParentStyle->GetCustomStyle( - FX_WSTRC(L"xfa-font-horizontal-scale"), wsValue)) { - return wsValue.GetInteger(); + auto it = m_mapXMLNodeToParseContext.find(pXMLNode); + if (it != m_mapXMLNodeToParseContext.end()) { + CXFA_TextParseContext* pContext = it->second; + if (pContext && pContext->m_pParentStyle && + pContext->m_pParentStyle->GetCustomStyle( + L"xfa-font-horizontal-scale", wsValue)) { + return wsValue.GetInteger(); + } } pXMLNode = pXMLNode->GetNodeItem(CFDE_XMLNode::Parent); } @@ -587,11 +589,13 @@ bool CXFA_TextParser::GetEmbbedObj(CXFA_TextProvider* pTextProvider, } return bRet; } + CXFA_TextParseContext* CXFA_TextParser::GetParseContextFromMap( CFDE_XMLNode* pXMLNode) { - return (CXFA_TextParseContext*)m_mapXMLNodeToParseContext.GetValueAt( - pXMLNode); + auto it = m_mapXMLNodeToParseContext.find(pXMLNode); + return it != m_mapXMLNodeToParseContext.end() ? it->second : nullptr; } + enum XFA_TABSTOPSSTATUS { XFA_TABSTOPSSTATUS_Error, XFA_TABSTOPSSTATUS_EOS, diff --git a/xfa/fxfa/app/xfa_textlayout.h b/xfa/fxfa/app/xfa_textlayout.h index 26bd1634ee..f923c743ed 100644 --- a/xfa/fxfa/app/xfa_textlayout.h +++ b/xfa/fxfa/app/xfa_textlayout.h @@ -134,8 +134,7 @@ class CXFA_TextParser { std::unique_ptr<IFX_MemoryAllocator> m_pAllocator; std::unique_ptr<CFDE_CSSStyleSelector> m_pSelector; IFDE_CSSStyleSheet* m_pUASheet; - CFX_MapPtrTemplate<CFDE_XMLNode*, CXFA_TextParseContext*> - m_mapXMLNodeToParseContext; + std::map<CFDE_XMLNode*, CXFA_TextParseContext*> m_mapXMLNodeToParseContext; }; class CXFA_LoaderContext { diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp index b5c7ea1f62..374fb98c52 100644 --- a/xfa/fxfa/parser/cxfa_document.cpp +++ b/xfa/fxfa/parser/cxfa_document.cpp @@ -351,7 +351,7 @@ void CXFA_Document::DoProtoMerge() { if (!pTemplateRoot) return; - CFX_MapPtrTemplate<uint32_t, CXFA_Node*> mIDMap; + std::map<uint32_t, CXFA_Node*> mIDMap; CXFA_NodeSet sUseNodes; CXFA_NodeIterator sIterator(pTemplateRoot); for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode; @@ -410,13 +410,13 @@ void CXFA_Document::DoProtoMerge() { XFA_RESOLVENODE_RS resoveNodeRS; int32_t iRet = m_pScriptContext->ResolveObjects(pUseHrefNode, wsSOM, resoveNodeRS, dwFlag); - if (iRet > 0 && resoveNodeRS.nodes[0]->IsNode()) { + if (iRet > 0 && resoveNodeRS.nodes[0]->IsNode()) pProtoNode = resoveNodeRS.nodes[0]->AsNode(); - } } else if (!wsID.IsEmpty()) { - if (!mIDMap.Lookup(FX_HashCode_GetW(wsID, false), pProtoNode)) { + auto it = mIDMap.find(FX_HashCode_GetW(wsID, false)); + if (it == mIDMap.end()) continue; - } + pProtoNode = it->second; } if (!pProtoNode) continue; diff --git a/xfa/fxfa/parser/cxfa_document.h b/xfa/fxfa/parser/cxfa_document.h index 4fd2d79504..fdd230dca7 100644 --- a/xfa/fxfa/parser/cxfa_document.h +++ b/xfa/fxfa/parser/cxfa_document.h @@ -7,6 +7,8 @@ #ifndef XFA_FXFA_PARSER_CXFA_DOCUMENT_H_ #define XFA_FXFA_PARSER_CXFA_DOCUMENT_H_ +#include <map> + #include "xfa/fxfa/fxfa.h" #include "xfa/fxfa/parser/xfa_localemgr.h" #include "xfa/fxfa/parser/xfa_object.h" @@ -101,7 +103,7 @@ class CXFA_Document { void ClearLayoutData(); - CFX_MapPtrTemplate<uint32_t, CXFA_Node*> m_rgGlobalBinding; + std::map<uint32_t, CXFA_Node*> m_rgGlobalBinding; CXFA_NodeArray m_pPendingPageSet; protected: diff --git a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp index 1a3da9ecb3..0a057f543f 100644 --- a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp +++ b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp @@ -1120,7 +1120,9 @@ bool CXFA_LayoutPageMgr::FindPageAreaFromPageSet_Ordered( bool bQuery) { int32_t iPageSetCount = 0; if (!pStartChild && !bQuery) { - m_pPageSetMap.Lookup(pPageSet, iPageSetCount); + auto it = m_pPageSetMap.find(pPageSet); + if (it != m_pPageSetMap.end()) + iPageSetCount = it->second; int32_t iMax = -1; CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_Element::Occur); if (pOccurNode) @@ -1128,7 +1130,6 @@ bool CXFA_LayoutPageMgr::FindPageAreaFromPageSet_Ordered( if (iMax >= 0 && iMax <= iPageSetCount) return false; } - bool bRes = false; CXFA_Node* pCurrentNode = pStartChild ? pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling) @@ -1173,7 +1174,7 @@ bool CXFA_LayoutPageMgr::FindPageAreaFromPageSet_Ordered( } } if (!pStartChild && bRes && !bQuery) - m_pPageSetMap.SetAt(pPageSet, ++iPageSetCount); + m_pPageSetMap[pPageSet] = ++iPageSetCount; return bRes; } @@ -1414,7 +1415,7 @@ void CXFA_LayoutPageMgr::InitPageSetMap() { XFA_ATTRIBUTEENUM eRelation = pPageSetNode->GetEnum(XFA_ATTRIBUTE_Relation); if (eRelation == XFA_ATTRIBUTEENUM_OrderedOccurrence) - m_pPageSetMap.SetAt(pPageSetNode, 0); + m_pPageSetMap[pPageSetNode] = 0; } } } @@ -1452,9 +1453,11 @@ void CXFA_LayoutPageMgr::CreateMinPageSetRecord(CXFA_Node* pPageSet, if (!pPageSet) return; - int32_t iCurSetCount = 0; - if (!m_pPageSetMap.Lookup(pPageSet, iCurSetCount)) + auto it = m_pPageSetMap.find(pPageSet); + if (it == m_pPageSetMap.end()) return; + + int32_t iCurSetCount = it->second; if (bCreateAll) iCurSetCount = 0; @@ -1475,7 +1478,7 @@ void CXFA_LayoutPageMgr::CreateMinPageSetRecord(CXFA_Node* pPageSet, } } } - m_pPageSetMap.SetAt(pPageSet, iMin); + m_pPageSetMap[pPageSet] = iMin; } } } @@ -1582,7 +1585,7 @@ void CXFA_LayoutPageMgr::ClearData() { m_pCurPageArea = nullptr; m_nCurPageCount = 0; m_bCreateOverFlowPage = false; - m_pPageSetMap.RemoveAll(); + m_pPageSetMap.clear(); } CXFA_LayoutItem* CXFA_LayoutPageMgr::FindOrCreateLayoutItem( diff --git a/xfa/fxfa/parser/cxfa_layoutpagemgr.h b/xfa/fxfa/parser/cxfa_layoutpagemgr.h index b466f3ad1f..1133e1778a 100644 --- a/xfa/fxfa/parser/cxfa_layoutpagemgr.h +++ b/xfa/fxfa/parser/cxfa_layoutpagemgr.h @@ -9,6 +9,7 @@ #include <iterator> #include <list> +#include <map> #include "xfa/fxfa/parser/xfa_layout_itemlayout.h" @@ -119,7 +120,7 @@ class CXFA_LayoutPageMgr { bool GetNextContentArea(CXFA_Node* pTargetContentArea); void InitPageSetMap(); void ProcessLastPageSet(); - inline bool IsPageSetRootOrderedOccurrence() { + bool IsPageSetRootOrderedOccurrence() const { return m_ePageSetMode == XFA_ATTRIBUTEENUM_OrderedOccurrence; } void ClearData(); @@ -127,6 +128,7 @@ class CXFA_LayoutPageMgr { void LayoutPageSetContents(); void PrepareLayout(); void SaveLayoutItem(CXFA_LayoutItem* pParentLayoutItem); + CXFA_LayoutProcessor* m_pLayoutProcessor; CXFA_Node* m_pTemplatePageSetRoot; CXFA_ContainerLayoutItem* m_pPageSetLayoutItemRoot; @@ -138,7 +140,7 @@ class CXFA_LayoutPageMgr { int32_t m_nCurPageCount; XFA_ATTRIBUTEENUM m_ePageSetMode; bool m_bCreateOverFlowPage; - CFX_MapPtrTemplate<CXFA_Node*, int32_t> m_pPageSetMap; + std::map<CXFA_Node*, int32_t> m_pPageSetMap; CFX_ArrayTemplate<CXFA_ContainerLayoutItem*> m_PageArray; }; diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp index 1bde816d3d..bc2a10c08b 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()) { diff --git a/xfa/fxfa/parser/cxfa_scriptcontext.cpp b/xfa/fxfa/parser/cxfa_scriptcontext.cpp index 60ee722c91..b33d4efda4 100644 --- a/xfa/fxfa/parser/cxfa_scriptcontext.cpp +++ b/xfa/fxfa/parser/cxfa_scriptcontext.cpp @@ -125,17 +125,12 @@ CXFA_ScriptContext::CXFA_ScriptContext(CXFA_Document* pDocument) m_eRunAtType(XFA_ATTRIBUTEENUM_Client) {} CXFA_ScriptContext::~CXFA_ScriptContext() { - FX_POSITION ps = m_mapVariableToContext.GetStartPosition(); - while (ps) { - CXFA_Object* pScriptNode; - CFXJSE_Context* pVariableContext = nullptr; - m_mapVariableToContext.GetNextAssoc(ps, pScriptNode, pVariableContext); - + for (const auto& pair : m_mapVariableToContext) { + CFXJSE_Context* pVariableContext = pair.second; delete ToThisProxy(pVariableContext->GetGlobalObject().get(), nullptr); delete pVariableContext; } - m_mapVariableToContext.RemoveAll(); - + m_mapVariableToContext.clear(); m_upObjectArray.RemoveAll(); } @@ -461,7 +456,7 @@ CFXJSE_Context* CXFA_ScriptContext::CreateVariablesContext( new CXFA_ThisProxy(pSubform, pScriptNode)); RemoveBuiltInObjs(pVariablesContext); pVariablesContext->EnableCompatibleMode(); - m_mapVariableToContext.SetAt(pScriptNode, pVariablesContext); + m_mapVariableToContext[pScriptNode] = pVariablesContext; return pVariablesContext; } CXFA_Object* CXFA_ScriptContext::GetVariablesThis(CXFA_Object* pObject, @@ -484,7 +479,8 @@ bool CXFA_ScriptContext::RunVariablesScript(CXFA_Node* pScriptNode) { if (!pParent || pParent->GetElementType() != XFA_Element::Variables) return false; - if (m_mapVariableToContext.GetValueAt(pScriptNode)) + auto it = m_mapVariableToContext.find(pScriptNode); + if (it != m_mapVariableToContext.end() && it->second) return true; CXFA_Node* pTextNode = pScriptNode->GetNodeItem(XFA_NODEITEM_FirstChild); @@ -521,10 +517,11 @@ bool CXFA_ScriptContext::QueryVariableValue(CXFA_Node* pScriptNode, variablesNode->GetElementType() != XFA_Element::Variables) return false; - void* lpVariables = m_mapVariableToContext.GetValueAt(pScriptNode); - if (!lpVariables) + auto it = m_mapVariableToContext.find(pScriptNode); + if (it == m_mapVariableToContext.end() || !it->second) return false; + void* lpVariables = it->second; bool bRes = false; CFXJSE_Context* pVariableContext = static_cast<CFXJSE_Context*>(lpVariables); std::unique_ptr<CFXJSE_Value> pObject = pVariableContext->GetGlobalObject(); diff --git a/xfa/fxfa/parser/cxfa_scriptcontext.h b/xfa/fxfa/parser/cxfa_scriptcontext.h index 664e3315bf..6d4f73a632 100644 --- a/xfa/fxfa/parser/cxfa_scriptcontext.h +++ b/xfa/fxfa/parser/cxfa_scriptcontext.h @@ -109,7 +109,7 @@ class CXFA_ScriptContext { CFXJSE_Class* m_pJsClass; XFA_SCRIPTLANGTYPE m_eScriptType; std::map<CXFA_Object*, std::unique_ptr<CFXJSE_Value>> m_mapObjectToValue; - CFX_MapPtrTemplate<CXFA_Object*, CFXJSE_Context*> m_mapVariableToContext; + std::map<CXFA_Object*, CFXJSE_Context*> m_mapVariableToContext; CXFA_EventParam m_eventParam; CXFA_NodeArray m_upObjectArray; // CacheList holds the NodeList items so we can clean them up when we're done. diff --git a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp index dab61e65d8..f1b60884ee 100644 --- a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp +++ b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp @@ -6,6 +6,7 @@ #include "xfa/fxfa/parser/xfa_document_datamerger_imp.h" +#include <map> #include <vector> #include "core/fxcrt/fx_ext.h" @@ -356,15 +357,14 @@ void CreateDataBinding(CXFA_Node* pFormNode, } CXFA_Node* GetGlobalBinding(CXFA_Document* pDocument, uint32_t dwNameHash) { - CXFA_Node* pNode = nullptr; - pDocument->m_rgGlobalBinding.Lookup(dwNameHash, pNode); - return pNode; + auto it = pDocument->m_rgGlobalBinding.find(dwNameHash); + return it != pDocument->m_rgGlobalBinding.end() ? it->second : nullptr; } void RegisterGlobalBinding(CXFA_Document* pDocument, uint32_t dwNameHash, CXFA_Node* pDataNode) { - pDocument->m_rgGlobalBinding.SetAt(dwNameHash, pDataNode); + pDocument->m_rgGlobalBinding[dwNameHash] = pDataNode; } CXFA_Node* ScopeMatchGlobalBinding(CXFA_Node* pDataScope, @@ -753,7 +753,7 @@ CXFA_Node* CopyContainer_SubformSet(CXFA_Document* pDocument, if (eType == XFA_Element::SubformSet || eType == XFA_Element::Area) { sNodeIterator.MoveToNext(); } else { - CFX_MapPtrTemplate<CXFA_Node*, CXFA_Node*> subformMapArray; + std::map<CXFA_Node*, CXFA_Node*> subformMapArray; CXFA_NodeArray nodeArray; for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { bool bSelfMatch = false; @@ -772,15 +772,16 @@ CXFA_Node* CopyContainer_SubformSet(CXFA_Document* pDocument, CreateDataBinding(pSubformNode, pDataNode, true); ASSERT(pSubformNode); - subformMapArray.SetAt(pSubformNode, pDataNode); + subformMapArray[pSubformNode] = pDataNode; nodeArray.Add(pSubformNode); } - subformMapArray.GetStartPosition(); for (int32_t iIndex = 0; iIndex < nodeArray.GetSize(); iIndex++) { CXFA_Node* pSubform = nodeArray[iIndex]; - CXFA_Node* pDataNode = - reinterpret_cast<CXFA_Node*>(subformMapArray.GetValueAt(pSubform)); + CXFA_Node* pDataNode = nullptr; + auto it = subformMapArray.find(pSubform); + if (it != subformMapArray.end()) + pDataNode = it->second; for (CXFA_Node* pTemplateChild = pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( @@ -794,7 +795,7 @@ CXFA_Node* CopyContainer_SubformSet(CXFA_Document* pDocument, } } } - subformMapArray.RemoveAll(); + subformMapArray.clear(); } for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { @@ -1521,7 +1522,7 @@ void CXFA_Document::DoDataRemerge(bool bDoDataMerge) { pFormRoot->RemoveChild(pNode); pFormRoot->SetObject(XFA_ATTRIBUTE_BindingNode, nullptr); } - m_rgGlobalBinding.RemoveAll(); + m_rgGlobalBinding.clear(); if (bDoDataMerge) DoDataMerge(); diff --git a/xfa/fxfa/parser/xfa_object.h b/xfa/fxfa/parser/xfa_object.h index 93f4e0145d..8be19ec2e1 100644 --- a/xfa/fxfa/parser/xfa_object.h +++ b/xfa/fxfa/parser/xfa_object.h @@ -7,6 +7,7 @@ #ifndef XFA_FXFA_PARSER_XFA_OBJECT_H_ #define XFA_FXFA_PARSER_XFA_OBJECT_H_ +#include <map> #include <unordered_set> #include "fxjs/cfxjse_arguments.h" @@ -144,8 +145,8 @@ struct XFA_MAPMODULEDATA { XFA_MAPMODULEDATA(); ~XFA_MAPMODULEDATA(); - CFX_MapPtrToPtr m_ValueMap; - CFX_MapPtrTemplate<void*, XFA_MAPDATABLOCK*> m_BufferMap; + std::map<void*, void*> m_ValueMap; + std::map<void*, XFA_MAPDATABLOCK*> m_BufferMap; }; #define XFA_CalcRefCount (void*)(uintptr_t) FXBSTR_ID('X', 'F', 'A', 'R') @@ -665,7 +666,7 @@ class CXFA_Node : public CXFA_Object { bool bProtoAlso = true) const; bool HasMapModuleKey(void* pKey, bool bProtoAlso = false); void RemoveMapModuleKey(void* pKey = nullptr); - void MergeAllData(void* pDstModule, bool bUseSrcAttr = true); + void MergeAllData(void* pDstModule); void MoveBufferMapData(CXFA_Node* pDstModule, void* pKey); void MoveBufferMapData(CXFA_Node* pSrcModule, CXFA_Node* pDstModule, |