Index: fpdfsdk/fpdfview.cpp |
diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp |
index f0c269a3121866327ae17561c15cf36dd83c70d2..8e23300498aca2ad7094f3488d69193ec85a35c2 100644 |
--- a/fpdfsdk/fpdfview.cpp |
+++ b/fpdfsdk/fpdfview.cpp |
@@ -119,15 +119,17 @@ void RenderPageImpl(CPDF_PageRenderContext* pContext, |
class CPDF_CustomAccess final : public IFX_SeekableReadStream { |
public: |
- explicit CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess); |
- ~CPDF_CustomAccess() override {} |
+ static CFX_RetainPtr<CPDF_CustomAccess> Create(FPDF_FILEACCESS* pFileAccess) { |
+ return CFX_RetainPtr<CPDF_CustomAccess>(new CPDF_CustomAccess(pFileAccess)); |
+ } |
// IFX_SeekableReadStream |
FX_FILESIZE GetSize() override; |
- void Release() override; |
bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; |
private: |
+ explicit CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess); |
+ |
FPDF_FILEACCESS m_FileAccess; |
}; |
@@ -138,10 +140,6 @@ 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) { |
@@ -161,12 +159,12 @@ bool CPDF_CustomAccess::ReadBlock(void* buffer, |
#ifdef PDF_ENABLE_XFA |
class CFPDF_FileStream : public IFX_SeekableStream { |
public: |
- explicit CFPDF_FileStream(FPDF_FILEHANDLER* pFS); |
- ~CFPDF_FileStream() override {} |
+ static CFX_RetainPtr<CFPDF_FileStream> Create(FPDF_FILEHANDLER* pFS) { |
+ return CFX_RetainPtr<CFPDF_FileStream>(new CFPDF_FileStream(pFS)); |
+ } |
+ ~CFPDF_FileStream() override; |
// IFX_SeekableStream: |
- IFX_SeekableStream* Retain() override; |
- void Release() override; |
FX_FILESIZE GetSize() override; |
bool IsEOF() override; |
FX_FILESIZE GetPosition() override; |
@@ -178,6 +176,8 @@ class CFPDF_FileStream : public IFX_SeekableStream { |
void SetPosition(FX_FILESIZE pos) { m_nCurPos = pos; } |
protected: |
+ explicit CFPDF_FileStream(FPDF_FILEHANDLER* pFS); |
+ |
FPDF_FILEHANDLER* m_pFS; |
FX_FILESIZE m_nCurPos; |
}; |
@@ -187,14 +187,9 @@ CFPDF_FileStream::CFPDF_FileStream(FPDF_FILEHANDLER* pFS) { |
m_nCurPos = 0; |
} |
-IFX_SeekableStream* CFPDF_FileStream::Retain() { |
- return this; |
-} |
- |
-void CFPDF_FileStream::Release() { |
+CFPDF_FileStream::~CFPDF_FileStream() { |
if (m_pFS && m_pFS->Release) |
m_pFS->Release(m_pFS->clientData); |
- delete this; |
} |
FX_FILESIZE CFPDF_FileStream::GetSize() { |
@@ -310,13 +305,15 @@ CFX_DIBitmap* CFXBitmapFromFPDFBitmap(FPDF_BITMAP bitmap) { |
return static_cast<CFX_DIBitmap*>(bitmap); |
} |
-IFX_SeekableReadStream* MakeSeekableReadStream(FPDF_FILEACCESS* pFileAccess) { |
- return new CPDF_CustomAccess(pFileAccess); |
+CFX_RetainPtr<IFX_SeekableReadStream> MakeSeekableReadStream( |
+ FPDF_FILEACCESS* pFileAccess) { |
+ return CPDF_CustomAccess::Create(pFileAccess); |
} |
#ifdef PDF_ENABLE_XFA |
-IFX_SeekableStream* MakeSeekableStream(FPDF_FILEHANDLER* pFilehandler) { |
- return new CFPDF_FileStream(pFilehandler); |
+CFX_RetainPtr<IFX_SeekableStream> MakeSeekableStream( |
+ FPDF_FILEHANDLER* pFilehandler) { |
+ return CFPDF_FileStream::Create(pFilehandler); |
} |
#endif // PDF_ENABLE_XFA |
@@ -447,7 +444,7 @@ DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path, |
FPDF_BYTESTRING password) { |
// NOTE: the creation of the file needs to be by the embedder on the |
// other side of this API. |
- IFX_SeekableReadStream* pFileAccess = |
+ CFX_RetainPtr<IFX_SeekableReadStream> pFileAccess = |
IFX_SeekableReadStream::CreateFromFilename((const FX_CHAR*)file_path); |
if (!pFileAccess) |
return nullptr; |
@@ -500,25 +497,26 @@ DLLEXPORT FPDF_BOOL STDCALL FPDF_LoadXFA(FPDF_DOCUMENT document) { |
class CMemFile final : public IFX_SeekableReadStream { |
public: |
- CMemFile(uint8_t* pBuf, FX_FILESIZE size) : m_pBuf(pBuf), m_size(size) {} |
+ static CFX_RetainPtr<CMemFile> Create(uint8_t* pBuf, FX_FILESIZE size) { |
+ return CFX_RetainPtr<CMemFile>(new CMemFile(pBuf, size)); |
+ } |
- void Release() override { delete this; } |
FX_FILESIZE GetSize() override { return m_size; } |
bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override { |
- if (offset < 0) { |
+ if (offset < 0) |
return false; |
- } |
+ |
FX_SAFE_FILESIZE newPos = pdfium::base::checked_cast<FX_FILESIZE>(size); |
newPos += offset; |
- if (!newPos.IsValid() || newPos.ValueOrDie() > m_size) { |
+ if (!newPos.IsValid() || newPos.ValueOrDie() > m_size) |
return false; |
- } |
+ |
FXSYS_memcpy(buffer, m_pBuf + offset, size); |
return true; |
} |
private: |
- ~CMemFile() override {} |
+ CMemFile(uint8_t* pBuf, FX_FILESIZE size) : m_pBuf(pBuf), m_size(size) {} |
uint8_t* const m_pBuf; |
const FX_FILESIZE m_size; |
@@ -527,12 +525,11 @@ class CMemFile final : public IFX_SeekableReadStream { |
DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf, |
int size, |
FPDF_BYTESTRING password) { |
- CMemFile* pMemFile = new CMemFile((uint8_t*)data_buf, size); |
- std::unique_ptr<CPDF_Parser> pParser(new CPDF_Parser); |
+ CFX_RetainPtr<CMemFile> pMemFile = CMemFile::Create((uint8_t*)data_buf, size); |
+ auto pParser = pdfium::MakeUnique<CPDF_Parser>(); |
pParser->SetPassword(password); |
- std::unique_ptr<CPDF_Document> pDocument( |
- new CPDF_Document(std::move(pParser))); |
+ auto pDocument = pdfium::MakeUnique<CPDF_Document>(std::move(pParser)); |
CPDF_Parser::Error error = |
pDocument->GetParser()->StartParse(pMemFile, pDocument.get()); |
if (error != CPDF_Parser::SUCCESS) { |
@@ -546,12 +543,12 @@ DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf, |
DLLEXPORT FPDF_DOCUMENT STDCALL |
FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, |
FPDF_BYTESTRING password) { |
- CPDF_CustomAccess* pFile = new CPDF_CustomAccess(pFileAccess); |
- std::unique_ptr<CPDF_Parser> pParser(new CPDF_Parser); |
+ CFX_RetainPtr<CPDF_CustomAccess> pFile = |
+ CPDF_CustomAccess::Create(pFileAccess); |
+ auto pParser = pdfium::MakeUnique<CPDF_Parser>(); |
pParser->SetPassword(password); |
- std::unique_ptr<CPDF_Document> pDocument( |
- new CPDF_Document(std::move(pParser))); |
+ auto pDocument = pdfium::MakeUnique<CPDF_Document>(std::move(pParser)); |
CPDF_Parser::Error error = |
pDocument->GetParser()->StartParse(pFile, pDocument.get()); |
if (error != CPDF_Parser::SUCCESS) { |