Files
wxWidgets/src/common/zstream.cpp
Robert Roebling 3069ac4e45 Removed a few old wxDebugMsg (now wxLogDebug)
block first event from wxCeckBox after SetValue() also


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1156 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
1998-12-10 14:34:14 +00:00

184 lines
4.2 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: zstream.cpp
// Purpose: Compressed stream classes
// Author: Guilhem Lavaux
// Modified by:
// Created: 11/07/98
// RCS-ID: $Id$
// Copyright: (c) Guilhem Lavaux
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "zstream.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#include <wx/stream.h>
#include <wx/zstream.h>
#include <wx/utils.h>
#include <wx/intl.h>
#include "wx/log.h"
#include "../zlib/zlib.h" // don't change this, Robert
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#define ZSTREAM_BUFFER_SIZE 1024
//////////////////////
// wxZlibInputStream
//////////////////////
wxZlibInputStream::wxZlibInputStream(wxInputStream& stream)
: wxFilterInputStream(stream)
{
int err;
// I need a private stream buffer.
m_i_streambuf = new wxStreamBuffer(*this, wxStreamBuffer::read);
m_i_destroybuf = TRUE;
m_inflate = new z_stream_s;
m_inflate->zalloc = (alloc_func)0;
m_inflate->zfree = (free_func)0;
m_inflate->opaque = (voidpf)0;
err = inflateInit(m_inflate);
if (err != Z_OK) {
inflateEnd(m_inflate);
delete m_inflate;
return;
}
m_z_buffer = new unsigned char[ZSTREAM_BUFFER_SIZE];
m_z_size = ZSTREAM_BUFFER_SIZE;
m_inflate->avail_in = 0;
m_inflate->next_in = NULL;
}
wxZlibInputStream::~wxZlibInputStream()
{
inflateEnd(m_inflate);
delete m_inflate;
}
size_t wxZlibInputStream::OnSysRead(void *buffer, size_t size)
{
int err;
m_inflate->next_out = (unsigned char *)buffer;
m_inflate->avail_out = size;
while (m_inflate->avail_out > 0) {
if (m_inflate->avail_in == 0) {
m_parent_i_stream->Read(m_z_buffer, m_z_size);
m_inflate->next_in = m_z_buffer;
m_inflate->avail_in = m_parent_i_stream->LastRead();
if (m_parent_i_stream->LastError() != wxStream_NOERROR)
return (size - m_inflate->avail_in);
}
err = inflate(m_inflate, Z_FINISH);
if (err == Z_STREAM_END)
return (size - m_inflate->avail_in);
}
return size-m_inflate->avail_in;
}
//////////////////////
// wxZlibOutputStream
//////////////////////
wxZlibOutputStream::wxZlibOutputStream(wxOutputStream& stream)
: wxFilterOutputStream(stream)
{
int err;
m_o_streambuf = new wxStreamBuffer(*this, wxStreamBuffer::write);
m_o_destroybuf = TRUE;
m_deflate = new z_stream_s;
m_deflate->zalloc = (alloc_func)0;
m_deflate->zfree = (free_func)0;
m_deflate->opaque = (voidpf)0;
err = deflateInit(m_deflate, Z_DEFAULT_COMPRESSION);
if (err != Z_OK) {
deflateEnd(m_deflate);
return;
}
m_z_buffer = new unsigned char[ZSTREAM_BUFFER_SIZE];
m_z_size = ZSTREAM_BUFFER_SIZE;
m_deflate->avail_in = 0;
m_deflate->next_out = m_z_buffer;
m_deflate->avail_out = m_z_size;
}
wxZlibOutputStream::~wxZlibOutputStream()
{
int err;
Sync();
err = deflate(m_deflate, Z_FINISH);
if (err != Z_STREAM_END)
{
wxLogDebug( "wxZlibOutputStream: an error occured while closing the stream.\n" );
return;
}
deflateEnd(m_deflate);
delete[] m_z_buffer;
}
void wxZlibOutputStream::Sync()
{
int err;
m_parent_o_stream->Write(m_z_buffer, m_z_size-m_deflate->avail_out);
m_deflate->next_out = m_z_buffer;
m_deflate->avail_out = m_z_size;
err = deflate(m_deflate, Z_FULL_FLUSH);
if (err != Z_OK) {
return;
}
m_parent_o_stream->Write(m_z_buffer, m_z_size-m_deflate->avail_out);
m_deflate->next_out = m_z_buffer;
m_deflate->avail_out = m_z_size;
}
size_t wxZlibOutputStream::OnSysWrite(const void *buffer, size_t size)
{
int err;
m_deflate->next_in = (unsigned char *)buffer;
m_deflate->avail_in = size;
while (m_deflate->avail_in > 0) {
if (m_deflate->avail_out == 0) {
m_parent_o_stream->Write(m_z_buffer, m_z_size);
if (m_parent_o_stream->LastError() != wxStream_NOERROR)
return (size - m_deflate->avail_in);
m_deflate->next_out = m_z_buffer;
m_deflate->avail_out = m_z_size;
}
err = deflate(m_deflate, Z_NO_FLUSH);
if (err != Z_OK)
return (size - m_deflate->avail_in);
}
return size;
}