From: Michael Wetherell Date: Fri, 27 Oct 2006 09:35:05 +0000 (+0000) Subject: Allow per instance filesystem handlers. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/52ad298e6600c75c417f94d23eef72ad4d78f133 Allow per instance filesystem handlers. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42507 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/filesys.h b/include/wx/filesys.h index 27ba3bf2b6..ca273c8876 100644 --- a/include/wx/filesys.h +++ b/include/wx/filesys.h @@ -25,6 +25,7 @@ #include "wx/stream.h" #include "wx/datetime.h" #include "wx/filename.h" +#include "wx/hashmap.h" class WXDLLIMPEXP_BASE wxFSFile; class WXDLLIMPEXP_BASE wxFileSystemHandler; @@ -173,11 +174,13 @@ enum { wxFS_SEEKABLE = 4 // Returned stream will be seekable }; +WX_DECLARE_VOIDPTR_HASH_MAP(wxFileSystemHandler*, wxFSHandlerHash); + class WXDLLIMPEXP_BASE wxFileSystem : public wxObject { public: wxFileSystem() : wxObject() { m_FindFileHandler = NULL;} - virtual ~wxFileSystem() { } + virtual ~wxFileSystem(); // sets the current location. Every call to OpenFile is // relative to this location. @@ -226,6 +229,8 @@ public: protected: + wxFileSystemHandler *MakeLocal(wxFileSystemHandler *h); + wxString m_Path; // the path (location) we are currently in // this is path, not file! @@ -237,6 +242,8 @@ protected: // list of FS handlers wxFileSystemHandler *m_FindFileHandler; // handler that succeed in FindFirst query + wxFSHandlerHash m_LocalHandlers; + // Handlers local to this instance DECLARE_DYNAMIC_CLASS(wxFileSystem) DECLARE_NO_COPY_CLASS(wxFileSystem) diff --git a/src/common/filesys.cpp b/src/common/filesys.cpp index d63b432e72..43c1ff93ae 100644 --- a/src/common/filesys.cpp +++ b/src/common/filesys.cpp @@ -262,6 +262,12 @@ IMPLEMENT_ABSTRACT_CLASS(wxFSFile, wxObject) wxList wxFileSystem::m_Handlers; +wxFileSystem::~wxFileSystem() +{ + WX_CLEAR_HASH_MAP(wxFSHandlerHash, m_LocalHandlers) +} + + static wxString MakeCorrectPath(const wxString& path) { wxString p(path); @@ -358,6 +364,25 @@ void wxFileSystem::ChangePathTo(const wxString& location, bool is_dir) +wxFileSystemHandler *wxFileSystem::MakeLocal(wxFileSystemHandler *h) +{ + wxClassInfo *classinfo = h->GetClassInfo(); + + if (classinfo->IsDynamic()) + { + wxFileSystemHandler*& local = m_LocalHandlers[classinfo]; + if (!local) + local = (wxFileSystemHandler*)classinfo->CreateObject(); + return local; + } + else + { + return h; + } +} + + + wxFSFile* wxFileSystem::OpenFile(const wxString& location, int flags) { wxString loc = MakeCorrectPath(location); @@ -389,7 +414,7 @@ wxFSFile* wxFileSystem::OpenFile(const wxString& location, int flags) wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData(); if (h->CanOpen(m_Path + loc)) { - s = h->OpenFile(*this, m_Path + loc); + s = MakeLocal(h)->OpenFile(*this, m_Path + loc); if (s) { m_LastName = m_Path + loc; break; } } node = node->GetNext(); @@ -405,7 +430,7 @@ wxFSFile* wxFileSystem::OpenFile(const wxString& location, int flags) wxFileSystemHandler *h = (wxFileSystemHandler*) node->GetData(); if (h->CanOpen(loc)) { - s = h->OpenFile(*this, loc); + s = MakeLocal(h)->OpenFile(*this, loc); if (s) { m_LastName = loc; break; } } node = node->GetNext(); @@ -438,18 +463,24 @@ wxString wxFileSystem::FindFirst(const wxString& spec, int flags) node = m_Handlers.GetFirst(); while (node) { - m_FindFileHandler = (wxFileSystemHandler*) node -> GetData(); - if (m_FindFileHandler -> CanOpen(m_Path + spec2)) + wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData(); + if (h -> CanOpen(m_Path + spec2)) + { + m_FindFileHandler = MakeLocal(h); return m_FindFileHandler -> FindFirst(m_Path + spec2, flags); + } node = node->GetNext(); } node = m_Handlers.GetFirst(); while (node) { - m_FindFileHandler = (wxFileSystemHandler*) node -> GetData(); - if (m_FindFileHandler -> CanOpen(spec2)) + wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData(); + if (h -> CanOpen(spec2)) + { + m_FindFileHandler = MakeLocal(h); return m_FindFileHandler -> FindFirst(spec2, flags); + } node = node->GetNext(); }