root/headers/private/support/ZlibCompressionAlgorithm.h
/*
 * Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef _ZLIB_COMPRESSION_ALGORITHM_H_
#define _ZLIB_COMPRESSION_ALGORITHM_H_


#include <CompressionAlgorithm.h>


// compression level
enum {
        B_ZLIB_COMPRESSION_NONE         = 0,
        B_ZLIB_COMPRESSION_FASTEST      = 1,
        B_ZLIB_COMPRESSION_BEST         = 9,
        B_ZLIB_COMPRESSION_DEFAULT      = -1,
};


class BZlibCompressionParameters : public BCompressionParameters {
public:
                                                                BZlibCompressionParameters(
                                                                        int compressionLevel
                                                                                = B_ZLIB_COMPRESSION_DEFAULT);
        virtual                                         ~BZlibCompressionParameters();

                        int32                           CompressionLevel() const;
                        void                            SetCompressionLevel(int32 level);

                        size_t                          BufferSize() const;
                        void                            SetBufferSize(size_t size);

                        // TODO: Support setting the gzip header.
                        bool                            IsGzipFormat() const;
                        void                            SetGzipFormat(bool gzipFormat);

private:
                        int32                           fCompressionLevel;
                        size_t                          fBufferSize;
                        bool                            fGzipFormat;
};


class BZlibDecompressionParameters : public BDecompressionParameters {
public:
                                                                BZlibDecompressionParameters();
        virtual                                         ~BZlibDecompressionParameters();

                        size_t                          BufferSize() const;
                        void                            SetBufferSize(size_t size);

private:
                        size_t                          fBufferSize;
};


class BZlibCompressionAlgorithm : public BCompressionAlgorithm {
public:
                                                                BZlibCompressionAlgorithm();
        virtual                                         ~BZlibCompressionAlgorithm();

        virtual status_t                        CreateCompressingInputStream(BDataIO* input,
                                                                        const BCompressionParameters* parameters,
                                                                        BDataIO*& _stream);
        virtual status_t                        CreateCompressingOutputStream(BDataIO* output,
                                                                        const BCompressionParameters* parameters,
                                                                        BDataIO*& _stream);
        virtual status_t                        CreateDecompressingInputStream(BDataIO* input,
                                                                        const BDecompressionParameters* parameters,
                                                                        BDataIO*& _stream);
        virtual status_t                        CreateDecompressingOutputStream(BDataIO* output,
                                                                        const BDecompressionParameters* parameters,
                                                                        BDataIO*& _stream);

        virtual status_t                        CompressBuffer(const iovec& input, iovec& output,
                                                                        const BCompressionParameters* parameters = NULL,
                                                                        iovec* scratch = NULL);
        virtual status_t                        DecompressBuffer(const iovec& input, iovec& output,
                                                                        const BDecompressionParameters* parameters = NULL,
                                                                        iovec* scratch = NULL);

private:
                        struct CompressionStrategy;
                        struct DecompressionStrategy;

                        template<typename BaseClass, typename Strategy> struct Stream;
                        template<typename BaseClass, typename Strategy>
                                friend struct Stream;

private:
        static  status_t                        _TranslateZlibError(int error);
};


#endif  // _ZLIB_COMPRESSION_ALGORITHM_H_