Add wxFileSystemHandler for "data" scheme

This notably allows embedding images directly in HTML.

Closes #24138.
This commit is contained in:
Viachaslau Lisouski 2023-12-15 09:07:39 +01:00 committed by Vadim Zeitlin
parent 68eaff5c02
commit ca405352e0
14 changed files with 306 additions and 1 deletions

View file

@ -603,6 +603,7 @@ ALL_BASE_HEADERS = \
wx/lzmastream.h \ wx/lzmastream.h \
wx/localedefs.h \ wx/localedefs.h \
wx/uilocale.h \ wx/uilocale.h \
wx/fs_data.h \
$(BASE_PLATFORM_HDR) \ $(BASE_PLATFORM_HDR) \
wx/fs_inet.h \ wx/fs_inet.h \
wx/protocol/file.h \ wx/protocol/file.h \
@ -789,6 +790,7 @@ ALL_PORTS_BASE_HEADERS = \
wx/lzmastream.h \ wx/lzmastream.h \
wx/localedefs.h \ wx/localedefs.h \
wx/uilocale.h \ wx/uilocale.h \
wx/fs_data.h \
wx/unix/app.h \ wx/unix/app.h \
wx/unix/apptbase.h \ wx/unix/apptbase.h \
wx/unix/apptrait.h \ wx/unix/apptrait.h \
@ -925,6 +927,7 @@ ALL_BASE_SOURCES = \
src/common/secretstore.cpp \ src/common/secretstore.cpp \
src/common/lzmastream.cpp \ src/common/lzmastream.cpp \
src/common/uilocale.cpp \ src/common/uilocale.cpp \
src/common/fs_data.cpp \
src/common/fdiodispatcher.cpp \ src/common/fdiodispatcher.cpp \
src/common/selectdispatcher.cpp \ src/common/selectdispatcher.cpp \
src/unix/appunix.cpp \ src/unix/appunix.cpp \
@ -1130,6 +1133,7 @@ MONODLL_OBJECTS = \
monodll_common_secretstore.o \ monodll_common_secretstore.o \
monodll_lzmastream.o \ monodll_lzmastream.o \
monodll_common_uilocale.o \ monodll_common_uilocale.o \
monodll_fs_data.o \
$(__BASE_PLATFORM_SRC_OBJECTS) \ $(__BASE_PLATFORM_SRC_OBJECTS) \
monodll_event.o \ monodll_event.o \
monodll_fs_mem.o \ monodll_fs_mem.o \
@ -1289,6 +1293,7 @@ MONOLIB_OBJECTS = \
monolib_common_secretstore.o \ monolib_common_secretstore.o \
monolib_lzmastream.o \ monolib_lzmastream.o \
monolib_common_uilocale.o \ monolib_common_uilocale.o \
monolib_fs_data.o \
$(__BASE_PLATFORM_SRC_OBJECTS_1) \ $(__BASE_PLATFORM_SRC_OBJECTS_1) \
monolib_event.o \ monolib_event.o \
monolib_fs_mem.o \ monolib_fs_mem.o \
@ -1417,6 +1422,7 @@ BASEDLL_OBJECTS = \
basedll_common_secretstore.o \ basedll_common_secretstore.o \
basedll_lzmastream.o \ basedll_lzmastream.o \
basedll_common_uilocale.o \ basedll_common_uilocale.o \
basedll_fs_data.o \
$(__BASE_PLATFORM_SRC_OBJECTS_2) \ $(__BASE_PLATFORM_SRC_OBJECTS_2) \
basedll_event.o \ basedll_event.o \
basedll_fs_mem.o \ basedll_fs_mem.o \
@ -1527,6 +1533,7 @@ BASELIB_OBJECTS = \
baselib_common_secretstore.o \ baselib_common_secretstore.o \
baselib_lzmastream.o \ baselib_lzmastream.o \
baselib_common_uilocale.o \ baselib_common_uilocale.o \
baselib_fs_data.o \
$(__BASE_PLATFORM_SRC_OBJECTS_3) \ $(__BASE_PLATFORM_SRC_OBJECTS_3) \
baselib_event.o \ baselib_event.o \
baselib_fs_mem.o \ baselib_fs_mem.o \
@ -14966,6 +14973,9 @@ monodll_lzmastream.o: $(srcdir)/src/common/lzmastream.cpp $(MONODLL_ODEP)
monodll_common_uilocale.o: $(srcdir)/src/common/uilocale.cpp $(MONODLL_ODEP) monodll_common_uilocale.o: $(srcdir)/src/common/uilocale.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/uilocale.cpp $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/uilocale.cpp
monodll_fs_data.o: $(srcdir)/src/common/fs_data.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/fs_data.cpp
monodll_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(MONODLL_ODEP) monodll_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp
@ -19712,6 +19722,9 @@ monolib_lzmastream.o: $(srcdir)/src/common/lzmastream.cpp $(MONOLIB_ODEP)
monolib_common_uilocale.o: $(srcdir)/src/common/uilocale.cpp $(MONOLIB_ODEP) monolib_common_uilocale.o: $(srcdir)/src/common/uilocale.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/uilocale.cpp $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/uilocale.cpp
monolib_fs_data.o: $(srcdir)/src/common/fs_data.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/fs_data.cpp
monolib_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(MONOLIB_ODEP) monolib_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp
@ -24458,6 +24471,9 @@ basedll_lzmastream.o: $(srcdir)/src/common/lzmastream.cpp $(BASEDLL_ODEP)
basedll_common_uilocale.o: $(srcdir)/src/common/uilocale.cpp $(BASEDLL_ODEP) basedll_common_uilocale.o: $(srcdir)/src/common/uilocale.cpp $(BASEDLL_ODEP)
$(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/uilocale.cpp $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/uilocale.cpp
basedll_fs_data.o: $(srcdir)/src/common/fs_data.cpp $(BASEDLL_ODEP)
$(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/fs_data.cpp
basedll_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(BASEDLL_ODEP) basedll_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(BASEDLL_ODEP)
$(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp
@ -24938,6 +24954,9 @@ baselib_lzmastream.o: $(srcdir)/src/common/lzmastream.cpp $(BASELIB_ODEP)
baselib_common_uilocale.o: $(srcdir)/src/common/uilocale.cpp $(BASELIB_ODEP) baselib_common_uilocale.o: $(srcdir)/src/common/uilocale.cpp $(BASELIB_ODEP)
$(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/uilocale.cpp $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/uilocale.cpp
baselib_fs_data.o: $(srcdir)/src/common/fs_data.cpp $(BASELIB_ODEP)
$(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/fs_data.cpp
baselib_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(BASELIB_ODEP) baselib_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(BASELIB_ODEP)
$(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp

View file

@ -580,6 +580,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/common/secretstore.cpp src/common/secretstore.cpp
src/common/lzmastream.cpp src/common/lzmastream.cpp
src/common/uilocale.cpp src/common/uilocale.cpp
src/common/fs_data.cpp
</set> </set>
<set var="BASE_AND_GUI_CMN_SRC" hints="files"> <set var="BASE_AND_GUI_CMN_SRC" hints="files">
src/common/event.cpp src/common/event.cpp
@ -755,6 +756,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
wx/lzmastream.h wx/lzmastream.h
wx/localedefs.h wx/localedefs.h
wx/uilocale.h wx/uilocale.h
wx/fs_data.h
</set> </set>

View file

@ -492,6 +492,7 @@ set(BASE_CMN_SRC
src/generic/fswatcherg.cpp src/generic/fswatcherg.cpp
src/common/lzmastream.cpp src/common/lzmastream.cpp
src/common/uilocale.cpp src/common/uilocale.cpp
src/common/fs_data.cpp
) )
set(BASE_AND_GUI_CMN_SRC set(BASE_AND_GUI_CMN_SRC
@ -669,6 +670,7 @@ set(BASE_CMN_HDR
wx/lzmastream.h wx/lzmastream.h
wx/localedefs.h wx/localedefs.h
wx/uilocale.h wx/uilocale.h
wx/fs_data.h
) )
set(NET_UNIX_SRC set(NET_UNIX_SRC

View file

@ -455,6 +455,7 @@ BASE_CMN_SRC =
src/common/filtfind.cpp src/common/filtfind.cpp
src/common/fmapbase.cpp src/common/fmapbase.cpp
src/common/fs_arc.cpp src/common/fs_arc.cpp
src/common/fs_data.cpp
src/common/fs_filter.cpp src/common/fs_filter.cpp
src/common/hash.cpp src/common/hash.cpp
src/common/hashmap.cpp src/common/hashmap.cpp
@ -571,6 +572,7 @@ BASE_CMN_HDR =
wx/fontenc.h wx/fontenc.h
wx/fontmap.h wx/fontmap.h
wx/fs_arc.h wx/fs_arc.h
wx/fs_data.h
wx/fs_filter.h wx/fs_filter.h
wx/fs_mem.h wx/fs_mem.h
wx/fs_zip.h wx/fs_zip.h

View file

@ -498,6 +498,7 @@ MONODLL_OBJECTS = \
$(OBJS)\monodll_common_secretstore.o \ $(OBJS)\monodll_common_secretstore.o \
$(OBJS)\monodll_lzmastream.o \ $(OBJS)\monodll_lzmastream.o \
$(OBJS)\monodll_common_uilocale.o \ $(OBJS)\monodll_common_uilocale.o \
$(OBJS)\monodll_fs_data.o \
$(OBJS)\monodll_basemsw.o \ $(OBJS)\monodll_basemsw.o \
$(OBJS)\monodll_crashrpt.o \ $(OBJS)\monodll_crashrpt.o \
$(OBJS)\monodll_debughlp.o \ $(OBJS)\monodll_debughlp.o \
@ -659,6 +660,7 @@ MONOLIB_OBJECTS = \
$(OBJS)\monolib_common_secretstore.o \ $(OBJS)\monolib_common_secretstore.o \
$(OBJS)\monolib_lzmastream.o \ $(OBJS)\monolib_lzmastream.o \
$(OBJS)\monolib_common_uilocale.o \ $(OBJS)\monolib_common_uilocale.o \
$(OBJS)\monolib_fs_data.o \
$(OBJS)\monolib_basemsw.o \ $(OBJS)\monolib_basemsw.o \
$(OBJS)\monolib_crashrpt.o \ $(OBJS)\monolib_crashrpt.o \
$(OBJS)\monolib_debughlp.o \ $(OBJS)\monolib_debughlp.o \
@ -808,6 +810,7 @@ BASEDLL_OBJECTS = \
$(OBJS)\basedll_common_secretstore.o \ $(OBJS)\basedll_common_secretstore.o \
$(OBJS)\basedll_lzmastream.o \ $(OBJS)\basedll_lzmastream.o \
$(OBJS)\basedll_common_uilocale.o \ $(OBJS)\basedll_common_uilocale.o \
$(OBJS)\basedll_fs_data.o \
$(OBJS)\basedll_basemsw.o \ $(OBJS)\basedll_basemsw.o \
$(OBJS)\basedll_crashrpt.o \ $(OBJS)\basedll_crashrpt.o \
$(OBJS)\basedll_debughlp.o \ $(OBJS)\basedll_debughlp.o \
@ -938,6 +941,7 @@ BASELIB_OBJECTS = \
$(OBJS)\baselib_common_secretstore.o \ $(OBJS)\baselib_common_secretstore.o \
$(OBJS)\baselib_lzmastream.o \ $(OBJS)\baselib_lzmastream.o \
$(OBJS)\baselib_common_uilocale.o \ $(OBJS)\baselib_common_uilocale.o \
$(OBJS)\baselib_fs_data.o \
$(OBJS)\baselib_basemsw.o \ $(OBJS)\baselib_basemsw.o \
$(OBJS)\baselib_crashrpt.o \ $(OBJS)\baselib_crashrpt.o \
$(OBJS)\baselib_debughlp.o \ $(OBJS)\baselib_debughlp.o \
@ -7235,6 +7239,9 @@ $(OBJS)\monodll_lzmastream.o: ../../src/common/lzmastream.cpp
$(OBJS)\monodll_common_uilocale.o: ../../src/common/uilocale.cpp $(OBJS)\monodll_common_uilocale.o: ../../src/common/uilocale.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\monodll_fs_data.o: ../../src/common/fs_data.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\monodll_basemsw.o: ../../src/msw/basemsw.cpp $(OBJS)\monodll_basemsw.o: ../../src/msw/basemsw.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
@ -9826,6 +9833,9 @@ $(OBJS)\monolib_lzmastream.o: ../../src/common/lzmastream.cpp
$(OBJS)\monolib_common_uilocale.o: ../../src/common/uilocale.cpp $(OBJS)\monolib_common_uilocale.o: ../../src/common/uilocale.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\monolib_fs_data.o: ../../src/common/fs_data.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\monolib_basemsw.o: ../../src/msw/basemsw.cpp $(OBJS)\monolib_basemsw.o: ../../src/msw/basemsw.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
@ -12417,6 +12427,9 @@ $(OBJS)\basedll_lzmastream.o: ../../src/common/lzmastream.cpp
$(OBJS)\basedll_common_uilocale.o: ../../src/common/uilocale.cpp $(OBJS)\basedll_common_uilocale.o: ../../src/common/uilocale.cpp
$(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $< $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\basedll_fs_data.o: ../../src/common/fs_data.cpp
$(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\basedll_basemsw.o: ../../src/msw/basemsw.cpp $(OBJS)\basedll_basemsw.o: ../../src/msw/basemsw.cpp
$(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $< $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<
@ -12759,6 +12772,9 @@ $(OBJS)\baselib_lzmastream.o: ../../src/common/lzmastream.cpp
$(OBJS)\baselib_common_uilocale.o: ../../src/common/uilocale.cpp $(OBJS)\baselib_common_uilocale.o: ../../src/common/uilocale.cpp
$(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $< $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\baselib_fs_data.o: ../../src/common/fs_data.cpp
$(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\baselib_basemsw.o: ../../src/msw/basemsw.cpp $(OBJS)\baselib_basemsw.o: ../../src/msw/basemsw.cpp
$(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $< $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<

View file

@ -534,6 +534,7 @@ MONODLL_OBJECTS = \
$(OBJS)\monodll_common_secretstore.obj \ $(OBJS)\monodll_common_secretstore.obj \
$(OBJS)\monodll_lzmastream.obj \ $(OBJS)\monodll_lzmastream.obj \
$(OBJS)\monodll_common_uilocale.obj \ $(OBJS)\monodll_common_uilocale.obj \
$(OBJS)\monodll_fs_data.obj \
$(OBJS)\monodll_basemsw.obj \ $(OBJS)\monodll_basemsw.obj \
$(OBJS)\monodll_crashrpt.obj \ $(OBJS)\monodll_crashrpt.obj \
$(OBJS)\monodll_debughlp.obj \ $(OBJS)\monodll_debughlp.obj \
@ -704,6 +705,7 @@ MONOLIB_OBJECTS = \
$(OBJS)\monolib_common_secretstore.obj \ $(OBJS)\monolib_common_secretstore.obj \
$(OBJS)\monolib_lzmastream.obj \ $(OBJS)\monolib_lzmastream.obj \
$(OBJS)\monolib_common_uilocale.obj \ $(OBJS)\monolib_common_uilocale.obj \
$(OBJS)\monolib_fs_data.obj \
$(OBJS)\monolib_basemsw.obj \ $(OBJS)\monolib_basemsw.obj \
$(OBJS)\monolib_crashrpt.obj \ $(OBJS)\monolib_crashrpt.obj \
$(OBJS)\monolib_debughlp.obj \ $(OBJS)\monolib_debughlp.obj \
@ -862,6 +864,7 @@ BASEDLL_OBJECTS = \
$(OBJS)\basedll_common_secretstore.obj \ $(OBJS)\basedll_common_secretstore.obj \
$(OBJS)\basedll_lzmastream.obj \ $(OBJS)\basedll_lzmastream.obj \
$(OBJS)\basedll_common_uilocale.obj \ $(OBJS)\basedll_common_uilocale.obj \
$(OBJS)\basedll_fs_data.obj \
$(OBJS)\basedll_basemsw.obj \ $(OBJS)\basedll_basemsw.obj \
$(OBJS)\basedll_crashrpt.obj \ $(OBJS)\basedll_crashrpt.obj \
$(OBJS)\basedll_debughlp.obj \ $(OBJS)\basedll_debughlp.obj \
@ -1002,6 +1005,7 @@ BASELIB_OBJECTS = \
$(OBJS)\baselib_common_secretstore.obj \ $(OBJS)\baselib_common_secretstore.obj \
$(OBJS)\baselib_lzmastream.obj \ $(OBJS)\baselib_lzmastream.obj \
$(OBJS)\baselib_common_uilocale.obj \ $(OBJS)\baselib_common_uilocale.obj \
$(OBJS)\baselib_fs_data.obj \
$(OBJS)\baselib_basemsw.obj \ $(OBJS)\baselib_basemsw.obj \
$(OBJS)\baselib_crashrpt.obj \ $(OBJS)\baselib_crashrpt.obj \
$(OBJS)\baselib_debughlp.obj \ $(OBJS)\baselib_debughlp.obj \
@ -7692,6 +7696,9 @@ $(OBJS)\monodll_lzmastream.obj: ..\..\src\common\lzmastream.cpp
$(OBJS)\monodll_common_uilocale.obj: ..\..\src\common\uilocale.cpp $(OBJS)\monodll_common_uilocale.obj: ..\..\src\common\uilocale.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\uilocale.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\uilocale.cpp
$(OBJS)\monodll_fs_data.obj: ..\..\src\common\fs_data.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\fs_data.cpp
$(OBJS)\monodll_basemsw.obj: ..\..\src\msw\basemsw.cpp $(OBJS)\monodll_basemsw.obj: ..\..\src\msw\basemsw.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\basemsw.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\basemsw.cpp
@ -10283,6 +10290,9 @@ $(OBJS)\monolib_lzmastream.obj: ..\..\src\common\lzmastream.cpp
$(OBJS)\monolib_common_uilocale.obj: ..\..\src\common\uilocale.cpp $(OBJS)\monolib_common_uilocale.obj: ..\..\src\common\uilocale.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\uilocale.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\uilocale.cpp
$(OBJS)\monolib_fs_data.obj: ..\..\src\common\fs_data.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\fs_data.cpp
$(OBJS)\monolib_basemsw.obj: ..\..\src\msw\basemsw.cpp $(OBJS)\monolib_basemsw.obj: ..\..\src\msw\basemsw.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\basemsw.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\basemsw.cpp
@ -12874,6 +12884,9 @@ $(OBJS)\basedll_lzmastream.obj: ..\..\src\common\lzmastream.cpp
$(OBJS)\basedll_common_uilocale.obj: ..\..\src\common\uilocale.cpp $(OBJS)\basedll_common_uilocale.obj: ..\..\src\common\uilocale.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\uilocale.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\uilocale.cpp
$(OBJS)\basedll_fs_data.obj: ..\..\src\common\fs_data.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\fs_data.cpp
$(OBJS)\basedll_basemsw.obj: ..\..\src\msw\basemsw.cpp $(OBJS)\basedll_basemsw.obj: ..\..\src\msw\basemsw.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\msw\basemsw.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\msw\basemsw.cpp
@ -13216,6 +13229,9 @@ $(OBJS)\baselib_lzmastream.obj: ..\..\src\common\lzmastream.cpp
$(OBJS)\baselib_common_uilocale.obj: ..\..\src\common\uilocale.cpp $(OBJS)\baselib_common_uilocale.obj: ..\..\src\common\uilocale.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\uilocale.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\uilocale.cpp
$(OBJS)\baselib_fs_data.obj: ..\..\src\common\fs_data.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\fs_data.cpp
$(OBJS)\baselib_basemsw.obj: ..\..\src\msw\basemsw.cpp $(OBJS)\baselib_basemsw.obj: ..\..\src\msw\basemsw.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\msw\basemsw.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\msw\basemsw.cpp

View file

@ -622,6 +622,7 @@
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)common_%(Filename).obj</ObjectFileName> <ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)common_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)common_%(Filename).obj</ObjectFileName> <ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)common_%(Filename).obj</ObjectFileName>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\common\fs_data.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="..\..\src\msw\version.rc"> <ResourceCompile Include="..\..\src\msw\version.rc">
@ -841,6 +842,7 @@
<ClInclude Include="..\..\include\wx\lzmastream.h" /> <ClInclude Include="..\..\include\wx\lzmastream.h" />
<ClInclude Include="..\..\include\wx\localedefs.h" /> <ClInclude Include="..\..\include\wx\localedefs.h" />
<ClInclude Include="..\..\include\wx\uilocale.h" /> <ClInclude Include="..\..\include\wx\uilocale.h" />
<ClInclude Include="..\..\include\wx\fs_data.h" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">

View file

@ -123,6 +123,9 @@
<ClCompile Include="..\..\src\common\fs_arc.cpp"> <ClCompile Include="..\..\src\common\fs_arc.cpp">
<Filter>Common Sources</Filter> <Filter>Common Sources</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\common\fs_data.cpp">
<Filter>Common Sources</Filter>
</ClCompile>
<ClCompile Include="..\..\src\common\fs_filter.cpp"> <ClCompile Include="..\..\src\common\fs_filter.cpp">
<Filter>Common Sources</Filter> <Filter>Common Sources</Filter>
</ClCompile> </ClCompile>
@ -535,6 +538,9 @@
<ClInclude Include="..\..\include\wx\fs_arc.h"> <ClInclude Include="..\..\include\wx\fs_arc.h">
<Filter>Common Headers</Filter> <Filter>Common Headers</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\include\wx\fs_data.h">
<Filter>Common Headers</Filter>
</ClInclude>
<ClInclude Include="..\..\include\wx\fs_filter.h"> <ClInclude Include="..\..\include\wx\fs_filter.h">
<Filter>Common Headers</Filter> <Filter>Common Headers</Filter>
</ClInclude> </ClInclude>

View file

@ -73,6 +73,10 @@ The following virtual file system handlers are part of wxWidgets so far:
A handler for archives such as zip A handler for archives such as zip
and tar. Include file is wx/fs_arc.h. URLs examples: and tar. Include file is wx/fs_arc.h. URLs examples:
"archive.zip#zip:filename", "archive.tar.gz#gzip:#tar:filename". "archive.zip#zip:filename", "archive.tar.gz#gzip:#tar:filename".
@li @b wxDataSchemeFSHandler:
A handler for accessing data inlined in URI according to RFC 2397.
URI example: "data:text/plain;base64,d3hXaWRnZXRzIGV4YW1wbGU=".
Include file is wx/fs_data.h.
@li @b wxFilterFSHandler: @li @b wxFilterFSHandler:
A handler for compression schemes such A handler for compression schemes such
as gzip. Header is wx/fs_filter.h. URLs are in the form, e.g.: as gzip. Header is wx/fs_filter.h. URLs are in the form, e.g.:

31
include/wx/fs_data.h Normal file
View file

@ -0,0 +1,31 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/fs_data.h
// Purpose: DATA scheme file system.
// Author: Vyacheslav Lisovski
// Copyright: (c) 2023 Vyacheslav Lisovski
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_FS_DATA_H_
#define _WX_FS_DATA_H_
#include "wx/defs.h"
#if wxUSE_FILESYSTEM
#include "wx/filesys.h"
// ----------------------------------------------------------------------------
// wxDataSchemeFSHandler
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_BASE wxDataSchemeFSHandler : public wxFileSystemHandler
{
public:
virtual bool CanOpen(const wxString& location) override;
virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location) override;
};
#endif // wxUSE_FILESYSTEM
#endif // _WX_FS_DATA_H_

31
interface/wx/fs_data.h Normal file
View file

@ -0,0 +1,31 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/fs_data.h
// Purpose: DATA scheme file system
// Author: Vyacheslav Lisovski
// Copyright: (c) 2023 Vyacheslav Lisovski
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
/**
@class wxDataSchemeFSHandler
File system handler for "data" URI scheme (RFC 2397).
URI syntax: @c "data:[<mediatype>][;base64],<data>".
The handler makes the data, included (encoded) into URI, available for
components that use the wxFileSystem infrastructure.
To make available for usage it should be registered somewhere within an
initialization procedure:
@code
wxFileSystem::AddHandler(new wxDataSchemeFSHandler);
@endcode
@since 3.3.0
*/
class wxDataSchemeFSHandler : public wxFileSystemHandler
{
public:
wxDataSchemeFSHandler();
};

126
src/common/fs_data.cpp Normal file
View file

@ -0,0 +1,126 @@
/////////////////////////////////////////////////////////////////////////////
// Name: src/common/fs_data.cpp
// Purpose: DATA scheme file system
// Author: Vyacheslav Lisovski
// Copyright: (c) 2023 Vyacheslav Lisovski
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#if wxUSE_FILESYSTEM
#include "wx/fs_data.h"
#include "wx/base64.h"
#include "wx/filesys.h"
#include "wx/mstream.h"
#include "wx/sstream.h"
#include "wx/uri.h"
namespace
{
// This stream holds the buffer and deletes when destroyed
class wxBufferedMemoryInputStream : public wxMemoryInputStream
{
public:
wxBufferedMemoryInputStream(const wxMemoryBuffer& buffer) :
wxMemoryInputStream(buffer.GetData(), buffer.GetDataLen()),
m_buffer{buffer}
{
}
private:
wxMemoryBuffer m_buffer;
};
// URL syntax: data:[<mediatype>][;base64],<data>
int GetMetadata(const wxString& location, wxString& mediatype, bool& isBase64)
{
int dataPos = location.Find(',');
if (dataPos > 0)
{
const int hdrPos = location.Find(':');
if (hdrPos > 0)
{
wxString metadata(location, hdrPos + 1, dataPos - hdrPos - 1);
int encPos = metadata.Find(';', true);
if (encPos > 0)
{
auto encoding = metadata.Right(metadata.Len() - encPos - 1);
if (encoding.IsSameAs("base64", false))
{
isBase64 = true;
}
else
{
encPos = metadata.Len();
}
}
else
encPos = metadata.Len();
mediatype = metadata.Left(encPos);
}
++dataPos;
}
return dataPos;
}
} // anonymous namespace
// ----------------------------------------------------------------------------
// wxDataSchemeFSHandler
// ----------------------------------------------------------------------------
bool wxDataSchemeFSHandler::CanOpen(const wxString& location)
{
return GetProtocol(location).IsSameAs("data", false);
}
wxFSFile* wxDataSchemeFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs),
const wxString& location)
{
wxString mediatype;
bool isBase64 = false;
int dataPos = GetMetadata(location, mediatype, isBase64);
if (dataPos < 0)
return nullptr;
if (mediatype.IsEmpty())
mediatype = "text/plain";
wxInputStream* stream = nullptr;
if (isBase64)
{
#if wxUSE_BASE64
stream = new wxBufferedMemoryInputStream(
wxBase64Decode(location.Right(location.Len() - dataPos)));
#endif // wxUSE_BASE64
}
else
{
stream = new wxStringInputStream(
wxURI::Unescape(location.Right(location.Len() - dataPos)));
}
if (stream)
{
return new wxFSFile(stream,
"",
mediatype,
""
#if wxUSE_DATETIME
, wxDateTime::Now()
#endif // wxUSE_DATETIME
);
}
return nullptr;
}
#endif // wxUSE_FILESYSTEM

View file

@ -152,6 +152,7 @@
#include <wx/fontutil.h> #include <wx/fontutil.h>
#include <wx/frame.h> #include <wx/frame.h>
#include <wx/fs_arc.h> #include <wx/fs_arc.h>
#include <wx/fs_data.h>
#include <wx/fs_filter.h> #include <wx/fs_filter.h>
#include <wx/fs_inet.h> #include <wx/fs_inet.h>
#include <wx/fs_mem.h> #include <wx/fs_mem.h>

View file

@ -1,7 +1,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Name: tests/filesys/filesys.cpp // Name: tests/filesys/filesys.cpp
// Purpose: wxFileSystem unit test // Purpose: wxFileSystem unit test
// Author: Vaclav Slavik // Author: Vaclav Slavik, Vyacheslav Lisovski
// Created: 2004-03-28 // Created: 2004-03-28
// Copyright: (c) 2004 Vaclav Slavik // Copyright: (c) 2004 Vaclav Slavik
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -21,7 +21,9 @@
#if wxUSE_FILESYSTEM #if wxUSE_FILESYSTEM
#include "wx/fs_data.h"
#include "wx/fs_mem.h" #include "wx/fs_mem.h"
#include "wx/sstream.h"
#include <memory> #include <memory>
@ -177,6 +179,51 @@ TEST_CASE("wxFileSystem::UnicodeFileNameToUrlConversion", "[filesys][url][filena
CHECK( filename.SameAs(wxFileName::URLToFileName(url)) ); CHECK( filename.SameAs(wxFileName::URLToFileName(url)) );
} }
TEST_CASE("wxFileSystem::DataSchemeFSHandler", "[filesys][dataschemefshandler][openfile]")
{
// Install wxDataSchemeFSHandler just for the duration of this test.
class AutoDataSchemeFSHandler
{
public:
AutoDataSchemeFSHandler() : m_handler(new wxDataSchemeFSHandler())
{
wxFileSystem::AddHandler(m_handler.get());
}
~AutoDataSchemeFSHandler()
{
wxFileSystem::RemoveHandler(m_handler.get());
}
private:
std::unique_ptr<wxDataSchemeFSHandler> const m_handler;
} autoDataSchemeFSHandler;
wxFileSystem fs;
const struct wxTestCaseData
{
const char *info, *input, *result1, *result2;
} testData[] =
{
{ "Testing minimal URI with data",
"data:,the%20data", "text/plain", "the data" },
{ "Testing base64 encoded",
"data:x-t1/x-s1;base64,SGVsbG8sIFdvcmxkIQ==", "x-t1/x-s1", "Hello, World!" },
{ "Testing complex media type",
"data:image/svg+xml;utf8,<svg width='10'... </svg>", "image/svg+xml;utf8", "<svg width='10'... </svg>" }
};
for ( const auto& dataItem : testData )
{
INFO(dataItem.info);
std::unique_ptr<wxFSFile> file(fs.OpenFile(dataItem.input));
CHECK(file->GetMimeType() == dataItem.result1);
wxStringOutputStream sos;
sos.Write(*file->GetStream());
CHECK(sos.GetString () == dataItem.result2);
}
}
// Test that using FindFirst() after removing a previously found URL works: // Test that using FindFirst() after removing a previously found URL works:
// this used to be broken, see https://github.com/wxWidgets/wxWidgets/issues/18744 // this used to be broken, see https://github.com/wxWidgets/wxWidgets/issues/18744
TEST_CASE("wxFileSystem::MemoryFSHandler", "[filesys][memoryfshandler][find]") TEST_CASE("wxFileSystem::MemoryFSHandler", "[filesys][memoryfshandler][find]")