Zipios++
gzipoutputstreambuf.cpp
Go to the documentation of this file.
1
2#include <time.h>
3
4#include "zipios++/zipios-config.h"
5
6#include <algorithm>
7#include "zipios++/meta-iostreams.h"
8
9#include <zlib.h>
10
12
13namespace zipios {
14
15using std::ios ;
16using std::cerr ;
17using std::endl ;
18
19GZIPOutputStreambuf::GZIPOutputStreambuf( streambuf *outbuf, bool del_outbuf )
20 : DeflateOutputStreambuf( outbuf, true, del_outbuf ),
21 _open ( false )
22{
23}
24
25void GZIPOutputStreambuf::setFilename( const string &filename ) {
26 _filename = filename ;
27}
28
29void GZIPOutputStreambuf::setComment( const string &comment ) {
30 _comment = comment ;
31}
32
36
38 if( ! _open )
39 return ;
40
41 closeStream();
42 writeTrailer();
43
44 _open = false ;
45}
46
50
51int GZIPOutputStreambuf::overflow( int c ) {
52 if (!_open) {
53 writeHeader();
54 _open = true;
55 }
56 return DeflateOutputStreambuf::overflow( c ) ;
57}
58
59int GZIPOutputStreambuf::sync() {
60 return DeflateOutputStreambuf::sync() ;
61}
62
63void GZIPOutputStreambuf::writeHeader() {
64 unsigned char flg = 0x00;
65 flg |= (_filename == "") ? 0x00 : 0x08;
66 flg |= (_comment == "") ? 0x00 : 0x10;
67
68 ostream os( _outbuf ) ;
69 os << (unsigned char)0x1f; // Magic #
70 os << (unsigned char)0x8b; // Magic #
71 os << (unsigned char)0x08; // Deflater.DEFLATED
72 os << flg; // FLG
73 os << (unsigned char)0x00; // MTIME
74 os << (unsigned char)0x00; // MTIME
75 os << (unsigned char)0x00; // MTIME
76 os << (unsigned char)0x00; // MTIME
77 os << (unsigned char)0x00; // XFLG
78 os << (unsigned char)0x00; // OS
79
80 if (_filename != "") {
81 os << _filename.c_str();// Filename
82 os << (unsigned char)0x00;
83 }
84
85 if (_comment != "") {
86 os << _comment.c_str(); // Comment
87 os << (unsigned char)0x00;
88 }
89}
90
91void GZIPOutputStreambuf::writeTrailer() {
92 writeInt(getCrc32());
93 writeInt(getCount());
94}
95
96void GZIPOutputStreambuf::writeInt(uint32 i) {
97 ostream os( _outbuf ) ;
98 os << (unsigned char)( i & 0xFF);
99 os << (unsigned char)((i >> 8) & 0xFF);
100 os << (unsigned char)((i >> 16) & 0xFF);
101 os << (unsigned char)((i >> 24) & 0xFF);
102}
103
104} // namespace
105
110/*
111 Zipios++ - a small C++ library that provides easy access to .zip files.
112 Copyright (C) 2000 Thomas Søndergaard
113
114 This library is free software; you can redistribute it and/or
115 modify it under the terms of the GNU Lesser General Public
116 License as published by the Free Software Foundation; either
117 version 2 of the License, or (at your option) any later version.
118
119 This library is distributed in the hope that it will be useful,
120 but WITHOUT ANY WARRANTY; without even the implied warranty of
121 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
122 Lesser General Public License for more details.
123
124 You should have received a copy of the GNU Lesser General Public
125 License along with this library; if not, write to the Free Software
126 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
127*/
DeflateOutputStreambuf is an output stream filter, that deflates the data that is written to it befor...
uint32 getCrc32() const
Returns the CRC32 for the current stream.
uint32 getCount() const
Returns the number of bytes written to the streambuf, that has been processed from the input buffer b...
void finish()
Finishes the compression.
GZIPOutputStreambuf(streambuf *outbuf, bool del_outbuf=false)
GZIPOutputStreambuf constructor.
virtual ~GZIPOutputStreambuf()
Destructor.
Header file that defines ZipOutputStreambuf.