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  ZBuffer();
49 
52  ZBuffer(std::ios& ios);
53 
56  virtual ~ZBuffer();
57 
60  void attach(std::ios& target);
61 
64  void detach();
65 
68  void discard();
69 
72  void reset();
73 
76  void reset(std::ios& target);
77 
80  void finish();
81 
86  std::streamsize import(std::streamsize maxImport = 0);
87 
88  std::streamsize import(const char* data, std::streamsize size);
89 
90  protected:
91  // inheritdoc
92  virtual std::streamsize showmanyc();
93 
94  // inheritdoc
95  virtual std::streamsize showfull();
96 
97  // inheritdoc
98  virtual int sync();
99 
100  // inheritdoc
101  virtual int_type underflow();
102 
103  // inheritdoc
104  virtual int_type overflow(int_type ch);
105 
106  private:
107  void inflateBuffer();
108 
109  private:
110  std::ios* _target;
111  z_stream* _zstr;
112 
113  static const int _pbmax = 4;
114  static const int _bufmax = 1024;
115  char _buf[_bufmax];
116 
117  static const int _zbufmax = 1024;
118  char _zbuf[_zbufmax];
119  int _zbufsize;
120 };
121 
122 } // namespace Pt
123 
124 #endif // PT_ZBUFFER_H
Buffer for input and output streams.
Definition: StreamBuffer.h:51
Stream buffer for zlib compression.
Definition: ZBuffer.h:43