Allow per instance filesystem handlers.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42507 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Michael Wetherell
2006-10-27 09:35:05 +00:00
parent 2786b6232c
commit 52ad298e66
2 changed files with 45 additions and 7 deletions

View File

@@ -25,6 +25,7 @@
#include "wx/stream.h" #include "wx/stream.h"
#include "wx/datetime.h" #include "wx/datetime.h"
#include "wx/filename.h" #include "wx/filename.h"
#include "wx/hashmap.h"
class WXDLLIMPEXP_BASE wxFSFile; class WXDLLIMPEXP_BASE wxFSFile;
class WXDLLIMPEXP_BASE wxFileSystemHandler; class WXDLLIMPEXP_BASE wxFileSystemHandler;
@@ -173,11 +174,13 @@ enum {
wxFS_SEEKABLE = 4 // Returned stream will be seekable wxFS_SEEKABLE = 4 // Returned stream will be seekable
}; };
WX_DECLARE_VOIDPTR_HASH_MAP(wxFileSystemHandler*, wxFSHandlerHash);
class WXDLLIMPEXP_BASE wxFileSystem : public wxObject class WXDLLIMPEXP_BASE wxFileSystem : public wxObject
{ {
public: public:
wxFileSystem() : wxObject() { m_FindFileHandler = NULL;} wxFileSystem() : wxObject() { m_FindFileHandler = NULL;}
virtual ~wxFileSystem() { } virtual ~wxFileSystem();
// sets the current location. Every call to OpenFile is // sets the current location. Every call to OpenFile is
// relative to this location. // relative to this location.
@@ -226,6 +229,8 @@ public:
protected: protected:
wxFileSystemHandler *MakeLocal(wxFileSystemHandler *h);
wxString m_Path; wxString m_Path;
// the path (location) we are currently in // the path (location) we are currently in
// this is path, not file! // this is path, not file!
@@ -237,6 +242,8 @@ protected:
// list of FS handlers // list of FS handlers
wxFileSystemHandler *m_FindFileHandler; wxFileSystemHandler *m_FindFileHandler;
// handler that succeed in FindFirst query // handler that succeed in FindFirst query
wxFSHandlerHash m_LocalHandlers;
// Handlers local to this instance
DECLARE_DYNAMIC_CLASS(wxFileSystem) DECLARE_DYNAMIC_CLASS(wxFileSystem)
DECLARE_NO_COPY_CLASS(wxFileSystem) DECLARE_NO_COPY_CLASS(wxFileSystem)

View File

@@ -262,6 +262,12 @@ IMPLEMENT_ABSTRACT_CLASS(wxFSFile, wxObject)
wxList wxFileSystem::m_Handlers; wxList wxFileSystem::m_Handlers;
wxFileSystem::~wxFileSystem()
{
WX_CLEAR_HASH_MAP(wxFSHandlerHash, m_LocalHandlers)
}
static wxString MakeCorrectPath(const wxString& path) static wxString MakeCorrectPath(const wxString& path)
{ {
wxString p(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) wxFSFile* wxFileSystem::OpenFile(const wxString& location, int flags)
{ {
wxString loc = MakeCorrectPath(location); wxString loc = MakeCorrectPath(location);
@@ -389,7 +414,7 @@ wxFSFile* wxFileSystem::OpenFile(const wxString& location, int flags)
wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData(); wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData();
if (h->CanOpen(m_Path + loc)) 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; } if (s) { m_LastName = m_Path + loc; break; }
} }
node = node->GetNext(); node = node->GetNext();
@@ -405,7 +430,7 @@ wxFSFile* wxFileSystem::OpenFile(const wxString& location, int flags)
wxFileSystemHandler *h = (wxFileSystemHandler*) node->GetData(); wxFileSystemHandler *h = (wxFileSystemHandler*) node->GetData();
if (h->CanOpen(loc)) if (h->CanOpen(loc))
{ {
s = h->OpenFile(*this, loc); s = MakeLocal(h)->OpenFile(*this, loc);
if (s) { m_LastName = loc; break; } if (s) { m_LastName = loc; break; }
} }
node = node->GetNext(); node = node->GetNext();
@@ -438,18 +463,24 @@ wxString wxFileSystem::FindFirst(const wxString& spec, int flags)
node = m_Handlers.GetFirst(); node = m_Handlers.GetFirst();
while (node) while (node)
{ {
m_FindFileHandler = (wxFileSystemHandler*) node -> GetData(); wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData();
if (m_FindFileHandler -> CanOpen(m_Path + spec2)) if (h -> CanOpen(m_Path + spec2))
{
m_FindFileHandler = MakeLocal(h);
return m_FindFileHandler -> FindFirst(m_Path + spec2, flags); return m_FindFileHandler -> FindFirst(m_Path + spec2, flags);
}
node = node->GetNext(); node = node->GetNext();
} }
node = m_Handlers.GetFirst(); node = m_Handlers.GetFirst();
while (node) while (node)
{ {
m_FindFileHandler = (wxFileSystemHandler*) node -> GetData(); wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData();
if (m_FindFileHandler -> CanOpen(spec2)) if (h -> CanOpen(spec2))
{
m_FindFileHandler = MakeLocal(h);
return m_FindFileHandler -> FindFirst(spec2, flags); return m_FindFileHandler -> FindFirst(spec2, flags);
}
node = node->GetNext(); node = node->GetNext();
} }