Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(196)

Side by Side Diff: xfa/fxfa/app/xfa_ffdoc.cpp

Issue 1917493002: Use std::map in xfa_ffdoc.cpp (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: rebase Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | xfa/fxfa/include/xfa_ffdoc.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/include/xfa_ffdoc.h" 7 #include "xfa/fxfa/include/xfa_ffdoc.h"
8 8
9 #include <algorithm>
10
9 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" 11 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
10 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" 12 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
11 #include "core/fpdfdoc/include/fpdf_doc.h" 13 #include "core/fpdfdoc/include/fpdf_doc.h"
12 #include "core/fxcrt/include/fx_ext.h" 14 #include "core/fxcrt/include/fx_ext.h"
13 #include "core/fxcrt/include/fx_memory.h" 15 #include "core/fxcrt/include/fx_memory.h"
14 #include "xfa/fde/xml/fde_xml_imp.h" 16 #include "xfa/fde/xml/fde_xml_imp.h"
15 #include "xfa/fgas/crt/fgas_algorithm.h" 17 #include "xfa/fgas/crt/fgas_algorithm.h"
16 #include "xfa/fwl/core/ifwl_notedriver.h" 18 #include "xfa/fwl/core/ifwl_notedriver.h"
17 #include "xfa/fxfa/app/xfa_ffnotify.h" 19 #include "xfa/fxfa/app/xfa_ffnotify.h"
18 #include "xfa/fxfa/include/xfa_checksum.h" 20 #include "xfa/fxfa/include/xfa_checksum.h"
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 CXFA_Node* pDynamicRender = 183 CXFA_Node* pDynamicRender =
182 pAcrobat7->GetFirstChildByClass(XFA_ELEMENT_DynamicRender); 184 pAcrobat7->GetFirstChildByClass(XFA_ELEMENT_DynamicRender);
183 if (!pDynamicRender) { 185 if (!pDynamicRender) {
184 return; 186 return;
185 } 187 }
186 CFX_WideString wsType; 188 CFX_WideString wsType;
187 if (pDynamicRender->TryContent(wsType) && wsType == FX_WSTRC(L"required")) { 189 if (pDynamicRender->TryContent(wsType) && wsType == FX_WSTRC(L"required")) {
188 m_dwDocType = XFA_DOCTYPE_Dynamic; 190 m_dwDocType = XFA_DOCTYPE_Dynamic;
189 } 191 }
190 } 192 }
193
191 CXFA_FFDocView* CXFA_FFDoc::CreateDocView(uint32_t dwView) { 194 CXFA_FFDocView* CXFA_FFDoc::CreateDocView(uint32_t dwView) {
192 CXFA_FFDocView* pDocView = 195 if (!m_TypeToDocViewMap[dwView])
193 (CXFA_FFDocView*)m_mapTypeToDocView.GetValueAt((void*)(uintptr_t)dwView); 196 m_TypeToDocViewMap[dwView].reset(new CXFA_FFDocView(this));
194 if (!pDocView) { 197
195 pDocView = new CXFA_FFDocView(this); 198 return m_TypeToDocViewMap[dwView].get();
196 m_mapTypeToDocView.SetAt((void*)(uintptr_t)dwView, pDocView); 199 }
200
201 CXFA_FFDocView* CXFA_FFDoc::GetDocView(CXFA_LayoutProcessor* pLayout) {
202 for (const auto& pair : m_TypeToDocViewMap) {
203 if (pair.second->GetXFALayout() == pLayout)
204 return pair.second.get();
197 } 205 }
198 return pDocView; 206 return nullptr;
199 } 207 }
200 CXFA_FFDocView* CXFA_FFDoc::GetDocView(CXFA_LayoutProcessor* pLayout) { 208
201 FX_POSITION ps = m_mapTypeToDocView.GetStartPosition(); 209 CXFA_FFDocView* CXFA_FFDoc::GetDocView() {
202 while (ps) { 210 auto it = m_TypeToDocViewMap.begin();
203 void* pType; 211 return it != m_TypeToDocViewMap.end() ? it->second.get() : nullptr;
204 CXFA_FFDocView* pDocView;
205 m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
206 if (pDocView->GetXFALayout() == pLayout) {
207 return pDocView;
208 }
209 }
210 return NULL;
211 } 212 }
212 CXFA_FFDocView* CXFA_FFDoc::GetDocView() { 213
213 FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
214 if (ps) {
215 void* pType;
216 CXFA_FFDocView* pDocView;
217 m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
218 return pDocView;
219 }
220 return NULL;
221 }
222 FX_BOOL CXFA_FFDoc::OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile) { 214 FX_BOOL CXFA_FFDoc::OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile) {
223 m_bOwnStream = bTakeOverFile; 215 m_bOwnStream = bTakeOverFile;
224 m_pStream = pStream; 216 m_pStream = pStream;
225 return TRUE; 217 return TRUE;
226 } 218 }
227 FX_BOOL CXFA_FFDoc::OpenDoc(CPDF_Document* pPDFDoc) { 219 FX_BOOL CXFA_FFDoc::OpenDoc(CPDF_Document* pPDFDoc) {
228 if (pPDFDoc == NULL) { 220 if (pPDFDoc == NULL) {
229 return FALSE; 221 return FALSE;
230 } 222 }
231 CPDF_Dictionary* pRoot = pPDFDoc->GetRoot(); 223 CPDF_Dictionary* pRoot = pPDFDoc->GetRoot();
(...skipping 25 matching lines...) Expand all
257 m_pPDFDoc = pPDFDoc; 249 m_pPDFDoc = pPDFDoc;
258 if (m_pStream) { 250 if (m_pStream) {
259 m_pStream->Release(); 251 m_pStream->Release();
260 m_pStream = NULL; 252 m_pStream = NULL;
261 } 253 }
262 m_pStream = pFileRead; 254 m_pStream = pFileRead;
263 m_bOwnStream = TRUE; 255 m_bOwnStream = TRUE;
264 return TRUE; 256 return TRUE;
265 } 257 }
266 FX_BOOL CXFA_FFDoc::CloseDoc() { 258 FX_BOOL CXFA_FFDoc::CloseDoc() {
267 FX_POSITION psClose = m_mapTypeToDocView.GetStartPosition(); 259 for (const auto& pair : m_TypeToDocViewMap)
268 while (psClose) { 260 pair.second->RunDocClose();
269 void* pType; 261
270 CXFA_FFDocView* pDocView; 262 if (m_pDocument)
271 m_mapTypeToDocView.GetNextAssoc(psClose, pType, (void*&)pDocView); 263 m_pDocument->ClearLayoutData();
272 pDocView->RunDocClose(); 264
265 m_TypeToDocViewMap.clear();
266
267 if (m_pDocument) {
268 m_pDocument->GetParser()->Release();
269 m_pDocument = nullptr;
273 } 270 }
274 if (m_pDocument) { 271
275 m_pDocument->ClearLayoutData(); 272 delete m_pNotify;
276 } 273 m_pNotify = nullptr;
277 FX_POSITION ps = m_mapTypeToDocView.GetStartPosition(); 274
278 while (ps) {
279 void* pType;
280 CXFA_FFDocView* pDocView;
281 m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
282 delete pDocView;
283 }
284 m_mapTypeToDocView.RemoveAll();
285 if (m_pDocument) {
286 IXFA_Parser* pParser = m_pDocument->GetParser();
287 pParser->Release();
288 m_pDocument = NULL;
289 }
290 if (m_pNotify) {
291 delete m_pNotify;
292 m_pNotify = NULL;
293 }
294 m_pApp->GetXFAFontMgr()->ReleaseDocFonts(this); 275 m_pApp->GetXFAFontMgr()->ReleaseDocFonts(this);
276
295 if (m_dwDocType != XFA_DOCTYPE_XDP && m_pStream && m_bOwnStream) { 277 if (m_dwDocType != XFA_DOCTYPE_XDP && m_pStream && m_bOwnStream) {
296 m_pStream->Release(); 278 m_pStream->Release();
297 m_pStream = NULL; 279 m_pStream = nullptr;
298 } 280 }
299 ps = m_mapNamedImages.GetStartPosition(); 281
300 while (ps) { 282 for (const auto& pair : m_HashToDibDpiMap)
301 void* pName; 283 delete pair.second.pDibSource;
302 FX_IMAGEDIB_AND_DPI* pImage = NULL; 284
303 m_mapNamedImages.GetNextAssoc(ps, pName, (void*&)pImage); 285 m_HashToDibDpiMap.clear();
304 if (pImage) { 286
305 delete pImage->pDibSource; 287 FWL_GetApp()->GetNoteDriver()->ClearEventTargets(FALSE);
306 pImage->pDibSource = NULL;
307 FX_Free(pImage);
308 pImage = NULL;
309 }
310 }
311 m_mapNamedImages.RemoveAll();
312 IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
313 pNoteDriver->ClearEventTargets(FALSE);
314 return TRUE; 288 return TRUE;
315 } 289 }
316 void CXFA_FFDoc::SetDocType(uint32_t dwType) { 290 void CXFA_FFDoc::SetDocType(uint32_t dwType) {
317 m_dwDocType = dwType; 291 m_dwDocType = dwType;
318 } 292 }
319 CPDF_Document* CXFA_FFDoc::GetPDFDoc() { 293 CPDF_Document* CXFA_FFDoc::GetPDFDoc() {
320 return m_pPDFDoc; 294 return m_pPDFDoc;
321 } 295 }
322 296
323 CFX_DIBitmap* CXFA_FFDoc::GetPDFNamedImage(const CFX_WideStringC& wsName, 297 CFX_DIBitmap* CXFA_FFDoc::GetPDFNamedImage(const CFX_WideStringC& wsName,
324 int32_t& iImageXDpi, 298 int32_t& iImageXDpi,
325 int32_t& iImageYDpi) { 299 int32_t& iImageYDpi) {
326 if (!m_pPDFDoc) 300 if (!m_pPDFDoc)
327 return nullptr; 301 return nullptr;
328 302
329 uint32_t dwHash = FX_HashCode_GetW(wsName, false); 303 uint32_t dwHash = FX_HashCode_GetW(wsName, false);
330 FX_IMAGEDIB_AND_DPI* imageDIBDpi = nullptr; 304 auto it = m_HashToDibDpiMap.find(dwHash);
331 if (m_mapNamedImages.Lookup((void*)(uintptr_t)dwHash, (void*&)imageDIBDpi)) { 305 if (it != m_HashToDibDpiMap.end()) {
332 iImageXDpi = imageDIBDpi->iImageXDpi; 306 iImageXDpi = it->second.iImageXDpi;
333 iImageYDpi = imageDIBDpi->iImageYDpi; 307 iImageYDpi = it->second.iImageYDpi;
334 return static_cast<CFX_DIBitmap*>(imageDIBDpi->pDibSource); 308 return static_cast<CFX_DIBitmap*>(it->second.pDibSource);
335 } 309 }
336 310
337 CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot(); 311 CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot();
338 if (!pRoot) 312 if (!pRoot)
339 return nullptr; 313 return nullptr;
340 314
341 CPDF_Dictionary* pNames = pRoot->GetDictBy("Names"); 315 CPDF_Dictionary* pNames = pRoot->GetDictBy("Names");
342 if (!pNames) 316 if (!pNames)
343 return nullptr; 317 return nullptr;
344 318
345 CPDF_Dictionary* pXFAImages = pNames->GetDictBy("XFAImages"); 319 CPDF_Dictionary* pXFAImages = pNames->GetDictBy("XFAImages");
346 if (!pXFAImages) 320 if (!pXFAImages)
347 return nullptr; 321 return nullptr;
348 322
349 CPDF_NameTree nametree(pXFAImages); 323 CPDF_NameTree nametree(pXFAImages);
350 CFX_ByteString bsName = PDF_EncodeText(wsName.c_str(), wsName.GetLength()); 324 CFX_ByteString bsName = PDF_EncodeText(wsName.c_str(), wsName.GetLength());
351 CPDF_Object* pObject = nametree.LookupValue(bsName); 325 CPDF_Object* pObject = nametree.LookupValue(bsName);
352 if (!pObject) { 326 if (!pObject) {
353 for (size_t i = 0; i < nametree.GetCount(); i++) { 327 for (size_t i = 0; i < nametree.GetCount(); i++) {
354 CFX_ByteString bsTemp; 328 CFX_ByteString bsTemp;
355 CPDF_Object* pTempObject = nametree.LookupValue(i, bsTemp); 329 CPDF_Object* pTempObject = nametree.LookupValue(i, bsTemp);
356 if (bsTemp == bsName) { 330 if (bsTemp == bsName) {
357 pObject = pTempObject; 331 pObject = pTempObject;
358 break; 332 break;
359 } 333 }
360 } 334 }
361 } 335 }
362 336
363 if (!pObject || !pObject->IsStream()) 337 CPDF_Stream* pStream = ToStream(pObject);
338 if (!pStream)
364 return nullptr; 339 return nullptr;
365 340
366 if (!imageDIBDpi) { 341 CPDF_StreamAcc streamAcc;
367 imageDIBDpi = FX_Alloc(FX_IMAGEDIB_AND_DPI, 1); 342 streamAcc.LoadAllData(pStream);
368 imageDIBDpi->pDibSource = nullptr; 343
369 imageDIBDpi->iImageXDpi = 0; 344 IFX_FileRead* pImageFileRead =
370 imageDIBDpi->iImageYDpi = 0; 345 FX_CreateMemoryStream((uint8_t*)streamAcc.GetData(), streamAcc.GetSize());
371 CPDF_StreamAcc streamAcc; 346
372 streamAcc.LoadAllData((CPDF_Stream*)pObject); 347 CFX_DIBitmap* pDibSource = XFA_LoadImageFromBuffer(
373 IFX_FileRead* pImageFileRead = FX_CreateMemoryStream( 348 pImageFileRead, FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi);
374 (uint8_t*)streamAcc.GetData(), streamAcc.GetSize()); 349 m_HashToDibDpiMap[dwHash] = {pDibSource, iImageXDpi, iImageYDpi};
375 imageDIBDpi->pDibSource = XFA_LoadImageFromBuffer( 350 pImageFileRead->Release();
376 pImageFileRead, FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi); 351 return pDibSource;
377 imageDIBDpi->iImageXDpi = iImageXDpi;
378 imageDIBDpi->iImageYDpi = iImageYDpi;
379 pImageFileRead->Release();
380 }
381 m_mapNamedImages.SetAt((void*)(uintptr_t)dwHash, imageDIBDpi);
382 return (CFX_DIBitmap*)imageDIBDpi->pDibSource;
383 } 352 }
384 353
385 CFDE_XMLElement* CXFA_FFDoc::GetPackageData(const CFX_WideStringC& wsPackage) { 354 CFDE_XMLElement* CXFA_FFDoc::GetPackageData(const CFX_WideStringC& wsPackage) {
386 uint32_t packetHash = FX_HashCode_GetW(wsPackage, false); 355 uint32_t packetHash = FX_HashCode_GetW(wsPackage, false);
387 CXFA_Node* pNode = ToNode(m_pDocument->GetXFAObject(packetHash)); 356 CXFA_Node* pNode = ToNode(m_pDocument->GetXFAObject(packetHash));
388 if (!pNode) { 357 if (!pNode) {
389 return NULL; 358 return NULL;
390 } 359 }
391 CFDE_XMLNode* pXMLNode = pNode->GetXMLMappingNode(); 360 CFDE_XMLNode* pXMLNode = pNode->GetXMLMappingNode();
392 return (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) 361 return (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element)
(...skipping 24 matching lines...) Expand all
417 } 386 }
418 pExport->Release(); 387 pExport->Release();
419 return bFlags; 388 return bFlags;
420 } 389 }
421 FX_BOOL CXFA_FFDoc::ImportData(IFX_FileRead* pStream, FX_BOOL bXDP) { 390 FX_BOOL CXFA_FFDoc::ImportData(IFX_FileRead* pStream, FX_BOOL bXDP) {
422 std::unique_ptr<CXFA_DataImporter, ReleaseDeleter<CXFA_DataImporter>> 391 std::unique_ptr<CXFA_DataImporter, ReleaseDeleter<CXFA_DataImporter>>
423 importer(new CXFA_DataImporter(m_pDocument)); 392 importer(new CXFA_DataImporter(m_pDocument));
424 393
425 return importer->ImportData(pStream); 394 return importer->ImportData(pStream);
426 } 395 }
OLDNEW
« no previous file with comments | « no previous file | xfa/fxfa/include/xfa_ffdoc.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698