| 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 |