sgstream: implement gzipped output file stream (gzofstream)
Add missing output implementation for gzfilebuf.
This commit is contained in:
@@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
using std::istream;
|
using std::istream;
|
||||||
|
using std::ostream;
|
||||||
|
|
||||||
sg_gzifstream::sg_gzifstream()
|
sg_gzifstream::sg_gzifstream()
|
||||||
: istream(&gzbuf)
|
: istream(&gzbuf)
|
||||||
@@ -146,3 +147,44 @@ skipcomment( istream& in )
|
|||||||
return 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 );
|
||||||
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
# include <istream>
|
# include <istream>
|
||||||
|
# include <ostream>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@@ -115,6 +116,58 @@ std::istream& skipws( std::istream& in );
|
|||||||
*/
|
*/
|
||||||
std::istream& skipcomment( 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 */
|
#endif /* _SGSTREAM_HXX */
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,9 @@ gzfilebuf::gzfilebuf()
|
|||||||
mode(ios_openmode(0)),
|
mode(ios_openmode(0)),
|
||||||
own_file_descriptor(false),
|
own_file_descriptor(false),
|
||||||
ibuf_size(0),
|
ibuf_size(0),
|
||||||
ibuffer(0)
|
ibuffer(0),
|
||||||
|
obuf_size(0),
|
||||||
|
obuffer(0)
|
||||||
{
|
{
|
||||||
// try {
|
// try {
|
||||||
ibuf_size = page_size / sizeof(char);
|
ibuf_size = page_size / sizeof(char);
|
||||||
@@ -59,6 +61,8 @@ gzfilebuf::~gzfilebuf()
|
|||||||
if ( own_file_descriptor )
|
if ( own_file_descriptor )
|
||||||
this->close();
|
this->close();
|
||||||
delete [] ibuffer;
|
delete [] ibuffer;
|
||||||
|
if (obuffer)
|
||||||
|
delete [] obuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -153,17 +157,17 @@ gzfilebuf::close()
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// int
|
int
|
||||||
// gzfilebuf::setcompressionlevel( int comp_level )
|
gzfilebuf::setcompressionlevel( int comp_level )
|
||||||
// {
|
{
|
||||||
// return gzsetparams(file, comp_level, -2);
|
return gzsetparams(file, comp_level, -2);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// int
|
int
|
||||||
// gzfilebuf::setcompressionstrategy( int comp_strategy )
|
gzfilebuf::setcompressionstrategy( int comp_strategy )
|
||||||
// {
|
{
|
||||||
// return gzsetparams(file, -2, comp_strategy);
|
return gzsetparams(file, -2, comp_strategy);
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
|
||||||
std::streampos
|
std::streampos
|
||||||
@@ -173,10 +177,9 @@ gzfilebuf::seekoff( std::streamoff, ios_seekdir, ios_openmode )
|
|||||||
}
|
}
|
||||||
|
|
||||||
gzfilebuf::int_type
|
gzfilebuf::int_type
|
||||||
gzfilebuf::overflow( int_type )
|
gzfilebuf::overflow( int_type c )
|
||||||
{
|
{
|
||||||
#if 0
|
if ( !is_open() || !(mode & ios_out) )
|
||||||
if ( !is_open() || !(mode & ios::out) )
|
|
||||||
return EOF;
|
return EOF;
|
||||||
|
|
||||||
if ( !base() )
|
if ( !base() )
|
||||||
@@ -207,7 +210,6 @@ gzfilebuf::overflow( int_type )
|
|||||||
*pptr() = c;
|
*pptr() = c;
|
||||||
pbump(1);
|
pbump(1);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -223,6 +225,22 @@ gzfilebuf::sync()
|
|||||||
return 0;
|
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::int_type
|
||||||
gzfilebuf::flushbuf()
|
gzfilebuf::flushbuf()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Open a stream
|
* Open a stream
|
||||||
* @param name file name
|
* @param name file name
|
||||||
* @param io_mode mdoe flags
|
* @param io_mode mode flags
|
||||||
* @return file stream
|
* @return file stream
|
||||||
*/
|
*/
|
||||||
gzfilebuf* open( const char* name, ios_openmode io_mode );
|
gzfilebuf* open( const char* name, ios_openmode io_mode );
|
||||||
@@ -83,8 +83,8 @@ public:
|
|||||||
/** Close stream */
|
/** Close stream */
|
||||||
gzfilebuf* close();
|
gzfilebuf* close();
|
||||||
|
|
||||||
// int setcompressionlevel( int comp_level );
|
int setcompressionlevel( int comp_level );
|
||||||
// int setcompressionstrategy( int comp_strategy );
|
int setcompressionstrategy( int comp_strategy );
|
||||||
|
|
||||||
/** @return true if open, false otherwise */
|
/** @return true if open, false otherwise */
|
||||||
bool is_open() const { return (file != NULL); }
|
bool is_open() const { return (file != NULL); }
|
||||||
@@ -100,6 +100,11 @@ protected:
|
|||||||
virtual int_type underflow();
|
virtual int_type underflow();
|
||||||
|
|
||||||
virtual int_type overflow( int_type c = parent::traits_type::eof() );
|
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:
|
private:
|
||||||
|
|
||||||
int_type flushbuf();
|
int_type flushbuf();
|
||||||
@@ -118,6 +123,10 @@ private:
|
|||||||
int ibuf_size;
|
int ibuf_size;
|
||||||
char* ibuffer;
|
char* ibuffer;
|
||||||
|
|
||||||
|
// Put (output) buffer.
|
||||||
|
int obuf_size;
|
||||||
|
char* obuffer;
|
||||||
|
|
||||||
enum { page_size = 4096 };
|
enum { page_size = 4096 };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -136,5 +145,14 @@ struct gzifstream_base
|
|||||||
gzfilebuf gzbuf;
|
gzfilebuf gzbuf;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _zfstream_hxx
|
/**
|
||||||
|
* document me too
|
||||||
|
*/
|
||||||
|
struct gzofstream_base
|
||||||
|
{
|
||||||
|
gzofstream_base() {}
|
||||||
|
|
||||||
|
gzfilebuf gzbuf;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _zfstream_hxx
|
||||||
|
|||||||
Reference in New Issue
Block a user