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