zstream.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. // Copyright: (c) Guilhem Lavaux
  8. // Licence: wxWindows licence
  9. /////////////////////////////////////////////////////////////////////////////
  10. #ifndef _WX_WXZSTREAM_H__
  11. #define _WX_WXZSTREAM_H__
  12. #include "wx/defs.h"
  13. #if wxUSE_ZLIB && wxUSE_STREAMS
  14. #include "wx/stream.h"
  15. #include "wx/versioninfo.h"
  16. // Compression level
  17. enum wxZlibCompressionLevels {
  18. wxZ_DEFAULT_COMPRESSION = -1,
  19. wxZ_NO_COMPRESSION = 0,
  20. wxZ_BEST_SPEED = 1,
  21. wxZ_BEST_COMPRESSION = 9
  22. };
  23. // Flags
  24. enum wxZLibFlags {
  25. wxZLIB_NO_HEADER = 0, // raw deflate stream, no header or checksum
  26. wxZLIB_ZLIB = 1, // zlib header and checksum
  27. wxZLIB_GZIP = 2, // gzip header and checksum, requires zlib 1.2.1+
  28. wxZLIB_AUTO = 3 // autodetect header zlib or gzip
  29. };
  30. class WXDLLIMPEXP_BASE wxZlibInputStream: public wxFilterInputStream {
  31. public:
  32. wxZlibInputStream(wxInputStream& stream, int flags = wxZLIB_AUTO);
  33. wxZlibInputStream(wxInputStream *stream, int flags = wxZLIB_AUTO);
  34. virtual ~wxZlibInputStream();
  35. char Peek() { return wxInputStream::Peek(); }
  36. wxFileOffset GetLength() const { return wxInputStream::GetLength(); }
  37. static bool CanHandleGZip();
  38. bool SetDictionary(const char *data, const size_t datalen);
  39. bool SetDictionary(const wxMemoryBuffer &buf);
  40. protected:
  41. size_t OnSysRead(void *buffer, size_t size);
  42. wxFileOffset OnSysTell() const { return m_pos; }
  43. private:
  44. void Init(int flags);
  45. protected:
  46. size_t m_z_size;
  47. unsigned char *m_z_buffer;
  48. struct z_stream_s *m_inflate;
  49. wxFileOffset m_pos;
  50. wxDECLARE_NO_COPY_CLASS(wxZlibInputStream);
  51. };
  52. class WXDLLIMPEXP_BASE wxZlibOutputStream: public wxFilterOutputStream {
  53. public:
  54. wxZlibOutputStream(wxOutputStream& stream, int level = -1, int flags = wxZLIB_ZLIB);
  55. wxZlibOutputStream(wxOutputStream *stream, int level = -1, int flags = wxZLIB_ZLIB);
  56. virtual ~wxZlibOutputStream() { Close(); }
  57. void Sync() { DoFlush(false); }
  58. bool Close();
  59. wxFileOffset GetLength() const { return m_pos; }
  60. static bool CanHandleGZip();
  61. bool SetDictionary(const char *data, const size_t datalen);
  62. bool SetDictionary(const wxMemoryBuffer &buf);
  63. protected:
  64. size_t OnSysWrite(const void *buffer, size_t size);
  65. wxFileOffset OnSysTell() const { return m_pos; }
  66. virtual void DoFlush(bool final);
  67. private:
  68. void Init(int level, int flags);
  69. protected:
  70. size_t m_z_size;
  71. unsigned char *m_z_buffer;
  72. struct z_stream_s *m_deflate;
  73. wxFileOffset m_pos;
  74. wxDECLARE_NO_COPY_CLASS(wxZlibOutputStream);
  75. };
  76. class WXDLLIMPEXP_BASE wxZlibClassFactory: public wxFilterClassFactory
  77. {
  78. public:
  79. wxZlibClassFactory();
  80. wxFilterInputStream *NewStream(wxInputStream& stream) const
  81. { return new wxZlibInputStream(stream); }
  82. wxFilterOutputStream *NewStream(wxOutputStream& stream) const
  83. { return new wxZlibOutputStream(stream, -1); }
  84. wxFilterInputStream *NewStream(wxInputStream *stream) const
  85. { return new wxZlibInputStream(stream); }
  86. wxFilterOutputStream *NewStream(wxOutputStream *stream) const
  87. { return new wxZlibOutputStream(stream, -1); }
  88. const wxChar * const *GetProtocols(wxStreamProtocolType type
  89. = wxSTREAM_PROTOCOL) const;
  90. private:
  91. DECLARE_DYNAMIC_CLASS(wxZlibClassFactory)
  92. };
  93. class WXDLLIMPEXP_BASE wxGzipClassFactory: public wxFilterClassFactory
  94. {
  95. public:
  96. wxGzipClassFactory();
  97. wxFilterInputStream *NewStream(wxInputStream& stream) const
  98. { return new wxZlibInputStream(stream); }
  99. wxFilterOutputStream *NewStream(wxOutputStream& stream) const
  100. { return new wxZlibOutputStream(stream, -1); }
  101. wxFilterInputStream *NewStream(wxInputStream *stream) const
  102. { return new wxZlibInputStream(stream); }
  103. wxFilterOutputStream *NewStream(wxOutputStream *stream) const
  104. { return new wxZlibOutputStream(stream, -1); }
  105. const wxChar * const *GetProtocols(wxStreamProtocolType type
  106. = wxSTREAM_PROTOCOL) const;
  107. private:
  108. DECLARE_DYNAMIC_CLASS(wxGzipClassFactory)
  109. };
  110. WXDLLIMPEXP_BASE wxVersionInfo wxGetZlibVersionInfo();
  111. #endif
  112. // wxUSE_ZLIB && wxUSE_STREAMS
  113. #endif
  114. // _WX_WXZSTREAM_H__