- place ifgzstream/ofgzstream in namespace zypp (not zypp::base)
authorMichael Andres <ma@suse.de>
Fri, 3 Mar 2006 17:16:48 +0000 (17:16 +0000)
committerMichael Andres <ma@suse.de>
Fri, 3 Mar 2006 17:16:48 +0000 (17:16 +0000)
zypp/NeedAType.h
zypp/base/GzStream.cc
zypp/base/GzStream.h

index 229be46..9f252a0 100644 (file)
@@ -82,12 +82,6 @@ namespace zypp
     struct MultiLocale : public std::map<Locale,_Val>
     {};
 
-  /** stream reading compessed or uncompress files */
-  typedef std::ifstream ifgzstream;
-
-  /** stream writing compessed or uncompress files */
-  typedef std::ofstream ofgzstream;
-
   //@}
   /////////////////////////////////////////////////////////////////
 } // namespace zypp
index 29eec37..ac378ca 100644 (file)
 namespace zypp
 { /////////////////////////////////////////////////////////////////
   ///////////////////////////////////////////////////////////////////
-  namespace base
+  namespace gzstream_detail
   { /////////////////////////////////////////////////////////////////
 
 
-///////////////////////////////////////////////////////////////////
-//
-//     CLASS NAME : ZlibError
-//
-///////////////////////////////////////////////////////////////////
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : ZlibError
+    //
+    ///////////////////////////////////////////////////////////////////
 
-///////////////////////////////////////////////////////////////////
-//
-//     METHOD NAME : ZlibError::strerror
-//     METHOD TYPE : std::string
-//
-std::string
-ZlibError::strerror() const
-{
-  std::string ret = ( _zError ? ::zError( _zError ) : "OK" );
-  if ( _zError == Z_ERRNO )
-    ret += std::string("(") + ::strerror( _errno ) + ")";
-  return ret;
-}
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : ZlibError::strerror
+    // METHOD TYPE : std::string
+    //
+    std::string
+    ZlibError::strerror() const
+    {
+      std::string ret = ( _zError ? ::zError( _zError ) : "OK" );
+      if ( _zError == Z_ERRNO )
+        ret += std::string("(") + ::strerror( _errno ) + ")";
+      return ret;
+    }
 
-///////////////////////////////////////////////////////////////////
-//
-//     CLASS NAME : fgzstreambuf
-//
-///////////////////////////////////////////////////////////////////
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : fgzstreambuf
+    //
+    ///////////////////////////////////////////////////////////////////
 
-///////////////////////////////////////////////////////////////////
-//
-//     METHOD NAME : fgzstreambuf::open
-//     METHOD TYPE : fgzstreambuf *
-//
-fgzstreambuf *
-fgzstreambuf::open( const char * name_r, std::ios_base::openmode mode_r )
-{
-  fgzstreambuf * ret = NULL;
-  if ( ! isOpen() )
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : fgzstreambuf::open
+    // METHOD TYPE : fgzstreambuf *
+    //
+    fgzstreambuf *
+    fgzstreambuf::open( const char * name_r, std::ios_base::openmode mode_r )
     {
-      if ( mode_r == std::ios_base::in )
-        _file = gzopen( name_r, "rb" );
-      else if ( mode_r == std::ios_base::out )
-        _file = gzopen( name_r, "wb" );
-      // else: not supported
-
-      if ( isOpen() )
+      fgzstreambuf * ret = NULL;
+      if ( ! isOpen() )
         {
-          // Store mode and initialize the internal buffer.
-          _mode = mode_r;
-          if ( inReadMode() )
+          if ( mode_r == std::ios_base::in )
+            _file = gzopen( name_r, "rb" );
+          else if ( mode_r == std::ios_base::out )
+            _file = gzopen( name_r, "wb" );
+          // else: not supported
+
+          if ( isOpen() )
             {
-              setp( NULL, NULL );
-              setg( &(_buffer[0]), &(_buffer[0]), &(_buffer[0]) );
+              // Store mode and initialize the internal buffer.
+              _mode = mode_r;
+              if ( inReadMode() )
+                {
+                  setp( NULL, NULL );
+                  setg( &(_buffer[0]), &(_buffer[0]), &(_buffer[0]) );
+                }
+              else
+                {
+                  setp( &(_buffer[0]), &(_buffer[_buffer.size()-1]) );
+                  setg( NULL, NULL, NULL );
+                }
+              ret = this;
             }
           else
-            {
-              setp( &(_buffer[0]), &(_buffer[_buffer.size()-1]) );
-              setg( NULL, NULL, NULL );
-            }
-          ret = this;
+            setZError();
         }
-      else
-        setZError();
+      return ret;
     }
-  return ret;
-}
 
-///////////////////////////////////////////////////////////////////
-//
-//     METHOD NAME : fgzstreambuf::close
-//     METHOD TYPE : fgzstreambuf *
-//
-fgzstreambuf *
-fgzstreambuf::close()
-{
-  fgzstreambuf * ret = NULL;
-  if ( isOpen() )
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : fgzstreambuf::close
+    // METHOD TYPE : fgzstreambuf *
+    //
+    fgzstreambuf *
+    fgzstreambuf::close()
     {
-      bool failed = false;
-      if ( sync() != 0 )
-        failed = true;
-      if ( gzclose( _file ) != Z_OK )
+      fgzstreambuf * ret = NULL;
+      if ( isOpen() )
         {
-          failed = true;
-          setZError();
-        }
+          bool failed = false;
+          if ( sync() != 0 )
+            failed = true;
+          if ( gzclose( _file ) != Z_OK )
+            {
+              failed = true;
+              setZError();
+            }
 
-      // Reset everything
-      _file = NULL;
-      _mode = std::ios_base::openmode(0);
-      setp( NULL, NULL );
-      setg( NULL, NULL, NULL );
-      if ( ! failed )
-        ret = this;
+          // Reset everything
+          _file = NULL;
+          _mode = std::ios_base::openmode(0);
+          setp( NULL, NULL );
+          setg( NULL, NULL, NULL );
+          if ( ! failed )
+            ret = this;
+        }
+      return ret;
     }
-  return ret;
-}
 
-///////////////////////////////////////////////////////////////////
-//
-//     METHOD NAME : fgzstreambuf::sync
-//     METHOD TYPE : int
-//
-int
-fgzstreambuf::sync()
-{
-  int ret = 0;
-  if ( pbase() < pptr() ) {
-    const int_type res = overflow();
-    if ( traits_type::eq_int_type( res, traits_type::eof() ) )
-      ret = -1;
-  }
-  return ret;
-}
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : fgzstreambuf::sync
+    // METHOD TYPE : int
+    //
+    int
+    fgzstreambuf::sync()
+    {
+      int ret = 0;
+      if ( pbase() < pptr() ) {
+        const int_type res = overflow();
+        if ( traits_type::eq_int_type( res, traits_type::eof() ) )
+          ret = -1;
+      }
+      return ret;
+    }
 
-///////////////////////////////////////////////////////////////////
-//
-//     METHOD NAME : fgzstreambuf::overflow
-//     METHOD TYPE : fgzstreambuf::int_type
-//
-fgzstreambuf::int_type
-fgzstreambuf::overflow( int_type c )
-{
-  int_type ret = traits_type::eof();
-  if ( inWriteMode() )
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : fgzstreambuf::overflow
+    // METHOD TYPE : fgzstreambuf::int_type
+    //
+    fgzstreambuf::int_type
+    fgzstreambuf::overflow( int_type c )
     {
-      if ( ! traits_type::eq_int_type( c, traits_type::eof() ) )
+      int_type ret = traits_type::eof();
+      if ( inWriteMode() )
         {
-          *pptr() = traits_type::to_char_type( c );
-          pbump(1);
+          if ( ! traits_type::eq_int_type( c, traits_type::eof() ) )
+            {
+              *pptr() = traits_type::to_char_type( c );
+              pbump(1);
+            }
+          if ( pbase() <= pptr() )
+            {
+              if ( zWriteFrom( pbase(), pptr() - pbase() ) )
+                {
+                  setp( &(_buffer[0]), &(_buffer[_buffer.size()-1]) );
+                  ret = traits_type::not_eof( c );
+                }
+              // else: error writing the file
+            }
         }
-      if ( pbase() <= pptr() )
+      return ret;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : fgzstreambuf::underflow
+    // METHOD TYPE : fgzstreambuf::int_type
+    //
+    fgzstreambuf::int_type
+    fgzstreambuf::underflow()
+    {
+      int_type ret = traits_type::eof();
+      if ( inReadMode() )
         {
-          if ( zWriteFrom( pbase(), pptr() - pbase() ) )
+          if ( gptr() < egptr() )
+            return traits_type::to_int_type( *gptr() );
+
+          const std::streamsize got = zReadTo( &(_buffer[0]), _buffer.size() );
+          if ( got > 0 )
             {
-              setp( &(_buffer[0]), &(_buffer[_buffer.size()-1]) );
-              ret = traits_type::not_eof( c );
+              setg( &(_buffer[0]), &(_buffer[0]), &(_buffer[got]) );
+              ret = traits_type::to_int_type( *gptr() );
             }
-          // else: error writing the file
+          else if ( got == 0 )
+            {
+              // EOF
+              setg( &(_buffer[0]), &(_buffer[0]), &(_buffer[0]) );
+            }
+          // else: error reading the file
         }
+      return ret;
     }
-  return ret;
-}
 
-///////////////////////////////////////////////////////////////////
-//
-//     METHOD NAME : fgzstreambuf::underflow
-//     METHOD TYPE : fgzstreambuf::int_type
-//
-fgzstreambuf::int_type
-fgzstreambuf::underflow()
-{
-  int_type ret = traits_type::eof();
-  if ( inReadMode() )
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : fgzstreambuf::zReadTo
+    // METHOD TYPE : std::streamsize
+    //
+    std::streamsize
+    fgzstreambuf::zReadTo( char * buffer_r, std::streamsize maxcount_r )
     {
-      if ( gptr() < egptr() )
-        return traits_type::to_int_type( *gptr() );
+      int read = gzread( _file, buffer_r, maxcount_r );
+      if ( read < 0 )
+        setZError();
+      return read;
+    }
 
-      const std::streamsize got = zReadTo( &(_buffer[0]), _buffer.size() );
-      if ( got > 0 )
-        {
-          setg( &(_buffer[0]), &(_buffer[0]), &(_buffer[got]) );
-          ret = traits_type::to_int_type( *gptr() );
-        }
-      else if ( got == 0 )
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : fgzstreambuf::zWriteFrom
+    // METHOD TYPE : bool
+    //
+    bool
+    fgzstreambuf::zWriteFrom( const char * buffer_r, std::streamsize count_r )
+    {
+      int written = 0;
+      if ( count_r )
         {
-          // EOF
-          setg( &(_buffer[0]), &(_buffer[0]), &(_buffer[0]) );
+          if ( (written = gzwrite( _file, buffer_r, count_r )) == 0 )
+            setZError();
         }
-      // else: error reading the file
+      return( written == count_r );
     }
-  return ret;
-}
 
-///////////////////////////////////////////////////////////////////
-//
-//     METHOD NAME : fgzstreambuf::zReadTo
-//     METHOD TYPE : std::streamsize
-//
-std::streamsize
-fgzstreambuf::zReadTo( char * buffer_r, std::streamsize maxcount_r )
-{
-  int read = gzread( _file, buffer_r, maxcount_r );
-  if ( read < 0 )
-    setZError();
-  return read;
-}
-
-///////////////////////////////////////////////////////////////////
-//
-//     METHOD NAME : fgzstreambuf::zWriteFrom
-//     METHOD TYPE : bool
-//
-bool
-fgzstreambuf::zWriteFrom( const char * buffer_r, std::streamsize count_r )
-{
-  int written = 0;
-  if ( count_r )
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : fgzstreambuf::zSeekTo
+    // METHOD TYPE : fgzstreambuf::pos_type
+    //
+    fgzstreambuf::pos_type
+    fgzstreambuf::zSeekTo( off_type off_r, std::ios_base::seekdir way_r )
     {
-      if ( (written = gzwrite( _file, buffer_r, count_r )) == 0 )
+      z_off_t ret = gzseek( _file, off_r, way_r );
+      if ( ret == -1 )
         setZError();
+      return ret;
     }
-  return( written == count_r );
-}
-
-///////////////////////////////////////////////////////////////////
-//
-//     METHOD NAME : fgzstreambuf::zSeekTo
-//     METHOD TYPE : fgzstreambuf::pos_type
-//
-fgzstreambuf::pos_type
-fgzstreambuf::zSeekTo( off_type off_r, std::ios_base::seekdir way_r )
-{
-  z_off_t ret = gzseek( _file, off_r, way_r );
-  if ( ret == -1 )
-    setZError();
-  return ret;
-}
 
-///////////////////////////////////////////////////////////////////
-//
-//     METHOD NAME : fgzstreambuf::zTell
-//     METHOD TYPE : fgzstreambuf::pos_type
-//
-fgzstreambuf::pos_type
-fgzstreambuf::zTell()
-{
-  z_off_t ret = gztell( _file );
-  if ( ret == -1 )
-    setZError();
-  return ret;
-}
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : fgzstreambuf::zTell
+    // METHOD TYPE : fgzstreambuf::pos_type
+    //
+    fgzstreambuf::pos_type
+    fgzstreambuf::zTell()
+    {
+      z_off_t ret = gztell( _file );
+      if ( ret == -1 )
+        setZError();
+      return ret;
+    }
 
-///////////////////////////////////////////////////////////////////
-//
-//     METHOD NAME : fgzstreambuf::seekTo
-//     METHOD TYPE : fgzstreambuf::pos_type
-//
-fgzstreambuf::pos_type
-fgzstreambuf::seekTo( off_type off_r, std::ios_base::seekdir way_r )
-{
-  pos_type ret = pos_type(off_type(-1));
-  if ( isOpen() )
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : fgzstreambuf::seekTo
+    // METHOD TYPE : fgzstreambuf::pos_type
+    //
+    fgzstreambuf::pos_type
+    fgzstreambuf::seekTo( off_type off_r, std::ios_base::seekdir way_r )
     {
-      if ( inWriteMode() )
-        {
-          if ( sync() == 0 )
-            ret = zSeekTo( off_r, way_r );
-        }
-      else
+      pos_type ret = pos_type(off_type(-1));
+      if ( isOpen() )
         {
-          off_type zegptr = zTell();
-          if ( zegptr != off_type(-1) )
+          if ( inWriteMode() )
             {
-              if ( way_r == std::ios_base::end )
-                {
-                  // Invalidate buffer and seek.
-                  // XXX improve by transformation into ios_base::beg
-                  // to see whether we stay inside the buffer.
-                  setg( &(_buffer[0]), &(_buffer[0]), &(_buffer[0]) );
-                  ret = zSeekTo( off_r, way_r );
-                }
-              else
+              if ( sync() == 0 )
+                ret = zSeekTo( off_r, way_r );
+            }
+          else
+            {
+              off_type zegptr = zTell();
+              if ( zegptr != off_type(-1) )
                 {
-                  // Transform into ios_base::beg and seek.
-                  off_type zeback = zegptr - ( egptr() - eback() );
-                  off_type zgptr  = zegptr - ( egptr() - gptr() );
-                  off_type zngptr = off_r;
-                  if ( way_r == std::ios_base::cur )
+                  if ( way_r == std::ios_base::end )
                     {
-                      zngptr += zgptr;
-                      way_r = std::ios_base::beg;
+                      // Invalidate buffer and seek.
+                      // XXX improve by transformation into ios_base::beg
+                      // to see whether we stay inside the buffer.
+                      setg( &(_buffer[0]), &(_buffer[0]), &(_buffer[0]) );
+                      ret = zSeekTo( off_r, way_r );
                     }
-
-                  if ( way_r == std::ios_base::beg )
+                  else
                     {
-                      if ( zeback <= zngptr && zngptr <= zegptr )
+                      // Transform into ios_base::beg and seek.
+                      off_type zeback = zegptr - ( egptr() - eback() );
+                      off_type zgptr  = zegptr - ( egptr() - gptr() );
+                      off_type zngptr = off_r;
+                      if ( way_r == std::ios_base::cur )
                         {
-                          // Still inside buffer, adjust gptr and
-                          // calculate new position.
-                          setg( eback(),
-                                eback() + (zngptr-zeback),
-                                egptr() );
-                          ret = pos_type(zngptr);
+                          zngptr += zgptr;
+                          way_r = std::ios_base::beg;
                         }
-                      else
+
+                      if ( way_r == std::ios_base::beg )
                         {
-                          // Invalidate buffer and seek.
-                          setg( &(_buffer[0]), &(_buffer[0]), &(_buffer[0]) );
-                          ret = zSeekTo( off_r, way_r );
+                          if ( zeback <= zngptr && zngptr <= zegptr )
+                            {
+                              // Still inside buffer, adjust gptr and
+                              // calculate new position.
+                              setg( eback(),
+                                    eback() + (zngptr-zeback),
+                                    egptr() );
+                              ret = pos_type(zngptr);
+                            }
+                          else
+                            {
+                              // Invalidate buffer and seek.
+                              setg( &(_buffer[0]), &(_buffer[0]), &(_buffer[0]) );
+                              ret = zSeekTo( off_r, way_r );
+                            }
                         }
                     }
                 }
             }
         }
+      return ret;
     }
-  return ret;
-}
 
     /////////////////////////////////////////////////////////////////
-  } // namespace base
+  } // namespace gzstream_detail
   ///////////////////////////////////////////////////////////////////
   /////////////////////////////////////////////////////////////////
 } // namespace zypp
