150 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ///////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        wx/lzmastream.h
 | |
| // Purpose:     Filters streams using LZMA(2) compression
 | |
| // Author:      Vadim Zeitlin
 | |
| // Created:     2018-03-29
 | |
| // Copyright:   (c) 2018 Vadim Zeitlin <vadim@wxwidgets.org>
 | |
| // Licence:     wxWindows licence
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #ifndef _WX_LZMASTREAM_H_
 | |
| #define _WX_LZMASTREAM_H_
 | |
| 
 | |
| #include "wx/defs.h"
 | |
| 
 | |
| #if wxUSE_LIBLZMA && wxUSE_STREAMS
 | |
| 
 | |
| #include "wx/stream.h"
 | |
| #include "wx/versioninfo.h"
 | |
| 
 | |
| namespace wxPrivate
 | |
| {
 | |
| 
 | |
| // Private wrapper for lzma_stream struct.
 | |
| struct wxLZMAStream;
 | |
| 
 | |
| // Common part of input and output LZMA streams: this is just an implementation
 | |
| // detail and is not part of the public API.
 | |
| class WXDLLIMPEXP_BASE wxLZMAData
 | |
| {
 | |
| protected:
 | |
|     wxLZMAData();
 | |
|     ~wxLZMAData();
 | |
| 
 | |
|     wxLZMAStream* m_stream;
 | |
|     wxUint8* m_streamBuf;
 | |
|     wxFileOffset m_pos;
 | |
| 
 | |
|     wxDECLARE_NO_COPY_CLASS(wxLZMAData);
 | |
| };
 | |
| 
 | |
| } // namespace wxPrivate
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // Filter for decompressing data compressed using LZMA
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| class WXDLLIMPEXP_BASE wxLZMAInputStream : public wxFilterInputStream,
 | |
|                                            private wxPrivate::wxLZMAData
 | |
| {
 | |
| public:
 | |
|     explicit wxLZMAInputStream(wxInputStream& stream)
 | |
|         : wxFilterInputStream(stream)
 | |
|     {
 | |
|         Init();
 | |
|     }
 | |
| 
 | |
|     explicit wxLZMAInputStream(wxInputStream* stream)
 | |
|         : wxFilterInputStream(stream)
 | |
|     {
 | |
|         Init();
 | |
|     }
 | |
| 
 | |
|     char Peek() wxOVERRIDE { return wxInputStream::Peek(); }
 | |
|     wxFileOffset GetLength() const wxOVERRIDE { return wxInputStream::GetLength(); }
 | |
| 
 | |
| protected:
 | |
|     size_t OnSysRead(void *buffer, size_t size) wxOVERRIDE;
 | |
|     wxFileOffset OnSysTell() const wxOVERRIDE { return m_pos; }
 | |
| 
 | |
| private:
 | |
|     void Init();
 | |
| };
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // Filter for compressing data using LZMA(2) algorithm
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| class WXDLLIMPEXP_BASE wxLZMAOutputStream : public wxFilterOutputStream,
 | |
|                                             private wxPrivate::wxLZMAData
 | |
| {
 | |
| public:
 | |
|     explicit wxLZMAOutputStream(wxOutputStream& stream, int level = -1)
 | |
|         : wxFilterOutputStream(stream)
 | |
|     {
 | |
|         Init(level);
 | |
|     }
 | |
| 
 | |
|     explicit wxLZMAOutputStream(wxOutputStream* stream, int level = -1)
 | |
|         : wxFilterOutputStream(stream)
 | |
|     {
 | |
|         Init(level);
 | |
|     }
 | |
| 
 | |
|     virtual ~wxLZMAOutputStream() { Close(); }
 | |
| 
 | |
|     void Sync() wxOVERRIDE { DoFlush(false); }
 | |
|     bool Close() wxOVERRIDE;
 | |
|     wxFileOffset GetLength() const wxOVERRIDE { return m_pos; }
 | |
| 
 | |
| protected:
 | |
|     size_t OnSysWrite(const void *buffer, size_t size) wxOVERRIDE;
 | |
|     wxFileOffset OnSysTell() const wxOVERRIDE { return m_pos; }
 | |
| 
 | |
| private:
 | |
|     void Init(int level);
 | |
| 
 | |
|     // Write the contents of the internal buffer to the output stream.
 | |
|     bool UpdateOutput();
 | |
| 
 | |
|     // Write out the current buffer if necessary, i.e. if no space remains in
 | |
|     // it, and reinitialize m_stream to point to it. Returns false on success
 | |
|     // or false on error, in which case m_lasterror is updated.
 | |
|     bool UpdateOutputIfNecessary();
 | |
| 
 | |
|     // Run LZMA_FINISH (if argument is true) or LZMA_FULL_FLUSH, return true on
 | |
|     // success or false on error.
 | |
|     bool DoFlush(bool finish);
 | |
| };
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // Support for creating LZMA streams from extension/MIME type
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| class WXDLLIMPEXP_BASE wxLZMAClassFactory: public wxFilterClassFactory
 | |
| {
 | |
| public:
 | |
|     wxLZMAClassFactory();
 | |
| 
 | |
|     wxFilterInputStream *NewStream(wxInputStream& stream) const wxOVERRIDE
 | |
|         { return new wxLZMAInputStream(stream); }
 | |
|     wxFilterOutputStream *NewStream(wxOutputStream& stream) const wxOVERRIDE
 | |
|         { return new wxLZMAOutputStream(stream, -1); }
 | |
|     wxFilterInputStream *NewStream(wxInputStream *stream) const wxOVERRIDE
 | |
|         { return new wxLZMAInputStream(stream); }
 | |
|     wxFilterOutputStream *NewStream(wxOutputStream *stream) const wxOVERRIDE
 | |
|         { return new wxLZMAOutputStream(stream, -1); }
 | |
| 
 | |
|     const wxChar * const *GetProtocols(wxStreamProtocolType type
 | |
|                                        = wxSTREAM_PROTOCOL) const wxOVERRIDE;
 | |
| 
 | |
| private:
 | |
|     wxDECLARE_DYNAMIC_CLASS(wxLZMAClassFactory);
 | |
| };
 | |
| 
 | |
| WXDLLIMPEXP_BASE wxVersionInfo wxGetLibLZMAVersionInfo();
 | |
| 
 | |
| #endif // wxUSE_LIBLZMA && wxUSE_STREAMS
 | |
| 
 | |
| #endif // _WX_LZMASTREAM_H_
 |