+ // 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);
+}
+
+static const wxString g_unixPathString(wxT("/"));
+static const wxString g_nativePathString(wxFILE_SEP_PATH);
+
+// Returns the native path for a file URL
+wxFileName wxFileSystem::URLToFileName(const wxString& url)
+{
+ wxString path = url;
+
+ if ( path.Find(wxT("file://")) == 0 )
+ {
+ path = path.Mid(7);
+ }
+ else if ( path.Find(wxT("file:")) == 0 )
+ {
+ path = path.Mid(5);
+ }
+ // Remove preceding double slash on Mac Classic
+#if defined(__WXMAC__) && !defined(__UNIX__)
+ else if ( path.Find(wxT("//")) == 0 )
+ path = path.Mid(2);
+#endif
+
+ path = wxURI::Unescape(path);
+
+#ifdef __WXMSW__
+ // file urls either start with a forward slash (local harddisk),
+ // otherwise they have a servername/sharename notation,
+ // which only exists on msw and corresponds to a unc
+ if ( path[0u] == wxT('/') && path [1u] != wxT('/'))
+ {
+ path = path.Mid(1);
+ }
+ else if ( (url.Find(wxT("file://")) == 0) &&
+ (path.Find(wxT('/')) != wxNOT_FOUND) &&
+ (path.length() > 1) && (path[1u] != wxT(':')) )
+ {
+ path = wxT("//") + path;
+ }
+#endif
+
+ path.Replace(g_unixPathString, g_nativePathString);
+
+ return wxFileName(path, wxPATH_NATIVE);