Make IFX_WriteStream not retainable. IFX_ArchiveStream inherits from IFX_WriteStream but does not need to be retainable. Instead, add IFX_RetainableWriteStream which inherits from both Retainable and IFX_WriteStream. Change-Id: I32930abf2d9c4f9bb083632d367b1623e4f83450 Reviewed-on: https://pdfium-review.googlesource.com/c/45556 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp index 06eb979..aae902c 100644 --- a/core/fpdfapi/edit/cpdf_creator.cpp +++ b/core/fpdfapi/edit/cpdf_creator.cpp
@@ -31,7 +31,8 @@ class CFX_FileBufferArchive final : public IFX_ArchiveStream { public: - explicit CFX_FileBufferArchive(const RetainPtr<IFX_WriteStream>& archive); + explicit CFX_FileBufferArchive( + const RetainPtr<IFX_RetainableWriteStream>& archive); ~CFX_FileBufferArchive() override; bool WriteBlock(const void* pBuf, size_t size) override; @@ -47,11 +48,11 @@ FX_FILESIZE offset_; size_t current_length_; std::vector<uint8_t> buffer_; - RetainPtr<IFX_WriteStream> backing_file_; + RetainPtr<IFX_RetainableWriteStream> backing_file_; }; CFX_FileBufferArchive::CFX_FileBufferArchive( - const RetainPtr<IFX_WriteStream>& file) + const RetainPtr<IFX_RetainableWriteStream>& file) : offset_(0), current_length_(0), buffer_(kArchiveBufferSize), @@ -141,7 +142,7 @@ } // namespace CPDF_Creator::CPDF_Creator(CPDF_Document* pDoc, - const RetainPtr<IFX_WriteStream>& archive) + const RetainPtr<IFX_RetainableWriteStream>& archive) : m_pDocument(pDoc), m_pParser(pDoc->GetParser()), m_pEncryptDict(m_pParser ? m_pParser->GetEncryptDict() : nullptr),
diff --git a/core/fpdfapi/edit/cpdf_creator.h b/core/fpdfapi/edit/cpdf_creator.h index 96643c8..ef81805 100644 --- a/core/fpdfapi/edit/cpdf_creator.h +++ b/core/fpdfapi/edit/cpdf_creator.h
@@ -29,8 +29,8 @@ class CPDF_Creator { public: - explicit CPDF_Creator(CPDF_Document* pDoc, - const RetainPtr<IFX_WriteStream>& archive); + CPDF_Creator(CPDF_Document* pDoc, + const RetainPtr<IFX_RetainableWriteStream>& archive); ~CPDF_Creator(); void RemoveSecurity();
diff --git a/core/fxcrt/fx_stream.h b/core/fxcrt/fx_stream.h index 1561224..354cbe4 100644 --- a/core/fxcrt/fx_stream.h +++ b/core/fxcrt/fx_stream.h
@@ -36,10 +36,13 @@ #define FX_FILEMODE_ReadOnly 1 #define FX_FILEMODE_Truncate 2 -class IFX_WriteStream : virtual public Retainable { +class IFX_WriteStream { public: virtual bool WriteBlock(const void* pData, size_t size) = 0; virtual bool WriteString(const ByteStringView& str) = 0; + + protected: + virtual ~IFX_WriteStream() = default; }; class IFX_ArchiveStream : public IFX_WriteStream { @@ -49,7 +52,10 @@ virtual FX_FILESIZE CurrentOffset() const = 0; }; -class IFX_SeekableWriteStream : public IFX_WriteStream { +class IFX_RetainableWriteStream : virtual public Retainable, + public IFX_WriteStream {}; + +class IFX_SeekableWriteStream : public IFX_RetainableWriteStream { public: // IFX_WriteStream: bool WriteBlock(const void* pData, size_t size) override;
diff --git a/core/fxge/win32/cfx_psrenderer.cpp b/core/fxge/win32/cfx_psrenderer.cpp index 13c1aba..9f76bf0 100644 --- a/core/fxge/win32/cfx_psrenderer.cpp +++ b/core/fxge/win32/cfx_psrenderer.cpp
@@ -109,7 +109,7 @@ CFX_PSRenderer::~CFX_PSRenderer() {} -void CFX_PSRenderer::Init(const RetainPtr<IFX_WriteStream>& pStream, +void CFX_PSRenderer::Init(const RetainPtr<IFX_RetainableWriteStream>& pStream, int pslevel, int width, int height,
diff --git a/core/fxge/win32/cfx_psrenderer.h b/core/fxge/win32/cfx_psrenderer.h index 9b1d86b..70f72a5 100644 --- a/core/fxge/win32/cfx_psrenderer.h +++ b/core/fxge/win32/cfx_psrenderer.h
@@ -31,7 +31,7 @@ CFX_PSRenderer(); ~CFX_PSRenderer(); - void Init(const RetainPtr<IFX_WriteStream>& stream, + void Init(const RetainPtr<IFX_RetainableWriteStream>& stream, int pslevel, int width, int height, @@ -88,7 +88,7 @@ void WritePSBinary(const uint8_t* data, int len); void WriteToStream(std::ostringstream* stringStream); - RetainPtr<IFX_WriteStream> m_pStream; + RetainPtr<IFX_RetainableWriteStream> m_pStream; int m_PSLevel; CFX_GraphStateData m_CurGraphState; bool m_bGraphStateSet;
diff --git a/core/fxge/win32/cpsoutput.h b/core/fxge/win32/cpsoutput.h index 04e5ac1..1607fe3 100644 --- a/core/fxge/win32/cpsoutput.h +++ b/core/fxge/win32/cpsoutput.h
@@ -12,7 +12,7 @@ #include "core/fxcrt/fx_stream.h" #include "core/fxcrt/fx_system.h" -class CPSOutput final : public IFX_WriteStream { +class CPSOutput final : public IFX_RetainableWriteStream { public: enum class OutputMode { kExtEscape, kGdiComment };
diff --git a/fpdfsdk/cpdfsdk_filewriteadapter.h b/fpdfsdk/cpdfsdk_filewriteadapter.h index beae403..4d89300 100644 --- a/fpdfsdk/cpdfsdk_filewriteadapter.h +++ b/fpdfsdk/cpdfsdk_filewriteadapter.h
@@ -12,7 +12,7 @@ #include "core/fxcrt/unowned_ptr.h" #include "public/fpdf_save.h" -class CPDFSDK_FileWriteAdapter final : public IFX_WriteStream { +class CPDFSDK_FileWriteAdapter final : public IFX_RetainableWriteStream { public: template <typename T, typename... Args> friend RetainPtr<T> pdfium::MakeRetain(Args&&... args);