1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/fs_mem.cpp
3 // Purpose: in-memory file system
4 // Author: Vaclav Slavik
6 // Copyright: (c) 2000 Vaclav Slavik
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
10 #include "wx/wxprec.h"
16 #if wxUSE_FILESYSTEM && wxUSE_STREAMS
18 #include "wx/fs_mem.h"
23 #include "wx/wxcrtvararg.h"
29 #include "wx/mstream.h"
31 // represents a file entry in wxMemoryFS
35 wxMemoryFSFile(const void *data
, size_t len
, const wxString
& mime
)
37 m_Data
= new char[len
];
38 memcpy(m_Data
, data
, len
);
44 wxMemoryFSFile(const wxMemoryOutputStream
& stream
, const wxString
& mime
)
46 m_Len
= stream
.GetSize();
47 m_Data
= new char[m_Len
];
48 stream
.CopyTo(m_Data
, m_Len
);
53 virtual ~wxMemoryFSFile()
63 #endif // wxUSE_DATETIME
69 m_Time
= wxDateTime::Now();
70 #endif // wxUSE_DATETIME
73 DECLARE_NO_COPY_CLASS(wxMemoryFSFile
)
79 //--------------------------------------------------------------------------------
81 //--------------------------------------------------------------------------------
84 wxMemoryFSHash
wxMemoryFSHandlerBase::m_Hash
;
87 wxMemoryFSHandlerBase::wxMemoryFSHandlerBase() : wxFileSystemHandler()
91 wxMemoryFSHandlerBase::~wxMemoryFSHandlerBase()
93 // as only one copy of FS handler is supposed to exist, we may silently
94 // delete static data here. (There is no way how to remove FS handler from
95 // wxFileSystem other than releasing _all_ handlers.)
96 WX_CLEAR_HASH_MAP(wxMemoryFSHash
, m_Hash
);
99 bool wxMemoryFSHandlerBase::CanOpen(const wxString
& location
)
101 return GetProtocol(location
) == "memory";
104 wxFSFile
* wxMemoryFSHandlerBase::OpenFile(wxFileSystem
& WXUNUSED(fs
),
105 const wxString
& location
)
107 wxMemoryFSHash::const_iterator i
= m_Hash
.find(GetRightLocation(location
));
108 if ( i
== m_Hash
.end() )
111 const wxMemoryFSFile
* const obj
= i
->second
;
115 new wxMemoryInputStream(obj
->m_Data
, obj
->m_Len
),
121 #endif // wxUSE_DATETIME
125 wxString
wxMemoryFSHandlerBase::FindFirst(const wxString
& WXUNUSED(spec
),
128 wxFAIL_MSG(wxT("wxMemoryFSHandlerBase::FindFirst not implemented"));
130 return wxEmptyString
;
133 wxString
wxMemoryFSHandlerBase::FindNext()
135 wxFAIL_MSG(wxT("wxMemoryFSHandlerBase::FindNext not implemented"));
137 return wxEmptyString
;
140 bool wxMemoryFSHandlerBase::CheckDoesntExist(const wxString
& filename
)
142 if ( m_Hash
.count(filename
) )
144 wxLogError(_("Memory VFS already contains file '%s'!"), filename
);
153 void wxMemoryFSHandlerBase::AddFileWithMimeType(const wxString
& filename
,
154 const wxString
& textdata
,
155 const wxString
& mimetype
)
157 AddFileWithMimeType(filename
,
158 (const void*) textdata
.mb_str(), textdata
.length(),
164 void wxMemoryFSHandlerBase::AddFileWithMimeType(const wxString
& filename
,
165 const void *binarydata
, size_t size
,
166 const wxString
& mimetype
)
168 if ( !CheckDoesntExist(filename
) )
171 m_Hash
[filename
] = new wxMemoryFSFile(binarydata
, size
, mimetype
);
175 void wxMemoryFSHandlerBase::AddFile(const wxString
& filename
,
176 const wxString
& textdata
)
178 AddFileWithMimeType(filename
, textdata
, wxEmptyString
);
183 void wxMemoryFSHandlerBase::AddFile(const wxString
& filename
,
184 const void *binarydata
, size_t size
)
186 AddFileWithMimeType(filename
, binarydata
, size
, wxEmptyString
);
191 /*static*/ void wxMemoryFSHandlerBase::RemoveFile(const wxString
& filename
)
193 wxMemoryFSHash::iterator i
= m_Hash
.find(filename
);
194 if ( i
== m_Hash
.end() )
196 wxLogError(_("Trying to remove file '%s' from memory VFS, "
197 "but it is not loaded!"),
212 wxMemoryFSHandler::AddFile(const wxString
& filename
,
213 const wxImage
& image
,
216 if ( !CheckDoesntExist(filename
) )
219 wxMemoryOutputStream mems
;
220 if ( image
.Ok() && image
.SaveFile(mems
, type
) )
222 m_Hash
[filename
] = new wxMemoryFSFile
225 wxImage::FindHandler(type
)->GetMimeType()
230 wxLogError(_("Failed to store image '%s' to memory VFS!"), filename
);
235 wxMemoryFSHandler::AddFile(const wxString
& filename
,
236 const wxBitmap
& bitmap
,
239 wxImage img
= bitmap
.ConvertToImage();
240 AddFile(filename
, img
, type
);
243 #endif // wxUSE_IMAGE
248 #endif // wxUSE_FILESYSTEM && wxUSE_FS_ZIP