Add wxFileSystemHandler for "data" scheme
This notably allows embedding images directly in HTML. Closes #24138.
This commit is contained in:
parent
68eaff5c02
commit
ca405352e0
14 changed files with 306 additions and 1 deletions
19
Makefile.in
19
Makefile.in
|
|
@ -603,6 +603,7 @@ ALL_BASE_HEADERS = \
|
|||
wx/lzmastream.h \
|
||||
wx/localedefs.h \
|
||||
wx/uilocale.h \
|
||||
wx/fs_data.h \
|
||||
$(BASE_PLATFORM_HDR) \
|
||||
wx/fs_inet.h \
|
||||
wx/protocol/file.h \
|
||||
|
|
@ -789,6 +790,7 @@ ALL_PORTS_BASE_HEADERS = \
|
|||
wx/lzmastream.h \
|
||||
wx/localedefs.h \
|
||||
wx/uilocale.h \
|
||||
wx/fs_data.h \
|
||||
wx/unix/app.h \
|
||||
wx/unix/apptbase.h \
|
||||
wx/unix/apptrait.h \
|
||||
|
|
@ -925,6 +927,7 @@ ALL_BASE_SOURCES = \
|
|||
src/common/secretstore.cpp \
|
||||
src/common/lzmastream.cpp \
|
||||
src/common/uilocale.cpp \
|
||||
src/common/fs_data.cpp \
|
||||
src/common/fdiodispatcher.cpp \
|
||||
src/common/selectdispatcher.cpp \
|
||||
src/unix/appunix.cpp \
|
||||
|
|
@ -1130,6 +1133,7 @@ MONODLL_OBJECTS = \
|
|||
monodll_common_secretstore.o \
|
||||
monodll_lzmastream.o \
|
||||
monodll_common_uilocale.o \
|
||||
monodll_fs_data.o \
|
||||
$(__BASE_PLATFORM_SRC_OBJECTS) \
|
||||
monodll_event.o \
|
||||
monodll_fs_mem.o \
|
||||
|
|
@ -1289,6 +1293,7 @@ MONOLIB_OBJECTS = \
|
|||
monolib_common_secretstore.o \
|
||||
monolib_lzmastream.o \
|
||||
monolib_common_uilocale.o \
|
||||
monolib_fs_data.o \
|
||||
$(__BASE_PLATFORM_SRC_OBJECTS_1) \
|
||||
monolib_event.o \
|
||||
monolib_fs_mem.o \
|
||||
|
|
@ -1417,6 +1422,7 @@ BASEDLL_OBJECTS = \
|
|||
basedll_common_secretstore.o \
|
||||
basedll_lzmastream.o \
|
||||
basedll_common_uilocale.o \
|
||||
basedll_fs_data.o \
|
||||
$(__BASE_PLATFORM_SRC_OBJECTS_2) \
|
||||
basedll_event.o \
|
||||
basedll_fs_mem.o \
|
||||
|
|
@ -1527,6 +1533,7 @@ BASELIB_OBJECTS = \
|
|||
baselib_common_secretstore.o \
|
||||
baselib_lzmastream.o \
|
||||
baselib_common_uilocale.o \
|
||||
baselib_fs_data.o \
|
||||
$(__BASE_PLATFORM_SRC_OBJECTS_3) \
|
||||
baselib_event.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)
|
||||
$(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)
|
||||
$(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)
|
||||
$(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)
|
||||
$(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)
|
||||
$(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)
|
||||
$(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)
|
||||
$(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)
|
||||
$(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp
|
||||
|
||||
|
|
|
|||
|
|
@ -580,6 +580,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
|
|||
src/common/secretstore.cpp
|
||||
src/common/lzmastream.cpp
|
||||
src/common/uilocale.cpp
|
||||
src/common/fs_data.cpp
|
||||
</set>
|
||||
<set var="BASE_AND_GUI_CMN_SRC" hints="files">
|
||||
src/common/event.cpp
|
||||
|
|
@ -755,6 +756,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
|
|||
wx/lzmastream.h
|
||||
wx/localedefs.h
|
||||
wx/uilocale.h
|
||||
wx/fs_data.h
|
||||
</set>
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -492,6 +492,7 @@ set(BASE_CMN_SRC
|
|||
src/generic/fswatcherg.cpp
|
||||
src/common/lzmastream.cpp
|
||||
src/common/uilocale.cpp
|
||||
src/common/fs_data.cpp
|
||||
)
|
||||
|
||||
set(BASE_AND_GUI_CMN_SRC
|
||||
|
|
@ -669,6 +670,7 @@ set(BASE_CMN_HDR
|
|||
wx/lzmastream.h
|
||||
wx/localedefs.h
|
||||
wx/uilocale.h
|
||||
wx/fs_data.h
|
||||
)
|
||||
|
||||
set(NET_UNIX_SRC
|
||||
|
|
|
|||
|
|
@ -455,6 +455,7 @@ BASE_CMN_SRC =
|
|||
src/common/filtfind.cpp
|
||||
src/common/fmapbase.cpp
|
||||
src/common/fs_arc.cpp
|
||||
src/common/fs_data.cpp
|
||||
src/common/fs_filter.cpp
|
||||
src/common/hash.cpp
|
||||
src/common/hashmap.cpp
|
||||
|
|
@ -571,6 +572,7 @@ BASE_CMN_HDR =
|
|||
wx/fontenc.h
|
||||
wx/fontmap.h
|
||||
wx/fs_arc.h
|
||||
wx/fs_data.h
|
||||
wx/fs_filter.h
|
||||
wx/fs_mem.h
|
||||
wx/fs_zip.h
|
||||
|
|
|
|||
|
|
@ -498,6 +498,7 @@ MONODLL_OBJECTS = \
|
|||
$(OBJS)\monodll_common_secretstore.o \
|
||||
$(OBJS)\monodll_lzmastream.o \
|
||||
$(OBJS)\monodll_common_uilocale.o \
|
||||
$(OBJS)\monodll_fs_data.o \
|
||||
$(OBJS)\monodll_basemsw.o \
|
||||
$(OBJS)\monodll_crashrpt.o \
|
||||
$(OBJS)\monodll_debughlp.o \
|
||||
|
|
@ -659,6 +660,7 @@ MONOLIB_OBJECTS = \
|
|||
$(OBJS)\monolib_common_secretstore.o \
|
||||
$(OBJS)\monolib_lzmastream.o \
|
||||
$(OBJS)\monolib_common_uilocale.o \
|
||||
$(OBJS)\monolib_fs_data.o \
|
||||
$(OBJS)\monolib_basemsw.o \
|
||||
$(OBJS)\monolib_crashrpt.o \
|
||||
$(OBJS)\monolib_debughlp.o \
|
||||
|
|
@ -808,6 +810,7 @@ BASEDLL_OBJECTS = \
|
|||
$(OBJS)\basedll_common_secretstore.o \
|
||||
$(OBJS)\basedll_lzmastream.o \
|
||||
$(OBJS)\basedll_common_uilocale.o \
|
||||
$(OBJS)\basedll_fs_data.o \
|
||||
$(OBJS)\basedll_basemsw.o \
|
||||
$(OBJS)\basedll_crashrpt.o \
|
||||
$(OBJS)\basedll_debughlp.o \
|
||||
|
|
@ -938,6 +941,7 @@ BASELIB_OBJECTS = \
|
|||
$(OBJS)\baselib_common_secretstore.o \
|
||||
$(OBJS)\baselib_lzmastream.o \
|
||||
$(OBJS)\baselib_common_uilocale.o \
|
||||
$(OBJS)\baselib_fs_data.o \
|
||||
$(OBJS)\baselib_basemsw.o \
|
||||
$(OBJS)\baselib_crashrpt.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
|
||||
$(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
|
||||
$(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
|
||||
$(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
|
||||
$(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
|
||||
$(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
|
||||
$(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
|
||||
$(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
|
||||
$(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
|
|
|
|||
|
|
@ -534,6 +534,7 @@ MONODLL_OBJECTS = \
|
|||
$(OBJS)\monodll_common_secretstore.obj \
|
||||
$(OBJS)\monodll_lzmastream.obj \
|
||||
$(OBJS)\monodll_common_uilocale.obj \
|
||||
$(OBJS)\monodll_fs_data.obj \
|
||||
$(OBJS)\monodll_basemsw.obj \
|
||||
$(OBJS)\monodll_crashrpt.obj \
|
||||
$(OBJS)\monodll_debughlp.obj \
|
||||
|
|
@ -704,6 +705,7 @@ MONOLIB_OBJECTS = \
|
|||
$(OBJS)\monolib_common_secretstore.obj \
|
||||
$(OBJS)\monolib_lzmastream.obj \
|
||||
$(OBJS)\monolib_common_uilocale.obj \
|
||||
$(OBJS)\monolib_fs_data.obj \
|
||||
$(OBJS)\monolib_basemsw.obj \
|
||||
$(OBJS)\monolib_crashrpt.obj \
|
||||
$(OBJS)\monolib_debughlp.obj \
|
||||
|
|
@ -862,6 +864,7 @@ BASEDLL_OBJECTS = \
|
|||
$(OBJS)\basedll_common_secretstore.obj \
|
||||
$(OBJS)\basedll_lzmastream.obj \
|
||||
$(OBJS)\basedll_common_uilocale.obj \
|
||||
$(OBJS)\basedll_fs_data.obj \
|
||||
$(OBJS)\basedll_basemsw.obj \
|
||||
$(OBJS)\basedll_crashrpt.obj \
|
||||
$(OBJS)\basedll_debughlp.obj \
|
||||
|
|
@ -1002,6 +1005,7 @@ BASELIB_OBJECTS = \
|
|||
$(OBJS)\baselib_common_secretstore.obj \
|
||||
$(OBJS)\baselib_lzmastream.obj \
|
||||
$(OBJS)\baselib_common_uilocale.obj \
|
||||
$(OBJS)\baselib_fs_data.obj \
|
||||
$(OBJS)\baselib_basemsw.obj \
|
||||
$(OBJS)\baselib_crashrpt.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
|
||||
$(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
|
||||
$(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
|
||||
$(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
|
||||
$(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
|
||||
$(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
|
||||
$(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
|
||||
$(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
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\msw\basemsw.cpp
|
||||
|
||||
|
|
|
|||
|
|
@ -622,6 +622,7 @@
|
|||
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)common_%(Filename).obj</ObjectFileName>
|
||||
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)common_%(Filename).obj</ObjectFileName>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\common\fs_data.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="..\..\src\msw\version.rc">
|
||||
|
|
@ -841,6 +842,7 @@
|
|||
<ClInclude Include="..\..\include\wx\lzmastream.h" />
|
||||
<ClInclude Include="..\..\include\wx\localedefs.h" />
|
||||
<ClInclude Include="..\..\include\wx\uilocale.h" />
|
||||
<ClInclude Include="..\..\include\wx\fs_data.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
|
|
|||
|
|
@ -123,6 +123,9 @@
|
|||
<ClCompile Include="..\..\src\common\fs_arc.cpp">
|
||||
<Filter>Common Sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\common\fs_data.cpp">
|
||||
<Filter>Common Sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\common\fs_filter.cpp">
|
||||
<Filter>Common Sources</Filter>
|
||||
</ClCompile>
|
||||
|
|
@ -535,6 +538,9 @@
|
|||
<ClInclude Include="..\..\include\wx\fs_arc.h">
|
||||
<Filter>Common Headers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\wx\fs_data.h">
|
||||
<Filter>Common Headers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\wx\fs_filter.h">
|
||||
<Filter>Common Headers</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -73,6 +73,10 @@ The following virtual file system handlers are part of wxWidgets so far:
|
|||
A handler for archives such as zip
|
||||
and tar. Include file is wx/fs_arc.h. URLs examples:
|
||||
"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:
|
||||
A handler for compression schemes such
|
||||
as gzip. Header is wx/fs_filter.h. URLs are in the form, e.g.:
|
||||
|
|
|
|||
31
include/wx/fs_data.h
Normal file
31
include/wx/fs_data.h
Normal 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
31
interface/wx/fs_data.h
Normal 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
126
src/common/fs_data.cpp
Normal 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
|
||||
|
|
@ -152,6 +152,7 @@
|
|||
#include <wx/fontutil.h>
|
||||
#include <wx/frame.h>
|
||||
#include <wx/fs_arc.h>
|
||||
#include <wx/fs_data.h>
|
||||
#include <wx/fs_filter.h>
|
||||
#include <wx/fs_inet.h>
|
||||
#include <wx/fs_mem.h>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Name: tests/filesys/filesys.cpp
|
||||
// Purpose: wxFileSystem unit test
|
||||
// Author: Vaclav Slavik
|
||||
// Author: Vaclav Slavik, Vyacheslav Lisovski
|
||||
// Created: 2004-03-28
|
||||
// Copyright: (c) 2004 Vaclav Slavik
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -21,7 +21,9 @@
|
|||
|
||||
#if wxUSE_FILESYSTEM
|
||||
|
||||
#include "wx/fs_data.h"
|
||||
#include "wx/fs_mem.h"
|
||||
#include "wx/sstream.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
|
|
@ -177,6 +179,51 @@ TEST_CASE("wxFileSystem::UnicodeFileNameToUrlConversion", "[filesys][url][filena
|
|||
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:
|
||||
// this used to be broken, see https://github.com/wxWidgets/wxWidgets/issues/18744
|
||||
TEST_CASE("wxFileSystem::MemoryFSHandler", "[filesys][memoryfshandler][find]")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue