Use std::map in xfa_ffdoc.cpp

Review URL: https://codereview.chromium.org/1917493002
diff --git a/xfa/fxfa/app/xfa_ffdoc.cpp b/xfa/fxfa/app/xfa_ffdoc.cpp
index 4b0f67b..0acd9a5 100644
--- a/xfa/fxfa/app/xfa_ffdoc.cpp
+++ b/xfa/fxfa/app/xfa_ffdoc.cpp
@@ -6,6 +6,8 @@
 
 #include "xfa/fxfa/include/xfa_ffdoc.h"
 
+#include <algorithm>
+
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfdoc/include/fpdf_doc.h"
@@ -188,37 +190,27 @@
     m_dwDocType = XFA_DOCTYPE_Dynamic;
   }
 }
+
 CXFA_FFDocView* CXFA_FFDoc::CreateDocView(uint32_t dwView) {
-  CXFA_FFDocView* pDocView =
-      (CXFA_FFDocView*)m_mapTypeToDocView.GetValueAt((void*)(uintptr_t)dwView);
-  if (!pDocView) {
-    pDocView = new CXFA_FFDocView(this);
-    m_mapTypeToDocView.SetAt((void*)(uintptr_t)dwView, pDocView);
-  }
-  return pDocView;
+  if (!m_TypeToDocViewMap[dwView])
+    m_TypeToDocViewMap[dwView].reset(new CXFA_FFDocView(this));
+
+  return m_TypeToDocViewMap[dwView].get();
 }
+
 CXFA_FFDocView* CXFA_FFDoc::GetDocView(CXFA_LayoutProcessor* pLayout) {
-  FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
-  while (ps) {
-    void* pType;
-    CXFA_FFDocView* pDocView;
-    m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
-    if (pDocView->GetXFALayout() == pLayout) {
-      return pDocView;
-    }
+  for (const auto& pair : m_TypeToDocViewMap) {
+    if (pair.second->GetXFALayout() == pLayout)
+      return pair.second.get();
   }
-  return NULL;
+  return nullptr;
 }
+
 CXFA_FFDocView* CXFA_FFDoc::GetDocView() {
-  FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
-  if (ps) {
-    void* pType;
-    CXFA_FFDocView* pDocView;
-    m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
-    return pDocView;
-  }
-  return NULL;
+  auto it = m_TypeToDocViewMap.begin();
+  return it != m_TypeToDocViewMap.end() ? it->second.get() : nullptr;
 }
+
 FX_BOOL CXFA_FFDoc::OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile) {
   m_bOwnStream = bTakeOverFile;
   m_pStream = pStream;
@@ -264,53 +256,35 @@
   return TRUE;
 }
 FX_BOOL CXFA_FFDoc::CloseDoc() {
-  FX_POSITION psClose = m_mapTypeToDocView.GetStartPosition();
-  while (psClose) {
-    void* pType;
-    CXFA_FFDocView* pDocView;
-    m_mapTypeToDocView.GetNextAssoc(psClose, pType, (void*&)pDocView);
-    pDocView->RunDocClose();
-  }
-  if (m_pDocument) {
+  for (const auto& pair : m_TypeToDocViewMap)
+    pair.second->RunDocClose();
+
+  if (m_pDocument)
     m_pDocument->ClearLayoutData();
-  }
-  FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
-  while (ps) {
-    void* pType;
-    CXFA_FFDocView* pDocView;
-    m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
-    delete pDocView;
-  }
-  m_mapTypeToDocView.RemoveAll();
+
+  m_TypeToDocViewMap.clear();
+
   if (m_pDocument) {
-    IXFA_Parser* pParser = m_pDocument->GetParser();
-    pParser->Release();
-    m_pDocument = NULL;
+    m_pDocument->GetParser()->Release();
+    m_pDocument = nullptr;
   }
-  if (m_pNotify) {
-    delete m_pNotify;
-    m_pNotify = NULL;
-  }
+
+  delete m_pNotify;
+  m_pNotify = nullptr;
+
   m_pApp->GetXFAFontMgr()->ReleaseDocFonts(this);
+
   if (m_dwDocType != XFA_DOCTYPE_XDP && m_pStream && m_bOwnStream) {
     m_pStream->Release();
-    m_pStream = NULL;
+    m_pStream = nullptr;
   }
-  ps = m_mapNamedImages.GetStartPosition();
-  while (ps) {
-    void* pName;
-    FX_IMAGEDIB_AND_DPI* pImage = NULL;
-    m_mapNamedImages.GetNextAssoc(ps, pName, (void*&)pImage);
-    if (pImage) {
-      delete pImage->pDibSource;
-      pImage->pDibSource = NULL;
-      FX_Free(pImage);
-      pImage = NULL;
-    }
-  }
-  m_mapNamedImages.RemoveAll();
-  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-  pNoteDriver->ClearEventTargets(FALSE);
+
+  for (const auto& pair : m_HashToDibDpiMap)
+    delete pair.second.pDibSource;
+
+  m_HashToDibDpiMap.clear();
+
+  FWL_GetApp()->GetNoteDriver()->ClearEventTargets(FALSE);
   return TRUE;
 }
 void CXFA_FFDoc::SetDocType(uint32_t dwType) {
@@ -327,11 +301,11 @@
     return nullptr;
 
   uint32_t dwHash = FX_HashCode_GetW(wsName, false);
-  FX_IMAGEDIB_AND_DPI* imageDIBDpi = nullptr;
-  if (m_mapNamedImages.Lookup((void*)(uintptr_t)dwHash, (void*&)imageDIBDpi)) {
-    iImageXDpi = imageDIBDpi->iImageXDpi;
-    iImageYDpi = imageDIBDpi->iImageYDpi;
-    return static_cast<CFX_DIBitmap*>(imageDIBDpi->pDibSource);
+  auto it = m_HashToDibDpiMap.find(dwHash);
+  if (it != m_HashToDibDpiMap.end()) {
+    iImageXDpi = it->second.iImageXDpi;
+    iImageYDpi = it->second.iImageYDpi;
+    return static_cast<CFX_DIBitmap*>(it->second.pDibSource);
   }
 
   CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot();
@@ -360,26 +334,21 @@
     }
   }
 
