35 #ifndef INCLUDED_utility_io_zipstream_IPP
36 #define INCLUDED_utility_io_zipstream_IPP
47 namespace zlib_stream {
80 m_ostream( ostream_ ),
81 m_output_buffer( buffer_size_, 0 ),
82 m_buffer( buffer_size_, 0 ),
95 std::min( 9, static_cast< int >( level_ ) ),
97 - static_cast< int >(window_size_),
98 std::min( 9, static_cast< int >( memory_level_ ) ),
99 static_cast< int >( strategy_ )
116 m_err=deflateEnd( &m_zip_stream );
129 if ( pptr() && pptr() > pbase() ) {
130 if ( traits_type::eq_int_type( overflow( traits_type::eof() ), traits_type::eof() ) )
return -1;
148 bool const test_eof = traits_type::eq_int_type( c, traits_type::eof() );
149 int w =
static_cast< int >( pptr() - pbase() );
154 if ( zip_to_stream( pbase(), w ) ) {
155 this->setp( pbase(), epptr() - 1 );
156 return traits_type::not_eof( c );
158 return traits_type::eof();
172 std::streamsize buffer_size_
175 std::streamsize written_byte_size = 0;
178 m_zip_stream.avail_in =
static_cast< uInt
>( buffer_size_ *
sizeof(
char_type) );
179 m_zip_stream.avail_out =
static_cast< uInt
>( m_output_buffer.size() );
180 m_zip_stream.next_out = &(m_output_buffer[0]);
186 m_zip_stream.next_in,
187 m_zip_stream.avail_in
191 m_err = deflate( &m_zip_stream, 0 );
193 if ( m_err == Z_OK || m_err == Z_STREAM_END ) {
195 static_cast< std::streamsize
>( m_output_buffer.size() )
196 - m_zip_stream.avail_out;
201 (
const char_type*) &(m_output_buffer[0]),
202 static_cast< std::streamsize >( written_byte_size /
sizeof(
char_type ) )
206 if ( ( remainder = written_byte_size%
sizeof(
char_type ) ) != 0 ) {
210 &(m_output_buffer[0]),
211 &(m_output_buffer[written_byte_size-remainder]),
217 m_zip_stream.avail_out =
218 static_cast< uInt
>( m_output_buffer.size() -
remainder );
219 m_zip_stream.next_out = &m_output_buffer[
remainder];
222 }
while ( m_zip_stream.avail_in != 0 && m_err == Z_OK );
224 return m_err == Z_OK;
238 std::streamsize written_byte_size = 0, total_written_byte_size = 0;
240 int const buffer_size =
static_cast< int >( pptr() - pbase() );
243 m_zip_stream.avail_in =
static_cast< uInt
>( buffer_size *
sizeof(
char_type) );
244 m_zip_stream.avail_out =
static_cast< uInt
>( m_output_buffer.size() );
245 m_zip_stream.next_out = &(m_output_buffer[0]);
253 m_zip_stream.next_in,
254 m_zip_stream.avail_in
258 m_err = deflate( &m_zip_stream, flush_mode );
259 if ( m_err == Z_OK || m_err == Z_STREAM_END ) {
261 static_cast< std::streamsize
>( m_output_buffer.size() )
262 - m_zip_stream.avail_out;
263 total_written_byte_size += written_byte_size;
266 (
const char_type*) &(m_output_buffer[0]),
267 static_cast< std::streamsize >( written_byte_size /
sizeof(
char_type ) *
sizeof(
byte_type ) )
271 if ( ( remainder = written_byte_size%
sizeof(
char_type ) ) != 0 ) {
274 &(m_output_buffer[0]),
275 &(m_output_buffer[written_byte_size-remainder]),
281 m_zip_stream.avail_out =
static_cast< uInt
>( m_output_buffer.size() -
remainder );
282 m_zip_stream.next_out = &m_output_buffer[
remainder];
284 }
while ( m_zip_stream.avail_in != 0 && m_err == Z_OK );
289 return total_written_byte_size;
302 std::streamsize
const total_written_byte_size = flush( Z_SYNC_FLUSH );
303 return total_written_byte_size;
316 std::streamsize
const total_written_byte_size = flush( Z_FINISH );
317 return total_written_byte_size;
332 m_zip_stream.next_in = NULL;
333 m_zip_stream.avail_in = 0;
334 m_zip_stream.avail_out = 0;
335 m_zip_stream.next_out = NULL;
337 m_err = deflateReset( &m_zip_stream );
351 size_t read_buffer_size_,
352 size_t input_buffer_size_
354 m_istream( istream_ ),
355 m_input_buffer( input_buffer_size_ ),
356 m_buffer( read_buffer_size_ ),
386 m_zip_stream.next_in = &( m_input_buffer[0] );
389 static_cast< std::streamsize >( m_input_buffer.size() /
sizeof(
char_type ) )
391 return m_zip_stream.avail_in = m_istream.gcount() *
sizeof(
char_type );
404 inflateEnd( &m_zip_stream );
417 if ( gptr() && ( gptr() < egptr() ) )
return *
reinterpret_cast< unsigned char *
>( gptr() );
419 int n_putback =
static_cast< int >( gptr() - eback() );
420 if ( n_putback > 4 ) n_putback = 4;
422 &( m_buffer[0] ) + ( 4 - n_putback ),
427 int num = unzip_from_stream(
428 &( m_buffer[0] ) + 4,
429 static_cast< std::streamsize >( ( m_buffer.size() - 4 ) *
sizeof(
char_type ) )
431 if ( num <= 0 )
return EOF;
435 &( m_buffer[0] ) + ( 4 - n_putback ),
436 &( m_buffer[0] ) + 4,
437 &( m_buffer[0] ) + 4 + num
441 return *
reinterpret_cast< unsigned char *
>( gptr() );
453 std::streamsize buffer_size_
457 m_zip_stream.avail_out =
static_cast< uInt
>( buffer_size_ *
sizeof(
char_type ) );
458 size_t count = m_zip_stream.avail_in;
461 if ( m_zip_stream.avail_in == 0 ) count = fill_input_buffer();
463 if ( m_zip_stream.avail_in ) {
464 m_err = inflate( &m_zip_stream, Z_SYNC_FLUSH );
466 }
while ( m_err == Z_OK && m_zip_stream.avail_out != 0 && count != 0 );
472 buffer_size_ - m_zip_stream.avail_out /
sizeof(
char_type )
474 std::streamsize n_read = buffer_size_ - m_zip_stream.avail_out /
sizeof(
char_type );
477 if ( m_err == Z_STREAM_END ) put_back_from_zip_stream();
491 if ( m_zip_stream.avail_in == 0 )
return;
493 m_istream.clear( std::ios::goodbit );
495 -static_cast< int >( m_zip_stream.avail_in ),
499 m_zip_stream.avail_in = 0;
517 z_stream & zip_stream = rdbuf()->get_zip_stream();
520 for ( len = 0; len < 2; ++
len ) {
521 c = (
int)rdbuf()->get_istream().get();
523 if ( len != 0 ) rdbuf()->get_istream().unget();
525 rdbuf()->get_istream().unget();
528 err = ( zip_stream.avail_in != 0 ? Z_OK : Z_STREAM_END );
535 method = (
int)rdbuf()->get_istream().get();
536 flags = (
int)rdbuf()->get_istream().get();
543 for ( len = 0; len < 6; ++
len ) rdbuf()->get_istream().get();
547 len = (uInt)rdbuf()->get_istream().get();
548 len += ((uInt)rdbuf()->get_istream().get()) << 8;
550 while ( len-- != 0 && rdbuf()->get_istream().get() != EOF ) {}
554 while ( ( c = rdbuf()->get_istream().
get() ) != 0 && c != EOF ) {}
558 while ( ( c = rdbuf()->get_istream().
get() ) != 0 && c != EOF ) {}
561 for ( len = 0; len < 2; ++
len ) rdbuf()->get_istream().get();
563 err = ( rdbuf()->get_istream().eof() ? Z_DATA_ERROR : Z_OK );
578 read_uint32( rdbuf()->get_istream(), m_gzip_crc );
579 read_uint32( rdbuf()->get_istream(), m_gzip_data_size );
601 b2 = 0xFF & ( x_ >> 8 );
602 b3 = 0xFF & ( x_ >> 16 );
603 b4 = 0xFF & ( x_ >> 24 );
605 out_.
write( &b1, 1 );
606 out_.
write( &b2, 1 );
607 out_.
write( &b3, 1 );
608 out_.
write( &b4, 1 );
627 unsigned char b1, b2, b3, b4;
629 in_.read( reinterpret_cast< char * >( &b1 ), 1 );
630 in_.read( reinterpret_cast< char * >( &b2 ), 1 );
631 in_.read( reinterpret_cast< char * >( &b3 ), 1 );
632 in_.read( reinterpret_cast< char * >( &b4 ), 1 );
634 x_ = b1 + ( b2 << 8 ) + ( b3 << 16 ) + ( b4 << 24 );
648 rdbuf()->get_ostream()
651 .put( static_cast< char_type >( Z_DEFLATED ) )
653 .put( zero ).put( zero ).put( zero ).put( zero )
655 .put( static_cast< char_type >( OS_CODE ) );
667 put_long_as_uint32( rdbuf()->get_ostream(), rdbuf()->get_crc() );
668 put_long_as_uint32( rdbuf()->get_ostream(), rdbuf()->get_in_size() );
675 #endif // INCLUDED_utility_io_zipstream_IPP
basic_zip_ostream & write(char const *str, std::streamsize const count)
write a string
size_t fill_input_buffer()
Altered zipstream library header.
std::basic_ostream< Elem, Tr > & ostream_reference
std::streamsize flush_finalize()
flushes the zip buffer and output buffer and finalize the zip stream
void put_back_from_zip_stream()
byte_type * byte_buffer_type
cmplx w(cmplx z, double relerr)
std::streamsize unzip_from_stream(char_type *, std::streamsize)
T remainder(T const &x, T const &y)
Remainder of x with respect to division by y that is of smallest magnitude.
std::basic_istream< Elem, Tr > & istream_reference
byte_type * byte_buffer_type
static void read_uint32(istream_reference in_, unsigned long &x_)
basic_unzip_streambuf(istream_reference istream_, size_t window_size_, size_t read_buffer_size_, size_t input_buffer_size_)
Construct an unzip stream.
static void put_long_as_uint32(ostream_reference out_, unsigned long x_)
char_vector_type m_buffer
bool zip_to_stream(char_type *, std::streamsize)
std::streamsize flush()
flushes the zip buffer and output buffer
Fstring::size_type len(Fstring const &s)
Length.
char_vector_type m_buffer
std::basic_ostream< Elem, Tr > & ostream_reference
basic_zip_streambuf(ostream_reference ostream_, size_t level_, EStrategy strategy_, size_t window_size_, size_t memory_level_, size_t buffer_size_)
Construct a zip stream.
void reset_state()
resets the zip stream and zeros the crc
std::basic_istream< Elem, Tr > & istream_reference
EStrategy
Compression strategy, see zlib doc.
void read_footer()
reads the gzip footer
int_type overflow(int_type c)