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