/* Copyright 2009 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Input and output classes for streaming brotli compression. */ #ifndef BROTLI_ENC_STREAMS_H_ #define BROTLI_ENC_STREAMS_H_ #include #include #include "../common/types.h" namespace brotli { /* Input interface for the compression routines. */ class BrotliIn { public: virtual ~BrotliIn(void) {} /* Return a pointer to the next block of input of at most n bytes. Return the actual length in *nread. At end of data, return NULL. Don't return NULL if there is more data to read, even if called with n == 0. Read will only be called if some of its bytes are needed. */ virtual const void* Read(size_t n, size_t* nread) = 0; }; /* Output interface for the compression routines. */ class BrotliOut { public: virtual ~BrotliOut(void) {} /* Write n bytes of data from buf. Return true if all written, false otherwise. */ virtual bool Write(const void *buf, size_t n) = 0; }; /* Adapter class to make BrotliIn objects from raw memory. */ class BrotliMemIn : public BrotliIn { public: BrotliMemIn(const void* buf, size_t len); void Reset(const void* buf, size_t len); /* returns the amount of data consumed */ size_t position(void) const { return pos_; } const void* Read(size_t n, size_t* OUTPUT); private: const void* buf_; /* start of input buffer */ size_t len_; /* length of input */ size_t pos_; /* current read position within input */ }; /* Adapter class to make BrotliOut objects from raw memory. */ class BrotliMemOut : public BrotliOut { public: BrotliMemOut(void* buf, size_t len); void Reset(void* buf, size_t len); /* returns the amount of data written */ size_t position(void) const { return pos_; } bool Write(const void* buf, size_t n); private: void* buf_; /* start of output buffer */ size_t len_; /* length of output */ size_t pos_; /* current write position within output */ }; /* Adapter class to make BrotliOut objects from a string. */ class BrotliStringOut : public BrotliOut { public: /* Create a writer that appends its data to buf. buf->size() will grow to at most max_size buf is expected to be empty when constructing BrotliStringOut. */ BrotliStringOut(std::string* buf, size_t max_size); void Reset(std::string* buf, size_t max_len); bool Write(const void* buf, size_t n); private: std::string* buf_; /* start of output buffer */ size_t max_size_; /* max length of output */ }; /* Adapter class to make BrotliIn object from a file. */ class BrotliFileIn : public BrotliIn { public: BrotliFileIn(FILE* f, size_t max_read_size); ~BrotliFileIn(void); const void* Read(size_t n, size_t* bytes_read); private: FILE* f_; char* buf_; size_t buf_size_; }; /* Adapter class to make BrotliOut object from a file. */ class BrotliFileOut : public BrotliOut { public: explicit BrotliFileOut(FILE* f); bool Write(const void* buf, size_t n); private: FILE* f_; }; } /* namespace brotli */ #endif /* BROTLI_ENC_STREAMS_H_ */