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:
@@ -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)
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user