File: lzmastream.h

package info (click to toggle)
wxpython4.0 4.2.3%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 221,752 kB
  • sloc: cpp: 962,555; python: 230,573; ansic: 170,731; makefile: 51,756; sh: 9,342; perl: 1,564; javascript: 584; php: 326; xml: 200
file content (149 lines) | stat: -rw-r--r-- 4,654 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
///////////////////////////////////////////////////////////////////////////////
// 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_