1 /*	$NetBSD: zfstream.h,v 1.1.1.1 2006/01/14 20:10:53 christos Exp $	*/
2 
3 
4 #ifndef zfstream_h
5 #define zfstream_h
6 
7 #include <fstream.h>
8 #include "zlib.h"
9 
10 class gzfilebuf : public streambuf {
11 
12 public:
13 
14   gzfilebuf( );
15   virtual ~gzfilebuf();
16 
17   gzfilebuf *open( const char *name, int io_mode );
18   gzfilebuf *attach( int file_descriptor, int io_mode );
19   gzfilebuf *close();
20 
21   int setcompressionlevel( int comp_level );
22   int setcompressionstrategy( int comp_strategy );
23 
24   inline int is_open() const { return (file !=NULL); }
25 
26   virtual streampos seekoff( streamoff, ios::seek_dir, int );
27 
28   virtual int sync();
29 
30 protected:
31 
32   virtual int underflow();
33   virtual int overflow( int = EOF );
34 
35 private:
36 
37   gzFile file;
38   short mode;
39   short own_file_descriptor;
40 
41   int flushbuf();
42   int fillbuf();
43 
44 };
45 
46 class gzfilestream_common : virtual public ios {
47 
48   friend class gzifstream;
49   friend class gzofstream;
50   friend gzofstream &setcompressionlevel( gzofstream &, int );
51   friend gzofstream &setcompressionstrategy( gzofstream &, int );
52 
53 public:
54   virtual ~gzfilestream_common();
55 
56   void attach( int fd, int io_mode );
57   void open( const char *name, int io_mode );
58   void close();
59 
60 protected:
61   gzfilestream_common();
62 
63 private:
64   gzfilebuf *rdbuf();
65 
66   gzfilebuf buffer;
67 
68 };
69 
70 class gzifstream : public gzfilestream_common, public istream {
71 
72 public:
73 
74   gzifstream();
75   gzifstream( const char *name, int io_mode = ios::in );
76   gzifstream( int fd, int io_mode = ios::in );
77 
78   virtual ~gzifstream();
79 
80 };
81 
82 class gzofstream : public gzfilestream_common, public ostream {
83 
84 public:
85 
86   gzofstream();
87   gzofstream( const char *name, int io_mode = ios::out );
88   gzofstream( int fd, int io_mode = ios::out );
89 
90   virtual ~gzofstream();
91 
92 };
93 
94 template<class T> class gzomanip {
95   friend gzofstream &operator<<(gzofstream &, const gzomanip<T> &);
96 public:
97   gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { }
98 private:
99   gzofstream &(*func)(gzofstream &, T);
100   T val;
101 };
102 
103 template<class T> gzofstream &operator<<(gzofstream &s, const gzomanip<T> &m)
104 {
105   return (*m.func)(s, m.val);
106 }
107 
108 inline gzofstream &setcompressionlevel( gzofstream &s, int l )
109 {
110   (s.rdbuf())->setcompressionlevel(l);
111   return s;
112 }
113 
114 inline gzofstream &setcompressionstrategy( gzofstream &s, int l )
115 {
116   (s.rdbuf())->setcompressionstrategy(l);
117   return s;
118 }
119 
120 inline gzomanip<int> setcompressionlevel(int l)
121 {
122   return gzomanip<int>(&setcompressionlevel,l);
123 }
124 
125 inline gzomanip<int> setcompressionstrategy(int l)
126 {
127   return gzomanip<int>(&setcompressionstrategy,l);
128 }
129 
130 #endif
131