26class GZIPCompressorOutputStream::GZIPCompressorHelper
29 GZIPCompressorHelper (
int compressionLevel,
int windowBits)
30 : compLevel ((compressionLevel < 0 || compressionLevel > 9) ? -1 : compressionLevel)
32 using namespace zlibNamespace;
35 streamIsValid = (deflateInit2 (&stream, compLevel, Z_DEFLATED,
36 windowBits != 0 ? windowBits : MAX_WBITS,
37 8, strategy) == Z_OK);
40 ~GZIPCompressorHelper()
43 zlibNamespace::deflateEnd (&stream);
46 bool write (
const uint8* data,
size_t dataSize, OutputStream& out)
53 if (! doNextBlock (data, dataSize, out, Z_NO_FLUSH))
59 void finish (OutputStream& out)
61 const uint8* data =
nullptr;
65 doNextBlock (data, dataSize, out, Z_FINISH);
69 enum { strategy = 0 };
71 zlibNamespace::z_stream stream;
73 bool isFirstDeflate =
true, streamIsValid =
false, finished =
false;
74 zlibNamespace::Bytef buffer[32768];
76 bool doNextBlock (
const uint8*& data,
size_t& dataSize, OutputStream& out,
const int flushMode)
78 using namespace zlibNamespace;
82 stream.next_in =
const_cast<uint8*
> (data);
83 stream.next_out = buffer;
84 stream.avail_in = (z_uInt) dataSize;
85 stream.avail_out = (z_uInt)
sizeof (buffer);
87 auto result = isFirstDeflate ? deflateParams (&stream, compLevel, strategy)
88 : deflate (&stream, flushMode);
89 isFirstDeflate =
false;
98 data += dataSize - stream.avail_in;
99 dataSize = stream.avail_in;
100 auto bytesDone = (ssize_t)
sizeof (buffer) - (ssize_t) stream.avail_out;
101 return bytesDone <= 0 || out.write (buffer, (
size_t) bytesDone);
112 JUCE_DECLARE_NON_COPYABLE (GZIPCompressorHelper)
123 helper (
new GZIPCompressorHelper (compressionLevel,
windowBits))
125 jassert (
out !=
nullptr);
135 helper->finish (*destStream);
148 return destStream->getPosition();
165 :
UnitTest (
"GZIP", UnitTestCategories::compression)
168 void runTest()
override
171 Random
rng = getRandom();
173 for (
int i = 100; --i >= 0;)
180 for (
int j =
rng.nextInt (100); --
j >= 0;)
182 MemoryBlock
data ((
unsigned int) (
rng.nextInt (2000) + 1));
184 for (
int k = (
int)
data.getSize(); --
k >= 0;)
210static GZIPTests gzipTests;
ElementType * data() noexcept
GZIPCompressorOutputStream(OutputStream &destStream, int compressionLevel=-1, int windowBits=0)
bool setPosition(int64) override
bool write(const void *, size_t) override
~GZIPCompressorOutputStream() override
int64 getPosition() override