#ifndef WX_PRECOMP
#include "wx/log.h"
+ #include "wx/module.h"
#endif
#include "wx/wfstream.h"
-#include "wx/module.h"
#include "wx/mimetype.h"
#include "wx/filename.h"
#include "wx/tokenzr.h"
// 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);
+#else
+#error One of wxUSE_FILE or wxUSE_FFILE must be set to 1 for wxFSHandler to work
+#endif
if ( !is->Ok() )
{
delete is;
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();
DECLARE_DYNAMIC_CLASS(wxFileSystemModule)
public:
+ wxFileSystemModule() :
+ wxModule(),
+ m_handler(NULL)
+ {
+ }
+
virtual bool OnInit()
{
- wxFileSystem::AddHandler(new wxLocalFSHandler);
+ m_handler = new wxLocalFSHandler;
+ wxFileSystem::AddHandler(m_handler);
return true;
}
virtual void OnExit()
{
+ delete wxFileSystem::RemoveHandler(m_handler);
+
wxFileSystem::CleanUpHandlers();
}
+
+ private:
+ wxFileSystemHandler* m_handler;
+
};
IMPLEMENT_DYNAMIC_CLASS(wxFileSystemModule, wxModule)