X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/11eaa98105f96ad6123283f519abf3ac0e5e5804..0b822969a677939811d9fb966177031fb5fc625b:/src/common/fs_mem.cpp diff --git a/src/common/fs_mem.cpp b/src/common/fs_mem.cpp index 3b45f31ae2..3da55fdc8d 100644 --- a/src/common/fs_mem.cpp +++ b/src/common/fs_mem.cpp @@ -1,92 +1,114 @@ ///////////////////////////////////////////////////////////////////////////// -// 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 ///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -#pragma implementation -#endif - #include "wx/wxprec.h" -#ifdef __BORDLANDC__ -#pragma hdrstop +#ifdef __BORLANDC__ + #pragma hdrstop #endif #if wxUSE_FILESYSTEM && wxUSE_STREAMS -#ifndef WXPRECOMP -#include "wx/wx.h" +#include "wx/fs_mem.h" + +#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/filesys.h" -#include "wx/fs_mem.h" #include "wx/mstream.h" - 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_Time = wxDateTime::Now(); + 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_Time = wxDateTime::Now(); + 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 + + DECLARE_NO_COPY_CLASS(MemFSHashObj) + + private: + void InitTime() + { +#if wxUSE_DATETIME + m_Time = wxDateTime::Now(); +#endif // wxUSE_DATETIME + } }; +#if wxUSE_BASE + //-------------------------------------------------------------------------------- // wxMemoryFSHandler //-------------------------------------------------------------------------------- -wxHashTable *wxMemoryFSHandler::m_Hash = NULL; +wxHashTable *wxMemoryFSHandlerBase::m_Hash = NULL; -wxMemoryFSHandler::wxMemoryFSHandler() : wxFileSystemHandler() +wxMemoryFSHandlerBase::wxMemoryFSHandlerBase() : wxFileSystemHandler() { - m_Hash = NULL; } -wxMemoryFSHandler::~wxMemoryFSHandler() +wxMemoryFSHandlerBase::~wxMemoryFSHandlerBase() { // 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; + + if (m_Hash) + { + WX_CLEAR_HASH_TABLE(*m_Hash); + delete m_Hash; + m_Hash = NULL; + } } -bool wxMemoryFSHandler::CanOpen(const wxString& location) +bool wxMemoryFSHandlerBase::CanOpen(const wxString& location) { wxString p = GetProtocol(location); return (p == wxT("memory")); @@ -95,7 +117,7 @@ bool wxMemoryFSHandler::CanOpen(const wxString& location) -wxFSFile* wxMemoryFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location) +wxFSFile* wxMemoryFSHandlerBase::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location) { if (m_Hash) { @@ -103,95 +125,93 @@ wxFSFile* wxMemoryFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString 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); + obj->m_MimeType, + GetAnchor(location) +#if wxUSE_DATETIME + , obj -> m_Time +#endif // wxUSE_DATETIME + ); } else return NULL; } -wxString wxMemoryFSHandler::FindFirst(const wxString& spec, int flags) +wxString wxMemoryFSHandlerBase::FindFirst(const wxString& WXUNUSED(spec), + int WXUNUSED(flags)) { - wxLogWarning(wxT("wxMemoryFSHandler::FindFirst not implemented")); + wxFAIL_MSG(wxT("wxMemoryFSHandlerBase::FindFirst not implemented")); + return wxEmptyString; } -wxString wxMemoryFSHandler::FindNext() +wxString wxMemoryFSHandlerBase::FindNext() { - wxLogWarning(wxT("wxMemoryFSHandler::FindNext not implemented")); + wxFAIL_MSG(wxT("wxMemoryFSHandlerBase::FindNext not implemented")); + return wxEmptyString; } - -bool wxMemoryFSHandler::CheckHash(const wxString& filename) +bool wxMemoryFSHandlerBase::CheckHash(const wxString& filename) { - if (m_Hash == NULL) + 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; + return false; } else - return TRUE; + return true; } - -#if wxUSE_GUI - -/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, wxImage& image, long type) +/*static*/ +void wxMemoryFSHandlerBase::AddFileWithMimeType(const wxString& filename, + const wxString& textdata, + const wxString& mimetype) { - 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); - } + AddFileWithMimeType(filename, + (const void*) textdata.mb_str(), textdata.length(), + mimetype); } -/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const wxBitmap& bitmap, long type) +/*static*/ +void wxMemoryFSHandlerBase::AddFileWithMimeType(const wxString& filename, + const void *binarydata, size_t size, + const wxString& mimetype) { - wxImage img(bitmap); - AddFile(filename, img, type); + if (!CheckHash(filename)) return; + m_Hash -> Put(filename, new MemFSHashObj(binarydata, size, mimetype)); } -#endif - -/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const wxString& textdata) +/*static*/ +void wxMemoryFSHandlerBase::AddFile(const wxString& filename, + const wxString& textdata) { - AddFile(filename, (const void*) textdata.mb_str(), textdata.Length()); + AddFileWithMimeType(filename, textdata, wxEmptyString); } -/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const void *binarydata, size_t size) +/*static*/ +void wxMemoryFSHandlerBase::AddFile(const wxString& filename, + const void *binarydata, size_t size) { - if (!CheckHash(filename)) return; - m_Hash -> Put(filename, new MemFSHashObj(binarydata, size)); + AddFileWithMimeType(filename, binarydata, size, wxEmptyString); } -/*static*/ void wxMemoryFSHandler::RemoveFile(const wxString& filename) +/*static*/ void wxMemoryFSHandlerBase::RemoveFile(const wxString& filename) { if (m_Hash == NULL || m_Hash -> Get(filename) == NULL) @@ -205,6 +225,54 @@ bool wxMemoryFSHandler::CheckHash(const wxString& filename) delete m_Hash -> Delete(filename); } +#endif // wxUSE_BASE + +#if wxUSE_GUI + +#if wxUSE_IMAGE +/*static*/ void +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, + wxImage::FindHandler(type)->GetMimeType() + ) + ); + } + else + { + wxString s; + s.Printf(_("Failed to store image '%s' to memory VFS!"), filename.c_str()); + wxPrintf(wxT("'%s'\n"), s.c_str()); + wxLogError(s); + } +} + +/*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 // wxUSE_IMAGE + +#endif // wxUSE_GUI #endif // wxUSE_FILESYSTEM && wxUSE_FS_ZIP