| /* 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 <stdio.h> | |
| #include <string> | |
| #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_ */ |