| 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 "parser_int.h" | 7 #include "parser_int.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 2797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2808 FX_FILESIZE m_dwTrailerOffset; | 2808 FX_FILESIZE m_dwTrailerOffset; |
| 2809 | 2809 |
| 2810 FX_FILESIZE m_dwCurrentOffset; | 2810 FX_FILESIZE m_dwCurrentOffset; |
| 2811 | 2811 |
| 2812 PDF_DATAAVAIL_STATUS m_docStatus; | 2812 PDF_DATAAVAIL_STATUS m_docStatus; |
| 2813 | 2813 |
| 2814 FX_FILESIZE m_dwFileLen; | 2814 FX_FILESIZE m_dwFileLen; |
| 2815 | 2815 |
| 2816 CPDF_Document* m_pDocument; | 2816 CPDF_Document* m_pDocument; |
| 2817 | 2817 |
| 2818 CPDF_SortObjNumArray m_objnum_array; | 2818 std::set<FX_DWORD> m_ObjectSet; |
| 2819 | 2819 |
| 2820 CFX_ArrayTemplate<CPDF_Object*> m_objs_array; | 2820 CFX_ArrayTemplate<CPDF_Object*> m_objs_array; |
| 2821 | 2821 |
| 2822 FX_FILESIZE m_Pos; | 2822 FX_FILESIZE m_Pos; |
| 2823 | 2823 |
| 2824 FX_FILESIZE m_bufferOffset; | 2824 FX_FILESIZE m_bufferOffset; |
| 2825 | 2825 |
| 2826 FX_DWORD m_bufferSize; | 2826 FX_DWORD m_bufferSize; |
| 2827 | 2827 |
| 2828 CFX_ByteString m_WordBuf; | 2828 CFX_ByteString m_WordBuf; |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3050 CPDF_Reference* pRef = pObj->AsReference(); | 3050 CPDF_Reference* pRef = pObj->AsReference(); |
| 3051 FX_DWORD dwNum = pRef->GetRefObjNum(); | 3051 FX_DWORD dwNum = pRef->GetRefObjNum(); |
| 3052 FX_FILESIZE offset; | 3052 FX_FILESIZE offset; |
| 3053 FX_DWORD size = GetObjectSize(dwNum, offset); | 3053 FX_DWORD size = GetObjectSize(dwNum, offset); |
| 3054 if (size == 0 || offset < 0 || offset >= m_dwFileLen) { | 3054 if (size == 0 || offset < 0 || offset >= m_dwFileLen) { |
| 3055 break; | 3055 break; |
| 3056 } | 3056 } |
| 3057 if (!IsDataAvail(offset, size, pHints)) { | 3057 if (!IsDataAvail(offset, size, pHints)) { |
| 3058 ret_array.Add(pObj); | 3058 ret_array.Add(pObj); |
| 3059 count++; | 3059 count++; |
| 3060 } else if (!m_objnum_array.Find(dwNum)) { | 3060 } else if (!pdfium::ContainsKey(m_ObjectSet, dwNum)) { |
| 3061 m_objnum_array.AddObjNum(dwNum); | 3061 m_ObjectSet.insert(dwNum); |
| 3062 CPDF_Object* pReferred = | 3062 CPDF_Object* pReferred = |
| 3063 m_pDocument->GetIndirectObject(pRef->GetRefObjNum(), nullptr); | 3063 m_pDocument->GetIndirectObject(pRef->GetRefObjNum(), nullptr); |
| 3064 if (pReferred) { | 3064 if (pReferred) { |
| 3065 new_obj_array.Add(pReferred); | 3065 new_obj_array.Add(pReferred); |
| 3066 } | 3066 } |
| 3067 } | 3067 } |
| 3068 } break; | 3068 } break; |
| 3069 } | 3069 } |
| 3070 } | 3070 } |
| 3071 if (count > 0) { | 3071 if (count > 0) { |
| 3072 int32_t iSize = new_obj_array.GetSize(); | 3072 int32_t iSize = new_obj_array.GetSize(); |
| 3073 for (i = 0; i < iSize; ++i) { | 3073 for (i = 0; i < iSize; ++i) { |
| 3074 CPDF_Object* pObj = new_obj_array[i]; | 3074 CPDF_Object* pObj = new_obj_array[i]; |
| 3075 if (CPDF_Reference* pRef = pObj->AsReference()) { | 3075 if (CPDF_Reference* pRef = pObj->AsReference()) { |
| 3076 FX_DWORD dwNum = pRef->GetRefObjNum(); | 3076 FX_DWORD dwNum = pRef->GetRefObjNum(); |
| 3077 if (!m_objnum_array.Find(dwNum)) | 3077 if (!pdfium::ContainsKey(m_ObjectSet, dwNum)) |
| 3078 ret_array.Add(pObj); | 3078 ret_array.Add(pObj); |
| 3079 } else { | 3079 } else { |
| 3080 ret_array.Add(pObj); | 3080 ret_array.Add(pObj); |
| 3081 } | 3081 } |
| 3082 } | 3082 } |
| 3083 return FALSE; | 3083 return FALSE; |
| 3084 } | 3084 } |
| 3085 obj_array.RemoveAll(); | 3085 obj_array.RemoveAll(); |
| 3086 obj_array.Append(new_obj_array); | 3086 obj_array.Append(new_obj_array); |
| 3087 return IsObjectsAvail(obj_array, FALSE, pHints, ret_array); | 3087 return IsObjectsAvail(obj_array, FALSE, pHints, ret_array); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3099 if (!CheckDocStatus(pHints)) { | 3099 if (!CheckDocStatus(pHints)) { |
| 3100 return DataNotAvailable; | 3100 return DataNotAvailable; |
| 3101 } | 3101 } |
| 3102 } | 3102 } |
| 3103 return DataAvailable; | 3103 return DataAvailable; |
| 3104 } | 3104 } |
| 3105 | 3105 |
| 3106 FX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(IFX_DownloadHints* pHints) { | 3106 FX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(IFX_DownloadHints* pHints) { |
| 3107 if (!m_objs_array.GetSize()) { | 3107 if (!m_objs_array.GetSize()) { |
| 3108 m_objs_array.RemoveAll(); | 3108 m_objs_array.RemoveAll(); |
| 3109 m_objnum_array.RemoveAll(); | 3109 m_ObjectSet.clear(); |
| 3110 CFX_ArrayTemplate<CPDF_Object*> obj_array; | 3110 CFX_ArrayTemplate<CPDF_Object*> obj_array; |
| 3111 obj_array.Append(m_arrayAcroforms); | 3111 obj_array.Append(m_arrayAcroforms); |
| 3112 FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array); | 3112 FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array); |
| 3113 if (bRet) { | 3113 if (bRet) { |
| 3114 m_objs_array.RemoveAll(); | 3114 m_objs_array.RemoveAll(); |
| 3115 } | 3115 } |
| 3116 return bRet; | 3116 return bRet; |
| 3117 } | 3117 } |
| 3118 CFX_ArrayTemplate<CPDF_Object*> new_objs_array; | 3118 CFX_ArrayTemplate<CPDF_Object*> new_objs_array; |
| 3119 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); | 3119 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); |
| (...skipping 1185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4305 m_bMainXRefLoadedOK = TRUE; | 4305 m_bMainXRefLoadedOK = TRUE; |
| 4306 m_bLinearedDataOK = TRUE; | 4306 m_bLinearedDataOK = TRUE; |
| 4307 } | 4307 } |
| 4308 | 4308 |
| 4309 return m_bLinearedDataOK ? DataAvailable : DataNotAvailable; | 4309 return m_bLinearedDataOK ? DataAvailable : DataNotAvailable; |
| 4310 } | 4310 } |
| 4311 FX_BOOL CPDF_DataAvail::CheckPageAnnots(int32_t iPage, | 4311 FX_BOOL CPDF_DataAvail::CheckPageAnnots(int32_t iPage, |
| 4312 IFX_DownloadHints* pHints) { | 4312 IFX_DownloadHints* pHints) { |
| 4313 if (!m_objs_array.GetSize()) { | 4313 if (!m_objs_array.GetSize()) { |
| 4314 m_objs_array.RemoveAll(); | 4314 m_objs_array.RemoveAll(); |
| 4315 m_objnum_array.RemoveAll(); | 4315 m_ObjectSet.clear(); |
| 4316 CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iPage); | 4316 CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iPage); |
| 4317 if (!pPageDict) { | 4317 if (!pPageDict) { |
| 4318 return TRUE; | 4318 return TRUE; |
| 4319 } | 4319 } |
| 4320 CPDF_Object* pAnnots = pPageDict->GetElement("Annots"); | 4320 CPDF_Object* pAnnots = pPageDict->GetElement("Annots"); |
| 4321 if (!pAnnots) { | 4321 if (!pAnnots) { |
| 4322 return TRUE; | 4322 return TRUE; |
| 4323 } | 4323 } |
| 4324 CFX_ArrayTemplate<CPDF_Object*> obj_array; | 4324 CFX_ArrayTemplate<CPDF_Object*> obj_array; |
| 4325 obj_array.Add(pAnnots); | 4325 obj_array.Add(pAnnots); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4375 int CPDF_DataAvail::IsPageAvail(int32_t iPage, IFX_DownloadHints* pHints) { | 4375 int CPDF_DataAvail::IsPageAvail(int32_t iPage, IFX_DownloadHints* pHints) { |
| 4376 if (!m_pDocument) { | 4376 if (!m_pDocument) { |
| 4377 return DataError; | 4377 return DataError; |
| 4378 } | 4378 } |
| 4379 if (IsFirstCheck(iPage)) { | 4379 if (IsFirstCheck(iPage)) { |
| 4380 m_bCurPageDictLoadOK = FALSE; | 4380 m_bCurPageDictLoadOK = FALSE; |
| 4381 m_bPageLoadedOK = FALSE; | 4381 m_bPageLoadedOK = FALSE; |
| 4382 m_bAnnotsLoad = FALSE; | 4382 m_bAnnotsLoad = FALSE; |
| 4383 m_bNeedDownLoadResource = FALSE; | 4383 m_bNeedDownLoadResource = FALSE; |
| 4384 m_objs_array.RemoveAll(); | 4384 m_objs_array.RemoveAll(); |
| 4385 m_objnum_array.RemoveAll(); | 4385 m_ObjectSet.clear(); |
| 4386 } | 4386 } |
| 4387 if (pdfium::ContainsKey(m_pagesLoadState, iPage)) | 4387 if (pdfium::ContainsKey(m_pagesLoadState, iPage)) |
| 4388 return DataAvailable; | 4388 return DataAvailable; |
| 4389 | 4389 |
| 4390 if (m_bLinearized) { | 4390 if (m_bLinearized) { |
| 4391 if ((FX_DWORD)iPage == m_dwFirstPageNo) { | 4391 if ((FX_DWORD)iPage == m_dwFirstPageNo) { |
| 4392 if (!CheckLinearizedFirstPage(iPage, pHints)) | 4392 if (!CheckLinearizedFirstPage(iPage, pHints)) |
| 4393 return DataNotAvailable; | 4393 return DataNotAvailable; |
| 4394 m_pagesLoadState.insert(iPage); | 4394 m_pagesLoadState.insert(iPage); |
| 4395 return DataAvailable; | 4395 return DataAvailable; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4432 } | 4432 } |
| 4433 if (m_bHaveAcroForm && !m_bAcroFormLoad) { | 4433 if (m_bHaveAcroForm && !m_bAcroFormLoad) { |
| 4434 if (!CheckAcroFormSubObject(pHints)) { | 4434 if (!CheckAcroFormSubObject(pHints)) { |
| 4435 return DataNotAvailable; | 4435 return DataNotAvailable; |
| 4436 } | 4436 } |
| 4437 m_bAcroFormLoad = TRUE; | 4437 m_bAcroFormLoad = TRUE; |
| 4438 } | 4438 } |
| 4439 if (!m_bPageLoadedOK) { | 4439 if (!m_bPageLoadedOK) { |
| 4440 if (!m_objs_array.GetSize()) { | 4440 if (!m_objs_array.GetSize()) { |
| 4441 m_objs_array.RemoveAll(); | 4441 m_objs_array.RemoveAll(); |
| 4442 m_objnum_array.RemoveAll(); | 4442 m_ObjectSet.clear(); |
| 4443 m_pPageDict = m_pDocument->GetPage(iPage); | 4443 m_pPageDict = m_pDocument->GetPage(iPage); |
| 4444 if (!m_pPageDict) { | 4444 if (!m_pPageDict) { |
| 4445 ResetFirstCheck(iPage); | 4445 ResetFirstCheck(iPage); |
| 4446 return DataAvailable; | 4446 return DataAvailable; |
| 4447 } | 4447 } |
| 4448 CFX_ArrayTemplate<CPDF_Object*> obj_array; | 4448 CFX_ArrayTemplate<CPDF_Object*> obj_array; |
| 4449 obj_array.Add(m_pPageDict); | 4449 obj_array.Add(m_pPageDict); |
| 4450 FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array); | 4450 FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array); |
| 4451 if (bRet) { | 4451 if (bRet) { |
| 4452 m_objs_array.RemoveAll(); | 4452 m_objs_array.RemoveAll(); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4586 } | 4586 } |
| 4587 CFX_ArrayTemplate<CPDF_Object*> new_objs_array; | 4587 CFX_ArrayTemplate<CPDF_Object*> new_objs_array; |
| 4588 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); | 4588 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); |
| 4589 m_objs_array.RemoveAll(); | 4589 m_objs_array.RemoveAll(); |
| 4590 if (!bRet) { | 4590 if (!bRet) { |
| 4591 m_objs_array.Append(new_objs_array); | 4591 m_objs_array.Append(new_objs_array); |
| 4592 return FormNotAvailable; | 4592 return FormNotAvailable; |
| 4593 } | 4593 } |
| 4594 return FormAvailable; | 4594 return FormAvailable; |
| 4595 } | 4595 } |
| 4596 void CPDF_SortObjNumArray::AddObjNum(FX_DWORD dwObjNum) { | 4596 |
| 4597 int32_t iNext = 0; | |
| 4598 if (BinarySearch(dwObjNum, iNext)) { | |
| 4599 return; | |
| 4600 } | |
| 4601 m_number_array.InsertAt(iNext, dwObjNum); | |
| 4602 } | |
| 4603 FX_BOOL CPDF_SortObjNumArray::Find(FX_DWORD dwObjNum) { | |
| 4604 int32_t iNext = 0; | |
| 4605 return BinarySearch(dwObjNum, iNext); | |
| 4606 } | |
| 4607 FX_BOOL CPDF_SortObjNumArray::BinarySearch(FX_DWORD value, int32_t& iNext) { | |
| 4608 int32_t iLow = 0; | |
| 4609 int32_t iHigh = m_number_array.GetSize() - 1; | |
| 4610 while (iLow <= iHigh) { | |
| 4611 int32_t iMid = (iLow + iHigh) / 2; | |
| 4612 if (m_number_array.GetAt(iMid) == value) { | |
| 4613 iNext = iMid; | |
| 4614 return TRUE; | |
| 4615 } | |
| 4616 if (m_number_array.GetAt(iMid) > value) { | |
| 4617 iHigh = iMid - 1; | |
| 4618 } else if (m_number_array.GetAt(iMid) < value) { | |
| 4619 iLow = iMid + 1; | |
| 4620 } | |
| 4621 } | |
| 4622 iNext = iLow; | |
| 4623 return FALSE; | |
| 4624 } | |
| 4625 CPDF_PageNode::~CPDF_PageNode() { | 4597 CPDF_PageNode::~CPDF_PageNode() { |
| 4626 for (int32_t i = 0; i < m_childNode.GetSize(); ++i) { | 4598 for (int32_t i = 0; i < m_childNode.GetSize(); ++i) { |
| 4627 delete m_childNode[i]; | 4599 delete m_childNode[i]; |
| 4628 } | 4600 } |
| 4629 m_childNode.RemoveAll(); | 4601 m_childNode.RemoveAll(); |
| 4630 } | 4602 } |
| 4631 CPDF_HintTables::~CPDF_HintTables() { | 4603 CPDF_HintTables::~CPDF_HintTables() { |
| 4632 m_dwDeltaNObjsArray.RemoveAll(); | 4604 m_dwDeltaNObjsArray.RemoveAll(); |
| 4633 m_dwNSharedObjsArray.RemoveAll(); | 4605 m_dwNSharedObjsArray.RemoveAll(); |
| 4634 m_dwSharedObjNumArray.RemoveAll(); | 4606 m_dwSharedObjNumArray.RemoveAll(); |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4995 if (!m_pLinearizedDict) | 4967 if (!m_pLinearizedDict) |
| 4996 return -1; | 4968 return -1; |
| 4997 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); | 4969 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); |
| 4998 if (!pRange) | 4970 if (!pRange) |
| 4999 return -1; | 4971 return -1; |
| 5000 CPDF_Object* pStreamLen = pRange->GetElementValue(1); | 4972 CPDF_Object* pStreamLen = pRange->GetElementValue(1); |
| 5001 if (!pStreamLen) | 4973 if (!pStreamLen) |
| 5002 return -1; | 4974 return -1; |
| 5003 return pStreamLen->GetInteger(); | 4975 return pStreamLen->GetInteger(); |
| 5004 } | 4976 } |
| OLD | NEW |