]> git.saurik.com Git - wxWidgets.git/commitdiff
Allow per instance filesystem handlers.
authorMichael Wetherell <mike.wetherell@ntlworld.com>
Fri, 27 Oct 2006 09:35:05 +0000 (09:35 +0000)
committerMichael Wetherell <mike.wetherell@ntlworld.com>
Fri, 27 Oct 2006 09:35:05 +0000 (09:35 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42507 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/filesys.h
src/common/filesys.cpp

index 27ba3bf2b62befed7547f73d12369fd9a4afb9ca..ca273c8876f1ed26ace7a39e9a1eecf3507f9906 100644 (file)
@@ -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)
index d63b432e72e736cfe073016f9a65bbb6a8cb9526..43c1ff93ae78526230ef567d0c9be30057dc1038 100644 (file)
@@ -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();
     }