diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib-compression/compression.h | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/lib-compression/compression.h b/src/lib-compression/compression.h new file mode 100644 index 0000000..60d58bf --- /dev/null +++ b/src/lib-compression/compression.h @@ -0,0 +1,55 @@ +#ifndef COMPRESSION_H +#define COMPRESSION_H + +enum istream_decompress_flags { + /* If stream isn't detected to be compressed, return it as passthrough + istream. */ + ISTREAM_DECOMPRESS_FLAG_TRY = BIT(0), +}; + +/* Compressed input is always detected once at maximum this many bytes have + been read. This value must be smaller than a typical istream max buffer + size. */ +#define COMPRESSION_HDR_MAX_SIZE 128 + +struct compression_handler { + const char *name; + const char *ext; + bool (*is_compressed)(struct istream *input); + struct istream *(*create_istream)(struct istream *input); + struct ostream *(*create_ostream)(struct ostream *output, int level); + /* returns minimum level */ + int (*get_min_level)(void); + /* the default can be -1 (e.g. gz), so the return value of this has to + be used as-is. */ + int (*get_default_level)(void); + /* returns maximum level */ + int (*get_max_level)(void); +}; + +extern const struct compression_handler compression_handlers[]; + +/* Returns 1 if compression handler was found and is usable, 0 if support isn't + compiled in, -1 if unknown. */ +int compression_lookup_handler(const char *name, + const struct compression_handler **handler_r); +/* Detect handler by looking at the first few bytes of the input stream. */ +const struct compression_handler * +compression_detect_handler(struct istream *input); +/* Lookup handler based on filename extension in the path, returns the same + * values as compression_lookup_handler. */ +int compression_lookup_handler_from_ext(const char *path, + const struct compression_handler **handler_r); + +/* Automatically detect the compression format. Note that using tee-istream as + one of the parent streams is dangerous here: A decompression istream may + have to read a lot of data (e.g. 8 kB isn't enough) before it returns even + the first byte as output. If the other tee children aren't read forward, + this can cause an infinite loop when i_stream_read() is always returning 0. + This is why ISTREAM_DECOMPRESS_FLAG_TRY should be used instead of attempting + to implement similar functionality with tee-istream. */ +struct istream * +i_stream_create_decompress(struct istream *input, + enum istream_decompress_flags flags); + +#endif |