]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxMemoryFSHandler for storing VFS in memory
authorVáclav Slavík <vslavik@fastmail.fm>
Thu, 17 Feb 2000 23:13:41 +0000 (23:13 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Thu, 17 Feb 2000 23:13:41 +0000 (23:13 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6128 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

distrib/msw/tmake/filelist.txt
include/wx/fs_mem.h [new file with mode: 0644]
src/common/fs_mem.cpp [new file with mode: 0644]
src/gtk/files.lst
src/gtk1/files.lst
src/motif/files.lst
src/wxvc.dsp
src/wxvc_dll.dsp

index c96d410949552509a7cfeee0d8a316da9c62e53a..ac8b1f4d3168e41708271ea0214c23ebda86b969 100644 (file)
@@ -133,6 +133,7 @@ fontmap.cpp C
 framecmn.cpp   C
 fs_inet.cpp    C
 fs_zip.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
 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
 frame.h        W
 fs_inet.h      W
 fs_zip.h       W
+fs_mem.h       W
 gauge.h        W
 gdicmn.h       W
 gdiobj.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 (file)
index 0000000..61b491f
--- /dev/null
@@ -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 (file)
index 0000000..adee5e6
--- /dev/null
@@ -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
index a7c370dbe7394eee42d91ba6af4dc6c2ed6999d0..7748558b13a3c56360bc970840ea3372dcb72eb6 100644 (file)
@@ -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 \
 # 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/fontmap.cpp \
                common/framecmn.cpp \
                common/fs_inet.cpp \
+               common/fs_mem.cpp \
                common/fs_zip.cpp \
                common/ftp.cpp \
                common/gdicmn.cpp \
                common/fs_zip.cpp \
                common/ftp.cpp \
                common/gdicmn.cpp \
@@ -290,6 +291,7 @@ ALL_HEADERS = \
                fontutil.h \
                frame.h \
                fs_inet.h \
                fontutil.h \
                frame.h \
                fs_inet.h \
+               fs_mem.h \
                fs_zip.h \
                gauge.h \
                gdicmn.h \
                fs_zip.h \
                gauge.h \
                gdicmn.h \
@@ -572,6 +574,7 @@ COMMONOBJS = \
                fontmap.o \
                framecmn.o \
                fs_inet.o \
                fontmap.o \
                framecmn.o \
                fs_inet.o \
+               fs_mem.o \
                fs_zip.o \
                ftp.o \
                gdicmn.o \
                fs_zip.o \
                ftp.o \
                gdicmn.o \
@@ -672,6 +675,7 @@ COMMONDEPS = \
                fontmap.d \
                framecmn.d \
                fs_inet.d \
                fontmap.d \
                framecmn.d \
                fs_inet.d \
+               fs_mem.d \
                fs_zip.d \
                ftp.d \
                gdicmn.d \
                fs_zip.d \
                ftp.d \
                gdicmn.d \
index a7c370dbe7394eee42d91ba6af4dc6c2ed6999d0..7748558b13a3c56360bc970840ea3372dcb72eb6 100644 (file)
@@ -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 \
 # 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/fontmap.cpp \
                common/framecmn.cpp \
                common/fs_inet.cpp \
+               common/fs_mem.cpp \
                common/fs_zip.cpp \
                common/ftp.cpp \
                common/gdicmn.cpp \
                common/fs_zip.cpp \
                common/ftp.cpp \
                common/gdicmn.cpp \
@@ -290,6 +291,7 @@ ALL_HEADERS = \
                fontutil.h \
                frame.h \
                fs_inet.h \
                fontutil.h \
                frame.h \
                fs_inet.h \
+               fs_mem.h \
                fs_zip.h \
                gauge.h \
                gdicmn.h \
                fs_zip.h \
                gauge.h \
                gdicmn.h \
@@ -572,6 +574,7 @@ COMMONOBJS = \
                fontmap.o \
                framecmn.o \
                fs_inet.o \
                fontmap.o \
                framecmn.o \
                fs_inet.o \
+               fs_mem.o \
                fs_zip.o \
                ftp.o \
                gdicmn.o \
                fs_zip.o \
                ftp.o \
                gdicmn.o \
@@ -672,6 +675,7 @@ COMMONDEPS = \
                fontmap.d \
                framecmn.d \
                fs_inet.d \
                fontmap.d \
                framecmn.d \
                fs_inet.d \
+               fs_mem.d \
                fs_zip.d \
                ftp.d \
                gdicmn.d \
                fs_zip.d \
                ftp.d \
                gdicmn.d \
index b67af2d95b552cf04d6c7e70f18bdbce4d0a0d64..cb9ff4bff6db16cc481c58376167fba5e5a73849 100644 (file)
@@ -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 \
 # 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/fontmap.cpp \
                common/framecmn.cpp \
                common/fs_inet.cpp \
+               common/fs_mem.cpp \
                common/fs_zip.cpp \
                common/ftp.cpp \
                common/gdicmn.cpp \
                common/fs_zip.cpp \
                common/ftp.cpp \
                common/gdicmn.cpp \
@@ -287,6 +288,7 @@ ALL_HEADERS = \
                fontutil.h \
                frame.h \
                fs_inet.h \
                fontutil.h \
                frame.h \
                fs_inet.h \
+               fs_mem.h \
                fs_zip.h \
                gauge.h \
                gdicmn.h \
                fs_zip.h \
                gauge.h \
                gdicmn.h \
@@ -569,6 +571,7 @@ COMMONOBJS = \
                fontmap.o \
                framecmn.o \
                fs_inet.o \
                fontmap.o \
                framecmn.o \
                fs_inet.o \
+               fs_mem.o \
                fs_zip.o \
                ftp.o \
                gdicmn.o \
                fs_zip.o \
                ftp.o \
                gdicmn.o \
@@ -669,6 +672,7 @@ COMMONDEPS = \
                fontmap.d \
                framecmn.d \
                fs_inet.d \
                fontmap.d \
                framecmn.d \
                fs_inet.d \
+               fs_mem.d \
                fs_zip.d \
                ftp.d \
                gdicmn.d \
                fs_zip.d \
                ftp.d \
                gdicmn.d \
@@ -989,7 +993,3 @@ HTMLDEPS = \
                m_pre.d \
                m_tables.d \
                winpars.d
                m_pre.d \
                m_tables.d \
                winpars.d
-
-IODBCOBJS = \
-
-IODBCDEPS = \
index 07077822db2a286bac20bc5cf554205e1d1f86f2..6c87170f6c1594180d8ea52831d97d7b51d7398d 100644 (file)
@@ -212,6 +212,10 @@ SOURCE=.\common\fs_inet.cpp
 # End Source File
 # Begin Source File
 
 # 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
 SOURCE=.\common\fs_zip.cpp
 # ADD CPP /I "zlib"
 # End Source File
index 36ae88b436ed8c18eeda1c46c3f3bd6b5b4cf8c7..edacc9f9f9e11d4d2fe4e3101723141e085dc328 100644 (file)
@@ -219,6 +219,10 @@ SOURCE=.\common\fs_inet.cpp
 # End Source File
 # Begin Source File
 
 # 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
 SOURCE=.\common\fs_zip.cpp
 # ADD CPP /I "zlib"
 # End Source File