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