zipios++
2.0.2
Zipios++ – a small C++ library that provides easy access to .zip files.
|
A class to handle stream deflate on the fly. More...
#include <deflateoutputstreambuf.hpp>
Public Member Functions | |
DeflateOutputStreambuf (std::streambuf *outbuf) | |
Initialize a DeflateOutputStreambuf object. More... | |
DeflateOutputStreambuf (DeflateOutputStreambuf const &src)=delete | |
virtual | ~DeflateOutputStreambuf () |
Clean up any resources used by this object. More... | |
void | closeStream () |
Closing the stream. More... | |
uint32_t | getCrc32 () const |
Get the CRC32 of the file. More... | |
size_t | getSize () const |
Retrieve the size of the file deflated. More... | |
bool | init (FileEntry::CompressionLevel compression_level) |
Initialize the zlib library. More... | |
DeflateOutputStreambuf & | operator= (DeflateOutputStreambuf const &rhs)=delete |
Protected Member Functions | |
virtual int | overflow (int c=EOF) |
Handle an overflow. More... | |
virtual int | sync () |
Synchronize the buffer. More... | |
Protected Attributes | |
std::vector< char > | m_invec |
std::streambuf * | m_outbuf |
uint32_t | m_overflown_bytes = 0 |
Private Member Functions | |
void | endDeflation () |
End deflation of current file. More... | |
void | flushOutvec () |
Flush the cached output data. More... | |
Private Attributes | |
uint32_t | m_crc32 = 0 |
std::vector< char > | m_outvec |
z_stream | m_zs |
bool | m_zs_initialized = false |
DeflateOutputStreambuf is an output stream filter, that deflates the data that is written to it before it passes it on to the output stream it is attached to. Deflation/Inflation is a compression/decompression method used in gzip and zip. The zlib library is used to perform the actual deflation, this class only wraps the functionality in an output stream filter.
Definition at line 47 of file deflateoutputstreambuf.hpp.
zipios::DeflateOutputStreambuf::DeflateOutputStreambuf | ( | std::streambuf * | outbuf | ) |
This function initializes the DeflateOutputStreambuf object to make it ready for compressing data using the zlib library.
[in,out] | outbuf | The streambuf to use for output. |
Definition at line 57 of file deflateoutputstreambuf.cpp.
References m_zs.
|
delete |
|
virtual |
The destructor makes sure that the zlib library is done with all the input and output data by calling various flush functions. It then makes sure that the remaining data from zlib is printed in the output file.
This is similar to calling closeStream() explicitly.
Definition at line 87 of file deflateoutputstreambuf.cpp.
References closeStream().
void zipios::DeflateOutputStreambuf::closeStream | ( | ) |
This function is expected to be called once the stream is getting closed (the buffer is destroyed.)
It ensures that the zlib library last few bytes get flushed and then mark the class as closed.
Note that this function can be called to close the current zlib library stream and start a new one. It is actually called from the putNextEntry() function (via the closeEntry() function.)
Definition at line 205 of file deflateoutputstreambuf.cpp.
References endDeflation(), m_zs, and m_zs_initialized.
Referenced by zipios::ZipOutputStreambuf::closeEntry(), zipios::GZIPOutputStreambuf::finish(), and ~DeflateOutputStreambuf().
|
private |
This function flushes the remaining data in the zlib buffers, after which the only possible operations are deflateEnd() or deflateReset().
Definition at line 382 of file deflateoutputstreambuf.cpp.
References flushOutvec(), zipios::getBufferSize(), m_outvec, m_overflown_bytes, m_zs, and overflow().
Referenced by closeStream().
|
private |
This function flushes m_outvec and updates the output pointer and size m_zs.next_out and m_zs.avail_out.
Definition at line 351 of file deflateoutputstreambuf.cpp.
References zipios::getBufferSize(), zipios::FilterOutputStreambuf::m_outbuf, m_outvec, and m_zs.
Referenced by endDeflation(), and overflow().
uint32_t zipios::DeflateOutputStreambuf::getCrc32 | ( | ) | const |
This function returns the CRC32 for the current file.
The returned value is the CRC for the data that has been compressed already (due to calls to overflow()). As DeflateOutputStreambuf may buffer an arbitrary amount of bytes until closeStream() has been invoked, the returned value is not very useful before closeStream() has been called.
Definition at line 239 of file deflateoutputstreambuf.cpp.
References m_crc32.
Referenced by zipios::ZipOutputStreambuf::updateEntryHeaderInfo(), and zipios::GZIPOutputStreambuf::writeTrailer().
size_t zipios::DeflateOutputStreambuf::getSize | ( | ) | const |
This function returns the number of bytes written to the streambuf object and that were processed from the input buffer by the compressor. After closeStream() has been called this number is the total number of bytes written to the stream. In other words, the size of the uncompressed data.
Definition at line 256 of file deflateoutputstreambuf.cpp.
References m_overflown_bytes.
Referenced by zipios::ZipOutputStreambuf::updateEntryHeaderInfo(), and zipios::GZIPOutputStreambuf::writeTrailer().
bool zipios::DeflateOutputStreambuf::init | ( | FileEntry::CompressionLevel | compression_level | ) |
This method is called in the constructor, so it must not write anything to the output streambuf m_outbuf (see notice in constructor.)
It will initialize the output stream as required to accept data to be compressed using the zlib library. The compression level is expected to come from the FileEntry which is about to be saved in the file.
Definition at line 106 of file deflateoutputstreambuf.cpp.
References zipios::FileEntry::COMPRESSION_LEVEL_DEFAULT, zipios::FileEntry::COMPRESSION_LEVEL_FASTEST, zipios::FileEntry::COMPRESSION_LEVEL_MAXIMUM, zipios::FileEntry::COMPRESSION_LEVEL_MINIMUM, zipios::FileEntry::COMPRESSION_LEVEL_NONE, zipios::FileEntry::COMPRESSION_LEVEL_SMALLEST, zipios::getBufferSize(), m_crc32, m_invec, m_outvec, m_zs, and m_zs_initialized.
Referenced by zipios::GZIPOutputStreambuf::GZIPOutputStreambuf(), and zipios::ZipOutputStreambuf::putNextEntry().
|
delete |
|
protectedvirtual |
This function is called by the streambuf implementation whenever "too many bytes" are in the output buffer, ready to be compressed.
IOException | This exception is raised whenever the overflow() function calls a zlib library function which returns an error. |
[in] | c | The character (byte) that overflowed the buffer. |
Reimplemented in zipios::ZipOutputStreambuf, and zipios::GZIPOutputStreambuf.
Definition at line 275 of file deflateoutputstreambuf.cpp.
References flushOutvec(), zipios::getBufferSize(), m_crc32, m_invec, m_outvec, and m_zs.
Referenced by endDeflation(), zipios::GZIPOutputStreambuf::overflow(), and zipios::ZipOutputStreambuf::overflow().
|
protectedvirtual |
The sync() function is expected to clear the input buffer so that any new data read from the input (i.e. a file) are re-read from disk. However, a call to sync() could break the filtering functionality so we do not implement it at all.
This means you are stuck with the existing buffer. But to make sure the system understands that, we always returns -1.
Reimplemented in zipios::ZipOutputStreambuf, and zipios::GZIPOutputStreambuf.
Definition at line 340 of file deflateoutputstreambuf.cpp.
Referenced by zipios::GZIPOutputStreambuf::sync(), and zipios::ZipOutputStreambuf::sync().
|
private |
Definition at line 76 of file deflateoutputstreambuf.hpp.
Referenced by getCrc32(), init(), and overflow().
|
protected |
Definition at line 65 of file deflateoutputstreambuf.hpp.
Referenced by init(), zipios::ZipOutputStreambuf::overflow(), overflow(), and zipios::ZipOutputStreambuf::putNextEntry().
|
protectedinherited |
Definition at line 49 of file filteroutputstreambuf.hpp.
Referenced by zipios::FilterOutputStreambuf::FilterOutputStreambuf(), zipios::ZipOutputStreambuf::finish(), flushOutvec(), zipios::ZipOutputStreambuf::overflow(), zipios::ZipOutputStreambuf::putNextEntry(), zipios::ZipOutputStreambuf::updateEntryHeaderInfo(), zipios::GZIPOutputStreambuf::writeHeader(), and zipios::GZIPOutputStreambuf::writeInt().
|
private |
Definition at line 74 of file deflateoutputstreambuf.hpp.
Referenced by endDeflation(), flushOutvec(), init(), and overflow().
|
protected |
Definition at line 64 of file deflateoutputstreambuf.hpp.
Referenced by endDeflation(), getSize(), zipios::ZipOutputStreambuf::overflow(), and zipios::ZipOutputStreambuf::putNextEntry().
|
private |
Definition at line 71 of file deflateoutputstreambuf.hpp.
Referenced by closeStream(), DeflateOutputStreambuf(), endDeflation(), flushOutvec(), init(), and overflow().
|
private |
Definition at line 72 of file deflateoutputstreambuf.hpp.
Referenced by closeStream(), and init().