]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filesys.cpp
Better place for coordinate mirroring and removal
[wxWidgets.git] / src / common / filesys.cpp
index 61ec083da446e7c3728772e64bf26b7faca0f6bb..57fc6e3712e92e001da5e259d84a77f10a6eba5d 100644 (file)
 
 #ifndef WX_PRECOMP
     #include "wx/log.h"
 
 #ifndef WX_PRECOMP
     #include "wx/log.h"
+    #include "wx/module.h"
 #endif
 
 #include "wx/wfstream.h"
 #endif
 
 #include "wx/wfstream.h"
-#include "wx/module.h"
 #include "wx/mimetype.h"
 #include "wx/filename.h"
 #include "wx/tokenzr.h"
 #include "wx/mimetype.h"
 #include "wx/filename.h"
 #include "wx/tokenzr.h"
@@ -214,7 +214,13 @@ wxFSFile* wxLocalFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString&
 
     // we need to check whether we can really read from this file, otherwise
     // wxFSFile is not going to work
 
     // we need to check whether we can really read from this file, otherwise
     // wxFSFile is not going to work
+#if wxUSE_FILE
+    wxFileInputStream *is = new wxFileInputStream(fullpath);
+#elif wxUSE_FFILE
     wxFFileInputStream *is = new wxFFileInputStream(fullpath);
     wxFFileInputStream *is = new wxFFileInputStream(fullpath);
+#else
+#error One of wxUSE_FILE or wxUSE_FFILE must be set to 1 for wxFSHandler to work
+#endif
     if ( !is->Ok() )
     {
         delete is;
     if ( !is->Ok() )
     {
         delete is;
@@ -482,10 +488,38 @@ bool wxFileSystem::FindFileInPath(wxString *pStr,
 
 void wxFileSystem::AddHandler(wxFileSystemHandler *handler)
 {
 
 void wxFileSystem::AddHandler(wxFileSystemHandler *handler)
 {
-    m_Handlers.Append(handler);
+    // prepend the handler to the beginning of the list because handlers added
+    // last should have the highest priority to allow overriding them
+    m_Handlers.Insert((size_t)0, handler);
+}
+
+wxFileSystemHandler* wxFileSystem::RemoveHandler(wxFileSystemHandler *handler)
+{
+    // if handler has already been removed (or deleted)
+    // we return NULL. This is by design in case
+    // CleanUpHandlers() is called before RemoveHandler
+    // is called, as we cannot control the order
+    // which modules are unloaded
+    if (!m_Handlers.DeleteObject(handler))
+        return NULL;
+
+    return handler;
 }
 
 
 }
 
 
+bool wxFileSystem::HasHandlerForPath(const wxString &location)
+{
+    for ( wxList::compatibility_iterator node = m_Handlers.GetFirst();
+           node; node = node->GetNext() )
+    {
+        wxFileSystemHandler *h = (wxFileSystemHandler*) node->GetData();
+        if (h->CanOpen(location))
+            return true;
+    }
+
+    return false;
+}
+
 void wxFileSystem::CleanUpHandlers()
 {
     WX_CLEAR_LIST(wxList, m_Handlers);
 void wxFileSystem::CleanUpHandlers()
 {
     WX_CLEAR_LIST(wxList, m_Handlers);
@@ -575,15 +609,28 @@ class wxFileSystemModule : public wxModule
     DECLARE_DYNAMIC_CLASS(wxFileSystemModule)
 
     public:
     DECLARE_DYNAMIC_CLASS(wxFileSystemModule)
 
     public:
+        wxFileSystemModule() :
+            wxModule(),
+            m_handler(NULL)
+        {
+        }
+
         virtual bool OnInit()
         {
         virtual bool OnInit()
         {
-            wxFileSystem::AddHandler(new wxLocalFSHandler);
+            m_handler = new wxLocalFSHandler;
+            wxFileSystem::AddHandler(m_handler);
             return true;
         }
         virtual void OnExit()
         {
             return true;
         }
         virtual void OnExit()
         {
+            delete wxFileSystem::RemoveHandler(m_handler);
+
             wxFileSystem::CleanUpHandlers();
         }
             wxFileSystem::CleanUpHandlers();
         }
+
+    private:
+        wxFileSystemHandler* m_handler;
+
 };
 
 IMPLEMENT_DYNAMIC_CLASS(wxFileSystemModule, wxModule)
 };
 
 IMPLEMENT_DYNAMIC_CLASS(wxFileSystemModule, wxModule)