-  if (!pObject || !pObject->IsStream())
+  CPDF_Stream* pStream = ToStream(pObject);
+  if (!pStream)
     return nullptr;
 
-  if (!imageDIBDpi) {
-    imageDIBDpi = FX_Alloc(FX_IMAGEDIB_AND_DPI, 1);
-    imageDIBDpi->pDibSource = nullptr;
-    imageDIBDpi->iImageXDpi = 0;
-    imageDIBDpi->iImageYDpi = 0;
-    CPDF_StreamAcc streamAcc;
-    streamAcc.LoadAllData((CPDF_Stream*)pObject);
-    IFX_FileRead* pImageFileRead = FX_CreateMemoryStream(
-        (uint8_t*)streamAcc.GetData(), streamAcc.GetSize());
-    imageDIBDpi->pDibSource = XFA_LoadImageFromBuffer(
-        pImageFileRead, FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi);
-    imageDIBDpi->iImageXDpi = iImageXDpi;
-    imageDIBDpi->iImageYDpi = iImageYDpi;
-    pImageFileRead->Release();
-  }
-  m_mapNamedImages.SetAt((void*)(uintptr_t)dwHash, imageDIBDpi);
-  return (CFX_DIBitmap*)imageDIBDpi->pDibSource;
+  CPDF_StreamAcc streamAcc;
+  streamAcc.LoadAllData(pStream);
+
+  IFX_FileRead* pImageFileRead =
+      FX_CreateMemoryStream((uint8_t*)streamAcc.GetData(), streamAcc.GetSize());
+
+  CFX_DIBitmap* pDibSource = XFA_LoadImageFromBuffer(
+      pImageFileRead, FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi);
+  m_HashToDibDpiMap[dwHash] = {pDibSource, iImageXDpi, iImageYDpi};
+  pImageFileRead->Release();
+  return pDibSource;
 }
 
 CFDE_XMLElement* CXFA_FFDoc::GetPackageData(const CFX_WideStringC& wsPackage) {
diff --git a/xfa/fxfa/include/xfa_ffdoc.h b/xfa/fxfa/include/xfa_ffdoc.h
index 9d9af3d..2569b50 100644
--- a/xfa/fxfa/include/xfa_ffdoc.h
+++ b/xfa/fxfa/include/xfa_ffdoc.h
@@ -7,6 +7,9 @@
 #ifndef XFA_FXFA_INCLUDE_XFA_FFDOC_H_
 #define XFA_FXFA_INCLUDE_XFA_FFDOC_H_
 
+#include <map>
+#include <memory>
+
 #include "xfa/fxfa/include/fxfa.h"
 #include "xfa/fxfa/parser/xfa_document.h"
 
@@ -56,8 +59,8 @@
   CXFA_FFApp* m_pApp;
   CXFA_FFNotify* m_pNotify;
   CPDF_Document* m_pPDFDoc;
-  CFX_MapPtrToPtr m_mapNamedImages;
-  CFX_MapPtrToPtr m_mapTypeToDocView;
+  std::map<uint32_t, FX_IMAGEDIB_AND_DPI> m_HashToDibDpiMap;
+  std::map<uint32_t, std::unique_ptr<CXFA_FFDocView>> m_TypeToDocViewMap;
   uint32_t m_dwDocType;
   FX_BOOL m_bOwnStream;
 };