lib/zlib/GzipOutputStream: add SyncFlush()

This commit is contained in:
Max Kellermann 2022-07-04 10:05:17 +02:00
parent 2c092d2613
commit 74780131bd
2 changed files with 30 additions and 2 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2014-2018 Max Kellermann <max.kellermann@gmail.com>
* Copyright 2014-2021 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -54,6 +54,29 @@ GzipOutputStream::~GzipOutputStream()
deflateEnd(&z);
}
void
GzipOutputStream::SyncFlush()
{
/* no more input */
z.next_in = nullptr;
z.avail_in = 0;
do {
Bytef output[16384];
z.next_out = output;
z.avail_out = sizeof(output);
int result = deflate(&z, Z_SYNC_FLUSH);
if (result != Z_OK)
throw ZlibError(result);
if (z.next_out == output)
break;
next.Write(output, z.next_out - output);
} while (z.avail_out == 0);
}
void
GzipOutputStream::Finish()
{

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2014-2018 Max Kellermann <max.kellermann@gmail.com>
* Copyright 2014-2021 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -54,6 +54,11 @@ public:
explicit GzipOutputStream(OutputStream &_next);
~GzipOutputStream();
/**
* Throws on error.
*/
void SyncFlush();
/**
* Finish the file and write all data remaining in zlib's
* output buffer.