]> git.mxchange.org Git - simgear.git/commitdiff
sgstream: implement gzipped output file stream (gzofstream)
authorThorstenB <brehmt@gmail.com>
Wed, 7 Nov 2012 22:44:44 +0000 (23:44 +0100)
committerThorstenB <brehmt@gmail.com>
Wed, 7 Nov 2012 22:45:01 +0000 (23:45 +0100)
Add missing output implementation for gzfilebuf.

simgear/misc/sgstream.cxx
simgear/misc/sgstream.hxx
simgear/misc/zfstream.cxx
simgear/misc/zfstream.hxx

index 6d5352c86ae2a6f1cefa845cd3d6cfb6df648318..70da33afd1316052ebc9925a699a9fb4946392f6 100644 (file)
@@ -29,6 +29,7 @@
 
 using std::string;
 using std::istream;
+using std::ostream;
 
 sg_gzifstream::sg_gzifstream()
     : istream(&gzbuf)
@@ -146,3 +147,44 @@ skipcomment( istream& in )
     return in;
 }
 
+
+sg_gzofstream::sg_gzofstream()
+    : ostream(&gzbuf)
+{
+}
+
+//-----------------------------------------------------------------------------
+//
+// Open a file for gzipped writing.
+//
+sg_gzofstream::sg_gzofstream( const string& name, ios_openmode io_mode )
+    : ostream(&gzbuf)
+{
+    this->open( name, io_mode );
+}
+
+//-----------------------------------------------------------------------------
+//
+// Attach a stream to an already opened file descriptor.
+//
+sg_gzofstream::sg_gzofstream( int fd, ios_openmode io_mode )
+    : ostream(&gzbuf)
+{
+    gzbuf.attach( fd, io_mode );
+}
+
+//-----------------------------------------------------------------------------
+//
+// Open a file for gzipped writing.
+//
+void
+sg_gzofstream::open( const string& name, ios_openmode io_mode )
+{
+    gzbuf.open( name.c_str(), io_mode );
+}
+
+void
+sg_gzofstream::attach( int fd, ios_openmode io_mode )
+{
+    gzbuf.attach( fd, io_mode );
+}
index a0414b18fdbc03fb6b087555ecb09edd8a063a6c..35c644594650d24a620c5e3194b52923b34ee812 100644 (file)
@@ -34,6 +34,7 @@
 #include <simgear/compiler.h>
 
 #  include <istream>
+#  include <ostream>
 
 #include <string>
 
@@ -115,6 +116,58 @@ std::istream& skipws( std::istream& in );
  */
 std::istream& skipcomment( std::istream& in );
 
+/**
+ * An envelope class for gzofstream.
+ */
+class sg_gzofstream : private gzofstream_base, public std::ostream
+{
+public:
+    /** Default constructor */
+    sg_gzofstream();
+
+    /**
+     * Constructor to open a file for writing.
+     * @param name name of file
+     * @param io_mode file open mode(s) "or'd" together
+     */
+    sg_gzofstream( const std::string& name,
+           ios_openmode io_mode = ios_out | ios_binary );
+
+    /**
+     * Constructor that attaches itself to an existing file descriptor.
+     * @param fd file descriptor
+     * @param io_mode file open mode(s) "or'd" together
+     */
+    sg_gzofstream( int fd, ios_openmode io_mode = ios_out|ios_binary );
+
+    /**
+     * Attempt to open a file for writing.
+     * @param name name of file
+     * @param io_mode file open mode(s) "or'd" together
+     */
+    void open( const std::string& name,
+           ios_openmode io_mode = ios_out|ios_binary );
+
+    /**
+     * Attach to an existing file descriptor.
+     * @param fd file descriptor
+     * @param io_mode file open mode(s) "or'd" together
+     */
+    void attach( int fd, ios_openmode io_mode = ios_out|ios_binary );
+
+    /**
+     * Close the stream.
+     */
+    void close() { gzbuf.close(); }
+
+    /** @return true if the file is successfully opened, false otherwise. */
+    bool is_open() { return gzbuf.is_open(); }
+
+private:
+    // Not defined!
+    sg_gzofstream( const sg_gzofstream& );
+    void operator= ( const sg_gzofstream& );
+};
 
 #endif /* _SGSTREAM_HXX */
 
