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);
43 zlibNamespace::deflateEnd (&stream);
46 bool write (
const uint8* data,
size_t dataSize,
OutputStream& out)
53 if (! doNextBlock (data, dataSize, out, Z_NO_FLUSH))
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 = (uInt) dataSize;
85 stream.avail_out = (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);
122 : destStream (out, deleteDestStream),
125 jassert (out !=
nullptr);
135 helper->finish (*destStream);
141 jassert (destBuffer !=
nullptr && (ssize_t) howMany >= 0);
143 return helper->write (
static_cast<const uint8*
> (destBuffer), howMany, *destStream);
148 return destStream->getPosition();
162 GZIPTests() :
UnitTest (
"GZIP",
"Compression") {}
164 void runTest()
override
167 Random rng = getRandom();
169 for (
int i = 100; --i >= 0;)
171 MemoryOutputStream original, compressed, uncompressed;
174 GZIPCompressorOutputStream zipper (compressed, rng.nextInt (10));
176 for (
int j = rng.nextInt (100); --j >= 0;)
178 MemoryBlock data ((
unsigned int) (rng.nextInt (2000) + 1));
180 for (
int k = (
int) data.getSize(); --k >= 0;)
181 data[k] = (
char) rng.nextInt (255);
189 MemoryInputStream compressedInput (compressed.getData(), compressed.getDataSize(),
false);
190 GZIPDecompressorInputStream unzipper (compressedInput);
192 uncompressed << unzipper;
195 expectEquals ((
int) uncompressed.getDataSize(),
196 (
int) original.getDataSize());
198 if (original.getDataSize() == uncompressed.getDataSize())
199 expect (memcmp (uncompressed.getData(),
201 original.getDataSize()) == 0);
206static GZIPTests gzipTests;
A stream which uses zlib to compress the data written into it.
GZIPCompressorOutputStream(OutputStream &destStream, int compressionLevel=-1, int windowBits=0)
Creates a compression stream.
bool setPosition(int64) override
Tries to move the stream's output position.
bool write(const void *, size_t) override
Writes a block of data to the stream.
~GZIPCompressorOutputStream() override
Destructor.
void flush() override
Flushes and closes the stream.
int64 getPosition() override
Returns the stream's current position.
The base class for streams that write data to some kind of destination.
virtual bool write(const void *dataToWrite, size_t numberOfBytes)=0
Writes a block of data to the stream.
This is a base class for classes that perform a unit test.