summaryrefslogtreecommitdiff
path: root/core/fpdfapi
diff options
context:
space:
mode:
Diffstat (limited to 'core/fpdfapi')
-rw-r--r--core/fpdfapi/parser/cpdf_data_avail.cpp92
-rw-r--r--core/fpdfapi/parser/cpdf_data_avail.h4
2 files changed, 36 insertions, 60 deletions
diff --git a/core/fpdfapi/parser/cpdf_data_avail.cpp b/core/fpdfapi/parser/cpdf_data_avail.cpp
index 0cdaed22ed..549ed75425 100644
--- a/core/fpdfapi/parser/cpdf_data_avail.cpp
+++ b/core/fpdfapi/parser/cpdf_data_avail.cpp
@@ -101,11 +101,8 @@ CPDF_DataAvail::CPDF_DataAvail(
m_bPagesLoad = false;
m_bPagesTreeLoad = false;
m_bMainXRefLoadedOK = false;
- m_bAnnotsLoad = false;
- m_bPageLoadedOK = false;
m_pTrailer = nullptr;
m_pCurrentParser = nullptr;
- m_pPageDict = nullptr;
m_docStatus = PDF_DATAAVAIL_HEADER;
m_bTotalLoadPageTree = false;
m_bCurPageDictLoadOK = false;
@@ -1173,11 +1170,6 @@ bool CPDF_DataAvail::CheckPageAnnots(uint32_t dwPage) {
CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::CheckLinearizedFirstPage(
uint32_t dwPage) {
- if (!m_bAnnotsLoad) {
- if (!CheckPageAnnots(dwPage))
- return DataNotAvailable;
- m_bAnnotsLoad = true;
- }
if (!ValidatePage(dwPage))
return DataError;
return DataAvailable;
@@ -1189,12 +1181,17 @@ CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::IsPageAvail(
if (!m_pDocument)
return DataError;
+ const FX_SAFE_INT32 safePage = pdfium::base::checked_cast<int32_t>(dwPage);
+ if (!safePage.IsValid())
+ return DataError;
+
+ if (safePage.ValueOrDie() >= m_pDocument->GetPageCount()) {
+ // This is XFA page.
+ return DataAvailable;
+ }
+
if (IsFirstCheck(dwPage)) {
m_bCurPageDictLoadOK = false;
- m_bPageLoadedOK = false;
- m_bAnnotsLoad = false;
- m_objs_array.clear();
- m_ObjectSet.clear();
}
if (pdfium::ContainsKey(m_pagesLoadState, dwPage))
@@ -1204,10 +1201,18 @@ CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::IsPageAvail(
if (m_pLinearized) {
if (dwPage == m_pLinearized->GetFirstPageNo()) {
- DocAvailStatus nRet = CheckLinearizedFirstPage(dwPage);
- if (nRet == DataAvailable)
- m_pagesLoadState.insert(dwPage);
- return nRet;
+ CPDF_Dictionary* pPageDict = m_pDocument->GetPage(safePage.ValueOrDie());
+ if (!pPageDict)
+ return DataError;
+
+ auto page_num_obj = std::make_pair(
+ dwPage, pdfium::MakeUnique<CPDF_PageObjectAvail>(
+ GetValidator().Get(), m_pDocument, pPageDict));
+
+ CPDF_PageObjectAvail* page_obj_avail =
+ m_PagesObjAvail.insert(std::move(page_num_obj)).first->second.get();
+ // TODO(art-snake): Check resources.
+ return page_obj_avail->CheckAvail();
}
DocAvailStatus nResult = CheckLinearizedData();
@@ -1247,61 +1252,34 @@ CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::IsPageAvail(
if (CheckAcroForm() == DocFormStatus::FormNotAvailable)
return DataNotAvailable;
- if (!m_bPageLoadedOK) {
- if (m_objs_array.empty()) {
- m_ObjectSet.clear();
-
- FX_SAFE_INT32 safePage = pdfium::base::checked_cast<int32_t>(dwPage);
- m_pPageDict = m_pDocument->GetPage(safePage.ValueOrDie());
- if (!m_pPageDict) {
- ResetFirstCheck(dwPage);
- // This is XFA page.
- return DataAvailable;
- }
-
- std::vector<CPDF_Object*> obj_array;
- obj_array.push_back(m_pPageDict);
- if (!AreObjectsAvailable(obj_array, true, m_objs_array))
- return DataNotAvailable;
-
- m_objs_array.clear();
- } else {
- std::vector<CPDF_Object*> new_objs_array;
- if (!AreObjectsAvailable(m_objs_array, false, new_objs_array)) {
- m_objs_array = new_objs_array;
- return DataNotAvailable;
- }
- }
- m_objs_array.clear();
- m_bPageLoadedOK = true;
- }
+ CPDF_Dictionary* pPageDict = m_pDocument->GetPage(safePage.ValueOrDie());
+ if (!pPageDict)
+ return DataError;
- if (!m_bAnnotsLoad) {
- if (!CheckPageAnnots(dwPage))
- return DataNotAvailable;
- m_bAnnotsLoad = true;
+ {
+ auto page_num_obj = std::make_pair(
+ dwPage, pdfium::MakeUnique<CPDF_PageObjectAvail>(
+ GetValidator().Get(), m_pDocument, pPageDict));
+ CPDF_PageObjectAvail* page_obj_avail =
+ m_PagesObjAvail.insert(std::move(page_num_obj)).first->second.get();
+ const DocAvailStatus status = page_obj_avail->CheckAvail();
+ if (status != DocAvailStatus::DataAvailable)
+ return status;
}
- const DocAvailStatus resources_status = CheckResources(m_pPageDict);
+ const DocAvailStatus resources_status = CheckResources(pPageDict);
if (resources_status != DocAvailStatus::DataAvailable)
return resources_status;
- m_bPageLoadedOK = false;
- m_bAnnotsLoad = false;
m_bCurPageDictLoadOK = false;
-
ResetFirstCheck(dwPage);
m_pagesLoadState.insert(dwPage);
- if (!ValidatePage(dwPage))
- return DataError;
return DataAvailable;
}
CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::CheckResources(
const CPDF_Dictionary* page) {
- if (!page)
- return DocAvailStatus::DataAvailable;
-
+ ASSERT(page);
const CPDF_ReadValidator::Session read_session(GetValidator().Get());
const CPDF_Object* resources = GetResourceObject(page);
if (GetValidator()->has_read_problems())
diff --git a/core/fpdfapi/parser/cpdf_data_avail.h b/core/fpdfapi/parser/cpdf_data_avail.h
index f7c502ff77..a887d94901 100644
--- a/core/fpdfapi/parser/cpdf_data_avail.h
+++ b/core/fpdfapi/parser/cpdf_data_avail.h
@@ -211,9 +211,6 @@ class CPDF_DataAvail final {
bool m_bPagesLoad;
CPDF_Parser* m_pCurrentParser;
FX_FILESIZE m_dwCurrentXRefSteam;
- bool m_bAnnotsLoad;
- CPDF_Dictionary* m_pPageDict;
- bool m_bPageLoadedOK;
std::unique_ptr<CPDF_PageObjectAvail> m_pFormAvail;
std::vector<std::unique_ptr<CPDF_Object>> m_PagesArray;
uint32_t m_dwEncryptObjNum;
@@ -226,6 +223,7 @@ class CPDF_DataAvail final {
std::set<uint32_t> m_SeenPrevPositions;
std::unique_ptr<CPDF_HintTables> m_pHintTables;
bool m_bSupportHintTable;
+ std::map<uint32_t, std::unique_ptr<CPDF_PageObjectAvail>> m_PagesObjAvail;
std::map<const CPDF_Object*, std::unique_ptr<CPDF_PageObjectAvail>>
m_PagesResourcesAvail;
};