CPDF_Dictionary* CPDF_DataAvail::GetPage(int index) { if (!m_pDocument || index < 0 || index >= GetPageCount()) return nullptr; CPDF_Dictionary* page = m_pDocument->GetPage(index); if (page) return page; if (!m_pLinearized || !m_pHintTables) return nullptr; if (index == static_cast<int>(m_pLinearized->GetFirstPageNo())) return nullptr; FX_FILESIZE szPageStartPos = 0; FX_FILESIZE szPageLength = 0; uint32_t dwObjNum = 0; const bool bPagePosGot = m_pHintTables->GetPagePos(index, &szPageStartPos, &szPageLength, &dwObjNum); if (!bPagePosGot || !dwObjNum) return nullptr; // We should say to the document, which object is the page. m_pDocument->SetPageObjNum(index, dwObjNum); // Page object already can be parsed in document. if (!m_pDocument->GetIndirectObject(dwObjNum)) { m_syntaxParser.InitParser( m_pFileRead, pdfium::base::checked_cast<uint32_t>(szPageStartPos)); m_pDocument->ReplaceIndirectObjectIfHigherGeneration( dwObjNum, ParseIndirectObjectAt(0, dwObjNum, m_pDocument)); } const bool is_page_valid = ValidatePage(index); (void)is_page_valid; ASSERT(is_page_valid); return m_pDocument->GetPage(index); }
CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::CheckLinearizedFirstPage( uint32_t dwPage, DownloadHints* pHints) { if (!m_bAnnotsLoad) { if (!CheckPageAnnots(dwPage, pHints)) return DataNotAvailable; m_bAnnotsLoad = true; } const bool is_page_valid = ValidatePage(dwPage); (void)is_page_valid; ASSERT(is_page_valid); return DataAvailable; }
CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::IsPageAvail( uint32_t dwPage, DownloadHints* pHints) { if (!m_pDocument) return DataError; if (IsFirstCheck(dwPage)) { m_bCurPageDictLoadOK = false; m_bPageLoadedOK = false; m_bAnnotsLoad = false; m_bNeedDownLoadResource = false; m_objs_array.clear(); m_ObjectSet.clear(); } if (pdfium::ContainsKey(m_pagesLoadState, dwPage)) return DataAvailable; if (m_pLinearized) { if (dwPage == m_pLinearized->GetFirstPageNo()) { DocAvailStatus nRet = CheckLinearizedFirstPage(dwPage, pHints); if (nRet == DataAvailable) m_pagesLoadState.insert(dwPage); return nRet; } DocAvailStatus nResult = CheckLinearizedData(pHints); if (nResult != DataAvailable) return nResult; if (m_pHintTables) { nResult = m_pHintTables->CheckPage(dwPage, pHints); if (nResult != DataAvailable) return nResult; m_pagesLoadState.insert(dwPage); return GetPage(dwPage) ? DataAvailable : DataError; } if (m_bMainXRefLoadedOK) { if (m_bTotalLoadPageTree) { if (!LoadPages(pHints)) return DataNotAvailable; } else { if (!m_bCurPageDictLoadOK && !CheckPage(dwPage, pHints)) return DataNotAvailable; } } else { if (!LoadAllFile(pHints)) return DataNotAvailable; m_pDocument->GetParser()->RebuildCrossRef(); ResetFirstCheck(dwPage); return DataAvailable; } } else { if (!m_bTotalLoadPageTree && !m_bCurPageDictLoadOK && !CheckPage(dwPage, pHints)) { return DataNotAvailable; } } if (m_bHaveAcroForm && !m_bAcroFormLoad) { if (!CheckAcroFormSubObject(pHints)) return DataNotAvailable; m_bAcroFormLoad = true; } 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, pHints, m_objs_array)) return DataNotAvailable; m_objs_array.clear(); } else { std::vector<CPDF_Object*> new_objs_array; if (!AreObjectsAvailable(m_objs_array, false, pHints, new_objs_array)) { m_objs_array = new_objs_array; return DataNotAvailable; } } m_objs_array.clear(); m_bPageLoadedOK = true; } if (!m_bAnnotsLoad) { if (!CheckPageAnnots(dwPage, pHints)) return DataNotAvailable; m_bAnnotsLoad = true; } if (m_pPageDict && !m_bNeedDownLoadResource) { m_pPageResource = m_pPageDict->GetObjectFor("Resources"); m_bNeedDownLoadResource = m_pPageResource || HaveResourceAncestor(m_pPageDict); } if (m_bNeedDownLoadResource) { if (!CheckResources(pHints)) return DataNotAvailable; m_bNeedDownLoadResource = false; } m_bPageLoadedOK = false; m_bAnnotsLoad = false; m_bCurPageDictLoadOK = false; ResetFirstCheck(dwPage); m_pagesLoadState.insert(dwPage); const bool is_page_valid = ValidatePage(dwPage); (void)is_page_valid; ASSERT(is_page_valid); return DataAvailable; }
void TSetupDlg::OnCommand (DWORD dwCmd, LPARAM lParam) { m_dwNotifyCode = dwCmd; switch (dwCmd) { /* Page 1 */ case MAKELPARAM (IDC_DSN, EN_CHANGE): ValidatePage (); break; case MAKELPARAM (IDC_SERVER, CBN_DROPDOWN): m_SERVER.OnCbnDropDown (); break; case MAKELPARAM (IDC_SERVER, CBN_CLOSEUP): m_SERVER.OnCbnCloseUp (); break; case MAKELPARAM (IDC_SERVER, CBN_EDITCHANGE): m_SERVER.OnCbnEditChange (); ValidatePage (); break; /* Page 2 */ case MAKELPARAM (IDC_AUTHMETHOD, CBN_SELCHANGE): SetAuthMethod (); break; case MAKELPARAM (IDC_USEUID, BN_CLICKED): SetUseUID (); ValidatePage (); break; case MAKELPARAM (IDC_UID, EN_CHANGE): ValidatePage (); break; case MAKELPARAM (IDC_BROWSEUIDCERT, BN_CLICKED): if (BrowseForFile (m_hInstance, m_UID, IDS_PKCS12BROWSE)) m_PWD.SetFocus (); break; case MAKELPARAM (IDC_USESERVERCERT, BN_CLICKED): SetUseServerCert (TRUE); ValidatePage (); break; case MAKELPARAM (IDC_SERVERCERT, EN_CHANGE): ValidatePage (); break; case MAKELPARAM (IDC_BROWSESERVERCERT, BN_CLICKED): BrowseForFile (m_hInstance, m_SERVERCERT, IDS_X509BROWSE); break; /* Page 3 */ case MAKELPARAM (IDC_USEDEFAULTDB, BN_CLICKED): SetUseDefaultDB (); ValidatePage (); break; case MAKELPARAM (IDC_USEDEFAULTIL, BN_CLICKED): SetUseDefaultIL (); ValidatePage (); break; case MAKELPARAM (IDC_USEDEFAULTCS, BN_CLICKED): SetUseDefaultCS (); ValidatePage (); break; case MAKELPARAM (IDC_DEFAULTDB, CBN_SELCHANGE): case MAKELPARAM (IDC_DEFAULTDB, CBN_EDITCHANGE): case MAKELPARAM (IDC_DEFAULTCS, CBN_SELCHANGE): case MAKELPARAM (IDC_DEFAULTCS, CBN_EDITCHANGE): case MAKELPARAM (IDC_DEFAULTIL, CBN_SELCHANGE): case MAKELPARAM (IDC_DEFAULTIL, CBN_EDITCHANGE): ValidatePage (); break; /* Global buttons */ case MAKELPARAM (IDC_BACKBTN, BN_CLICKED): ChangePage (m_iCurPage - 1); break; case MAKELPARAM (IDC_NEXTBTN, BN_CLICKED): if (m_iCurPage == 0) FillAuthMethods (); else if (m_iCurPage == 1) { FillIsolationLevels (); if (!FillDBCombos ()) { SetFocus (GetDlgItem (m_hPageWnd[1], IDC_PWD)); break; } } if (m_iCurPage == m_iNumPages - 1) { SaveToProps (); EndDialog (m_hWnd, IDOK); } else ChangePage (m_iCurPage + 1); break; case MAKELPARAM (IDCANCEL, BN_CLICKED): EndDialog (m_hWnd, dwCmd); break; } }