index fff4e0e..24b8c7a 100644 (file)
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 { /////////////////////////////////////////////////////////////////
+
   ///////////////////////////////////////////////////////////////////
-  namespace base
+  namespace gzstream_detail
   { /////////////////////////////////////////////////////////////////
 
-///////////////////////////////////////////////////////////////////
-//
-//     CLASS NAME : ZlibError
-/**
- * @short Helper class to ship zlib errors.
- **/
-struct ZlibError
-{
-  /**
-   * The zlib error code
-   **/
-  int _zError;
-
-  /**
-   * errno, valid if zError is Z_ERRNO
-   **/
-  int _errno;
-
-  ZlibError()
-  : _zError( 0 ), _errno( 0 )
-  {}
-
-  /**
-   * Return string describing the zlib error code
-   **/
-  std::string
-  strerror() const;
-};
-///////////////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////////////
-//
-//     CLASS NAME : fgzstreambuf
-/**
- * @short Streambuffer reading or writing gzip files.
- *
- * Read and write mode are mutual exclusive. Seek is supported,
- * but zlib restrictions appy (only forward seek in write mode;
- * backward seek in read mode might be expensive).Putback is not
- * supported.
- *
- * Reading plain (no gziped) files is possible as well.
- *
- * This streambuf is used in @ref ifgzstream and  @ref ofgzstream.
- **/
-class fgzstreambuf : public std::streambuf {
-
-  public:
-
-    fgzstreambuf( unsigned bufferSize_r = 512 )
-    : _file( NULL )
-    , _mode( std::ios_base::openmode(0) )
-    , _buffer( (bufferSize_r?bufferSize_r:1), 0 )
-    {}
-
-    virtual
-    ~fgzstreambuf()
-    { close(); }
-
-    bool
-    isOpen() const
-    { return _file; }
-
-    bool
-    inReadMode() const
-    { return( _mode == std::ios_base::in ); }
-
-    bool
-    inWriteMode() const
-    { return( _mode == std::ios_base::out ); }
-
-    fgzstreambuf *
-    open( const char * name_r, std::ios_base::openmode mode_r = std::ios_base::in );
-
-    fgzstreambuf *
-    close();
-
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : ZlibError
     /**
-     * The last error returned fron zlib.
+     * @short Helper class to ship zlib errors.
      **/
-    ZlibError
-    zError() const
-    { return _error; }
+    struct ZlibError
+    {
+      /**
+       * The zlib error code
+       **/
+      int _zError;
+
+      /**
+       * errno, valid if zError is Z_ERRNO
+       **/
+      int _errno;
+
+      ZlibError()
+      : _zError( 0 ), _errno( 0 )
+      {}
+
+      /**
+       * Return string describing the zlib error code
+       **/
+      std::string
+      strerror() const;
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : fgzstreambuf
+    /**
+     * @short Streambuffer reading or writing gzip files.
+     *
+     * Read and write mode are mutual exclusive. Seek is supported,
+     * but zlib restrictions appy (only forward seek in write mode;
+     * backward seek in read mode might be expensive).Putback is not
+     * supported.
+     *
+     * Reading plain (no gziped) files is possible as well.
+     *
+     * This streambuf is used in @ref ifgzstream and  @ref ofgzstream.
+     **/
+    class fgzstreambuf : public std::streambuf {
 
-  protected:
+    public:
 
-    virtual int
-    sync();
+      fgzstreambuf( unsigned bufferSize_r = 512 )
+      : _file( NULL )
+      , _mode( std::ios_base::openmode(0) )
+      , _buffer( (bufferSize_r?bufferSize_r:1), 0 )
+      {}
 
-    virtual int_type
-    overflow( int_type c = traits_type::eof() );
+      virtual
+      ~fgzstreambuf()
+      { close(); }
 
-    virtual int_type
-    underflow();
+      bool
+      isOpen() const
+      { return _file; }
 
-    virtual pos_type
-    seekoff( off_type off_r, std::ios_base::seekdir way_r, std::ios_base::openmode /* ignored */ )
-    { return seekTo( off_r, way_r ); }
+      bool
+      inReadMode() const
+      { return( _mode == std::ios_base::in ); }
 
-    virtual pos_type
-    seekpos( pos_type pos_r, std::ios_base::openmode /* ignored */ )
-    { return seekTo( off_type(pos_r), std::ios_base::beg ); }
+      bool
+      inWriteMode() const
+      { return( _mode == std::ios_base::out ); }
 
-  private:
+      fgzstreambuf *
+      open( const char * name_r, std::ios_base::openmode mode_r = std::ios_base::in );
 
-    typedef std::vector<char> buffer_type;
+        fgzstreambuf *
+        close();
 
-    gzFile                   _file;
+        /**
+         * The last error returned fron zlib.
+         **/
+        ZlibError
+        zError() const
+        { return _error; }
 
-    std::ios_base::openmode  _mode;
+    protected:
 
-    buffer_type              _buffer;
+      virtual int
+      sync();
 
-    ZlibError                _error;
+      virtual int_type
+      overflow( int_type c = traits_type::eof() );
 
-  private:
+      virtual int_type
+      underflow();
 
-    void
-    setZError()
-    { gzerror( _file, &_error._zError ); }
+      virtual pos_type
+      seekoff( off_type off_r, std::ios_base::seekdir way_r, std::ios_base::openmode /* ignored */ )
+      { return seekTo( off_r, way_r ); }
 
-    std::streamsize
-    zReadTo( char * buffer_r, std::streamsize maxcount_r );
+      virtual pos_type
+      seekpos( pos_type pos_r, std::ios_base::openmode /* ignored */ )
+      { return seekTo( off_type(pos_r), std::ios_base::beg ); }
 
-    bool
-    zWriteFrom( const char * buffer_r, std::streamsize count_r );
+    private:
 
-    pos_type
-    zSeekTo( off_type off_r, std::ios_base::seekdir way_r );
+      typedef std::vector<char> buffer_type;
 
-    pos_type
-    zTell();
+      gzFile                   _file;
 
-    pos_type
-    seekTo( off_type off_r, std::ios_base::seekdir way_r );
-};
-///////////////////////////////////////////////////////////////////
+      std::ios_base::openmode  _mode;
 
-///////////////////////////////////////////////////////////////////
-//
-//     CLASS NAME : fXstream<class _BStr,class _SBuf>
-/**
- * @short Common template to define ifgzstream/ofgzstream
- * reading/writing gzip files.
- *
- * Don't use fXstream directly, but @ref ifgzstream or
- * @ref ofgzstream. fXstream is just to avoid almost
- * duplicate code.
- **/
-template<class _BStream,class _StreamBuf>
-  class fXstream : public _BStream
-  {
-  public:
-
-    typedef _BStream               stream_type;
-    typedef _StreamBuf             streambuf_type;
-
-    fXstream()
-    : stream_type( NULL )
-    { this->init( &_streambuf ); }
-
-    explicit
-    fXstream( const char * file_r )
-    : stream_type( NULL )
-    { this->init( &_streambuf ); this->open( file_r ); }
-
-    virtual
-    ~fXstream()
-    {}
-
-    bool
-    is_open() const
-    { return _streambuf.isOpen(); }
-
-    void
-    open( const char * file_r )
-    {
-      if ( !_streambuf.open( file_r, defMode(*this) ) )
-        this->setstate(std::ios_base::failbit);
-      else
-        this->clear();
-    }
-
-    void
-    close()
-    {
-      if ( !_streambuf.close() )
-        this->setstate(std::ios_base::failbit);
-    }
+      buffer_type              _buffer;
 
-    /**
-     * The last error returned retuned fron zlib.
-     **/
-    ZlibError
-    zError() const
-    { return _streambuf.zError(); }
+      ZlibError                _error;
 
+    private:
 
-  private:
+      void
+      setZError()
+      { gzerror( _file, &_error._zError ); }
 
-    streambuf_type _streambuf;
+      std::streamsize
+      zReadTo( char * buffer_r, std::streamsize maxcount_r );
 
-    std::ios_base::openmode
-    defMode( const std::istream & str_r )
-    { return std::ios_base::in; }
+      bool
+      zWriteFrom( const char * buffer_r, std::streamsize count_r );
 
-    std::ios_base::openmode
-    defMode( const std::ostream & str_r )
-    { return std::ios_base::out; }
+      pos_type
+      zSeekTo( off_type off_r, std::ios_base::seekdir way_r );
 
-};
-///////////////////////////////////////////////////////////////////
+      pos_type
+      zTell();
 
-///////////////////////////////////////////////////////////////////
+      pos_type
+      seekTo( off_type off_r, std::ios_base::seekdir way_r );
+    };
+    ///////////////////////////////////////////////////////////////////
 
-/**
- * istream reading gzip files as well as plain files.
- **/
-typedef fXstream<std::istream,fgzstreambuf> ifgzstream;
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : fXstream<class _BStr,class _SBuf>
+    /**
+     * @short Common template to define ifgzstream/ofgzstream
+     * reading/writing gzip files.
+     *
+     * Don't use fXstream directly, but @ref ifgzstream or
+     * @ref ofgzstream. fXstream is just to avoid almost
+     * duplicate code.
+     **/
+    template<class _BStream,class _StreamBuf>
+      class fXstream : public _BStream
+      {
+      public:
+
+        typedef gzstream_detail::ZlibError ZlibError;
+        typedef _BStream                   stream_type;
+        typedef _StreamBuf                 streambuf_type;
+
+        fXstream()
+        : stream_type( NULL )
+        { this->init( &_streambuf ); }
+
+        explicit
+        fXstream( const char * file_r )
+        : stream_type( NULL )
+        { this->init( &_streambuf ); this->open( file_r ); }
+
+        virtual
+        ~fXstream()
+        {}
+
+        bool
+        is_open() const
+        { return _streambuf.isOpen(); }
+
+        void
+        open( const char * file_r )
+        {
+          if ( !_streambuf.open( file_r, defMode(*this) ) )
+            this->setstate(std::ios_base::failbit);
+          else
+            this->clear();
+        }
+
+        void
+        close()
+        {
+          if ( !_streambuf.close() )
+            this->setstate(std::ios_base::failbit);
+        }
+
+        /**
+         * The last error returned retuned fron zlib.
+         **/
+        ZlibError
+        zError() const
+        { return _streambuf.zError(); }
+
+
+      private:
+
+        streambuf_type _streambuf;
+
+        std::ios_base::openmode
+        defMode( const std::istream & str_r )
+        { return std::ios_base::in; }
+
+        std::ios_base::openmode
+        defMode( const std::ostream & str_r )
+        { return std::ios_base::out; }
+
+      };
+    ///////////////////////////////////////////////////////////////////
 
-/**
- * ostream writing gzip files.
- **/
-typedef fXstream<std::ostream,fgzstreambuf> ofgzstream;
+    /////////////////////////////////////////////////////////////////
+  } // namespace gzstream_detail
+  ///////////////////////////////////////////////////////////////////
 
-///////////////////////////////////////////////////////////////////
+  /**
+   * istream reading gzip files as well as plain files.
+   **/
+  typedef gzstream_detail::fXstream<std::istream,gzstream_detail::fgzstreambuf> ifgzstream;
 
+  /**
+   * ostream writing gzip files.
+   **/
+  typedef gzstream_detail::fXstream<std::ostream,gzstream_detail::fgzstreambuf> ofgzstream;
 
-    /////////////////////////////////////////////////////////////////
-  } // namespace base
-  ///////////////////////////////////////////////////////////////////
   /////////////////////////////////////////////////////////////////
 } // namespace zypp
 ///////////////////////////////////////////////////////////////////