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 <utility> | 8 #include <utility> |
8 #include <vector> | 9 #include <vector> |
9 | 10 |
10 #include "../../../include/fpdfapi/fpdf_module.h" | 11 #include "../../../include/fpdfapi/fpdf_module.h" |
11 #include "../../../include/fpdfapi/fpdf_page.h" | 12 #include "../../../include/fpdfapi/fpdf_page.h" |
12 #include "../../../include/fpdfapi/fpdf_parser.h" | 13 #include "../../../include/fpdfapi/fpdf_parser.h" |
13 #include "../../../include/fxcrt/fx_safe_types.h" | 14 #include "../../../include/fxcrt/fx_safe_types.h" |
14 #include "../fpdf_page/pageint.h" | 15 #include "../fpdf_page/pageint.h" |
15 | 16 |
16 FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict) { | 17 FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict) { |
(...skipping 2979 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2996 FX_DWORD m_dwEncryptObjNum; | 2997 FX_DWORD m_dwEncryptObjNum; |
2997 | 2998 |
2998 FX_FILESIZE m_dwPrevXRefOffset; | 2999 FX_FILESIZE m_dwPrevXRefOffset; |
2999 | 3000 |
3000 FX_BOOL m_bTotalLoadPageTree; | 3001 FX_BOOL m_bTotalLoadPageTree; |
3001 | 3002 |
3002 FX_BOOL m_bCurPageDictLoadOK; | 3003 FX_BOOL m_bCurPageDictLoadOK; |
3003 | 3004 |
3004 CPDF_PageNode m_pageNodes; | 3005 CPDF_PageNode m_pageNodes; |
3005 | 3006 |
3006 CFX_CMapDWordToDWord* m_pageMapCheckState; | 3007 std::set<FX_DWORD> m_pageMapCheckState; |
3007 | 3008 std::set<FX_DWORD> m_pagesLoadState; |
3008 CFX_CMapDWordToDWord* m_pagesLoadState; | |
3009 }; | 3009 }; |
3010 | 3010 |
3011 IPDF_DataAvail::IPDF_DataAvail(IFX_FileAvail* pFileAvail, | 3011 IPDF_DataAvail::IPDF_DataAvail(IFX_FileAvail* pFileAvail, |
3012 IFX_FileRead* pFileRead) | 3012 IFX_FileRead* pFileRead) |
3013 : m_pFileAvail(pFileAvail), m_pFileRead(pFileRead) {} | 3013 : m_pFileAvail(pFileAvail), m_pFileRead(pFileRead) {} |
3014 | 3014 |
3015 // static | 3015 // static |
3016 IPDF_DataAvail* IPDF_DataAvail::Create(IFX_FileAvail* pFileAvail, | 3016 IPDF_DataAvail* IPDF_DataAvail::Create(IFX_FileAvail* pFileAvail, |
3017 IFX_FileRead* pFileRead) { | 3017 IFX_FileRead* pFileRead) { |
3018 return new CPDF_DataAvail(pFileAvail, pFileRead); | 3018 return new CPDF_DataAvail(pFileAvail, pFileRead); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3056 m_bPageLoadedOK = FALSE; | 3056 m_bPageLoadedOK = FALSE; |
3057 m_bNeedDownLoadResource = FALSE; | 3057 m_bNeedDownLoadResource = FALSE; |
3058 m_bLinearizedFormParamLoad = FALSE; | 3058 m_bLinearizedFormParamLoad = FALSE; |
3059 m_pLinearized = NULL; | 3059 m_pLinearized = NULL; |
3060 m_pRoot = NULL; | 3060 m_pRoot = NULL; |
3061 m_pTrailer = NULL; | 3061 m_pTrailer = NULL; |
3062 m_pCurrentParser = NULL; | 3062 m_pCurrentParser = NULL; |
3063 m_pAcroForm = NULL; | 3063 m_pAcroForm = NULL; |
3064 m_pPageDict = NULL; | 3064 m_pPageDict = NULL; |
3065 m_pPageResource = NULL; | 3065 m_pPageResource = NULL; |
3066 m_pageMapCheckState = NULL; | |
3067 m_docStatus = PDF_DATAAVAIL_HEADER; | 3066 m_docStatus = PDF_DATAAVAIL_HEADER; |
3068 m_parser.m_bOwnFileRead = FALSE; | 3067 m_parser.m_bOwnFileRead = FALSE; |
3069 m_bTotalLoadPageTree = FALSE; | 3068 m_bTotalLoadPageTree = FALSE; |
3070 m_bCurPageDictLoadOK = FALSE; | 3069 m_bCurPageDictLoadOK = FALSE; |
3071 m_bLinearedDataOK = FALSE; | 3070 m_bLinearedDataOK = FALSE; |
3072 m_pagesLoadState = NULL; | |
3073 } | 3071 } |
3074 CPDF_DataAvail::~CPDF_DataAvail() { | 3072 CPDF_DataAvail::~CPDF_DataAvail() { |
3075 if (m_pLinearized) { | 3073 if (m_pLinearized) { |
3076 m_pLinearized->Release(); | 3074 m_pLinearized->Release(); |
3077 } | 3075 } |
3078 if (m_pRoot) { | 3076 if (m_pRoot) { |
3079 m_pRoot->Release(); | 3077 m_pRoot->Release(); |
3080 } | 3078 } |
3081 if (m_pTrailer) { | 3079 if (m_pTrailer) { |
3082 m_pTrailer->Release(); | 3080 m_pTrailer->Release(); |
3083 } | 3081 } |
3084 delete m_pageMapCheckState; | |
3085 delete m_pagesLoadState; | |
3086 int32_t i = 0; | 3082 int32_t i = 0; |
3087 int32_t iSize = m_arrayAcroforms.GetSize(); | 3083 int32_t iSize = m_arrayAcroforms.GetSize(); |
3088 for (i = 0; i < iSize; ++i) { | 3084 for (i = 0; i < iSize; ++i) { |
3089 ((CPDF_Object*)m_arrayAcroforms.GetAt(i))->Release(); | 3085 ((CPDF_Object*)m_arrayAcroforms.GetAt(i))->Release(); |
3090 } | 3086 } |
3091 } | 3087 } |
3092 void CPDF_DataAvail::SetDocument(CPDF_Document* pDoc) { | 3088 void CPDF_DataAvail::SetDocument(CPDF_Document* pDoc) { |
3093 m_pDocument = pDoc; | 3089 m_pDocument = pDoc; |
3094 } | 3090 } |
3095 FX_DWORD CPDF_DataAvail::GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset) { | 3091 FX_DWORD CPDF_DataAvail::GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset) { |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3510 if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) { | 3506 if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) { |
3511 m_docStatus = PDF_DATAAVAIL_ERROR; | 3507 m_docStatus = PDF_DATAAVAIL_ERROR; |
3512 return FALSE; | 3508 return FALSE; |
3513 } | 3509 } |
3514 m_PagesObjNum = pRef->GetRefObjNum(); | 3510 m_PagesObjNum = pRef->GetRefObjNum(); |
3515 m_pCurrentParser = (CPDF_Parser*)m_pDocument->GetParser(); | 3511 m_pCurrentParser = (CPDF_Parser*)m_pDocument->GetParser(); |
3516 m_docStatus = PDF_DATAAVAIL_PAGETREE; | 3512 m_docStatus = PDF_DATAAVAIL_PAGETREE; |
3517 return TRUE; | 3513 return TRUE; |
3518 } | 3514 } |
3519 FX_BOOL CPDF_DataAvail::IsFirstCheck(int iPage) { | 3515 FX_BOOL CPDF_DataAvail::IsFirstCheck(int iPage) { |
3520 if (NULL == m_pageMapCheckState) { | 3516 if (m_pageMapCheckState.find(iPage) != m_pageMapCheckState.end()) |
3521 m_pageMapCheckState = new CFX_CMapDWordToDWord(); | |
3522 } | |
3523 FX_DWORD dwValue = 0; | |
3524 if (!m_pageMapCheckState->Lookup(iPage, dwValue)) { | |
3525 m_pageMapCheckState->SetAt(iPage, 1); | |
3526 return TRUE; | |
3527 } | |
3528 if (dwValue != 0) { | |
3529 return FALSE; | 3517 return FALSE; |
3530 } | 3518 |
3531 m_pageMapCheckState->SetAt(iPage, 1); | 3519 m_pageMapCheckState.insert(iPage); |
3532 return TRUE; | 3520 return TRUE; |
3533 } | 3521 } |
3534 void CPDF_DataAvail::ResetFirstCheck(int iPage) { | 3522 void CPDF_DataAvail::ResetFirstCheck(int iPage) { |
3535 if (NULL == m_pageMapCheckState) { | 3523 m_pageMapCheckState.erase(iPage); |
3536 m_pageMapCheckState = new CFX_CMapDWordToDWord(); | |
3537 } | |
3538 FX_DWORD dwValue = 1; | |
3539 if (!m_pageMapCheckState->Lookup(iPage, dwValue)) { | |
3540 return; | |
3541 } | |
3542 m_pageMapCheckState->SetAt(iPage, 0); | |
3543 } | 3524 } |
3544 FX_BOOL CPDF_DataAvail::CheckPage(IFX_DownloadHints* pHints) { | 3525 FX_BOOL CPDF_DataAvail::CheckPage(IFX_DownloadHints* pHints) { |
3545 FX_DWORD iPageObjs = m_PageObjList.GetSize(); | 3526 FX_DWORD iPageObjs = m_PageObjList.GetSize(); |
3546 CFX_DWordArray UnavailObjList; | 3527 CFX_DWordArray UnavailObjList; |
3547 for (FX_DWORD i = 0; i < iPageObjs; ++i) { | 3528 for (FX_DWORD i = 0; i < iPageObjs; ++i) { |
3548 FX_DWORD dwPageObjNum = m_PageObjList.GetAt(i); | 3529 FX_DWORD dwPageObjNum = m_PageObjList.GetAt(i); |
3549 FX_BOOL bExist = FALSE; | 3530 FX_BOOL bExist = FALSE; |
3550 CPDF_Object* pObj = GetObject(dwPageObjNum, pHints, &bExist); | 3531 CPDF_Object* pObj = GetObject(dwPageObjNum, pHints, &bExist); |
3551 if (!pObj) { | 3532 if (!pObj) { |
3552 if (bExist) { | 3533 if (bExist) { |
(...skipping 953 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4506 return FALSE; | 4487 return FALSE; |
4507 } | 4488 } |
4508 if (IsFirstCheck(iPage)) { | 4489 if (IsFirstCheck(iPage)) { |
4509 m_bCurPageDictLoadOK = FALSE; | 4490 m_bCurPageDictLoadOK = FALSE; |
4510 m_bPageLoadedOK = FALSE; | 4491 m_bPageLoadedOK = FALSE; |
4511 m_bAnnotsLoad = FALSE; | 4492 m_bAnnotsLoad = FALSE; |
4512 m_bNeedDownLoadResource = FALSE; | 4493 m_bNeedDownLoadResource = FALSE; |
4513 m_objs_array.RemoveAll(); | 4494 m_objs_array.RemoveAll(); |
4514 m_objnum_array.RemoveAll(); | 4495 m_objnum_array.RemoveAll(); |
4515 } | 4496 } |
4516 if (m_pagesLoadState == NULL) { | 4497 if (m_pagesLoadState.find(iPage) != m_pagesLoadState.end()) { |
4517 m_pagesLoadState = new CFX_CMapDWordToDWord(); | |
4518 } | |
4519 FX_DWORD dwPageLoad = 0; | |
4520 if (m_pagesLoadState->Lookup(iPage, dwPageLoad) && dwPageLoad != 0) { | |
4521 return TRUE; | 4498 return TRUE; |
4522 } | 4499 } |
4523 if (m_bLinearized) { | 4500 if (m_bLinearized) { |
4524 if ((FX_DWORD)iPage == m_dwFirstPageNo) { | 4501 if ((FX_DWORD)iPage == m_dwFirstPageNo) { |
4525 m_pagesLoadState->SetAt(iPage, TRUE); | 4502 m_pagesLoadState.insert(iPage); |
4526 return TRUE; | 4503 return TRUE; |
4527 } | 4504 } |
4528 if (!CheckLinearizedData(pHints)) { | 4505 if (!CheckLinearizedData(pHints)) { |
4529 return FALSE; | 4506 return FALSE; |
4530 } | 4507 } |
4531 if (m_bMainXRefLoadedOK) { | 4508 if (m_bMainXRefLoadedOK) { |
4532 if (m_bTotalLoadPageTree) { | 4509 if (m_bTotalLoadPageTree) { |
4533 if (!LoadPages(pHints)) { | 4510 if (!LoadPages(pHints)) { |
4534 return FALSE; | 4511 return FALSE; |
4535 } | 4512 } |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4610 FX_BOOL bRet = CheckResources(pHints); | 4587 FX_BOOL bRet = CheckResources(pHints); |
4611 if (!bRet) { | 4588 if (!bRet) { |
4612 return FALSE; | 4589 return FALSE; |
4613 } | 4590 } |
4614 m_bNeedDownLoadResource = FALSE; | 4591 m_bNeedDownLoadResource = FALSE; |
4615 } | 4592 } |
4616 m_bPageLoadedOK = FALSE; | 4593 m_bPageLoadedOK = FALSE; |
4617 m_bAnnotsLoad = FALSE; | 4594 m_bAnnotsLoad = FALSE; |
4618 m_bCurPageDictLoadOK = FALSE; | 4595 m_bCurPageDictLoadOK = FALSE; |
4619 ResetFirstCheck(iPage); | 4596 ResetFirstCheck(iPage); |
4620 m_pagesLoadState->SetAt(iPage, TRUE); | 4597 m_pagesLoadState.insert(iPage); |
4621 return TRUE; | 4598 return TRUE; |
4622 } | 4599 } |
4623 FX_BOOL CPDF_DataAvail::CheckResources(IFX_DownloadHints* pHints) { | 4600 FX_BOOL CPDF_DataAvail::CheckResources(IFX_DownloadHints* pHints) { |
4624 if (!m_objs_array.GetSize()) { | 4601 if (!m_objs_array.GetSize()) { |
4625 m_objs_array.RemoveAll(); | 4602 m_objs_array.RemoveAll(); |
4626 CFX_PtrArray obj_array; | 4603 CFX_PtrArray obj_array; |
4627 obj_array.Add(m_pPageResource); | 4604 obj_array.Add(m_pPageResource); |
4628 FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array); | 4605 FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array); |
4629 if (bRet) { | 4606 if (bRet) { |
4630 m_objs_array.RemoveAll(); | 4607 m_objs_array.RemoveAll(); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4708 return FALSE; | 4685 return FALSE; |
4709 } | 4686 } |
4710 CPDF_PageNode::~CPDF_PageNode() { | 4687 CPDF_PageNode::~CPDF_PageNode() { |
4711 int32_t iSize = m_childNode.GetSize(); | 4688 int32_t iSize = m_childNode.GetSize(); |
4712 for (int32_t i = 0; i < iSize; ++i) { | 4689 for (int32_t i = 0; i < iSize; ++i) { |
4713 CPDF_PageNode* pNode = (CPDF_PageNode*)m_childNode[i]; | 4690 CPDF_PageNode* pNode = (CPDF_PageNode*)m_childNode[i]; |
4714 delete pNode; | 4691 delete pNode; |
4715 } | 4692 } |
4716 m_childNode.RemoveAll(); | 4693 m_childNode.RemoveAll(); |
4717 } | 4694 } |
OLD | NEW |