From 72cf56a0fd536ab9eb5398f95df9347b25a5e707 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Tue, 1 Jul 2014 21:53:49 +0200 Subject: [PATCH] BZlibCompressionAlgorithm: Basic support for gzip format --- .../support/ZlibCompressionAlgorithm.h | 5 +++ src/kits/support/ZlibCompressionAlgorithm.cpp | 36 +++++++++++++++---- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/headers/private/support/ZlibCompressionAlgorithm.h b/headers/private/support/ZlibCompressionAlgorithm.h index 6e8099d610..df9ddae54f 100644 --- a/headers/private/support/ZlibCompressionAlgorithm.h +++ b/headers/private/support/ZlibCompressionAlgorithm.h @@ -31,9 +31,14 @@ public: 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; }; diff --git a/src/kits/support/ZlibCompressionAlgorithm.cpp b/src/kits/support/ZlibCompressionAlgorithm.cpp index ca02633dfe..9aaaf26fdc 100644 --- a/src/kits/support/ZlibCompressionAlgorithm.cpp +++ b/src/kits/support/ZlibCompressionAlgorithm.cpp @@ -45,7 +45,8 @@ BZlibCompressionParameters::BZlibCompressionParameters( : BCompressionParameters(), fCompressionLevel(compressionLevel), - fBufferSize(kDefaultBufferSize) + fBufferSize(kDefaultBufferSize), + fGzipFormat(false) { } @@ -83,6 +84,20 @@ BZlibCompressionParameters::SetBufferSize(size_t size) } +bool +BZlibCompressionParameters::IsGzipFormat() const +{ + return fGzipFormat; +} + + +void +BZlibCompressionParameters::SetGzipFormat(bool gzipFormat) +{ + fGzipFormat = gzipFormat; +} + + // #pragma mark - BZlibDecompressionParameters @@ -127,10 +142,18 @@ struct BZlibCompressionAlgorithm::CompressionStrategy { static int Init(z_stream& stream, const BZlibCompressionParameters* parameters) { - return deflateInit(&stream, - parameters != NULL - ? parameters->CompressionLevel() - : B_ZLIB_COMPRESSION_DEFAULT); + int32 compressionLevel = B_ZLIB_COMPRESSION_DEFAULT; + bool gzipFormat = false; + if (parameters != NULL) { + compressionLevel = parameters->CompressionLevel(); + gzipFormat = parameters->IsGzipFormat(); + } + + return deflateInit2(&stream, compressionLevel, + Z_DEFLATED, + MAX_WBITS + (gzipFormat ? 16 : 0), + MAX_MEM_LEVEL, + Z_DEFAULT_STRATEGY); } static void Uninit(z_stream& stream) @@ -159,7 +182,8 @@ struct BZlibCompressionAlgorithm::DecompressionStrategy { static int Init(z_stream& stream, const BZlibDecompressionParameters* /*parameters*/) { - return inflateInit(&stream); + // auto-detect zlib/gzip header + return inflateInit2(&stream, 32 + MAX_WBITS); } static void Uninit(z_stream& stream)