ZBuffer.h
1 /*
2  * Copyright (C) 2015 by Marc Boris Duerner
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * As a special exception, you may use this file as part of a free
10  * software library without restriction. Specifically, if other files
11  * instantiate templates or use macros or inline functions from this
12  * file, or you compile this file and link it with other files to
13  * produce an executable, this file does not by itself cause the
14  * resulting executable to be covered by the GNU General Public
15  * License. This exception does not however invalidate any other
16  * reasons why the executable file might be covered by the GNU Library
17  * General Public License.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  * Lesser General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public
25  * License along with this library; if not, write to the Free Software
26  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27  */
28 
29 #ifndef PT_ZBUFFER_H
30 #define PT_ZBUFFER_H
31 
32 #include <Pt/Api.h>
33 #include <Pt/StreamBuffer.h>
34 #include <ios>
35 #include <cstddef>
36 
37 typedef struct z_stream_s z_stream;
38 
39 namespace Pt {
40 
43 class PT_API ZBuffer : public BasicStreamBuffer<char>
44 {
45  public:
48  enum Format
49  {
50  Zlib = 0,
51  Gzip
52  };
53 
56  ZBuffer(Format fmt = Zlib);
57 
60  ZBuffer(std::ios& ios, Format fmt = Zlib);
61 
64  virtual ~ZBuffer();
65 
68  void attach(std::ios& target);
69 
72  void detach();
73 
76  void discard();
77 
80  void reset();
81 
84  void reset(std::ios& target);
85 
88  void finish();
89 
92  std::size_t zcount() const { return _zcount; }
93 
98  std::streamsize import(std::streamsize maxImport = 0);
99 
100  std::streamsize import(const char* data, std::streamsize size);
101 
102  protected:
103  // inheritdoc
104  virtual std::streamsize showmanyc();
105 
106  // inheritdoc
107  virtual std::streamsize showfull();
108 
109  // inheritdoc
110  virtual int sync();
111 
112  // inheritdoc
113  virtual int_type underflow();
114 
115  // inheritdoc
116  virtual int_type overflow(int_type ch);
117 
118  private:
119  void inflateBuffer();
120 
121  private:
122  std::ios* _target;
123  z_stream* _zstr;
124  Format _format;
125 
126  static const int _pbmax = 4;
127  static const int _bufmax = 4096;
128  char _buf[_bufmax];
129 
130  static const int _zbufmax = 4096;
131  char _zbuf[_zbufmax];
132  int _zbufsize;
133 
134  std::size_t _zcount;
135 };
136 
137 } // namespace Pt
138 
139 #endif // PT_ZBUFFER_H
Core module.
Definition: Allocator.h:33
ZBuffer(std::ios &ios, Format fmt=Zlib)
Construct with target stream.
Stream buffer for zlib compression.
Definition: ZBuffer.h:44
void reset()
Detach from target stream, discard the buffer and reset the state.
virtual std::streamsize showfull()
Returns the number of characters buffered for output.
ZBuffer(Format fmt=Zlib)
Default Constructor.
void detach()
Detach from target stream.
virtual ~ZBuffer()
Destructor.
void discard()
Discards the buffer content and resets the state.
void attach(std::ios &target)
Attach to target stream.
void finish()
Finish and flush remaining data to the target stream.
Format
Compression/decompression format.
Definition: ZBuffer.h:49
Buffer for input and output streams.
Definition: StreamBuffer.h:52
void reset(std::ios &target)
Attach to target stream, discard the buffer and reset the state.
std::size_t zcount() const
Returns the total number of decompressed bytes produced so far.
Definition: ZBuffer.h:92