1 // Copyright 2014 The PDFium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #ifndef CORE_FXCRT_FX_STREAM_H_ 8 #define CORE_FXCRT_FX_STREAM_H_ 9 10 #include <stddef.h> 11 #include <stdint.h> 12 13 #include "core/fxcrt/bytestring.h" 14 #include "core/fxcrt/fx_types.h" 15 #include "core/fxcrt/retain_ptr.h" 16 #include "third_party/base/containers/span.h" 17 18 class IFX_WriteStream { 19 public: 20 // When `size` is 0, treat it as a no-op and return true. 21 virtual bool WriteBlock(pdfium::span<const uint8_t> data) = 0; 22 23 bool WriteString(ByteStringView str); 24 bool WriteByte(uint8_t byte); 25 bool WriteDWord(uint32_t i); 26 bool WriteFilesize(FX_FILESIZE size); 27 28 protected: 29 virtual ~IFX_WriteStream() = default; 30 }; 31 32 class IFX_ArchiveStream : public IFX_WriteStream { 33 public: 34 virtual FX_FILESIZE CurrentOffset() const = 0; 35 }; 36 37 class IFX_StreamWithSize { 38 public: 39 virtual FX_FILESIZE GetSize() = 0; 40 }; 41 42 class IFX_RetainableWriteStream : virtual public Retainable, 43 public IFX_WriteStream {}; 44 45 class IFX_SeekableWriteStream : virtual public IFX_StreamWithSize, 46 public IFX_RetainableWriteStream { 47 public: 48 // IFX_WriteStream: 49 bool WriteBlock(pdfium::span<const uint8_t> buffer) override; 50 51 virtual bool Flush() = 0; 52 virtual bool WriteBlockAtOffset(pdfium::span<const uint8_t> data, 53 FX_FILESIZE offset) = 0; 54 }; 55 56 class IFX_SeekableReadStream : virtual public Retainable, 57 virtual public IFX_StreamWithSize { 58 public: 59 static RetainPtr<IFX_SeekableReadStream> CreateFromFilename( 60 const char* filename); 61 62 virtual bool IsEOF(); 63 virtual FX_FILESIZE GetPosition(); 64 [[nodiscard]] virtual size_t ReadBlock(pdfium::span<uint8_t> buffer); 65 [[nodiscard]] virtual bool ReadBlockAtOffset(pdfium::span<uint8_t> buffer, 66 FX_FILESIZE offset) = 0; 67 }; 68 69 class IFX_SeekableStream : public IFX_SeekableReadStream, 70 public IFX_SeekableWriteStream { 71 public: 72 // IFX_SeekableWriteStream: 73 bool WriteBlock(pdfium::span<const uint8_t> buffer) override; 74 }; 75 76 #endif // CORE_FXCRT_FX_STREAM_H_ 77