1///////////////////////////////////////////////////////////////////////////// 2// Name: wx/zstream.h 3// Purpose: Memory stream classes 4// Author: Guilhem Lavaux 5// Modified by: Mike Wetherell 6// Created: 11/07/98 7// RCS-ID: $Id: zstream.h 54688 2008-07-18 08:06:44Z MW $ 8// Copyright: (c) Guilhem Lavaux 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11#ifndef _WX_WXZSTREAM_H__ 12#define _WX_WXZSTREAM_H__ 13 14#include "wx/defs.h" 15 16#if wxUSE_ZLIB && wxUSE_STREAMS 17 18#include "wx/stream.h" 19 20// Compression level 21enum { 22 wxZ_DEFAULT_COMPRESSION = -1, 23 wxZ_NO_COMPRESSION = 0, 24 wxZ_BEST_SPEED = 1, 25 wxZ_BEST_COMPRESSION = 9 26}; 27 28// Flags 29enum { 30#if WXWIN_COMPATIBILITY_2_4 31 wxZLIB_24COMPATIBLE = 4, // read v2.4.x data without error 32#endif 33 wxZLIB_NO_HEADER = 0, // raw deflate stream, no header or checksum 34 wxZLIB_ZLIB = 1, // zlib header and checksum 35 wxZLIB_GZIP = 2, // gzip header and checksum, requires zlib 1.2.1+ 36 wxZLIB_AUTO = 3 // autodetect header zlib or gzip 37}; 38 39class WXDLLIMPEXP_BASE wxZlibInputStream: public wxFilterInputStream { 40 public: 41 wxZlibInputStream(wxInputStream& stream, int flags = wxZLIB_AUTO); 42 wxZlibInputStream(wxInputStream *stream, int flags = wxZLIB_AUTO); 43 virtual ~wxZlibInputStream(); 44 45 char Peek() { return wxInputStream::Peek(); } 46 wxFileOffset GetLength() const { return wxInputStream::GetLength(); } 47 48 static bool CanHandleGZip(); 49 50 protected: 51 size_t OnSysRead(void *buffer, size_t size); 52 wxFileOffset OnSysTell() const { return m_pos; } 53 54 private: 55 void Init(int flags); 56 57 protected: 58 size_t m_z_size; 59 unsigned char *m_z_buffer; 60 struct z_stream_s *m_inflate; 61 wxFileOffset m_pos; 62#if WXWIN_COMPATIBILITY_2_4 63 bool m_24compatibilty; 64#endif 65 66 DECLARE_NO_COPY_CLASS(wxZlibInputStream) 67}; 68 69class WXDLLIMPEXP_BASE wxZlibOutputStream: public wxFilterOutputStream { 70 public: 71 wxZlibOutputStream(wxOutputStream& stream, int level = -1, int flags = wxZLIB_ZLIB); 72 wxZlibOutputStream(wxOutputStream *stream, int level = -1, int flags = wxZLIB_ZLIB); 73 virtual ~wxZlibOutputStream() { Close(); } 74 75 void Sync() { DoFlush(false); } 76 bool Close(); 77 wxFileOffset GetLength() const { return m_pos; } 78 79 static bool CanHandleGZip(); 80 81 protected: 82 size_t OnSysWrite(const void *buffer, size_t size); 83 wxFileOffset OnSysTell() const { return m_pos; } 84 85 virtual void DoFlush(bool final); 86 87 private: 88 void Init(int level, int flags); 89 90 protected: 91 size_t m_z_size; 92 unsigned char *m_z_buffer; 93 struct z_stream_s *m_deflate; 94 wxFileOffset m_pos; 95 96 DECLARE_NO_COPY_CLASS(wxZlibOutputStream) 97}; 98 99class WXDLLIMPEXP_BASE wxZlibClassFactory: public wxFilterClassFactory 100{ 101public: 102 wxZlibClassFactory(); 103 104 wxFilterInputStream *NewStream(wxInputStream& stream) const 105 { return new wxZlibInputStream(stream); } 106 wxFilterOutputStream *NewStream(wxOutputStream& stream) const 107 { return new wxZlibOutputStream(stream, -1); } 108 wxFilterInputStream *NewStream(wxInputStream *stream) const 109 { return new wxZlibInputStream(stream); } 110 wxFilterOutputStream *NewStream(wxOutputStream *stream) const 111 { return new wxZlibOutputStream(stream, -1); } 112 113 const wxChar * const *GetProtocols(wxStreamProtocolType type 114 = wxSTREAM_PROTOCOL) const; 115 116private: 117 DECLARE_DYNAMIC_CLASS(wxZlibClassFactory) 118}; 119 120class WXDLLIMPEXP_BASE wxGzipClassFactory: public wxFilterClassFactory 121{ 122public: 123 wxGzipClassFactory(); 124 125 wxFilterInputStream *NewStream(wxInputStream& stream) const 126 { return new wxZlibInputStream(stream); } 127 wxFilterOutputStream *NewStream(wxOutputStream& stream) const 128 { return new wxZlibOutputStream(stream, -1, wxZLIB_GZIP); } 129 wxFilterInputStream *NewStream(wxInputStream *stream) const 130 { return new wxZlibInputStream(stream); } 131 wxFilterOutputStream *NewStream(wxOutputStream *stream) const 132 { return new wxZlibOutputStream(stream, -1, wxZLIB_GZIP); } 133 134 const wxChar * const *GetProtocols(wxStreamProtocolType type 135 = wxSTREAM_PROTOCOL) const; 136 137private: 138 DECLARE_DYNAMIC_CLASS(wxGzipClassFactory) 139}; 140 141#endif 142 // wxUSE_ZLIB && wxUSE_STREAMS 143 144#endif 145 // _WX_WXZSTREAM_H__ 146 147