improve XRC loading performance on Unix by avoiding MIME database loading

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@46522 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2007-06-18 18:37:40 +00:00
parent 707dcbad73
commit 9f50431f18
6 changed files with 118 additions and 18 deletions

View File

@@ -97,6 +97,8 @@ All (GUI):
- Fixed selecting part of word from right to left in wxHTML (Michael Hieke) - 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 - Selecting text in wxHTML with character precision was made easier, it's
enough to select half of a character (Michael Hieke) 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: wxMSW:

View File

@@ -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 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 Add file to list of files stored in memory. Stored
data (bitmap, text or raw data) 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 that wxWidgets can save (e.g. JPG, PNG, see \helpref{wxImage
documentation}{wximage})! documentation}{wximage})!
Versions that take \arg{mimetype} argument are available since version 2.8.5.
\membersection{wxMemoryFSHandler::RemoveFile}\label{wxmemoryfshandlerremovefile} \membersection{wxMemoryFSHandler::RemoveFile}\label{wxmemoryfshandlerremovefile}

View File

@@ -35,6 +35,14 @@ public:
// name "memory:" + filename // name "memory:" + filename
static void AddFile(const wxString& filename, const wxString& textdata); static void AddFile(const wxString& filename, const wxString& textdata);
static void AddFile(const wxString& filename, const void *binarydata, size_t size); 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 // Remove file from memory FS and free occupied memory
static void RemoveFile(const wxString& filename); static void RemoveFile(const wxString& filename);
@@ -73,6 +81,24 @@ public:
{ {
wxMemoryFSHandlerBase::AddFile(filename, binarydata, size); 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 #if wxUSE_IMAGE
static void AddFile(const wxString& filename, static void AddFile(const wxString& filename,

View File

@@ -33,19 +33,21 @@ class MemFSHashObj : public wxObject
{ {
public: public:
MemFSHashObj(const void *data, size_t len) MemFSHashObj(const void *data, size_t len, const wxString& mime)
{ {
m_Data = new char[len]; m_Data = new char[len];
memcpy(m_Data, data, len); memcpy(m_Data, data, len);
m_Len = len; m_Len = len;
m_MimeType = mime;
InitTime(); InitTime();
} }
MemFSHashObj(const wxMemoryOutputStream& stream) MemFSHashObj(const wxMemoryOutputStream& stream, const wxString& mime)
{ {
m_Len = stream.GetSize(); m_Len = stream.GetSize();
m_Data = new char[m_Len]; m_Data = new char[m_Len];
stream.CopyTo(m_Data, m_Len); stream.CopyTo(m_Data, m_Len);
m_MimeType = mime;
InitTime(); InitTime();
} }
@@ -56,6 +58,7 @@ class MemFSHashObj : public wxObject
char *m_Data; char *m_Data;
size_t m_Len; size_t m_Len;
wxString m_MimeType;
#if wxUSE_DATETIME #if wxUSE_DATETIME
wxDateTime m_Time; wxDateTime m_Time;
#endif // wxUSE_DATETIME #endif // wxUSE_DATETIME
@@ -118,16 +121,27 @@ wxFSFile* wxMemoryFSHandlerBase::OpenFile(wxFileSystem& WXUNUSED(fs), const wxSt
if (m_Hash) if (m_Hash)
{ {
MemFSHashObj *obj = (MemFSHashObj*) m_Hash -> Get(GetRightLocation(location)); MemFSHashObj *obj = (MemFSHashObj*) m_Hash -> Get(GetRightLocation(location));
if (obj == NULL) return NULL; if (obj == NULL)
else return new wxFSFile(new wxMemoryInputStream(obj -> m_Data, obj -> m_Len), {
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, location,
GetMimeTypeFromExt(location), mime,
GetAnchor(location) GetAnchor(location)
#if wxUSE_DATETIME #if wxUSE_DATETIME
, obj -> m_Time , obj -> m_Time
#endif // wxUSE_DATETIME #endif // wxUSE_DATETIME
); );
} }
}
else return NULL; 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; 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; wxMemoryOutputStream mems;
if (image.Ok() && image.SaveFile(mems, (int)type)) 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 else
{ {
wxString s; wxString s;

View File

@@ -28,6 +28,7 @@
#include "wx/wfstream.h" #include "wx/wfstream.h"
#include "wx/utils.h" #include "wx/utils.h"
#include "wx/hashset.h" #include "wx/hashset.h"
#include "wx/mimetype.h"
WX_DECLARE_HASH_SET(wxString, wxStringHash, wxStringEqual, StringSet); WX_DECLARE_HASH_SET(wxString, wxStringHash, wxStringEqual, StringSet);
@@ -607,6 +608,14 @@ _T("#include <wx/filesys.h>\n")
_T("#include <wx/fs_mem.h>\n") _T("#include <wx/fs_mem.h>\n")
_T("#include <wx/xrc/xmlres.h>\n") _T("#include <wx/xrc/xmlres.h>\n")
_T("#include <wx/xrc/xh_all.h>\n") _T("#include <wx/xrc/xh_all.h>\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")); _T("\n"));
for (i = 0; i < flist.Count(); i++) for (i = 0; i < flist.Count(); i++)
@@ -631,8 +640,21 @@ _T("\n"));
for (i = 0; i < flist.Count(); i++) for (i = 0; i < flist.Count(); i++)
{ {
wxString s; 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); file.Write(s);
} }

View File

@@ -28,6 +28,7 @@
@WX_VERSION_TAG@.5 { @WX_VERSION_TAG@.5 {
global: global:
*wxDocument*GetUserReadableName*; *wxDocument*GetUserReadableName*;
*wxMemoryFSHandler*AddFileWithMimeType*;
*wxMetafileDC*DoGetTextExtent*; *wxMetafileDC*DoGetTextExtent*;
}; };