From dcb86da02199f7fea33f7b76a5c0fc95873f93f3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Thu, 17 Feb 2000 23:13:41 +0000 Subject: [PATCH] added wxMemoryFSHandler for storing VFS in memory git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6128 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- distrib/msw/tmake/filelist.txt | 2 + include/wx/fs_mem.h | 64 ++++++++++ src/common/fs_mem.cpp | 207 +++++++++++++++++++++++++++++++++ src/gtk/files.lst | 6 +- src/gtk1/files.lst | 6 +- src/motif/files.lst | 10 +- src/wxvc.dsp | 4 + src/wxvc_dll.dsp | 4 + 8 files changed, 296 insertions(+), 7 deletions(-) create mode 100644 include/wx/fs_mem.h create mode 100644 src/common/fs_mem.cpp diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index c96d410949..ac8b1f4d31 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -133,6 +133,7 @@ fontmap.cpp C framecmn.cpp C fs_inet.cpp C fs_zip.cpp C +fs_mem.cpp C ftp.cpp C S gdicmn.cpp C geometry.cpp C @@ -596,6 +597,7 @@ fontutil.h W frame.h W fs_inet.h W fs_zip.h W +fs_mem.h W gauge.h W gdicmn.h W gdiobj.h W diff --git a/include/wx/fs_mem.h b/include/wx/fs_mem.h new file mode 100644 index 0000000000..61b491fbc1 --- /dev/null +++ b/include/wx/fs_mem.h @@ -0,0 +1,64 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: fs_mem.h +// Purpose: in-memory file system +// Author: Vaclav Slavik +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + + +#ifdef __GNUG__ +#pragma implementation +#endif + +#include "wx/wxprec.h" + +#ifdef __BORDLANDC__ +#pragma hdrstop +#endif + +#if (wxUSE_HTML || wxUSE_FS_INET || wxUSE_FS_ZIP) && wxUSE_STREAMS + +#ifndef WXPRECOMP +#include "wx/wx.h" +#endif + +#include "wx/filesys.h" +#include "wx/image.h" +#include "wx/bitmap.h" + +//-------------------------------------------------------------------------------- +// wxMemoryFSHandler +//-------------------------------------------------------------------------------- + +class WXDLLEXPORT wxMemoryFSHandler : public wxFileSystemHandler +{ + public: + wxMemoryFSHandler(); + ~wxMemoryFSHandler(); + + // Add file to list of files stored in memory. Stored data (bitmap, text or raw data) + // will be copied into private memory stream and available under name "memory:" + filename + static void AddFile(const wxString& filename, wxImage& image, long type); + static void AddFile(const wxString& filename, const wxBitmap& bitmap, long type); + static void AddFile(const wxString& filename, const wxString& textdata); + static void AddFile(const wxString& filename, const void *binarydata, size_t size); + + // Remove file from memory FS and free occupied memory + static void RemoveFile(const wxString& filename); + + virtual bool CanOpen(const wxString& location); + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); + virtual wxString FindFirst(const wxString& spec, int flags = 0); + virtual wxString FindNext(); + + private: + static wxHashTable *m_Hash; + + static bool CheckHash(const wxString& filename); +}; + +#endif + // (wxUSE_HTML || wxUSE_FS_INET || wxUSE_FS_ZIP) && wxUSE_STREAMS + + diff --git a/src/common/fs_mem.cpp b/src/common/fs_mem.cpp new file mode 100644 index 0000000000..adee5e641e --- /dev/null +++ b/src/common/fs_mem.cpp @@ -0,0 +1,207 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: fs_mem.cpp +// Purpose: in-memory file system +// Author: Vaclav Slavik +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + + +#ifdef __GNUG__ +#pragma implementation +#endif + +#include "wx/wxprec.h" + +#ifdef __BORDLANDC__ +#pragma hdrstop +#endif + +#if (wxUSE_HTML || wxUSE_FS_INET || wxUSE_FS_ZIP) && wxUSE_STREAMS + +#ifndef WXPRECOMP +#include "wx/wx.h" +#endif + +#include "wx/filesys.h" +#include "wx/fs_mem.h" +#include "wx/mstream.h" + + +class MemFSHashObj : public wxObject +{ + public: + + MemFSHashObj(const void *data, size_t len) + { + m_Data = new char[len]; + memcpy(m_Data, data, len); + m_Len = len; + m_Time = wxDateTime::Today(); + } + + MemFSHashObj(wxMemoryOutputStream& stream) + { + m_Len = stream.GetSize(); + m_Data = new char[m_Len]; + stream.CopyTo(m_Data, m_Len); + m_Time = wxDateTime::Today(); + } + + ~MemFSHashObj() + { + delete[] m_Data; + } + + char *m_Data; + size_t m_Len; + wxDateTime m_Time; +}; + + +//-------------------------------------------------------------------------------- +// wxMemoryFSHandler +//-------------------------------------------------------------------------------- + + +wxHashTable *wxMemoryFSHandler::m_Hash = NULL; + + +wxMemoryFSHandler::wxMemoryFSHandler() : wxFileSystemHandler() +{ + m_Hash = NULL; +} + + + +wxMemoryFSHandler::~wxMemoryFSHandler() +{ + // as only one copy of FS handler is supposed to exist, we may silently + // delete static data here. (There is no way how to remove FS handler from + // wxFileSystem other than releasing _all_ handlers.) + + if (m_Hash) delete m_Hash; + m_Hash = NULL; +} + + + +bool wxMemoryFSHandler::CanOpen(const wxString& location) +{ + wxString p = GetProtocol(location); + return (p == wxT("memory")); +} + + + + +wxFSFile* wxMemoryFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location) +{ + if (m_Hash) + { + MemFSHashObj *obj = (MemFSHashObj*) m_Hash -> Get(GetRightLocation(location)); + if (obj == NULL) return NULL; + else return new wxFSFile(new wxMemoryInputStream(obj -> m_Data, obj -> m_Len), + location, + GetMimeTypeFromExt(location), + GetAnchor(location), + obj -> m_Time); + } + else return NULL; +} + + + +wxString wxMemoryFSHandler::FindFirst(const wxString& spec, int flags) +{ + wxLogWarning(wxT("wxMemoryFSHandler::FindFirst not implemented")); + return wxEmptyString; +} + + + +wxString wxMemoryFSHandler::FindNext() +{ + wxLogWarning(wxT("wxMemoryFSHandler::FindNext not implemented")); + return wxEmptyString; +} + + + +bool wxMemoryFSHandler::CheckHash(const wxString& filename) +{ + if (m_Hash == NULL) + { + m_Hash = new wxHashTable(wxKEY_STRING); + m_Hash -> DeleteContents(TRUE); + } + + if (m_Hash -> Get(filename) != NULL) + { + wxString s; + s.Printf(_("Memory VFS already contains file '%s'!"), filename.c_str()); + wxLogError(s); + return FALSE; + } + else + return TRUE; +} + + + +/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, wxImage& image, long type) +{ + if (!CheckHash(filename)) return; + + + wxMemoryOutputStream mems; + if (image.Ok() && image.SaveFile(mems, type)) + m_Hash -> Put(filename, new MemFSHashObj(mems)); + else + { + wxString s; + s.Printf(_("Failed to store image '%s' to memory VFS!"), filename.c_str()); + printf("'%s'\n", s.c_str()); + wxLogError(s); + } +} + + +/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const wxBitmap& bitmap, long type) +{ + wxImage img(bitmap); + AddFile(filename, img, type); +} + + +/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const wxString& textdata) +{ + AddFile(filename, (const void*) textdata.mb_str(), textdata.Length()); +} + + +/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const void *binarydata, size_t size) +{ + if (!CheckHash(filename)) return; + m_Hash -> Put(filename, new MemFSHashObj(binarydata, size)); +} + + + +/*static*/ void wxMemoryFSHandler::RemoveFile(const wxString& filename) +{ + if (m_Hash == NULL || + m_Hash -> Get(filename) == NULL) + { + wxString s; + s.Printf(_("Trying to remove file '%s' from memory VFS, but it is not loaded!"), filename.c_str()); + wxLogError(s); + } + + else + delete m_Hash -> Delete(filename); +} + + + +#endif // wxUSE_FS_ZIP diff --git a/src/gtk/files.lst b/src/gtk/files.lst index a7c370dbe7..7748558b13 100644 --- a/src/gtk/files.lst +++ b/src/gtk/files.lst @@ -1,4 +1,4 @@ -# This file was automatically generated by tmake at 17:23, 2000/02/01 +# This file was automatically generated by tmake at 18:32, 2000/02/17 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE GTK.T! ALL_SOURCES = \ generic/busyinfo.cpp \ @@ -69,6 +69,7 @@ ALL_SOURCES = \ common/fontmap.cpp \ common/framecmn.cpp \ common/fs_inet.cpp \ + common/fs_mem.cpp \ common/fs_zip.cpp \ common/ftp.cpp \ common/gdicmn.cpp \ @@ -290,6 +291,7 @@ ALL_HEADERS = \ fontutil.h \ frame.h \ fs_inet.h \ + fs_mem.h \ fs_zip.h \ gauge.h \ gdicmn.h \ @@ -572,6 +574,7 @@ COMMONOBJS = \ fontmap.o \ framecmn.o \ fs_inet.o \ + fs_mem.o \ fs_zip.o \ ftp.o \ gdicmn.o \ @@ -672,6 +675,7 @@ COMMONDEPS = \ fontmap.d \ framecmn.d \ fs_inet.d \ + fs_mem.d \ fs_zip.d \ ftp.d \ gdicmn.d \ diff --git a/src/gtk1/files.lst b/src/gtk1/files.lst index a7c370dbe7..7748558b13 100644 --- a/src/gtk1/files.lst +++ b/src/gtk1/files.lst @@ -1,4 +1,4 @@ -# This file was automatically generated by tmake at 17:23, 2000/02/01 +# This file was automatically generated by tmake at 18:32, 2000/02/17 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE GTK.T! ALL_SOURCES = \ generic/busyinfo.cpp \ @@ -69,6 +69,7 @@ ALL_SOURCES = \ common/fontmap.cpp \ common/framecmn.cpp \ common/fs_inet.cpp \ + common/fs_mem.cpp \ common/fs_zip.cpp \ common/ftp.cpp \ common/gdicmn.cpp \ @@ -290,6 +291,7 @@ ALL_HEADERS = \ fontutil.h \ frame.h \ fs_inet.h \ + fs_mem.h \ fs_zip.h \ gauge.h \ gdicmn.h \ @@ -572,6 +574,7 @@ COMMONOBJS = \ fontmap.o \ framecmn.o \ fs_inet.o \ + fs_mem.o \ fs_zip.o \ ftp.o \ gdicmn.o \ @@ -672,6 +675,7 @@ COMMONDEPS = \ fontmap.d \ framecmn.d \ fs_inet.d \ + fs_mem.d \ fs_zip.d \ ftp.d \ gdicmn.d \ diff --git a/src/motif/files.lst b/src/motif/files.lst index b67af2d95b..cb9ff4bff6 100644 --- a/src/motif/files.lst +++ b/src/motif/files.lst @@ -1,4 +1,4 @@ -# This file was automatically generated by tmake at 18:14, 2000/01/31 +# This file was automatically generated by tmake at 18:32, 2000/02/17 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE MOTIF.T! ALL_SOURCES = \ generic/busyinfo.cpp \ @@ -72,6 +72,7 @@ ALL_SOURCES = \ common/fontmap.cpp \ common/framecmn.cpp \ common/fs_inet.cpp \ + common/fs_mem.cpp \ common/fs_zip.cpp \ common/ftp.cpp \ common/gdicmn.cpp \ @@ -287,6 +288,7 @@ ALL_HEADERS = \ fontutil.h \ frame.h \ fs_inet.h \ + fs_mem.h \ fs_zip.h \ gauge.h \ gdicmn.h \ @@ -569,6 +571,7 @@ COMMONOBJS = \ fontmap.o \ framecmn.o \ fs_inet.o \ + fs_mem.o \ fs_zip.o \ ftp.o \ gdicmn.o \ @@ -669,6 +672,7 @@ COMMONDEPS = \ fontmap.d \ framecmn.d \ fs_inet.d \ + fs_mem.d \ fs_zip.d \ ftp.d \ gdicmn.d \ @@ -989,7 +993,3 @@ HTMLDEPS = \ m_pre.d \ m_tables.d \ winpars.d - -IODBCOBJS = \ - -IODBCDEPS = \ diff --git a/src/wxvc.dsp b/src/wxvc.dsp index 07077822db..6c87170f6c 100644 --- a/src/wxvc.dsp +++ b/src/wxvc.dsp @@ -212,6 +212,10 @@ SOURCE=.\common\fs_inet.cpp # End Source File # Begin Source File +SOURCE=.\common\fs_mem.cpp +# End Source File +# Begin Source File + SOURCE=.\common\fs_zip.cpp # ADD CPP /I "zlib" # End Source File diff --git a/src/wxvc_dll.dsp b/src/wxvc_dll.dsp index 36ae88b436..edacc9f9f9 100644 --- a/src/wxvc_dll.dsp +++ b/src/wxvc_dll.dsp @@ -219,6 +219,10 @@ SOURCE=.\common\fs_inet.cpp # End Source File # Begin Source File +SOURCE=.\common\fs_mem.cpp +# End Source File +# Begin Source File + SOURCE=.\common\fs_zip.cpp # ADD CPP /I "zlib" # End Source File -- 2.45.2