diff --git a/docs/changes.txt b/docs/changes.txt index 1ba311939a..dc61983178 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -97,6 +97,8 @@ All (GUI): - Fixed selecting part of word from right to left in wxHTML (Michael Hieke) - Selecting text in wxHTML with character precision was made easier, it's enough to select half of a character (Michael Hieke) +- Significantly improved startup times of XRC-based applications using + embedded resources on Unix (requires resources recompilation) wxMSW: diff --git a/docs/latex/wx/fs_mem.tex b/docs/latex/wx/fs_mem.tex index 3db09a4832..93aa6567f6 100644 --- a/docs/latex/wx/fs_mem.tex +++ b/docs/latex/wx/fs_mem.tex @@ -78,9 +78,9 @@ Constructor. \func{static void}{AddFile}{\param{const wxString\& }{filename}, \param{const wxBitmap\& }{bitmap}, \param{long }{type}} -\func{static void}{AddFile}{\param{const wxString\& }{filename}, \param{const wxString\& }{textdata}} +\func{static void}{AddFile}{\param{const wxString\& }{filename}, \param{const wxString\& }{textdata}, \param{const wxString\& }{mimetype}} -\func{static void}{AddFile}{\param{const wxString\& }{filename}, \param{const void* }{binarydata}, \param{size\_t }{size}} +\func{static void}{AddFile}{\param{const wxString\& }{filename}, \param{const void* }{binarydata}, \param{size\_t }{size}, \param{const wxString\& }{mimetype}} Add file to list of files stored in memory. Stored data (bitmap, text or raw data) @@ -92,6 +92,8 @@ Note that you must use a \arg{type} value (aka image format) that wxWidgets can save (e.g. JPG, PNG, see \helpref{wxImage documentation}{wximage})! +Versions that take \arg{mimetype} argument are available since version 2.8.5. + \membersection{wxMemoryFSHandler::RemoveFile}\label{wxmemoryfshandlerremovefile} diff --git a/include/wx/fs_mem.h b/include/wx/fs_mem.h index 7dd33a3c70..4d81398cfd 100644 --- a/include/wx/fs_mem.h +++ b/include/wx/fs_mem.h @@ -35,6 +35,14 @@ public: // name "memory:" + filename static void AddFile(const wxString& filename, const wxString& textdata); static void AddFile(const wxString& filename, const void *binarydata, size_t size); +#if wxABI_VERSION >= 20805 + static void AddFileWithMimeType(const wxString& filename, + const wxString& textdata, + const wxString& mimetype); + static void AddFileWithMimeType(const wxString& filename, + const void *binarydata, size_t size, + const wxString& mimetype); +#endif // wxABI_VERSION >= 20805 // Remove file from memory FS and free occupied memory static void RemoveFile(const wxString& filename); @@ -73,6 +81,24 @@ public: { wxMemoryFSHandlerBase::AddFile(filename, binarydata, size); } +#if wxABI_VERSION >= 20805 + static void AddFileWithMimeType(const wxString& filename, + const wxString& textdata, + const wxString& mimetype) + { + wxMemoryFSHandlerBase::AddFileWithMimeType(filename, + textdata, + mimetype); + } + static void AddFileWithMimeType(const wxString& filename, + const void *binarydata, size_t size, + const wxString& mimetype) + { + wxMemoryFSHandlerBase::AddFileWithMimeType(filename, + binarydata, size, + mimetype); + } +#endif // wxABI_VERSION >= 20805 #if wxUSE_IMAGE static void AddFile(const wxString& filename, diff --git a/src/common/fs_mem.cpp b/src/common/fs_mem.cpp index 054cb609ef..b7110b590f 100644 --- a/src/common/fs_mem.cpp +++ b/src/common/fs_mem.cpp @@ -33,19 +33,21 @@ 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(const 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(); } @@ -56,6 +58,7 @@ class MemFSHashObj : public wxObject char *m_Data; size_t m_Len; + wxString m_MimeType; #if wxUSE_DATETIME wxDateTime m_Time; #endif // wxUSE_DATETIME @@ -118,15 +121,26 @@ wxFSFile* wxMemoryFSHandlerBase::OpenFile(wxFileSystem& WXUNUSED(fs), const wxSt 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) + if (obj == NULL) + { + return NULL; + } + else + { + wxString mime = obj->m_MimeType; + if ( mime.empty() ) + mime = GetMimeTypeFromExt(location); + return new wxFSFile + ( + new wxMemoryInputStream(obj -> m_Data, obj -> m_Len), + location, + mime, + GetAnchor(location) #if wxUSE_DATETIME - , obj -> m_Time + , obj -> m_Time #endif // wxUSE_DATETIME - ); + ); + } } else return NULL; } @@ -170,16 +184,39 @@ bool wxMemoryFSHandlerBase::CheckHash(const wxString& filename) } -/*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); } @@ -212,7 +249,17 @@ wxMemoryFSHandler::AddFile(const wxString& filename, 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; diff --git a/utils/wxrc/wxrc.cpp b/utils/wxrc/wxrc.cpp index 8ac5aaef2f..4cfa9ff753 100644 --- a/utils/wxrc/wxrc.cpp +++ b/utils/wxrc/wxrc.cpp @@ -28,6 +28,7 @@ #include "wx/wfstream.h" #include "wx/utils.h" #include "wx/hashset.h" +#include "wx/mimetype.h" WX_DECLARE_HASH_SET(wxString, wxStringHash, wxStringEqual, StringSet); @@ -607,6 +608,14 @@ _T("#include \n") _T("#include \n") _T("#include \n") _T("#include \n") +_T("\n") +_T("#if wxCHECK_VERSION(2,8,5) && wxABI_VERSION >= 20805\n") +_T(" #define XRC_ADD_FILE(name, data, size, mime) \\\n") +_T(" wxMemoryFSHandler::AddFileWithMimeType(name, data, size, mime)\n") +_T("#else\n") +_T(" #define XRC_ADD_FILE(name, data, size, mime) \\\n") +_T(" wxMemoryFSHandler::AddFile(name, data, size)\n") +_T("#endif\n") _T("\n")); for (i = 0; i < flist.Count(); i++) @@ -631,8 +640,21 @@ _T("\n")); for (i = 0; i < flist.Count(); i++) { wxString s; - s.Printf(_T(" wxMemoryFSHandler::AddFile(wxT(\"XRC_resource/") + flist[i] + - _T("\"), xml_res_file_%i, xml_res_size_%i);\n"), i, i); + + wxString mime; + wxString ext = wxFileName(flist[i]).GetExt(); + if ( ext.Lower() == _T("xrc") ) + mime = _T("text/xml"); + else + { + wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(ext); + if ( ft ) + ft->GetMimeType(&mime); + } + + s.Printf(_T(" XRC_ADD_FILE(wxT(\"XRC_resource/") + flist[i] + + _T("\"), xml_res_file_%i, xml_res_size_%i, _T(\"%s\"));\n"), + i, i, mime.c_str()); file.Write(s); } diff --git a/version-script.in b/version-script.in index a2959fbcdf..85cb066c5b 100644 --- a/version-script.in +++ b/version-script.in @@ -28,6 +28,7 @@ @WX_VERSION_TAG@.5 { global: *wxDocument*GetUserReadableName*; + *wxMemoryFSHandler*AddFileWithMimeType*; *wxMetafileDC*DoGetTextExtent*; };