From c5d7b81ecf829d5b0f3455bfa6e35736313f223c Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Mon, 18 Jun 2007 18:43:34 +0000 Subject: [PATCH] improve XRC loading performance on Unix by avoiding MIME database loading git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46523 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/fs_mem.h | 22 ++++++++++++++++++ src/common/fs_mem.cpp | 52 ++++++++++++++++++++++++++++++++++++------- utils/wxrc/wxrc.cpp | 26 ++++++++++++++++++++-- 3 files changed, 90 insertions(+), 10 deletions(-) diff --git a/include/wx/fs_mem.h b/include/wx/fs_mem.h index 7dd33a3c70..fe1139b065 100644 --- a/include/wx/fs_mem.h +++ b/include/wx/fs_mem.h @@ -35,6 +35,12 @@ 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); + 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); // Remove file from memory FS and free occupied memory static void RemoveFile(const wxString& filename); @@ -73,6 +79,22 @@ public: { wxMemoryFSHandlerBase::AddFile(filename, binarydata, size); } + 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); + } #if wxUSE_IMAGE static void AddFile(const wxString& filename, diff --git a/src/common/fs_mem.cpp b/src/common/fs_mem.cpp index aed198aa5a..3da55fdc8d 100644 --- a/src/common/fs_mem.cpp +++ b/src/common/fs_mem.cpp @@ -34,19 +34,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(); } @@ -57,6 +59,7 @@ class MemFSHashObj : public wxObject char *m_Data; size_t m_Len; + wxString m_MimeType; #if wxUSE_DATETIME wxDateTime m_Time; #endif // wxUSE_DATETIME @@ -122,7 +125,7 @@ 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, - wxEmptyString, + obj->m_MimeType, GetAnchor(location) #if wxUSE_DATETIME , obj -> m_Time @@ -171,16 +174,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); } @@ -213,7 +239,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 f5ac65295d..d5076040e8 100644 --- a/utils/wxrc/wxrc.cpp +++ b/utils/wxrc/wxrc.cpp @@ -29,6 +29,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); @@ -613,6 +614,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.GetCount(); i++) @@ -637,8 +646,21 @@ _T("\n")); for (i = 0; i < flist.GetCount(); 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); } -- 2.47.2