X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e2b87f38d9092b56591728558f2cc13cac6a58af..8998887c224924d5f6f4601597c162d6429495e1:/src/common/fs_mem.cpp?ds=sidebyside diff --git a/src/common/fs_mem.cpp b/src/common/fs_mem.cpp index 29c730164c..aa59f1b48c 100644 --- a/src/common/fs_mem.cpp +++ b/src/common/fs_mem.cpp @@ -3,11 +3,18 @@ // Purpose: in-memory file system // Author: Vaclav Slavik // Copyright: (c) 2000 Vaclav Slavik -// Licence: wxWindows Licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#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 @@ -19,14 +26,19 @@ #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 #include "wx/intl.h" #include "wx/log.h" #include "wx/hash.h" #endif -#include "wx/filesys.h" -#include "wx/fs_mem.h" #include "wx/mstream.h" class MemFSHashObj : public wxObject @@ -67,38 +79,44 @@ class MemFSHashObj : public wxObject { #if wxUSE_DATETIME m_Time = wxDateTime::Now(); -#endif // wxUSE_DATETIME +#endif // wxUSE_DATETIME } }; +#if wxUSE_BASE + //-------------------------------------------------------------------------------- // wxMemoryFSHandler //-------------------------------------------------------------------------------- -wxHashTable *wxMemoryFSHandler::m_Hash = NULL; +wxHashTable *wxMemoryFSHandlerBase::m_Hash = NULL; -wxMemoryFSHandler::wxMemoryFSHandler() : wxFileSystemHandler() +wxMemoryFSHandlerBase::wxMemoryFSHandlerBase() : wxFileSystemHandler() { } -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")); @@ -107,7 +125,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) { @@ -119,7 +137,7 @@ wxFSFile* wxMemoryFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString GetAnchor(location) #if wxUSE_DATETIME , obj -> m_Time -#endif // wxUSE_DATETIME +#endif // wxUSE_DATETIME ); } else return NULL; @@ -127,30 +145,29 @@ wxFSFile* wxMemoryFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString -wxString wxMemoryFSHandler::FindFirst(const wxString& WXUNUSED(spec), +wxString wxMemoryFSHandlerBase::FindFirst(const wxString& WXUNUSED(spec), int WXUNUSED(flags)) { - wxFAIL_MSG(wxT("wxMemoryFSHandler::FindFirst not implemented")); + wxFAIL_MSG(wxT("wxMemoryFSHandlerBase::FindFirst not implemented")); return wxEmptyString; } -wxString wxMemoryFSHandler::FindNext() +wxString wxMemoryFSHandlerBase::FindNext() { - wxFAIL_MSG(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) { m_Hash = new wxHashTable(wxKEY_STRING); - m_Hash -> DeleteContents(TRUE); } if (m_Hash -> Get(filename) != NULL) @@ -158,49 +175,20 @@ bool wxMemoryFSHandler::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; -} - - - -#if wxUSE_GUI - -/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, 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)); - 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); - } + return true; } -/*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const wxBitmap& bitmap, long type) -{ - wxImage img = bitmap.ConvertToImage(); - AddFile(filename, img, type); -} - -#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()); } -/*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)); @@ -208,7 +196,7 @@ bool wxMemoryFSHandler::CheckHash(const wxString& filename) -/*static*/ void wxMemoryFSHandler::RemoveFile(const wxString& filename) +/*static*/ void wxMemoryFSHandlerBase::RemoveFile(const wxString& filename) { if (m_Hash == NULL || m_Hash -> Get(filename) == NULL) @@ -222,6 +210,43 @@ 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)); + 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) +{ + wxImage img = bitmap.ConvertToImage(); + AddFile(filename, img, type); +} + +#endif // wxUSE_IMAGE + +#endif // wxUSE_GUI #endif // wxUSE_FILESYSTEM && wxUSE_FS_ZIP +