19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
29e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "zfstream.h"
39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzfilebuf::gzfilebuf() :
59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  file(NULL),
69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  mode(0),
79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  own_file_descriptor(0)
89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ }
99e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzfilebuf::~gzfilebuf() {
119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  sync();
139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( own_file_descriptor )
149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    close();
159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzfilebuf *gzfilebuf::open( const char *name,
199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                            int io_mode ) {
209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( is_open() )
229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return NULL;
239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  char char_mode[10];
259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  char *p = char_mode;
269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( io_mode & ios::in ) {
289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    mode = ios::in;
299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *p++ = 'r';
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  } else if ( io_mode & ios::app ) {
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    mode = ios::app;
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *p++ = 'a';
339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  } else {
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    mode = ios::out;
359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *p++ = 'w';
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  }
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( io_mode & ios::binary ) {
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    mode |= ios::binary;
409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *p++ = 'b';
419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  }
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  // Hard code the compression level
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( io_mode & (ios::out|ios::app )) {
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *p++ = '9';
469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  }
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  // Put the end-of-string indicator
499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  *p = '\0';
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( (file = gzopen(name, char_mode)) == NULL )
529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return NULL;
539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  own_file_descriptor = 1;
559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return this;
579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzfilebuf *gzfilebuf::attach( int file_descriptor,
619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                              int io_mode ) {
629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( is_open() )
649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return NULL;
659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  char char_mode[10];
679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  char *p = char_mode;
689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( io_mode & ios::in ) {
709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    mode = ios::in;
719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *p++ = 'r';
729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  } else if ( io_mode & ios::app ) {
739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    mode = ios::app;
749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *p++ = 'a';
759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  } else {
769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    mode = ios::out;
779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *p++ = 'w';
789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  }
799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( io_mode & ios::binary ) {
819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    mode |= ios::binary;
829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *p++ = 'b';
839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  }
849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  // Hard code the compression level
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( io_mode & (ios::out|ios::app )) {
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *p++ = '9';
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  }
899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  // Put the end-of-string indicator
919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  *p = '\0';
929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( (file = gzdopen(file_descriptor, char_mode)) == NULL )
949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return NULL;
959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  own_file_descriptor = 0;
979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return this;
999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzfilebuf *gzfilebuf::close() {
1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( is_open() ) {
1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    sync();
1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    gzclose( file );
1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    file = NULL;
1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  }
1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return this;
1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint gzfilebuf::setcompressionlevel( int comp_level ) {
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return gzsetparams(file, comp_level, -2);
1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint gzfilebuf::setcompressionstrategy( int comp_strategy ) {
1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return gzsetparams(file, -2, comp_strategy);
1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstreampos gzfilebuf::seekoff( streamoff off, ios::seek_dir dir, int which ) {
1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return streampos(EOF);
1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint gzfilebuf::underflow() {
1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  // If the file hasn't been opened for reading, error.
1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( !is_open() || !(mode & ios::in) )
1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return EOF;
1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  // if a buffer doesn't exists, allocate one.
1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( !base() ) {
1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ( (allocate()) == EOF )
1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      return EOF;
1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    setp(0,0);
1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  } else {
1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ( in_avail() )
1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      return (unsigned char) *gptr();
1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ( out_waiting() ) {
1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      if ( flushbuf() == EOF )
1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return EOF;
1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  }
1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  // Attempt to fill the buffer.
1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  int result = fillbuf();
1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( result == EOF ) {
1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    // disable get area
1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    setg(0,0,0);
1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return EOF;
1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  }
1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return (unsigned char) *gptr();
1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint gzfilebuf::overflow( int c ) {
1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( !is_open() || !(mode & ios::out) )
1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return EOF;
1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( !base() ) {
1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ( allocate() == EOF )
1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      return EOF;
1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    setg(0,0,0);
1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  } else {
1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (in_avail()) {
1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return EOF;
1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (out_waiting()) {
1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      if (flushbuf() == EOF)
1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return EOF;
1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  }
1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  int bl = blen();
1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  setp( base(), base() + bl);
1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( c != EOF ) {
1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *pptr() = c;
1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pbump(1);
1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  }
2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return 0;
2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint gzfilebuf::sync() {
2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( !is_open() )
2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return EOF;
2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( out_waiting() )
2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return flushbuf();
2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return 0;
2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint gzfilebuf::flushbuf() {
2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  int n;
2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  char *q;
2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  q = pbase();
2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  n = pptr() - q;
2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( gzwrite( file, q, n) < n )
2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return EOF;
2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  setp(0,0);
2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return 0;
2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint gzfilebuf::fillbuf() {
2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  int required;
2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  char *p;
2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  p = base();
2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  required = blen();
2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  int t = gzread( file, p, required );
2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( t <= 0) return EOF;
2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  setg( base(), base(), base()+t);
2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return t;
2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzfilestream_common::gzfilestream_common() :
2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  ios( gzfilestream_common::rdbuf() )
2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ }
2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzfilestream_common::~gzfilestream_common()
2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ }
2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid gzfilestream_common::attach( int fd, int io_mode ) {
2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( !buffer.attach( fd, io_mode) )
2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    clear( ios::failbit | ios::badbit );
2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else
2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    clear();
2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid gzfilestream_common::open( const char *name, int io_mode ) {
2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( !buffer.open( name, io_mode ) )
2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    clear( ios::failbit | ios::badbit );
2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else
2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    clear();
2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid gzfilestream_common::close() {
2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ( !buffer.close() )
2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    clear( ios::failbit | ios::badbit );
2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzfilebuf *gzfilestream_common::rdbuf()
2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return &buffer;
2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzifstream::gzifstream() :
2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  ios( gzfilestream_common::rdbuf() )
2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  clear( ios::badbit );
2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzifstream::gzifstream( const char *name, int io_mode ) :
2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  ios( gzfilestream_common::rdbuf() )
2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  gzfilestream_common::open( name, io_mode );
3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
3029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzifstream::gzifstream( int fd, int io_mode ) :
3049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  ios( gzfilestream_common::rdbuf() )
3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  gzfilestream_common::attach( fd, io_mode );
3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzifstream::~gzifstream() { }
3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzofstream::gzofstream() :
3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  ios( gzfilestream_common::rdbuf() )
3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
3149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  clear( ios::badbit );
3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
3169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzofstream::gzofstream( const char *name, int io_mode ) :
3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  ios( gzfilestream_common::rdbuf() )
3199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
3209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  gzfilestream_common::open( name, io_mode );
3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzofstream::gzofstream( int fd, int io_mode ) :
3249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  ios( gzfilestream_common::rdbuf() )
3259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
3269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  gzfilestream_common::attach( fd, io_mode );
3279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
3289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgzofstream::~gzofstream() { }
330