1275793eaSopenharmony_ci
2275793eaSopenharmony_ci#ifndef zfstream_h
3275793eaSopenharmony_ci#define zfstream_h
4275793eaSopenharmony_ci
5275793eaSopenharmony_ci#include <fstream.h>
6275793eaSopenharmony_ci#include "zlib.h"
7275793eaSopenharmony_ci
8275793eaSopenharmony_ciclass gzfilebuf : public streambuf {
9275793eaSopenharmony_ci
10275793eaSopenharmony_cipublic:
11275793eaSopenharmony_ci
12275793eaSopenharmony_ci  gzfilebuf( );
13275793eaSopenharmony_ci  virtual ~gzfilebuf();
14275793eaSopenharmony_ci
15275793eaSopenharmony_ci  gzfilebuf *open( const char *name, int io_mode );
16275793eaSopenharmony_ci  gzfilebuf *attach( int file_descriptor, int io_mode );
17275793eaSopenharmony_ci  gzfilebuf *close();
18275793eaSopenharmony_ci
19275793eaSopenharmony_ci  int setcompressionlevel( int comp_level );
20275793eaSopenharmony_ci  int setcompressionstrategy( int comp_strategy );
21275793eaSopenharmony_ci
22275793eaSopenharmony_ci  inline int is_open() const { return (file !=NULL); }
23275793eaSopenharmony_ci
24275793eaSopenharmony_ci  virtual streampos seekoff( streamoff, ios::seek_dir, int );
25275793eaSopenharmony_ci
26275793eaSopenharmony_ci  virtual int sync();
27275793eaSopenharmony_ci
28275793eaSopenharmony_ciprotected:
29275793eaSopenharmony_ci
30275793eaSopenharmony_ci  virtual int underflow();
31275793eaSopenharmony_ci  virtual int overflow( int = EOF );
32275793eaSopenharmony_ci
33275793eaSopenharmony_ciprivate:
34275793eaSopenharmony_ci
35275793eaSopenharmony_ci  gzFile file;
36275793eaSopenharmony_ci  short mode;
37275793eaSopenharmony_ci  short own_file_descriptor;
38275793eaSopenharmony_ci
39275793eaSopenharmony_ci  int flushbuf();
40275793eaSopenharmony_ci  int fillbuf();
41275793eaSopenharmony_ci
42275793eaSopenharmony_ci};
43275793eaSopenharmony_ci
44275793eaSopenharmony_ciclass gzfilestream_common : virtual public ios {
45275793eaSopenharmony_ci
46275793eaSopenharmony_ci  friend class gzifstream;
47275793eaSopenharmony_ci  friend class gzofstream;
48275793eaSopenharmony_ci  friend gzofstream &setcompressionlevel( gzofstream &, int );
49275793eaSopenharmony_ci  friend gzofstream &setcompressionstrategy( gzofstream &, int );
50275793eaSopenharmony_ci
51275793eaSopenharmony_cipublic:
52275793eaSopenharmony_ci  virtual ~gzfilestream_common();
53275793eaSopenharmony_ci
54275793eaSopenharmony_ci  void attach( int fd, int io_mode );
55275793eaSopenharmony_ci  void open( const char *name, int io_mode );
56275793eaSopenharmony_ci  void close();
57275793eaSopenharmony_ci
58275793eaSopenharmony_ciprotected:
59275793eaSopenharmony_ci  gzfilestream_common();
60275793eaSopenharmony_ci
61275793eaSopenharmony_ciprivate:
62275793eaSopenharmony_ci  gzfilebuf *rdbuf();
63275793eaSopenharmony_ci
64275793eaSopenharmony_ci  gzfilebuf buffer;
65275793eaSopenharmony_ci
66275793eaSopenharmony_ci};
67275793eaSopenharmony_ci
68275793eaSopenharmony_ciclass gzifstream : public gzfilestream_common, public istream {
69275793eaSopenharmony_ci
70275793eaSopenharmony_cipublic:
71275793eaSopenharmony_ci
72275793eaSopenharmony_ci  gzifstream();
73275793eaSopenharmony_ci  gzifstream( const char *name, int io_mode = ios::in );
74275793eaSopenharmony_ci  gzifstream( int fd, int io_mode = ios::in );
75275793eaSopenharmony_ci
76275793eaSopenharmony_ci  virtual ~gzifstream();
77275793eaSopenharmony_ci
78275793eaSopenharmony_ci};
79275793eaSopenharmony_ci
80275793eaSopenharmony_ciclass gzofstream : public gzfilestream_common, public ostream {
81275793eaSopenharmony_ci
82275793eaSopenharmony_cipublic:
83275793eaSopenharmony_ci
84275793eaSopenharmony_ci  gzofstream();
85275793eaSopenharmony_ci  gzofstream( const char *name, int io_mode = ios::out );
86275793eaSopenharmony_ci  gzofstream( int fd, int io_mode = ios::out );
87275793eaSopenharmony_ci
88275793eaSopenharmony_ci  virtual ~gzofstream();
89275793eaSopenharmony_ci
90275793eaSopenharmony_ci};
91275793eaSopenharmony_ci
92275793eaSopenharmony_citemplate<class T> class gzomanip {
93275793eaSopenharmony_ci  friend gzofstream &operator<<(gzofstream &, const gzomanip<T> &);
94275793eaSopenharmony_cipublic:
95275793eaSopenharmony_ci  gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { }
96275793eaSopenharmony_ciprivate:
97275793eaSopenharmony_ci  gzofstream &(*func)(gzofstream &, T);
98275793eaSopenharmony_ci  T val;
99275793eaSopenharmony_ci};
100275793eaSopenharmony_ci
101275793eaSopenharmony_citemplate<class T> gzofstream &operator<<(gzofstream &s, const gzomanip<T> &m)
102275793eaSopenharmony_ci{
103275793eaSopenharmony_ci  return (*m.func)(s, m.val);
104275793eaSopenharmony_ci}
105275793eaSopenharmony_ci
106275793eaSopenharmony_ciinline gzofstream &setcompressionlevel( gzofstream &s, int l )
107275793eaSopenharmony_ci{
108275793eaSopenharmony_ci  (s.rdbuf())->setcompressionlevel(l);
109275793eaSopenharmony_ci  return s;
110275793eaSopenharmony_ci}
111275793eaSopenharmony_ci
112275793eaSopenharmony_ciinline gzofstream &setcompressionstrategy( gzofstream &s, int l )
113275793eaSopenharmony_ci{
114275793eaSopenharmony_ci  (s.rdbuf())->setcompressionstrategy(l);
115275793eaSopenharmony_ci  return s;
116275793eaSopenharmony_ci}
117275793eaSopenharmony_ci
118275793eaSopenharmony_ciinline gzomanip<int> setcompressionlevel(int l)
119275793eaSopenharmony_ci{
120275793eaSopenharmony_ci  return gzomanip<int>(&setcompressionlevel,l);
121275793eaSopenharmony_ci}
122275793eaSopenharmony_ci
123275793eaSopenharmony_ciinline gzomanip<int> setcompressionstrategy(int l)
124275793eaSopenharmony_ci{
125275793eaSopenharmony_ci  return gzomanip<int>(&setcompressionstrategy,l);
126275793eaSopenharmony_ci}
127275793eaSopenharmony_ci
128275793eaSopenharmony_ci#endif
129