Files
create/src/zipios++/gzipoutputstreambuf.cpp
wmayer 3a4100d656 zipios++: modernize C++11
* use nullptr
* replace deprecated headers
2022-01-26 21:54:52 +01:00

128 lines
3.3 KiB
C++

#include <ctime>
#include "zipios-config.h"
#include <algorithm>
#include "meta-iostreams.h"
#include <zlib.h>
#include "gzipoutputstreambuf.h"
namespace zipios {
using std::ios ;
using std::cerr ;
using std::endl ;
GZIPOutputStreambuf::GZIPOutputStreambuf( streambuf *outbuf, bool del_outbuf )
: DeflateOutputStreambuf( outbuf, true, del_outbuf ),
_open ( false )
{
}
void GZIPOutputStreambuf::setFilename( const string &filename ) {
_filename = filename ;
}
void GZIPOutputStreambuf::setComment( const string &comment ) {
_comment = comment ;
}
void GZIPOutputStreambuf::close() {
finish() ;
}
void GZIPOutputStreambuf::finish() {
if( ! _open )
return ;
closeStream();
writeTrailer();
_open = false ;
}
GZIPOutputStreambuf::~GZIPOutputStreambuf() {
finish() ;
}
int GZIPOutputStreambuf::overflow( int c ) {
if (!_open) {
writeHeader();
_open = true;
}
return DeflateOutputStreambuf::overflow( c ) ;
}
int GZIPOutputStreambuf::sync() {
return DeflateOutputStreambuf::sync() ;
}
void GZIPOutputStreambuf::writeHeader() {
unsigned char flg = 0x00;
flg |= (_filename == "") ? 0x00 : 0x08;
flg |= (_comment == "") ? 0x00 : 0x10;
ostream os( _outbuf ) ;
os << (unsigned char)0x1f; // Magic #
os << (unsigned char)0x8b; // Magic #
os << (unsigned char)0x08; // Deflater.DEFLATED
os << flg; // FLG
os << (unsigned char)0x00; // MTIME
os << (unsigned char)0x00; // MTIME
os << (unsigned char)0x00; // MTIME
os << (unsigned char)0x00; // MTIME
os << (unsigned char)0x00; // XFLG
os << (unsigned char)0x00; // OS
if (_filename != "") {
os << _filename.c_str();// Filename
os << (unsigned char)0x00;
}
if (_comment != "") {
os << _comment.c_str(); // Comment
os << (unsigned char)0x00;
}
}
void GZIPOutputStreambuf::writeTrailer() {
writeInt(getCrc32());
writeInt(getCount());
}
void GZIPOutputStreambuf::writeInt(uint32 i) {
ostream os( _outbuf ) ;
os << (unsigned char)( i & 0xFF);
os << (unsigned char)((i >> 8) & 0xFF);
os << (unsigned char)((i >> 16) & 0xFF);
os << (unsigned char)((i >> 24) & 0xFF);
}
} // namespace
/** \file
Implementation of GZIPOutputStreambuf.
*/
/*
Zipios++ - a small C++ library that provides easy access to .zip files.
Copyright (C) 2000 Thomas Søndergaard
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/