From 26c10153557648de46ddbb60e923ac7f05d9c9a0 Mon Sep 17 00:00:00 2001 From: David Rose Date: Tue, 6 Aug 2002 12:31:32 +0000 Subject: [PATCH] better zlib error handling --- panda/src/express/zStreamBuf.cxx | 80 +++++++++++++++++++++++++------- panda/src/express/zStreamBuf.h | 1 + 2 files changed, 64 insertions(+), 17 deletions(-) diff --git a/panda/src/express/zStreamBuf.cxx b/panda/src/express/zStreamBuf.cxx index c0b4c24b84..444eed4789 100644 --- a/panda/src/express/zStreamBuf.cxx +++ b/panda/src/express/zStreamBuf.cxx @@ -79,11 +79,11 @@ open_read(istream *source, bool owns_source) { _z_source.zalloc = Z_NULL; _z_source.zfree = Z_NULL; _z_source.opaque = Z_NULL; + _z_source.msg = "no error message"; int result = inflateInit(&_z_source); if (result < 0) { - express_cat.warning() - << "zlib error " << result << " = " << _z_source.msg << "\n"; + show_zlib_error("inflateInit", result, _z_source); close_read(); } } @@ -99,8 +99,7 @@ close_read() { int result = inflateEnd(&_z_source); if (result < 0) { - express_cat.warning() - << "zlib error " << result << " = " << _z_source.msg << "\n"; + show_zlib_error("inflateEnd", result, _z_source); } if (_owns_source) { @@ -124,11 +123,11 @@ open_write(ostream *dest, bool owns_dest, int compression_level) { _z_dest.zalloc = Z_NULL; _z_dest.zfree = Z_NULL; _z_dest.opaque = Z_NULL; + _z_dest.msg = "no error message"; int result = deflateInit(&_z_dest, compression_level); if (result < 0) { - express_cat.warning() - << "zlib error " << result << " = " << _z_dest.msg << "\n"; + show_zlib_error("deflateInit", result, _z_dest); close_write(); } } @@ -147,8 +146,7 @@ close_write() { int result = deflateEnd(&_z_dest); if (result < 0) { - express_cat.warning() - << "zlib error " << result << " = " << _z_dest.msg << "\n"; + show_zlib_error("deflateEnd", result, _z_dest); } if (_owns_dest) { @@ -272,9 +270,10 @@ read_chars(char *start, size_t length) { // Here's the end of the file. return bytes_read; } - if (result < 0) { - express_cat.warning() - << "zlib error " << result << " = " << _z_source.msg << "\n"; + // It might return Z_BUF_ERROR if we passed in Z_FINISH but not a + // big enough output buffer for everything. + if (result < 0 && result != Z_BUF_ERROR) { + show_zlib_error("inflate", result, _z_source); return bytes_read; } } @@ -301,8 +300,7 @@ write_chars(const char *start, size_t length, int flush) { int result = deflate(&_z_dest, flush); if (result < 0 && result != Z_BUF_ERROR) { - express_cat.warning() - << "zlib error " << result << " = " << _z_dest.msg << "\n"; + show_zlib_error("deflate", result, _z_dest); } while (_z_dest.avail_in != 0) { @@ -313,8 +311,7 @@ write_chars(const char *start, size_t length, int flush) { } result = deflate(&_z_dest, flush); if (result < 0) { - express_cat.warning() - << "zlib error " << result << " = " << _z_dest.msg << "\n"; + show_zlib_error("deflate", result, _z_dest); } } @@ -324,10 +321,59 @@ write_chars(const char *start, size_t length, int flush) { _z_dest.avail_out = compress_buffer_size; result = deflate(&_z_dest, flush); if (result < 0 && result != Z_BUF_ERROR) { - express_cat.warning() - << "zlib error " << result << " = " << _z_dest.msg << "\n"; + show_zlib_error("deflate", result, _z_dest); } } } +//////////////////////////////////////////////////////////////////// +// Function: ZStreamBuf::show_zlib_error +// Access: Private +// Description: Reports a recent error code returned by zlib. +//////////////////////////////////////////////////////////////////// +void ZStreamBuf:: +show_zlib_error(const char *function, int error_code, z_stream &z) { + stringstream error_line; + + error_line + << "zlib error in " << function << ": "; + switch (error_code) { + case Z_OK: + error_line << "Z_OK"; + break; + case Z_STREAM_END: + error_line << "Z_STREAM_END"; + break; + case Z_NEED_DICT: + error_line << "Z_NEED_DICT"; + break; + case Z_ERRNO: + error_line << "Z_ERRNO"; + break; + case Z_STREAM_ERROR: + error_line << "Z_STREAM_ERROR"; + break; + case Z_DATA_ERROR: + error_line << "Z_DATA_ERROR"; + break; + case Z_MEM_ERROR: + error_line << "Z_MEM_ERROR"; + break; + case Z_BUF_ERROR: + error_line << "Z_BUF_ERROR"; + break; + case Z_VERSION_ERROR: + error_line << "Z_VERSION_ERROR"; + break; + default: + error_line << error_code; + } + if (z.msg != (char *)NULL) { + error_line + << " = " << z.msg; + } + + express_cat.warning() << error_line.str() << "\n"; +} + #endif // HAVE_ZLIB diff --git a/panda/src/express/zStreamBuf.h b/panda/src/express/zStreamBuf.h index d12dbbe08a..d495dfcc29 100644 --- a/panda/src/express/zStreamBuf.h +++ b/panda/src/express/zStreamBuf.h @@ -50,6 +50,7 @@ protected: 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: istream *_source;