X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e484468721a4e8e0099a363deee468e44d89294a..0bd2681966523df88ad5cf8e505b532843e58d74:/src/common/fs_mem.cpp diff --git a/src/common/fs_mem.cpp b/src/common/fs_mem.cpp index 37a272bbdc..3da55fdc8d 100644 --- a/src/common/fs_mem.cpp +++ b/src/common/fs_mem.cpp @@ -1,42 +1,31 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: fs_mem.cpp +// Name: src/common/fs_mem.cpp // Purpose: in-memory file system // Author: Vaclav Slavik +// RCS-ID: $Id$ // Copyright: (c) 2000 Vaclav Slavik -// Licence: wxWindows Licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) && !defined(__EMX__) -// Some older compilers (such as EMX) cannot handle -// #pragma interface/implementation correctly, iff -// #pragma implementation is used in _two_ translation -// units (as created by e.g. event.cpp compiled for -// libwx_base and event.cpp compiled for libwx_gui_core). -// So we must not use those pragmas for those compilers in -// such files. -#pragma implementation "fs_mem.h" -#endif - #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #if wxUSE_FILESYSTEM && wxUSE_STREAMS #include "wx/fs_mem.h" -#if wxUSE_GUI - #include "wx/image.h" - #include "wx/bitmap.h" -#endif // wxUSE_GUI - -#ifndef WXPRECOMP +#ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/log.h" #include "wx/hash.h" + #include "wx/wxcrtvararg.h" + #if wxUSE_GUI + #include "wx/bitmap.h" + #include "wx/image.h" + #endif // wxUSE_GUI #endif #include "wx/mstream.h" @@ -45,29 +34,32 @@ class MemFSHashObj : public wxObject { public: - MemFSHashObj(const void *data, size_t len) + MemFSHashObj(const void *data, size_t len, const wxString& mime) { m_Data = new char[len]; memcpy(m_Data, data, len); m_Len = len; + m_MimeType = mime; InitTime(); } - MemFSHashObj(wxMemoryOutputStream& stream) + MemFSHashObj(const wxMemoryOutputStream& stream, const wxString& mime) { m_Len = stream.GetSize(); m_Data = new char[m_Len]; stream.CopyTo(m_Data, m_Len); + m_MimeType = mime; InitTime(); } - ~MemFSHashObj() + virtual ~MemFSHashObj() { delete[] m_Data; } char *m_Data; size_t m_Len; + wxString m_MimeType; #if wxUSE_DATETIME wxDateTime m_Time; #endif // wxUSE_DATETIME @@ -79,7 +71,7 @@ class MemFSHashObj : public wxObject { #if wxUSE_DATETIME m_Time = wxDateTime::Now(); -#endif // wxUSE_DATETIME +#endif // wxUSE_DATETIME } }; @@ -133,11 +125,11 @@ wxFSFile* wxMemoryFSHandlerBase::OpenFile(wxFileSystem& WXUNUSED(fs), const wxSt if (obj == NULL) return NULL; else return new wxFSFile(new wxMemoryInputStream(obj -> m_Data, obj -> m_Len), location, - GetMimeTypeFromExt(location), + obj->m_MimeType, GetAnchor(location) #if wxUSE_DATETIME , obj -> m_Time -#endif // wxUSE_DATETIME +#endif // wxUSE_DATETIME ); } else return NULL; @@ -175,23 +167,46 @@ bool wxMemoryFSHandlerBase::CheckHash(const wxString& filename) wxString s; s.Printf(_("Memory VFS already contains file '%s'!"), filename.c_str()); wxLogError(s); - return FALSE; + return false; } else - return TRUE; + return true; } -/*static*/ void wxMemoryFSHandlerBase::AddFile(const wxString& filename, const wxString& textdata) +/*static*/ +void wxMemoryFSHandlerBase::AddFileWithMimeType(const wxString& filename, + const wxString& textdata, + const wxString& mimetype) { - AddFile(filename, (const void*) textdata.mb_str(), textdata.Length()); + AddFileWithMimeType(filename, + (const void*) textdata.mb_str(), textdata.length(), + mimetype); } -/*static*/ void wxMemoryFSHandlerBase::AddFile(const wxString& filename, const void *binarydata, size_t size) +/*static*/ +void wxMemoryFSHandlerBase::AddFileWithMimeType(const wxString& filename, + const void *binarydata, size_t size, + const wxString& mimetype) { if (!CheckHash(filename)) return; - m_Hash -> Put(filename, new MemFSHashObj(binarydata, size)); + m_Hash -> Put(filename, new MemFSHashObj(binarydata, size, mimetype)); +} + +/*static*/ +void wxMemoryFSHandlerBase::AddFile(const wxString& filename, + const wxString& textdata) +{ + AddFileWithMimeType(filename, textdata, wxEmptyString); +} + + +/*static*/ +void wxMemoryFSHandlerBase::AddFile(const wxString& filename, + const void *binarydata, size_t size) +{ + AddFileWithMimeType(filename, binarydata, size, wxEmptyString); } @@ -216,13 +231,25 @@ bool wxMemoryFSHandlerBase::CheckHash(const wxString& filename) #if wxUSE_IMAGE /*static*/ void -wxMemoryFSHandler::AddFile(const wxString& filename, wxImage& image, long type) +wxMemoryFSHandler::AddFile(const wxString& filename, + const wxImage& image, + long type) { if (!CheckHash(filename)) return; wxMemoryOutputStream mems; if (image.Ok() && image.SaveFile(mems, (int)type)) - m_Hash -> Put(filename, new MemFSHashObj(mems)); + { + m_Hash->Put + ( + filename, + new MemFSHashObj + ( + mems, + wxImage::FindHandler(type)->GetMimeType() + ) + ); + } else { wxString s; @@ -231,16 +258,21 @@ wxMemoryFSHandler::AddFile(const wxString& filename, wxImage& image, long type) wxLogError(s); } } -#endif // wxUSE_IMAGE -/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const wxBitmap& bitmap, long type) +/*static*/ void +wxMemoryFSHandler::AddFile(const wxString& filename, + const wxBitmap& bitmap, + long type) { +#if !defined(__WXMSW__) || wxUSE_WXDIB wxImage img = bitmap.ConvertToImage(); AddFile(filename, img, type); +#endif } -#endif +#endif // wxUSE_IMAGE +#endif // wxUSE_GUI -#endif // wxUSE_FILESYSTEM && wxUSE_FS_ZIP +#endif // wxUSE_FILESYSTEM && wxUSE_FS_ZIP