]> git.saurik.com Git - wxWidgets.git/commitdiff
improve XRC loading performance on Unix by avoiding MIME database loading
authorVáclav Slavík <vslavik@fastmail.fm>
Mon, 18 Jun 2007 18:43:34 +0000 (18:43 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Mon, 18 Jun 2007 18:43:34 +0000 (18:43 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46523 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/fs_mem.h
src/common/fs_mem.cpp
utils/wxrc/wxrc.cpp

index 7dd33a3c7077b933d5ade39f224fad5d1ab19cc0..fe1139b06530bf1ce9b2a980ddf985594a5a99af 100644 (file)
@@ -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,
index aed198aa5a6eabe24ffaa74786d8e8cd41dc6a97..3da55fdc8d1fcf410923e650c88869be7d36382d 100644 (file)
@@ -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;
index f5ac65295d18f8d414a273f97a3aea1ed4652aab..d5076040e86fd68e8dd5e957bbdd8b1063c1ff2b 100644 (file)
@@ -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 <wx/filesys.h>\n")
 _T("#include <wx/fs_mem.h>\n")
 _T("#include <wx/xrc/xmlres.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"));
 
     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);
     }