historical/toontown-classic.git/panda/include/zStreamBuf.h
2024-01-16 11:20:27 -06:00

78 lines
2.1 KiB
C++

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file zStreamBuf.h
* @author drose
* @date 2002-08-05
*/
#ifndef ZSTREAMBUF_H
#define ZSTREAMBUF_H
#include "pandabase.h"
// This module is not compiled if zlib is not available.
#ifdef HAVE_ZLIB
#include <zlib.h>
/**
* The streambuf object that implements IDecompressStream and OCompressStream.
*/
class EXPCL_PANDA_EXPRESS ZStreamBuf : public std::streambuf {
public:
ZStreamBuf();
virtual ~ZStreamBuf();
void open_read(std::istream *source, bool owns_source);
void close_read();
void open_write(std::ostream *dest, bool owns_dest, int compression_level);
void close_write();
virtual std::streampos seekoff(std::streamoff off, ios_seekdir dir, ios_openmode which);
virtual std::streampos seekpos(std::streampos pos, ios_openmode which);
protected:
virtual int overflow(int c);
virtual int sync();
virtual int underflow();
private:
size_t read_chars(char *start, size_t length);
void write_chars(const char *start, size_t length, int flush);
void show_zlib_error(const char *function, int error_code, z_stream &z);
private:
std::istream *_source;
bool _owns_source;
std::ostream *_dest;
bool _owns_dest;
z_stream _z_source;
z_stream _z_dest;
char *_buffer;
// We need to store the decompression buffer on the class object, because
// zlib might not consume all of the input characters at each call to
// inflate(). This isn't a problem on output because in that case we can
// afford to wait until it does consume all of the characters we give it.
enum {
// It's not clear how large or small this buffer ought to be. It doesn't
// seem to matter much, especially since this is just a temporary holding
// area before getting copied into zlib's own internal buffers.
decompress_buffer_size = 128
};
char decompress_buffer[decompress_buffer_size];
};
#endif // HAVE_ZLIB
#endif