| OLD | NEW |
| 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 <set> | 7 #include <set> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 2660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2671 } | 2671 } |
| 2672 } | 2672 } |
| 2673 | 2673 |
| 2674 class CPDF_DataAvail final : public IPDF_DataAvail { | 2674 class CPDF_DataAvail final : public IPDF_DataAvail { |
| 2675 public: | 2675 public: |
| 2676 CPDF_DataAvail(IFX_FileAvail* pFileAvail, | 2676 CPDF_DataAvail(IFX_FileAvail* pFileAvail, |
| 2677 IFX_FileRead* pFileRead, | 2677 IFX_FileRead* pFileRead, |
| 2678 FX_BOOL bSupportHintTable); | 2678 FX_BOOL bSupportHintTable); |
| 2679 ~CPDF_DataAvail() override; | 2679 ~CPDF_DataAvail() override; |
| 2680 | 2680 |
| 2681 int IsDocAvail(IFX_DownloadHints* pHints) override; | 2681 // IPDF_DataAvail: |
| 2682 DocAvailStatus IsDocAvail(IFX_DownloadHints* pHints) override; |
| 2683 void SetDocument(CPDF_Document* pDoc) override; |
| 2684 int IsPageAvail(int iPage, IFX_DownloadHints* pHints) override; |
| 2685 DocFormStatus IsFormAvail(IFX_DownloadHints* pHints) override; |
| 2686 DocLinearizationStatus IsLinearizedPDF() override; |
| 2687 FX_BOOL IsLinearized() override { return m_bLinearized; } |
| 2688 void GetLinearizedMainXRefInfo(FX_FILESIZE* pPos, FX_DWORD* pSize) override; |
| 2682 | 2689 |
| 2683 void SetDocument(CPDF_Document* pDoc) override; | |
| 2684 | |
| 2685 int IsPageAvail(int iPage, IFX_DownloadHints* pHints) override; | |
| 2686 | |
| 2687 int IsFormAvail(IFX_DownloadHints* pHints) override; | |
| 2688 | |
| 2689 int IsLinearizedPDF() override; | |
| 2690 | |
| 2691 FX_BOOL IsLinearized() override { return m_bLinearized; } | |
| 2692 | |
| 2693 void GetLinearizedMainXRefInfo(FX_FILESIZE* pPos, FX_DWORD* pSize) override; | |
| 2694 int GetPageCount() const; | 2690 int GetPageCount() const; |
| 2695 CPDF_Dictionary* GetPage(int index); | 2691 CPDF_Dictionary* GetPage(int index); |
| 2696 | 2692 |
| 2697 friend class CPDF_HintTables; | 2693 friend class CPDF_HintTables; |
| 2698 | 2694 |
| 2699 protected: | 2695 protected: |
| 2700 static const int kMaxDataAvailRecursionDepth = 64; | 2696 static const int kMaxDataAvailRecursionDepth = 64; |
| 2701 static int s_CurrentDataAvailRecursionDepth; | 2697 static int s_CurrentDataAvailRecursionDepth; |
| 2702 static const int kMaxPageRecursionDepth = 1024; | 2698 static const int kMaxPageRecursionDepth = 1024; |
| 2703 | 2699 |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3073 } else { | 3069 } else { |
| 3074 ret_array.Add(pObj); | 3070 ret_array.Add(pObj); |
| 3075 } | 3071 } |
| 3076 } | 3072 } |
| 3077 return FALSE; | 3073 return FALSE; |
| 3078 } | 3074 } |
| 3079 obj_array.RemoveAll(); | 3075 obj_array.RemoveAll(); |
| 3080 obj_array.Append(new_obj_array); | 3076 obj_array.Append(new_obj_array); |
| 3081 return IsObjectsAvail(obj_array, FALSE, pHints, ret_array); | 3077 return IsObjectsAvail(obj_array, FALSE, pHints, ret_array); |
| 3082 } | 3078 } |
| 3083 int CPDF_DataAvail::IsDocAvail(IFX_DownloadHints* pHints) { | 3079 |
| 3080 IPDF_DataAvail::DocAvailStatus CPDF_DataAvail::IsDocAvail( |
| 3081 IFX_DownloadHints* pHints) { |
| 3084 if (!m_dwFileLen && m_pFileRead) { | 3082 if (!m_dwFileLen && m_pFileRead) { |
| 3085 m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize(); | 3083 m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize(); |
| 3086 if (!m_dwFileLen) { | 3084 if (!m_dwFileLen) { |
| 3087 return PDF_DATA_ERROR; | 3085 return DataError; |
| 3088 } | 3086 } |
| 3089 } | 3087 } |
| 3090 while (!m_bDocAvail) { | 3088 while (!m_bDocAvail) { |
| 3091 if (!CheckDocStatus(pHints)) { | 3089 if (!CheckDocStatus(pHints)) { |
| 3092 return PDF_DATA_NOTAVAIL; | 3090 return DataNotAvailable; |
| 3093 } | 3091 } |
| 3094 } | 3092 } |
| 3095 return PDF_DATA_AVAIL; | 3093 return DataAvailable; |
| 3096 } | 3094 } |
| 3095 |
| 3097 FX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(IFX_DownloadHints* pHints) { | 3096 FX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(IFX_DownloadHints* pHints) { |
| 3098 if (!m_objs_array.GetSize()) { | 3097 if (!m_objs_array.GetSize()) { |
| 3099 m_objs_array.RemoveAll(); | 3098 m_objs_array.RemoveAll(); |
| 3100 m_objnum_array.RemoveAll(); | 3099 m_objnum_array.RemoveAll(); |
| 3101 CFX_PtrArray obj_array; | 3100 CFX_PtrArray obj_array; |
| 3102 obj_array.Append(m_arrayAcroforms); | 3101 obj_array.Append(m_arrayAcroforms); |
| 3103 FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array); | 3102 FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array); |
| 3104 if (bRet) { | 3103 if (bRet) { |
| 3105 m_objs_array.RemoveAll(); | 3104 m_objs_array.RemoveAll(); |
| 3106 } | 3105 } |
| (...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3637 FX_DWORD gennum = FXSYS_atoi(word); | 3636 FX_DWORD gennum = FXSYS_atoi(word); |
| 3638 if (m_syntaxParser.GetKeyword() != FX_BSTRC("obj")) { | 3637 if (m_syntaxParser.GetKeyword() != FX_BSTRC("obj")) { |
| 3639 m_syntaxParser.RestorePos(SavedPos); | 3638 m_syntaxParser.RestorePos(SavedPos); |
| 3640 return NULL; | 3639 return NULL; |
| 3641 } | 3640 } |
| 3642 CPDF_Object* pObj = | 3641 CPDF_Object* pObj = |
| 3643 m_syntaxParser.GetObject(pObjList, parser_objnum, gennum, 0); | 3642 m_syntaxParser.GetObject(pObjList, parser_objnum, gennum, 0); |
| 3644 m_syntaxParser.RestorePos(SavedPos); | 3643 m_syntaxParser.RestorePos(SavedPos); |
| 3645 return pObj; | 3644 return pObj; |
| 3646 } | 3645 } |
| 3647 int CPDF_DataAvail::IsLinearizedPDF() { | 3646 IPDF_DataAvail::DocLinearizationStatus CPDF_DataAvail::IsLinearizedPDF() { |
| 3648 FX_DWORD req_size = 1024; | 3647 FX_DWORD req_size = 1024; |
| 3649 if (!m_pFileAvail->IsDataAvail(0, req_size)) { | 3648 if (!m_pFileAvail->IsDataAvail(0, req_size)) { |
| 3650 return PDF_LINEARIZATION_UNKNOWN; | 3649 return LinearizationUnknown; |
| 3651 } | 3650 } |
| 3652 if (!m_pFileRead) { | 3651 if (!m_pFileRead) { |
| 3653 return PDF_NOT_LINEARIZED; | 3652 return NotLinearized; |
| 3654 } | 3653 } |
| 3655 FX_FILESIZE dwSize = m_pFileRead->GetSize(); | 3654 FX_FILESIZE dwSize = m_pFileRead->GetSize(); |
| 3656 if (dwSize < (FX_FILESIZE)req_size) { | 3655 if (dwSize < (FX_FILESIZE)req_size) { |
| 3657 return PDF_LINEARIZATION_UNKNOWN; | 3656 return LinearizationUnknown; |
| 3658 } | 3657 } |
| 3659 uint8_t buffer[1024]; | 3658 uint8_t buffer[1024]; |
| 3660 m_pFileRead->ReadBlock(buffer, 0, req_size); | 3659 m_pFileRead->ReadBlock(buffer, 0, req_size); |
| 3661 if (IsLinearizedFile(buffer, req_size)) { | 3660 if (IsLinearizedFile(buffer, req_size)) { |
| 3662 return PDF_LINEARIZED; | 3661 return Linearized; |
| 3663 } | 3662 } |
| 3664 return PDF_NOT_LINEARIZED; | 3663 return NotLinearized; |
| 3665 } | 3664 } |
| 3666 FX_BOOL CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen) { | 3665 FX_BOOL CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen) { |
| 3667 ScopedFileStream file(FX_CreateMemoryStream(pData, (size_t)dwLen, FALSE)); | 3666 ScopedFileStream file(FX_CreateMemoryStream(pData, (size_t)dwLen, FALSE)); |
| 3668 int32_t offset = GetHeaderOffset(file.get()); | 3667 int32_t offset = GetHeaderOffset(file.get()); |
| 3669 if (offset == -1) { | 3668 if (offset == -1) { |
| 3670 m_docStatus = PDF_DATAAVAIL_ERROR; | 3669 m_docStatus = PDF_DATAAVAIL_ERROR; |
| 3671 return FALSE; | 3670 return FALSE; |
| 3672 } | 3671 } |
| 3673 m_dwHeaderOffset = offset; | 3672 m_dwHeaderOffset = offset; |
| 3674 m_syntaxParser.InitParser(file.get(), offset); | 3673 m_syntaxParser.InitParser(file.get(), offset); |
| (...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4271 } | 4270 } |
| 4272 } | 4271 } |
| 4273 if (m_bPagesLoad) { | 4272 if (m_bPagesLoad) { |
| 4274 return TRUE; | 4273 return TRUE; |
| 4275 } | 4274 } |
| 4276 m_pDocument->LoadPages(); | 4275 m_pDocument->LoadPages(); |
| 4277 return FALSE; | 4276 return FALSE; |
| 4278 } | 4277 } |
| 4279 int CPDF_DataAvail::CheckLinearizedData(IFX_DownloadHints* pHints) { | 4278 int CPDF_DataAvail::CheckLinearizedData(IFX_DownloadHints* pHints) { |
| 4280 if (m_bLinearedDataOK) { | 4279 if (m_bLinearedDataOK) { |
| 4281 return PDF_DATA_AVAIL; | 4280 return DataAvailable; |
| 4282 } | 4281 } |
| 4283 | 4282 |
| 4284 if (!m_bMainXRefLoadTried) { | 4283 if (!m_bMainXRefLoadTried) { |
| 4285 FX_SAFE_DWORD data_size = m_dwFileLen; | 4284 FX_SAFE_DWORD data_size = m_dwFileLen; |
| 4286 data_size -= m_dwLastXRefOffset; | 4285 data_size -= m_dwLastXRefOffset; |
| 4287 if (!data_size.IsValid()) { | 4286 if (!data_size.IsValid()) { |
| 4288 return PDF_DATA_ERROR; | 4287 return DataError; |
| 4289 } | 4288 } |
| 4290 if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, | 4289 if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, |
| 4291 data_size.ValueOrDie())) { | 4290 data_size.ValueOrDie())) { |
| 4292 pHints->AddSegment(m_dwLastXRefOffset, data_size.ValueOrDie()); | 4291 pHints->AddSegment(m_dwLastXRefOffset, data_size.ValueOrDie()); |
| 4293 return PDF_DATA_NOTAVAIL; | 4292 return DataNotAvailable; |
| 4294 } | 4293 } |
| 4295 FX_DWORD dwRet = (m_pDocument->GetParser())->LoadLinearizedMainXRefTable(); | 4294 FX_DWORD dwRet = (m_pDocument->GetParser())->LoadLinearizedMainXRefTable(); |
| 4296 m_bMainXRefLoadTried = TRUE; | 4295 m_bMainXRefLoadTried = TRUE; |
| 4297 if (dwRet != PDFPARSE_ERROR_SUCCESS) { | 4296 if (dwRet != PDFPARSE_ERROR_SUCCESS) { |
| 4298 return PDF_DATA_ERROR; | 4297 return DataError; |
| 4299 } | 4298 } |
| 4300 if (!PreparePageItem()) { | 4299 if (!PreparePageItem()) { |
| 4301 return PDF_DATA_NOTAVAIL; | 4300 return DataNotAvailable; |
| 4302 } | 4301 } |
| 4303 m_bMainXRefLoadedOK = TRUE; | 4302 m_bMainXRefLoadedOK = TRUE; |
| 4304 m_bLinearedDataOK = TRUE; | 4303 m_bLinearedDataOK = TRUE; |
| 4305 } | 4304 } |
| 4306 | 4305 |
| 4307 return m_bLinearedDataOK ? PDF_DATA_AVAIL : PDF_DATA_NOTAVAIL; | 4306 return m_bLinearedDataOK ? DataAvailable : DataNotAvailable; |
| 4308 } | 4307 } |
| 4309 FX_BOOL CPDF_DataAvail::CheckPageAnnots(int32_t iPage, | 4308 FX_BOOL CPDF_DataAvail::CheckPageAnnots(int32_t iPage, |
| 4310 IFX_DownloadHints* pHints) { | 4309 IFX_DownloadHints* pHints) { |
| 4311 if (!m_objs_array.GetSize()) { | 4310 if (!m_objs_array.GetSize()) { |
| 4312 m_objs_array.RemoveAll(); | 4311 m_objs_array.RemoveAll(); |
| 4313 m_objnum_array.RemoveAll(); | 4312 m_objnum_array.RemoveAll(); |
| 4314 CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iPage); | 4313 CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iPage); |
| 4315 if (!pPageDict) { | 4314 if (!pPageDict) { |
| 4316 return TRUE; | 4315 return TRUE; |
| 4317 } | 4316 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4365 } | 4364 } |
| 4366 CPDF_Object* pRet = pParentDict->GetElement("Resources"); | 4365 CPDF_Object* pRet = pParentDict->GetElement("Resources"); |
| 4367 if (pRet) { | 4366 if (pRet) { |
| 4368 m_pPageResource = pRet; | 4367 m_pPageResource = pRet; |
| 4369 return TRUE; | 4368 return TRUE; |
| 4370 } | 4369 } |
| 4371 return HaveResourceAncestor(pParentDict); | 4370 return HaveResourceAncestor(pParentDict); |
| 4372 } | 4371 } |
| 4373 int CPDF_DataAvail::IsPageAvail(int32_t iPage, IFX_DownloadHints* pHints) { | 4372 int CPDF_DataAvail::IsPageAvail(int32_t iPage, IFX_DownloadHints* pHints) { |
| 4374 if (!m_pDocument) { | 4373 if (!m_pDocument) { |
| 4375 return PDF_DATA_ERROR; | 4374 return DataError; |
| 4376 } | 4375 } |
| 4377 if (IsFirstCheck(iPage)) { | 4376 if (IsFirstCheck(iPage)) { |
| 4378 m_bCurPageDictLoadOK = FALSE; | 4377 m_bCurPageDictLoadOK = FALSE; |
| 4379 m_bPageLoadedOK = FALSE; | 4378 m_bPageLoadedOK = FALSE; |
| 4380 m_bAnnotsLoad = FALSE; | 4379 m_bAnnotsLoad = FALSE; |
| 4381 m_bNeedDownLoadResource = FALSE; | 4380 m_bNeedDownLoadResource = FALSE; |
| 4382 m_objs_array.RemoveAll(); | 4381 m_objs_array.RemoveAll(); |
| 4383 m_objnum_array.RemoveAll(); | 4382 m_objnum_array.RemoveAll(); |
| 4384 } | 4383 } |
| 4385 if (m_pagesLoadState.find(iPage) != m_pagesLoadState.end()) { | 4384 if (m_pagesLoadState.find(iPage) != m_pagesLoadState.end()) { |
| 4386 return PDF_DATA_AVAIL; | 4385 return DataAvailable; |
| 4387 } | 4386 } |
| 4388 if (m_bLinearized) { | 4387 if (m_bLinearized) { |
| 4389 if ((FX_DWORD)iPage == m_dwFirstPageNo) { | 4388 if ((FX_DWORD)iPage == m_dwFirstPageNo) { |
| 4390 m_pagesLoadState.insert(iPage); | 4389 m_pagesLoadState.insert(iPage); |
| 4391 return PDF_DATA_AVAIL; | 4390 return DataAvailable; |
| 4392 } | 4391 } |
| 4393 int32_t nResult = CheckLinearizedData(pHints); | 4392 int32_t nResult = CheckLinearizedData(pHints); |
| 4394 if (nResult != PDF_DATA_AVAIL) { | 4393 if (nResult != DataAvailable) { |
| 4395 return nResult; | 4394 return nResult; |
| 4396 } | 4395 } |
| 4397 if (m_pHintTables) { | 4396 if (m_pHintTables) { |
| 4398 nResult = m_pHintTables->CheckPage(iPage, pHints); | 4397 nResult = m_pHintTables->CheckPage(iPage, pHints); |
| 4399 if (nResult != PDF_DATA_AVAIL) | 4398 if (nResult != DataAvailable) |
| 4400 return nResult; | 4399 return nResult; |
| 4401 m_pagesLoadState.insert(iPage); | 4400 m_pagesLoadState.insert(iPage); |
| 4402 return PDF_DATA_AVAIL; | 4401 return DataAvailable; |
| 4403 } | 4402 } |
| 4404 if (m_bMainXRefLoadedOK) { | 4403 if (m_bMainXRefLoadedOK) { |
| 4405 if (m_bTotalLoadPageTree) { | 4404 if (m_bTotalLoadPageTree) { |
| 4406 if (!LoadPages(pHints)) { | 4405 if (!LoadPages(pHints)) { |
| 4407 return PDF_DATA_NOTAVAIL; | 4406 return DataNotAvailable; |
| 4408 } | 4407 } |
| 4409 } else { | 4408 } else { |
| 4410 if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) { | 4409 if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) { |
| 4411 return PDF_DATA_NOTAVAIL; | 4410 return DataNotAvailable; |
| 4412 } | 4411 } |
| 4413 } | 4412 } |
| 4414 } else { | 4413 } else { |
| 4415 if (!LoadAllFile(pHints)) { | 4414 if (!LoadAllFile(pHints)) { |
| 4416 return PDF_DATA_NOTAVAIL; | 4415 return DataNotAvailable; |
| 4417 } | 4416 } |
| 4418 ((CPDF_Parser*)m_pDocument->GetParser())->RebuildCrossRef(); | 4417 ((CPDF_Parser*)m_pDocument->GetParser())->RebuildCrossRef(); |
| 4419 ResetFirstCheck(iPage); | 4418 ResetFirstCheck(iPage); |
| 4420 return PDF_DATA_AVAIL; | 4419 return DataAvailable; |
| 4421 } | 4420 } |
| 4422 } else { | 4421 } else { |
| 4423 if (!m_bTotalLoadPageTree) { | 4422 if (!m_bTotalLoadPageTree) { |
| 4424 if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) { | 4423 if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) { |
| 4425 return PDF_DATA_NOTAVAIL; | 4424 return DataNotAvailable; |
| 4426 } | 4425 } |
| 4427 } | 4426 } |
| 4428 } | 4427 } |
| 4429 if (m_bHaveAcroForm && !m_bAcroFormLoad) { | 4428 if (m_bHaveAcroForm && !m_bAcroFormLoad) { |
| 4430 if (!CheckAcroFormSubObject(pHints)) { | 4429 if (!CheckAcroFormSubObject(pHints)) { |
| 4431 return PDF_DATA_NOTAVAIL; | 4430 return DataNotAvailable; |
| 4432 } | 4431 } |
| 4433 m_bAcroFormLoad = TRUE; | 4432 m_bAcroFormLoad = TRUE; |
| 4434 } | 4433 } |
| 4435 if (!m_bPageLoadedOK) { | 4434 if (!m_bPageLoadedOK) { |
| 4436 if (!m_objs_array.GetSize()) { | 4435 if (!m_objs_array.GetSize()) { |
| 4437 m_objs_array.RemoveAll(); | 4436 m_objs_array.RemoveAll(); |
| 4438 m_objnum_array.RemoveAll(); | 4437 m_objnum_array.RemoveAll(); |
| 4439 m_pPageDict = m_pDocument->GetPage(iPage); | 4438 m_pPageDict = m_pDocument->GetPage(iPage); |
| 4440 if (!m_pPageDict) { | 4439 if (!m_pPageDict) { |
| 4441 ResetFirstCheck(iPage); | 4440 ResetFirstCheck(iPage); |
| 4442 return PDF_DATA_AVAIL; | 4441 return DataAvailable; |
| 4443 } | 4442 } |
| 4444 CFX_PtrArray obj_array; | 4443 CFX_PtrArray obj_array; |
| 4445 obj_array.Add(m_pPageDict); | 4444 obj_array.Add(m_pPageDict); |
| 4446 FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array); | 4445 FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array); |
| 4447 if (bRet) { | 4446 if (bRet) { |
| 4448 m_objs_array.RemoveAll(); | 4447 m_objs_array.RemoveAll(); |
| 4449 m_bPageLoadedOK = TRUE; | 4448 m_bPageLoadedOK = TRUE; |
| 4450 } else { | 4449 } else { |
| 4451 return bRet; | 4450 return bRet; |
| 4452 } | 4451 } |
| 4453 } else { | 4452 } else { |
| 4454 CFX_PtrArray new_objs_array; | 4453 CFX_PtrArray new_objs_array; |
| 4455 FX_BOOL bRet = | 4454 FX_BOOL bRet = |
| 4456 IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); | 4455 IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); |
| 4457 m_objs_array.RemoveAll(); | 4456 m_objs_array.RemoveAll(); |
| 4458 if (bRet) { | 4457 if (bRet) { |
| 4459 m_bPageLoadedOK = TRUE; | 4458 m_bPageLoadedOK = TRUE; |
| 4460 } else { | 4459 } else { |
| 4461 m_objs_array.Append(new_objs_array); | 4460 m_objs_array.Append(new_objs_array); |
| 4462 return PDF_DATA_NOTAVAIL; | 4461 return DataNotAvailable; |
| 4463 } | 4462 } |
| 4464 } | 4463 } |
| 4465 } | 4464 } |
| 4466 if (m_bPageLoadedOK) { | 4465 if (m_bPageLoadedOK) { |
| 4467 if (!m_bAnnotsLoad) { | 4466 if (!m_bAnnotsLoad) { |
| 4468 if (!CheckPageAnnots(iPage, pHints)) { | 4467 if (!CheckPageAnnots(iPage, pHints)) { |
| 4469 return PDF_DATA_NOTAVAIL; | 4468 return DataNotAvailable; |
| 4470 } | 4469 } |
| 4471 m_bAnnotsLoad = TRUE; | 4470 m_bAnnotsLoad = TRUE; |
| 4472 } | 4471 } |
| 4473 } | 4472 } |
| 4474 if (m_pPageDict && !m_bNeedDownLoadResource) { | 4473 if (m_pPageDict && !m_bNeedDownLoadResource) { |
| 4475 m_pPageResource = m_pPageDict->GetElement("Resources"); | 4474 m_pPageResource = m_pPageDict->GetElement("Resources"); |
| 4476 if (!m_pPageResource) { | 4475 if (!m_pPageResource) { |
| 4477 m_bNeedDownLoadResource = HaveResourceAncestor(m_pPageDict); | 4476 m_bNeedDownLoadResource = HaveResourceAncestor(m_pPageDict); |
| 4478 } else { | 4477 } else { |
| 4479 m_bNeedDownLoadResource = TRUE; | 4478 m_bNeedDownLoadResource = TRUE; |
| 4480 } | 4479 } |
| 4481 } | 4480 } |
| 4482 if (m_bNeedDownLoadResource) { | 4481 if (m_bNeedDownLoadResource) { |
| 4483 FX_BOOL bRet = CheckResources(pHints); | 4482 FX_BOOL bRet = CheckResources(pHints); |
| 4484 if (!bRet) { | 4483 if (!bRet) { |
| 4485 return PDF_DATA_NOTAVAIL; | 4484 return DataNotAvailable; |
| 4486 } | 4485 } |
| 4487 m_bNeedDownLoadResource = FALSE; | 4486 m_bNeedDownLoadResource = FALSE; |
| 4488 } | 4487 } |
| 4489 m_bPageLoadedOK = FALSE; | 4488 m_bPageLoadedOK = FALSE; |
| 4490 m_bAnnotsLoad = FALSE; | 4489 m_bAnnotsLoad = FALSE; |
| 4491 m_bCurPageDictLoadOK = FALSE; | 4490 m_bCurPageDictLoadOK = FALSE; |
| 4492 ResetFirstCheck(iPage); | 4491 ResetFirstCheck(iPage); |
| 4493 m_pagesLoadState.insert(iPage); | 4492 m_pagesLoadState.insert(iPage); |
| 4494 return PDF_DATA_AVAIL; | 4493 return DataAvailable; |
| 4495 } | 4494 } |
| 4496 FX_BOOL CPDF_DataAvail::CheckResources(IFX_DownloadHints* pHints) { | 4495 FX_BOOL CPDF_DataAvail::CheckResources(IFX_DownloadHints* pHints) { |
| 4497 if (!m_objs_array.GetSize()) { | 4496 if (!m_objs_array.GetSize()) { |
| 4498 m_objs_array.RemoveAll(); | 4497 m_objs_array.RemoveAll(); |
| 4499 CFX_PtrArray obj_array; | 4498 CFX_PtrArray obj_array; |
| 4500 obj_array.Add(m_pPageResource); | 4499 obj_array.Add(m_pPageResource); |
| 4501 FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array); | 4500 FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array); |
| 4502 if (bRet) { | 4501 if (bRet) { |
| 4503 m_objs_array.RemoveAll(); | 4502 m_objs_array.RemoveAll(); |
| 4504 } | 4503 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4550 CPDF_Object* pPageDict = ParseIndirectObjectAt(0, dwObjNum, m_pDocument); | 4549 CPDF_Object* pPageDict = ParseIndirectObjectAt(0, dwObjNum, m_pDocument); |
| 4551 if (!pPageDict) { | 4550 if (!pPageDict) { |
| 4552 return nullptr; | 4551 return nullptr; |
| 4553 } | 4552 } |
| 4554 m_pDocument->InsertIndirectObject(dwObjNum, pPageDict); | 4553 m_pDocument->InsertIndirectObject(dwObjNum, pPageDict); |
| 4555 return pPageDict->GetDict(); | 4554 return pPageDict->GetDict(); |
| 4556 } | 4555 } |
| 4557 } | 4556 } |
| 4558 return m_pDocument->GetPage(index); | 4557 return m_pDocument->GetPage(index); |
| 4559 } | 4558 } |
| 4560 int CPDF_DataAvail::IsFormAvail(IFX_DownloadHints* pHints) { | 4559 IPDF_DataAvail::DocFormStatus CPDF_DataAvail::IsFormAvail( |
| 4560 IFX_DownloadHints* pHints) { |
| 4561 if (!m_pDocument) { | 4561 if (!m_pDocument) { |
| 4562 return PDF_FORM_AVAIL; | 4562 return FormAvailable; |
| 4563 } | 4563 } |
| 4564 if (!m_bLinearizedFormParamLoad) { | 4564 if (!m_bLinearizedFormParamLoad) { |
| 4565 CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); | 4565 CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); |
| 4566 if (!pRoot) { | 4566 if (!pRoot) { |
| 4567 return PDF_FORM_AVAIL; | 4567 return FormAvailable; |
| 4568 } | 4568 } |
| 4569 CPDF_Object* pAcroForm = pRoot->GetElement(FX_BSTRC("AcroForm")); | 4569 CPDF_Object* pAcroForm = pRoot->GetElement(FX_BSTRC("AcroForm")); |
| 4570 if (!pAcroForm) { | 4570 if (!pAcroForm) { |
| 4571 return PDF_FORM_NOTEXIST; | 4571 return FormNotExist; |
| 4572 } | 4572 } |
| 4573 if (!CheckLinearizedData(pHints)) { | 4573 if (!CheckLinearizedData(pHints)) { |
| 4574 return PDF_FORM_NOTAVAIL; | 4574 return FormNotAvailable; |
| 4575 } | 4575 } |
| 4576 if (!m_objs_array.GetSize()) { | 4576 if (!m_objs_array.GetSize()) { |
| 4577 m_objs_array.Add(pAcroForm->GetDict()); | 4577 m_objs_array.Add(pAcroForm->GetDict()); |
| 4578 } | 4578 } |
| 4579 m_bLinearizedFormParamLoad = TRUE; | 4579 m_bLinearizedFormParamLoad = TRUE; |
| 4580 } | 4580 } |
| 4581 CFX_PtrArray new_objs_array; | 4581 CFX_PtrArray new_objs_array; |
| 4582 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); | 4582 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); |
| 4583 m_objs_array.RemoveAll(); | 4583 m_objs_array.RemoveAll(); |
| 4584 if (!bRet) { | 4584 if (!bRet) { |
| 4585 m_objs_array.Append(new_objs_array); | 4585 m_objs_array.Append(new_objs_array); |
| 4586 return PDF_FORM_NOTAVAIL; | 4586 return FormNotAvailable; |
| 4587 } | 4587 } |
| 4588 return PDF_FORM_AVAIL; | 4588 return FormAvailable; |
| 4589 } | 4589 } |
| 4590 void CPDF_SortObjNumArray::AddObjNum(FX_DWORD dwObjNum) { | 4590 void CPDF_SortObjNumArray::AddObjNum(FX_DWORD dwObjNum) { |
| 4591 int32_t iNext = 0; | 4591 int32_t iNext = 0; |
| 4592 if (BinarySearch(dwObjNum, iNext)) { | 4592 if (BinarySearch(dwObjNum, iNext)) { |
| 4593 return; | 4593 return; |
| 4594 } | 4594 } |
| 4595 m_number_array.InsertAt(iNext, dwObjNum); | 4595 m_number_array.InsertAt(iNext, dwObjNum); |
| 4596 } | 4596 } |
| 4597 FX_BOOL CPDF_SortObjNumArray::Find(FX_DWORD dwObjNum) { | 4597 FX_BOOL CPDF_SortObjNumArray::Find(FX_DWORD dwObjNum) { |
| 4598 int32_t iNext = 0; | 4598 int32_t iNext = 0; |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4862 dwObjNum = 1; | 4862 dwObjNum = 1; |
| 4863 for (int i = 0; i < index; ++i) { | 4863 for (int i = 0; i < index; ++i) { |
| 4864 if (i == nFirstPageNum) | 4864 if (i == nFirstPageNum) |
| 4865 continue; | 4865 continue; |
| 4866 dwObjNum += m_dwDeltaNObjsArray[i]; | 4866 dwObjNum += m_dwDeltaNObjsArray[i]; |
| 4867 } | 4867 } |
| 4868 return TRUE; | 4868 return TRUE; |
| 4869 } | 4869 } |
| 4870 int32_t CPDF_HintTables::CheckPage(int index, IFX_DownloadHints* pHints) { | 4870 int32_t CPDF_HintTables::CheckPage(int index, IFX_DownloadHints* pHints) { |
| 4871 if (!m_pLinearizedDict || !pHints) | 4871 if (!m_pLinearizedDict || !pHints) |
| 4872 return PDF_DATA_ERROR; | 4872 return IPDF_DataAvail::DataError; |
| 4873 CPDF_Object* pFirstAvailPage = | 4873 CPDF_Object* pFirstAvailPage = |
| 4874 m_pLinearizedDict->GetElementValue(FX_BSTRC("P")); | 4874 m_pLinearizedDict->GetElementValue(FX_BSTRC("P")); |
| 4875 int nFirstAvailPage = pFirstAvailPage ? pFirstAvailPage->GetInteger() : 0; | 4875 int nFirstAvailPage = pFirstAvailPage ? pFirstAvailPage->GetInteger() : 0; |
| 4876 if (index == nFirstAvailPage) | 4876 if (index == nFirstAvailPage) |
| 4877 return PDF_DATA_AVAIL; | 4877 return IPDF_DataAvail::DataAvailable; |
| 4878 FX_DWORD dwLength = GetItemLength(index, m_szPageOffsetArray); | 4878 FX_DWORD dwLength = GetItemLength(index, m_szPageOffsetArray); |
| 4879 if (!dwLength || | 4879 if (!dwLength || |
| 4880 !m_pDataAvail->IsDataAvail(m_szPageOffsetArray[index], dwLength, | 4880 !m_pDataAvail->IsDataAvail(m_szPageOffsetArray[index], dwLength, |
| 4881 pHints)) { | 4881 pHints)) { |
| 4882 return PDF_DATA_NOTAVAIL; | 4882 return IPDF_DataAvail::DataNotAvailable; |
| 4883 } | 4883 } |
| 4884 // Download data of shared objects in the page. | 4884 // Download data of shared objects in the page. |
| 4885 FX_DWORD offset = 0; | 4885 FX_DWORD offset = 0; |
| 4886 for (int i = 0; i < index; ++i) { | 4886 for (int i = 0; i < index; ++i) { |
| 4887 offset += m_dwNSharedObjsArray[i]; | 4887 offset += m_dwNSharedObjsArray[i]; |
| 4888 } | 4888 } |
| 4889 CPDF_Object* pFirstPageObj = | 4889 CPDF_Object* pFirstPageObj = |
| 4890 m_pLinearizedDict->GetElementValue(FX_BSTRC("O")); | 4890 m_pLinearizedDict->GetElementValue(FX_BSTRC("O")); |
| 4891 int nFirstPageObjNum = pFirstPageObj ? pFirstPageObj->GetInteger() : -1; | 4891 int nFirstPageObjNum = pFirstPageObj ? pFirstPageObj->GetInteger() : -1; |
| 4892 if (nFirstPageObjNum < 0) | 4892 if (nFirstPageObjNum < 0) |
| 4893 return FALSE; | 4893 return FALSE; // TODO(thestig): Fix this and the return type. |
| 4894 FX_DWORD dwIndex = 0; | 4894 FX_DWORD dwIndex = 0; |
| 4895 FX_DWORD dwObjNum = 0; | 4895 FX_DWORD dwObjNum = 0; |
| 4896 for (int j = 0; j < m_dwNSharedObjsArray[index]; ++j) { | 4896 for (int j = 0; j < m_dwNSharedObjsArray[index]; ++j) { |
| 4897 dwIndex = m_dwIdentifierArray[offset + j]; | 4897 dwIndex = m_dwIdentifierArray[offset + j]; |
| 4898 dwObjNum = m_dwSharedObjNumArray[dwIndex]; | 4898 dwObjNum = m_dwSharedObjNumArray[dwIndex]; |
| 4899 if (dwObjNum >= nFirstPageObjNum && | 4899 if (dwObjNum >= nFirstPageObjNum && |
| 4900 dwObjNum < nFirstPageObjNum + m_nFirstPageSharedObjs) { | 4900 dwObjNum < nFirstPageObjNum + m_nFirstPageSharedObjs) { |
| 4901 continue; | 4901 continue; |
| 4902 } | 4902 } |
| 4903 dwLength = GetItemLength(dwIndex, m_szSharedObjOffsetArray); | 4903 dwLength = GetItemLength(dwIndex, m_szSharedObjOffsetArray); |
| 4904 if (!dwLength || | 4904 if (!dwLength || |
| 4905 !m_pDataAvail->IsDataAvail(m_szSharedObjOffsetArray[dwIndex], dwLength, | 4905 !m_pDataAvail->IsDataAvail(m_szSharedObjOffsetArray[dwIndex], dwLength, |
| 4906 pHints)) { | 4906 pHints)) { |
| 4907 return PDF_DATA_NOTAVAIL; | 4907 return IPDF_DataAvail::DataNotAvailable; |
| 4908 } | 4908 } |
| 4909 } | 4909 } |
| 4910 return PDF_DATA_AVAIL; | 4910 return IPDF_DataAvail::DataAvailable; |
| 4911 } | 4911 } |
| 4912 FX_BOOL CPDF_HintTables::LoadHintStream(CPDF_Stream* pHintStream) { | 4912 FX_BOOL CPDF_HintTables::LoadHintStream(CPDF_Stream* pHintStream) { |
| 4913 if (!pHintStream || !m_pLinearizedDict) | 4913 if (!pHintStream || !m_pLinearizedDict) |
| 4914 return FALSE; | 4914 return FALSE; |
| 4915 CPDF_Dictionary* pDict = pHintStream->GetDict(); | 4915 CPDF_Dictionary* pDict = pHintStream->GetDict(); |
| 4916 CPDF_Object* pOffset = pDict ? pDict->GetElement(FX_BSTRC("S")) : nullptr; | 4916 CPDF_Object* pOffset = pDict ? pDict->GetElement(FX_BSTRC("S")) : nullptr; |
| 4917 if (!pOffset || pOffset->GetType() != PDFOBJ_NUMBER) | 4917 if (!pOffset || pOffset->GetType() != PDFOBJ_NUMBER) |
| 4918 return FALSE; | 4918 return FALSE; |
| 4919 CPDF_StreamAcc acc; | 4919 CPDF_StreamAcc acc; |
| 4920 acc.LoadAllData(pHintStream); | 4920 acc.LoadAllData(pHintStream); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 4946 if (!m_pLinearizedDict) | 4946 if (!m_pLinearizedDict) |
| 4947 return -1; | 4947 return -1; |
| 4948 CPDF_Array* pRange = m_pLinearizedDict->GetArray(FX_BSTRC("H")); | 4948 CPDF_Array* pRange = m_pLinearizedDict->GetArray(FX_BSTRC("H")); |
| 4949 if (!pRange) | 4949 if (!pRange) |
| 4950 return -1; | 4950 return -1; |
| 4951 CPDF_Object* pStreamLen = pRange->GetElementValue(1); | 4951 CPDF_Object* pStreamLen = pRange->GetElementValue(1); |
| 4952 if (!pStreamLen) | 4952 if (!pStreamLen) |
| 4953 return -1; | 4953 return -1; |
| 4954 return pStreamLen->GetInteger(); | 4954 return pStreamLen->GetInteger(); |
| 4955 } | 4955 } |
| OLD | NEW |