diff --git a/Makefile.in b/Makefile.in
index 583620372a..d2b234ea11 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -530,6 +530,7 @@ ALL_BASE_HEADERS = \
wx/fswatcher.h \
wx/generic/fswatcher.h \
wx/secretstore.h \
+ wx/lzmastream.h \
$(BASE_PLATFORM_HDR) \
wx/fs_inet.h \
wx/protocol/file.h \
@@ -713,6 +714,7 @@ ALL_PORTS_BASE_HEADERS = \
wx/fswatcher.h \
wx/generic/fswatcher.h \
wx/secretstore.h \
+ wx/lzmastream.h \
wx/unix/app.h \
wx/unix/apptbase.h \
wx/unix/apptrait.h \
@@ -851,6 +853,7 @@ ALL_BASE_SOURCES = \
src/common/fswatchercmn.cpp \
src/generic/fswatcherg.cpp \
src/common/secretstore.cpp \
+ src/common/lzmastream.cpp \
src/common/fdiodispatcher.cpp \
src/common/selectdispatcher.cpp \
src/unix/appunix.cpp \
@@ -1034,6 +1037,7 @@ MONODLL_OBJECTS = \
monodll_fswatchercmn.o \
monodll_fswatcherg.o \
monodll_common_secretstore.o \
+ monodll_lzmastream.o \
$(__BASE_PLATFORM_SRC_OBJECTS) \
monodll_event.o \
monodll_fs_mem.o \
@@ -1176,6 +1180,7 @@ MONOLIB_OBJECTS = \
monolib_fswatchercmn.o \
monolib_fswatcherg.o \
monolib_common_secretstore.o \
+ monolib_lzmastream.o \
$(__BASE_PLATFORM_SRC_OBJECTS_1) \
monolib_event.o \
monolib_fs_mem.o \
@@ -1307,6 +1312,7 @@ BASEDLL_OBJECTS = \
basedll_fswatchercmn.o \
basedll_fswatcherg.o \
basedll_common_secretstore.o \
+ basedll_lzmastream.o \
$(__BASE_PLATFORM_SRC_OBJECTS_2) \
basedll_event.o \
basedll_fs_mem.o \
@@ -1421,6 +1427,7 @@ BASELIB_OBJECTS = \
baselib_fswatchercmn.o \
baselib_fswatcherg.o \
baselib_common_secretstore.o \
+ baselib_lzmastream.o \
$(__BASE_PLATFORM_SRC_OBJECTS_3) \
baselib_event.o \
baselib_fs_mem.o \
@@ -16270,6 +16277,9 @@ monodll_fswatcherg.o: $(srcdir)/src/generic/fswatcherg.cpp $(MONODLL_ODEP)
monodll_common_secretstore.o: $(srcdir)/src/common/secretstore.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/secretstore.cpp
+monodll_lzmastream.o: $(srcdir)/src/common/lzmastream.cpp $(MONODLL_ODEP)
+ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/lzmastream.cpp
+
monodll_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp
@@ -21529,6 +21539,9 @@ monolib_fswatcherg.o: $(srcdir)/src/generic/fswatcherg.cpp $(MONOLIB_ODEP)
monolib_common_secretstore.o: $(srcdir)/src/common/secretstore.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/secretstore.cpp
+monolib_lzmastream.o: $(srcdir)/src/common/lzmastream.cpp $(MONOLIB_ODEP)
+ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/lzmastream.cpp
+
monolib_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp
@@ -26788,6 +26801,9 @@ basedll_fswatcherg.o: $(srcdir)/src/generic/fswatcherg.cpp $(BASEDLL_ODEP)
basedll_common_secretstore.o: $(srcdir)/src/common/secretstore.cpp $(BASEDLL_ODEP)
$(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/secretstore.cpp
+basedll_lzmastream.o: $(srcdir)/src/common/lzmastream.cpp $(BASEDLL_ODEP)
+ $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/lzmastream.cpp
+
basedll_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(BASEDLL_ODEP)
$(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp
@@ -27265,6 +27281,9 @@ baselib_fswatcherg.o: $(srcdir)/src/generic/fswatcherg.cpp $(BASELIB_ODEP)
baselib_common_secretstore.o: $(srcdir)/src/common/secretstore.cpp $(BASELIB_ODEP)
$(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/secretstore.cpp
+baselib_lzmastream.o: $(srcdir)/src/common/lzmastream.cpp $(BASELIB_ODEP)
+ $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/lzmastream.cpp
+
baselib_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(BASELIB_ODEP)
$(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp
diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl
index 0f38e0952f..d529b6d731 100644
--- a/build/bakefiles/files.bkl
+++ b/build/bakefiles/files.bkl
@@ -546,6 +546,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/common/fswatchercmn.cpp
src/generic/fswatcherg.cpp
src/common/secretstore.cpp
+ src/common/lzmastream.cpp
src/common/event.cpp
@@ -719,6 +720,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
wx/fswatcher.h
wx/generic/fswatcher.h
wx/secretstore.h
+ wx/lzmastream.h
diff --git a/build/cmake/files.cmake b/build/cmake/files.cmake
index d6d9c6becb..0acb0dc7df 100644
--- a/build/cmake/files.cmake
+++ b/build/cmake/files.cmake
@@ -458,6 +458,7 @@ set(BASE_CMN_SRC
src/common/zstream.cpp
src/common/fswatchercmn.cpp
src/generic/fswatcherg.cpp
+ src/common/lzmastream.cpp
)
set(BASE_AND_GUI_CMN_SRC
@@ -633,6 +634,7 @@ set(BASE_CMN_HDR
wx/meta/removeref.h
wx/fswatcher.h
wx/generic/fswatcher.h
+ wx/lzmastream.h
)
set(NET_UNIX_SRC
diff --git a/build/files b/build/files
index e81c72ebdc..166aab50a1 100644
--- a/build/files
+++ b/build/files
@@ -433,6 +433,7 @@ BASE_CMN_SRC =
src/common/list.cpp
src/common/log.cpp
src/common/longlong.cpp
+ src/common/lzmastream.cpp
src/common/memory.cpp
src/common/mimecmn.cpp
src/common/module.cpp
@@ -559,6 +560,7 @@ BASE_CMN_HDR =
wx/listimpl.cpp
wx/log.h
wx/longlong.h
+ wx/lzmastream.h
wx/math.h
wx/memconf.h
wx/memory.h
diff --git a/build/msw/makefile.bcc b/build/msw/makefile.bcc
index 0c23f0a938..334895a139 100644
--- a/build/msw/makefile.bcc
+++ b/build/msw/makefile.bcc
@@ -455,6 +455,7 @@ MONODLL_OBJECTS = \
$(OBJS)\monodll_fswatchercmn.obj \
$(OBJS)\monodll_fswatcherg.obj \
$(OBJS)\monodll_common_secretstore.obj \
+ $(OBJS)\monodll_lzmastream.obj \
$(OBJS)\monodll_basemsw.obj \
$(OBJS)\monodll_crashrpt.obj \
$(OBJS)\monodll_debughlp.obj \
@@ -607,6 +608,7 @@ MONOLIB_OBJECTS = \
$(OBJS)\monolib_fswatchercmn.obj \
$(OBJS)\monolib_fswatcherg.obj \
$(OBJS)\monolib_common_secretstore.obj \
+ $(OBJS)\monolib_lzmastream.obj \
$(OBJS)\monolib_basemsw.obj \
$(OBJS)\monolib_crashrpt.obj \
$(OBJS)\monolib_debughlp.obj \
@@ -755,6 +757,7 @@ BASEDLL_OBJECTS = \
$(OBJS)\basedll_fswatchercmn.obj \
$(OBJS)\basedll_fswatcherg.obj \
$(OBJS)\basedll_common_secretstore.obj \
+ $(OBJS)\basedll_lzmastream.obj \
$(OBJS)\basedll_basemsw.obj \
$(OBJS)\basedll_crashrpt.obj \
$(OBJS)\basedll_debughlp.obj \
@@ -888,6 +891,7 @@ BASELIB_OBJECTS = \
$(OBJS)\baselib_fswatchercmn.obj \
$(OBJS)\baselib_fswatcherg.obj \
$(OBJS)\baselib_common_secretstore.obj \
+ $(OBJS)\baselib_lzmastream.obj \
$(OBJS)\baselib_basemsw.obj \
$(OBJS)\baselib_crashrpt.obj \
$(OBJS)\baselib_debughlp.obj \
@@ -6690,6 +6694,9 @@ $(OBJS)\monodll_fswatcherg.obj: ..\..\src\generic\fswatcherg.cpp
$(OBJS)\monodll_common_secretstore.obj: ..\..\src\common\secretstore.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\secretstore.cpp
+$(OBJS)\monodll_lzmastream.obj: ..\..\src\common\lzmastream.cpp
+ $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\lzmastream.cpp
+
$(OBJS)\monodll_basemsw.obj: ..\..\src\msw\basemsw.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\basemsw.cpp
@@ -9236,6 +9243,9 @@ $(OBJS)\monolib_fswatcherg.obj: ..\..\src\generic\fswatcherg.cpp
$(OBJS)\monolib_common_secretstore.obj: ..\..\src\common\secretstore.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\secretstore.cpp
+$(OBJS)\monolib_lzmastream.obj: ..\..\src\common\lzmastream.cpp
+ $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\lzmastream.cpp
+
$(OBJS)\monolib_basemsw.obj: ..\..\src\msw\basemsw.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\basemsw.cpp
@@ -11782,6 +11792,9 @@ $(OBJS)\basedll_fswatcherg.obj: ..\..\src\generic\fswatcherg.cpp
$(OBJS)\basedll_common_secretstore.obj: ..\..\src\common\secretstore.cpp
$(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\secretstore.cpp
+$(OBJS)\basedll_lzmastream.obj: ..\..\src\common\lzmastream.cpp
+ $(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\lzmastream.cpp
+
$(OBJS)\basedll_basemsw.obj: ..\..\src\msw\basemsw.cpp
$(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) ..\..\src\msw\basemsw.cpp
@@ -12127,6 +12140,9 @@ $(OBJS)\baselib_fswatcherg.obj: ..\..\src\generic\fswatcherg.cpp
$(OBJS)\baselib_common_secretstore.obj: ..\..\src\common\secretstore.cpp
$(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) ..\..\src\common\secretstore.cpp
+$(OBJS)\baselib_lzmastream.obj: ..\..\src\common\lzmastream.cpp
+ $(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) ..\..\src\common\lzmastream.cpp
+
$(OBJS)\baselib_basemsw.obj: ..\..\src\msw\basemsw.cpp
$(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) ..\..\src\msw\basemsw.cpp
diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc
index 4272f38c1a..7a686f28c3 100644
--- a/build/msw/makefile.gcc
+++ b/build/msw/makefile.gcc
@@ -443,6 +443,7 @@ MONODLL_OBJECTS = \
$(OBJS)\monodll_fswatchercmn.o \
$(OBJS)\monodll_fswatcherg.o \
$(OBJS)\monodll_common_secretstore.o \
+ $(OBJS)\monodll_lzmastream.o \
$(OBJS)\monodll_basemsw.o \
$(OBJS)\monodll_crashrpt.o \
$(OBJS)\monodll_debughlp.o \
@@ -596,6 +597,7 @@ MONOLIB_OBJECTS = \
$(OBJS)\monolib_fswatchercmn.o \
$(OBJS)\monolib_fswatcherg.o \
$(OBJS)\monolib_common_secretstore.o \
+ $(OBJS)\monolib_lzmastream.o \
$(OBJS)\monolib_basemsw.o \
$(OBJS)\monolib_crashrpt.o \
$(OBJS)\monolib_debughlp.o \
@@ -745,6 +747,7 @@ BASEDLL_OBJECTS = \
$(OBJS)\basedll_fswatchercmn.o \
$(OBJS)\basedll_fswatcherg.o \
$(OBJS)\basedll_common_secretstore.o \
+ $(OBJS)\basedll_lzmastream.o \
$(OBJS)\basedll_basemsw.o \
$(OBJS)\basedll_crashrpt.o \
$(OBJS)\basedll_debughlp.o \
@@ -878,6 +881,7 @@ BASELIB_OBJECTS = \
$(OBJS)\baselib_fswatchercmn.o \
$(OBJS)\baselib_fswatcherg.o \
$(OBJS)\baselib_common_secretstore.o \
+ $(OBJS)\baselib_lzmastream.o \
$(OBJS)\baselib_basemsw.o \
$(OBJS)\baselib_crashrpt.o \
$(OBJS)\baselib_debughlp.o \
@@ -6872,6 +6876,9 @@ $(OBJS)\monodll_fswatcherg.o: ../../src/generic/fswatcherg.cpp
$(OBJS)\monodll_common_secretstore.o: ../../src/common/secretstore.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+$(OBJS)\monodll_lzmastream.o: ../../src/common/lzmastream.cpp
+ $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\monodll_basemsw.o: ../../src/msw/basemsw.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
@@ -9420,6 +9427,9 @@ $(OBJS)\monolib_fswatcherg.o: ../../src/generic/fswatcherg.cpp
$(OBJS)\monolib_common_secretstore.o: ../../src/common/secretstore.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+$(OBJS)\monolib_lzmastream.o: ../../src/common/lzmastream.cpp
+ $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\monolib_basemsw.o: ../../src/msw/basemsw.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
@@ -11968,6 +11978,9 @@ $(OBJS)\basedll_fswatcherg.o: ../../src/generic/fswatcherg.cpp
$(OBJS)\basedll_common_secretstore.o: ../../src/common/secretstore.cpp
$(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<
+$(OBJS)\basedll_lzmastream.o: ../../src/common/lzmastream.cpp
+ $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\basedll_basemsw.o: ../../src/msw/basemsw.cpp
$(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<
@@ -12313,6 +12326,9 @@ $(OBJS)\baselib_fswatcherg.o: ../../src/generic/fswatcherg.cpp
$(OBJS)\baselib_common_secretstore.o: ../../src/common/secretstore.cpp
$(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<
+$(OBJS)\baselib_lzmastream.o: ../../src/common/lzmastream.cpp
+ $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\baselib_basemsw.o: ../../src/msw/basemsw.cpp
$(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<
diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc
index b2965f5f63..1015011203 100644
--- a/build/msw/makefile.vc
+++ b/build/msw/makefile.vc
@@ -475,6 +475,7 @@ MONODLL_OBJECTS = \
$(OBJS)\monodll_fswatchercmn.obj \
$(OBJS)\monodll_fswatcherg.obj \
$(OBJS)\monodll_common_secretstore.obj \
+ $(OBJS)\monodll_lzmastream.obj \
$(OBJS)\monodll_basemsw.obj \
$(OBJS)\monodll_crashrpt.obj \
$(OBJS)\monodll_debughlp.obj \
@@ -637,6 +638,7 @@ MONOLIB_OBJECTS = \
$(OBJS)\monolib_fswatchercmn.obj \
$(OBJS)\monolib_fswatcherg.obj \
$(OBJS)\monolib_common_secretstore.obj \
+ $(OBJS)\monolib_lzmastream.obj \
$(OBJS)\monolib_basemsw.obj \
$(OBJS)\monolib_crashrpt.obj \
$(OBJS)\monolib_debughlp.obj \
@@ -793,6 +795,7 @@ BASEDLL_OBJECTS = \
$(OBJS)\basedll_fswatchercmn.obj \
$(OBJS)\basedll_fswatcherg.obj \
$(OBJS)\basedll_common_secretstore.obj \
+ $(OBJS)\basedll_lzmastream.obj \
$(OBJS)\basedll_basemsw.obj \
$(OBJS)\basedll_crashrpt.obj \
$(OBJS)\basedll_debughlp.obj \
@@ -936,6 +939,7 @@ BASELIB_OBJECTS = \
$(OBJS)\baselib_fswatchercmn.obj \
$(OBJS)\baselib_fswatcherg.obj \
$(OBJS)\baselib_common_secretstore.obj \
+ $(OBJS)\baselib_lzmastream.obj \
$(OBJS)\baselib_basemsw.obj \
$(OBJS)\baselib_crashrpt.obj \
$(OBJS)\baselib_debughlp.obj \
@@ -7387,6 +7391,9 @@ $(OBJS)\monodll_fswatcherg.obj: ..\..\src\generic\fswatcherg.cpp
$(OBJS)\monodll_common_secretstore.obj: ..\..\src\common\secretstore.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\secretstore.cpp
+$(OBJS)\monodll_lzmastream.obj: ..\..\src\common\lzmastream.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\lzmastream.cpp
+
$(OBJS)\monodll_basemsw.obj: ..\..\src\msw\basemsw.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\basemsw.cpp
@@ -9933,6 +9940,9 @@ $(OBJS)\monolib_fswatcherg.obj: ..\..\src\generic\fswatcherg.cpp
$(OBJS)\monolib_common_secretstore.obj: ..\..\src\common\secretstore.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\secretstore.cpp
+$(OBJS)\monolib_lzmastream.obj: ..\..\src\common\lzmastream.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\lzmastream.cpp
+
$(OBJS)\monolib_basemsw.obj: ..\..\src\msw\basemsw.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\basemsw.cpp
@@ -12479,6 +12489,9 @@ $(OBJS)\basedll_fswatcherg.obj: ..\..\src\generic\fswatcherg.cpp
$(OBJS)\basedll_common_secretstore.obj: ..\..\src\common\secretstore.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\secretstore.cpp
+$(OBJS)\basedll_lzmastream.obj: ..\..\src\common\lzmastream.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\lzmastream.cpp
+
$(OBJS)\basedll_basemsw.obj: ..\..\src\msw\basemsw.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\msw\basemsw.cpp
@@ -12824,6 +12837,9 @@ $(OBJS)\baselib_fswatcherg.obj: ..\..\src\generic\fswatcherg.cpp
$(OBJS)\baselib_common_secretstore.obj: ..\..\src\common\secretstore.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\secretstore.cpp
+$(OBJS)\baselib_lzmastream.obj: ..\..\src\common\lzmastream.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\lzmastream.cpp
+
$(OBJS)\baselib_basemsw.obj: ..\..\src\msw\basemsw.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\msw\basemsw.cpp
diff --git a/build/msw/wx_base.vcxproj b/build/msw/wx_base.vcxproj
index bdf09a2b7d..920df8bae3 100644
--- a/build/msw/wx_base.vcxproj
+++ b/build/msw/wx_base.vcxproj
@@ -605,6 +605,7 @@
$(IntDir)common_%(Filename).obj
$(IntDir)common_%(Filename).obj
+
@@ -822,6 +823,7 @@
+
diff --git a/build/msw/wx_base.vcxproj.filters b/build/msw/wx_base.vcxproj.filters
index 6e1b1cace5..30fff49b7e 100644
--- a/build/msw/wx_base.vcxproj.filters
+++ b/build/msw/wx_base.vcxproj.filters
@@ -162,6 +162,9 @@
Common Sources
+
+ Common Sources
+
Common Sources
@@ -604,6 +607,9 @@
Common Headers
+
+ Common Headers
+
Common Headers
diff --git a/build/msw/wx_vc7_base.vcproj b/build/msw/wx_vc7_base.vcproj
index 509f9cba53..007b65e75f 100644
--- a/build/msw/wx_vc7_base.vcproj
+++ b/build/msw/wx_vc7_base.vcproj
@@ -462,6 +462,9 @@
+
+
@@ -1135,6 +1138,9 @@
+
+
diff --git a/build/msw/wx_vc8_base.vcproj b/build/msw/wx_vc8_base.vcproj
index 3a22b0bd71..a2014a225b 100644
--- a/build/msw/wx_vc8_base.vcproj
+++ b/build/msw/wx_vc8_base.vcproj
@@ -1053,6 +1053,10 @@
RelativePath="..\..\src\common\longlong.cpp"
>
+
+
@@ -2111,6 +2115,10 @@
RelativePath="..\..\include\wx\longlong.h"
>
+
+
diff --git a/build/msw/wx_vc9_base.vcproj b/build/msw/wx_vc9_base.vcproj
index 2c435c44bb..7b04347201 100644
--- a/build/msw/wx_vc9_base.vcproj
+++ b/build/msw/wx_vc9_base.vcproj
@@ -1049,6 +1049,10 @@
RelativePath="..\..\src\common\longlong.cpp"
>
+
+
@@ -2107,6 +2111,10 @@
RelativePath="..\..\include\wx\longlong.h"
>
+
+
diff --git a/docs/doxygen/mainpages/cat_classes.h b/docs/doxygen/mainpages/cat_classes.h
index 50a6485224..66bad14a00 100644
--- a/docs/doxygen/mainpages/cat_classes.h
+++ b/docs/doxygen/mainpages/cat_classes.h
@@ -703,6 +703,7 @@ Related overview: @ref overview_stream
@li wxTempFileOutputStream: Stream to safely replace an existing file
@li wxStringInputStream: String input stream class
@li wxStringOutputStream: String output stream class
+@li wxLZMAInputStream: LZMA decompression stream class
@li wxZlibInputStream: Zlib and gzip (compression) input stream class
@li wxZlibOutputStream: Zlib and gzip (compression) output stream class
@li wxZipInputStream: Input stream for reading from ZIP archives
diff --git a/include/wx/lzmastream.h b/include/wx/lzmastream.h
new file mode 100644
index 0000000000..3c2a77808f
--- /dev/null
+++ b/include/wx/lzmastream.h
@@ -0,0 +1,54 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name: wx/lzmastream.h
+// Purpose: Filters streams using LZMA(2) compression
+// Author: Vadim Zeitlin
+// Created: 2018-03-29
+// Copyright: (c) 2018 Vadim Zeitlin
+// 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"
+
+struct wxLZMAStream;
+
+// ----------------------------------------------------------------------------
+// Filter for decompressing data compressed using LZMA
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_BASE wxLZMAInputStream : public wxFilterInputStream
+{
+public:
+ explicit wxLZMAInputStream(wxInputStream& stream);
+ explicit wxLZMAInputStream(wxInputStream* stream);
+ virtual ~wxLZMAInputStream();
+
+ 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();
+
+ wxLZMAStream* m_stream;
+ wxUint8* m_inbuf;
+ wxFileOffset m_pos;
+
+ wxDECLARE_NO_COPY_CLASS(wxLZMAInputStream);
+};
+
+WXDLLIMPEXP_BASE wxVersionInfo wxGetLibLZMAVersionInfo();
+
+#endif // wxUSE_LIBLZMA && wxUSE_STREAMS
+
+#endif // _WX_LZMASTREAM_H_
diff --git a/interface/wx/lzmastream.h b/interface/wx/lzmastream.h
new file mode 100644
index 0000000000..7ca8fb5d32
--- /dev/null
+++ b/interface/wx/lzmastream.h
@@ -0,0 +1,60 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name: wx/lzmastream.h
+// Purpose: LZMA [de]compression classes documentation
+// Author: Vadim Zeitlin
+// Created: 2018-03-29
+// Copyright: (c) 2018 Vadim Zeitlin
+// Licence: wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+/**
+ @class wxLZMAInputStream
+
+ This filter stream decompresses data in XZ format.
+
+ XZ format uses LZMA2 algorithm for compression used for .xz files and is
+ similar to GZip or BZip2 format. Notice that it is different from, and
+ incompatible with, 7z archive format even although it uses the same
+ compression algorithm.
+
+ To decompress contents of standard input to standard output, the following
+ (not optimally efficient) code could be used:
+ @code
+ wxFFileInputStream fin(stdin);
+ wxLZMAInputStream zin(fin);
+ wxFFileOutputStream fout(stdout);
+ zin.Read(fout);
+
+ if ( zin.GetLastError() != wxSTREAM_EOF ) {
+ ... handle error ...
+ }
+ @endcode
+
+ @library{wxbase}
+ @category{archive,streams}
+
+ @see wxInputStream, wxZlibInputStream
+
+ @since 3.1.2
+*/
+class wxLZMAInputStream : public wxFilterInputStream
+{
+public:
+ /**
+ Create decompressing stream associated with the given underlying
+ stream.
+
+ This overload does not take ownership of the @a stream.
+ */
+ wxLZMAInputStream(wxInputStream& stream);
+
+ /**
+ Create decompressing stream associated with the given underlying
+ stream and takes ownership of it.
+
+ As with the base wxFilterInputStream class, passing @a stream by
+ pointer indicates that this object takes ownership of it and will
+ delete it when it is itself destroyed.
+ */
+ wxLZMAInputStream(wxInputStream* stream);
+};
diff --git a/src/common/lzmastream.cpp b/src/common/lzmastream.cpp
new file mode 100644
index 0000000000..b8aae286f1
--- /dev/null
+++ b/src/common/lzmastream.cpp
@@ -0,0 +1,210 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name: src/common/lzmastream.cpp
+// Purpose: Implementation of LZMA stream classes
+// Author: Vadim Zeitlin
+// Created: 2018-03-29
+// Copyright: (c) 2018 Vadim Zeitlin
+// Licence: wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#if wxUSE_LIBLZMA && wxUSE_STREAMS
+
+#include "wx/lzmastream.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/log.h"
+ #include "wx/translation.h"
+#endif // WX_PRECOMP
+
+#include
+
+// ----------------------------------------------------------------------------
+// Constants
+// ----------------------------------------------------------------------------
+
+static const size_t wxLZMA_BUF_SIZE = 4096;
+
+// ----------------------------------------------------------------------------
+// Private helpers
+// ----------------------------------------------------------------------------
+
+// Simpler wrapper around lzma_stream, taking care of initializing and
+// finalizing it.
+struct wxLZMAStream : lzma_stream
+{
+ wxLZMAStream()
+ {
+ memset(this, 0, sizeof(lzma_stream));
+ }
+
+ ~wxLZMAStream()
+ {
+ lzma_end(this);
+ }
+};
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// Functions
+// ----------------------------------------------------------------------------
+
+wxVersionInfo wxGetLibLZMAVersionInfo()
+{
+ const uint32_t ver = lzma_version_number();
+
+ // For now ignore the "stability" part of the version.
+ return wxVersionInfo
+ (
+ "liblzma",
+ ver / 10000000,
+ (ver % 10000000) / 10000,
+ (ver % 10000) / 10
+ );
+}
+
+// ----------------------------------------------------------------------------
+// wxLZMAInputStream: decompression
+// ----------------------------------------------------------------------------
+
+wxLZMAInputStream::wxLZMAInputStream(wxInputStream& stream)
+ : wxFilterInputStream(stream)
+{
+ Init();
+}
+
+wxLZMAInputStream::wxLZMAInputStream(wxInputStream* stream)
+ : wxFilterInputStream(stream)
+{
+ Init();
+}
+
+void wxLZMAInputStream::Init()
+{
+ m_stream = new wxLZMAStream;
+ m_inbuf = new wxUint8[wxLZMA_BUF_SIZE];
+ m_pos = 0;
+
+ // We don't specify any memory usage limit nor any flags, not even
+ // LZMA_CONCATENATED recommended by liblzma documentation, because we don't
+ // foresee the need to support concatenated compressed files for now.
+ const lzma_ret rc = lzma_stream_decoder(m_stream, UINT64_MAX, 0);
+ switch ( rc )
+ {
+ case LZMA_OK:
+ // Skip setting m_lasterror below.
+ return;
+
+ case LZMA_MEM_ERROR:
+ wxLogError(_("Failed to allocate memory for LZMA decompression."));
+ break;
+
+ default:
+ wxLogError(_("Failed to initialize LZMA decompression: "
+ "unexpected error %u."),
+ rc);
+ break;
+ }
+
+ m_lasterror = wxSTREAM_READ_ERROR;
+}
+
+wxLZMAInputStream::~wxLZMAInputStream()
+{
+ delete [] m_inbuf;
+ delete m_stream;
+}
+
+size_t wxLZMAInputStream::OnSysRead(void* outbuf, size_t size)
+{
+ m_stream->next_out = static_cast(outbuf);
+ m_stream->avail_out = size;
+
+ // Decompress input as long as we don't have any errors (including EOF, as
+ // it doesn't make sense to continue after it neither) and have space to
+ // decompress it to.
+ while ( m_lasterror == wxSTREAM_NO_ERROR && m_stream->avail_out > 0 )
+ {
+ // Get more input data if needed.
+ if ( !m_stream->avail_in )
+ {
+ m_parent_i_stream->Read(m_inbuf, wxLZMA_BUF_SIZE);
+ m_stream->next_in = m_inbuf;
+ m_stream->avail_in = m_parent_i_stream->LastRead();
+
+ if ( !m_stream->avail_in )
+ {
+ if ( m_parent_i_stream->GetLastError() == wxSTREAM_EOF )
+ {
+ // We have reached end of the underlying stream.
+ m_lasterror = wxSTREAM_EOF;
+ break;
+ }
+
+ m_lasterror = wxSTREAM_READ_ERROR;
+ return 0;
+ }
+ }
+
+ // Do decompress.
+ const lzma_ret rc = lzma_code(m_stream, LZMA_RUN);
+
+ wxString err;
+ switch ( rc )
+ {
+ case LZMA_OK:
+ continue;
+
+ case LZMA_STREAM_END:
+ m_lasterror = wxSTREAM_EOF;
+ continue;
+
+ case LZMA_FORMAT_ERROR:
+ err = wxTRANSLATE("input is not in XZ format");
+ break;
+
+ case LZMA_OPTIONS_ERROR:
+ err = wxTRANSLATE("input compressed using unknown XZ option");
+ break;
+
+ case LZMA_DATA_ERROR:
+ case LZMA_BUF_ERROR:
+ err = wxTRANSLATE("input is corrupted");
+ break;
+
+ default:
+ err = wxTRANSLATE("unknown decompression error");
+ break;
+ }
+
+ wxLogError(_("LZMA decompression error: %s"), wxGetTranslation(err));
+
+ m_lasterror = wxSTREAM_READ_ERROR;
+ return 0;
+ }
+
+ // Return the number of bytes actually read, this may be less than the
+ // requested size if we hit EOF.
+ size -= m_stream->avail_out;
+ m_pos += size;
+ return size;
+}
+
+#endif // wxUSE_LIBLZMA && wxUSE_STREAMS