| Index: fpdfsdk/fpdfview.cpp
|
| diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp
|
| index 633cbe879e1274a6a16c0af93b1afb034e3d4576..449433ed9003e9703f35b448494f456af8ec39e9 100644
|
| --- a/fpdfsdk/fpdfview.cpp
|
| +++ b/fpdfsdk/fpdfview.cpp
|
| @@ -117,6 +117,47 @@ void RenderPageImpl(CPDF_PageRenderContext* pContext,
|
| pContext->m_pDevice->RestoreState(false);
|
| }
|
|
|
| +class CPDF_CustomAccess final : public IFX_SeekableReadStream {
|
| + public:
|
| + explicit CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess);
|
| + ~CPDF_CustomAccess() override {}
|
| +
|
| + // IFX_SeekableReadStream
|
| + FX_FILESIZE GetSize() override;
|
| + void Release() override;
|
| + bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override;
|
| +
|
| + private:
|
| + FPDF_FILEACCESS m_FileAccess;
|
| +};
|
| +
|
| +CPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess)
|
| + : m_FileAccess(*pFileAccess) {}
|
| +
|
| +FX_FILESIZE CPDF_CustomAccess::GetSize() {
|
| + return m_FileAccess.m_FileLen;
|
| +}
|
| +
|
| +void CPDF_CustomAccess::Release() {
|
| + delete this;
|
| +}
|
| +
|
| +bool CPDF_CustomAccess::ReadBlock(void* buffer,
|
| + FX_FILESIZE offset,
|
| + size_t size) {
|
| + if (offset < 0)
|
| + return false;
|
| +
|
| + FX_SAFE_FILESIZE newPos = pdfium::base::checked_cast<FX_FILESIZE>(size);
|
| + newPos += offset;
|
| + if (!newPos.IsValid() ||
|
| + newPos.ValueOrDie() > static_cast<FX_FILESIZE>(m_FileAccess.m_FileLen)) {
|
| + return false;
|
| + }
|
| + return !!m_FileAccess.m_GetBlock(m_FileAccess.m_Param, offset,
|
| + reinterpret_cast<uint8_t*>(buffer), size);
|
| +}
|
| +
|
| } // namespace
|
|
|
| UnderlyingDocumentType* UnderlyingFromFPDFDocument(FPDF_DOCUMENT doc) {
|
| @@ -246,31 +287,8 @@ bool CFPDF_FileStream::Flush() {
|
| }
|
| #endif // PDF_ENABLE_XFA
|
|
|
| -CPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess)
|
| - : m_FileAccess(*pFileAccess) {}
|
| -
|
| -FX_FILESIZE CPDF_CustomAccess::GetSize() {
|
| - return m_FileAccess.m_FileLen;
|
| -}
|
| -
|
| -void CPDF_CustomAccess::Release() {
|
| - delete this;
|
| -}
|
| -
|
| -bool CPDF_CustomAccess::ReadBlock(void* buffer,
|
| - FX_FILESIZE offset,
|
| - size_t size) {
|
| - if (offset < 0)
|
| - return false;
|
| -
|
| - FX_SAFE_FILESIZE newPos = pdfium::base::checked_cast<FX_FILESIZE>(size);
|
| - newPos += offset;
|
| - if (!newPos.IsValid() ||
|
| - newPos.ValueOrDie() > static_cast<FX_FILESIZE>(m_FileAccess.m_FileLen)) {
|
| - return false;
|
| - }
|
| - return !!m_FileAccess.m_GetBlock(m_FileAccess.m_Param, offset,
|
| - reinterpret_cast<uint8_t*>(buffer), size);
|
| +IFX_SeekableReadStream* MakeSeekableReadStream(FPDF_FILEACCESS* pFileAccess) {
|
| + return new CPDF_CustomAccess(pFileAccess);
|
| }
|
|
|
| // 0 bit: FPDF_POLICY_MACHINETIME_ACCESS
|
|
|