/* 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_ */ |