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);