index 2e50eba1f4ba1e626bb23f59965d031b5f92823b..b5755625b2d900b231d742b3c4dd667e1f83b806 100644 (file)
@@ -39,7 +39,9 @@ gzfilebuf::gzfilebuf()
       mode(ios_openmode(0)),
       own_file_descriptor(false),
       ibuf_size(0),
-      ibuffer(0)
+      ibuffer(0),
+      obuf_size(0),
+      obuffer(0)
 {
 //     try {
     ibuf_size = page_size / sizeof(char);
@@ -59,6 +61,8 @@ gzfilebuf::~gzfilebuf()
     if ( own_file_descriptor )
         this->close();
     delete [] ibuffer;
+    if (obuffer)
+        delete [] obuffer;
 }
 
 void
@@ -153,17 +157,17 @@ gzfilebuf::close()
     return this;
 }
 
-// int
-// gzfilebuf::setcompressionlevel( int comp_level )
-// {
-//     return gzsetparams(file, comp_level, -2);
-// }
+int
+gzfilebuf::setcompressionlevel( int comp_level )
+{
+    return gzsetparams(file, comp_level, -2);
+}
 
-// int
-// gzfilebuf::setcompressionstrategy( int comp_strategy )
-// {
-//     return gzsetparams(file, -2, comp_strategy);
-// }
+int
+gzfilebuf::setcompressionstrategy( int comp_strategy )
+{
+    return gzsetparams(file, -2, comp_strategy);
+}
 
 
 std::streampos
@@ -173,10 +177,9 @@ gzfilebuf::seekoff( std::streamoff, ios_seekdir, ios_openmode )
 }
 
 gzfilebuf::int_type
-gzfilebuf::overflow( int_type )
+gzfilebuf::overflow( int_type )
 {
-#if 0
-    if ( !is_open() || !(mode & ios::out) )
+    if ( !is_open() || !(mode & ios_out) )
         return EOF;
 
     if ( !base() )
@@ -207,7 +210,6 @@ gzfilebuf::overflow( int_type )
         *pptr() = c;
         pbump(1);
     }
-#endif
     return 0;
 }
 
@@ -223,6 +225,22 @@ gzfilebuf::sync()
     return 0;
 }
 
+bool
+gzfilebuf::out_waiting()
+{
+    char* q = pbase();
+    int n = pptr() - q;
+    return n>0;
+}
+
+char
+gzfilebuf::allocate()
+{
+    obuf_size = page_size / sizeof(char);
+    obuffer = new char [ibuf_size];
+    return 0;
+}
+
 gzfilebuf::int_type
 gzfilebuf::flushbuf()
 {
index a9f065eaab29df7f94b73f8087295ba836752281..635397a71a084e61ba04c4fa65839d4191268599 100644 (file)
@@ -67,7 +67,7 @@ public:
     /**
      * Open a stream
      * @param name file name
-     * @param io_mode mdoe flags
+     * @param io_mode mode flags
      * @return file stream
      */
     gzfilebuf* open( const char* name, ios_openmode io_mode );
@@ -83,8 +83,8 @@ public:
     /** Close stream */
     gzfilebuf* close();
 
-    // int setcompressionlevel( int comp_level );
-    // int setcompressionstrategy( int comp_strategy );
+    int setcompressionlevel( int comp_level );
+    int setcompressionstrategy( int comp_strategy );
 
     /** @return true if open, false otherwise */
     bool is_open() const { return (file != NULL); }
@@ -100,6 +100,11 @@ protected:
     virtual int_type underflow();
 
     virtual int_type overflow( int_type c = parent::traits_type::eof() );
+    bool    out_waiting();
+    char*   base() {return obuffer;}
+    int     blen() {return ibuf_size;}
+    char    allocate();
+
 private:
 
     int_type flushbuf();
@@ -118,6 +123,10 @@ private:
     int ibuf_size;
     char* ibuffer;
 
+    // Put (output) buffer.
+    int obuf_size;
+    char* obuffer;
+
     enum { page_size = 4096 };
 
 private:
@@ -136,5 +145,14 @@ struct gzifstream_base
     gzfilebuf gzbuf;
 };
 
-#endif // _zfstream_hxx
+/**
+ * document me too
+ */
+struct gzofstream_base
+{
+    gzofstream_base() {}
 
+    gzfilebuf gzbuf;
+};
+
+#endif // _zfstream_hxx