X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8ad944dcbcb8c1aaa0b8b5ce653d5a7206ea7cb8..785f5eaa05195f5e44a974861864324667a3326e:/src/common/filesys.cpp diff --git a/src/common/filesys.cpp b/src/common/filesys.cpp index fa5355435d..5e10fd8d44 100644 --- a/src/common/filesys.cpp +++ b/src/common/filesys.cpp @@ -7,7 +7,7 @@ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "filesys.h" #endif @@ -25,7 +25,7 @@ #include "wx/filesys.h" #include "wx/mimetype.h" #include "wx/filename.h" - +#include "wx/log.h" //-------------------------------------------------------------------------------- @@ -35,10 +35,6 @@ IMPLEMENT_ABSTRACT_CLASS(wxFileSystemHandler, wxObject) -#if wxUSE_MIMETYPE -static wxFileTypeInfo *gs_FSMimeFallbacks = NULL; -#endif - wxString wxFileSystemHandler::GetMimeTypeFromExt(const wxString& location) { wxString ext, mime; @@ -62,10 +58,41 @@ wxString wxFileSystemHandler::GetMimeTypeFromExt(const wxString& location) } #if wxUSE_MIMETYPE - static bool s_MinimalMimeEnsured = FALSE; - if (!s_MinimalMimeEnsured) { - wxTheMimeTypesManager->AddFallbacks(gs_FSMimeFallbacks); - s_MinimalMimeEnsured = TRUE; + static bool s_MinimalMimeEnsured = false; + if (!s_MinimalMimeEnsured) + { + static const wxFileTypeInfo fallbacks[] = + { + wxFileTypeInfo(_T("image/jpeg"), + _T(""), + _T(""), + _T("JPEG image (from fallback)"), + _T("jpg"), _T("jpeg"), _T("JPG"), _T("JPEG"), NULL), + wxFileTypeInfo(_T("image/gif"), + _T(""), + _T(""), + _T("GIF image (from fallback)"), + _T("gif"), _T("GIF"), NULL), + wxFileTypeInfo(_T("image/png"), + _T(""), + _T(""), + _T("PNG image (from fallback)"), + _T("png"), _T("PNG"), NULL), + wxFileTypeInfo(_T("image/bmp"), + _T(""), + _T(""), + _T("windows bitmap image (from fallback)"), + _T("bmp"), _T("BMP"), NULL), + wxFileTypeInfo(_T("text/html"), + _T(""), + _T(""), + _T("HTML document (from fallback)"), + _T("htm"), _T("html"), _T("HTM"), _T("HTML"), NULL), + // must terminate the table with this! + wxFileTypeInfo() + }; + wxTheMimeTypesManager->AddFallbacks(fallbacks); + s_MinimalMimeEnsured = true; } wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(ext); @@ -127,7 +154,14 @@ wxString wxFileSystemHandler::GetRightLocation(const wxString& location) const { int i, l = location.Length(); int l2 = l + 1; - for (i = l-1; (i >= 0) && ((location[i] != wxT(':')) || (i == 1) || (location[i-2] == wxT(':'))); i--) {if (location[i] == wxT('#')) l2 = i + 1;} + + for (i = l-1; + (i >= 0) && + ((location[i] != wxT(':')) || (i == 1) || (location[i-2] == wxT(':'))); + i--) + { + if (location[i] == wxT('#')) l2 = i + 1; + } if (i == 0) return wxEmptyString; else return location.Mid(i + 1, l2 - i - 2); } @@ -172,25 +206,36 @@ bool wxLocalFSHandler::CanOpen(const wxString& location) wxFSFile* wxLocalFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location) { // location has Unix path separators - wxString right = ms_root + GetRightLocation(location); + wxString right = GetRightLocation(location); wxFileName fn = wxFileSystem::URLToFileName(right); + wxString fullpath = ms_root + fn.GetFullPath(); + + if (!wxFileExists(fullpath)) + return (wxFSFile*) NULL; - if (!wxFileExists(fn.GetFullPath())) + // we need to check whether we can really read from this file, otherwise + // wxFSFile is not going to work + wxFFileInputStream *is = new wxFFileInputStream(fullpath); + if ( !is->Ok() ) + { + delete is; return (wxFSFile*) NULL; + } - return new wxFSFile(new wxFFileInputStream(fn.GetFullPath()), + return new wxFSFile(is, right, GetMimeTypeFromExt(location), - GetAnchor(location), - wxDateTime(wxFileModificationTime(fn.GetFullPath()))); - + GetAnchor(location) +#if wxUSE_DATETIME + ,wxDateTime(wxFileModificationTime(fullpath)) +#endif // wxUSE_DATETIME + ); } wxString wxLocalFSHandler::FindFirst(const wxString& spec, int flags) { - wxString right = ms_root + GetRightLocation(spec); - return wxFindFirstFile(wxFileSystem::URLToFileName(right).GetFullPath(), - flags); + wxFileName fn = wxFileSystem::URLToFileName(GetRightLocation(spec)); + return wxFindFirstFile(ms_root + fn.GetFullPath(), flags); } wxString wxLocalFSHandler::FindNext() @@ -313,7 +358,7 @@ wxFSFile* wxFileSystem::OpenFile(const wxString& location) unsigned i, ln; char meta; wxFSFile *s = NULL; - wxNode *node; + wxList::compatibility_iterator node; ln = loc.Length(); meta = 0; @@ -367,7 +412,7 @@ wxFSFile* wxFileSystem::OpenFile(const wxString& location) wxString wxFileSystem::FindFirst(const wxString& spec, int flags) { - wxNode *node; + wxList::compatibility_iterator node; wxString spec2(spec); m_FindFileHandler = NULL; @@ -414,8 +459,7 @@ void wxFileSystem::AddHandler(wxFileSystemHandler *handler) void wxFileSystem::CleanUpHandlers() { - m_Handlers.DeleteContents(TRUE); - m_Handlers.Clear(); + WX_CLEAR_LIST(wxList, m_Handlers); } const static wxString g_unixPathString(wxT("/")); @@ -430,6 +474,18 @@ wxFileName wxFileSystem::URLToFileName(const wxString& url) { 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.Replace(wxT("%25"), wxT("%")); + path.Replace(wxT("%3A"), wxT(":")); #ifdef __WXMSW__ // file urls either start with a forward slash (local harddisk), @@ -459,8 +515,8 @@ wxString wxFileSystem::FileNameToURL(const wxFileName& filename) fn.Normalize(wxPATH_NORM_DOTS | wxPATH_NORM_TILDE | wxPATH_NORM_ABSOLUTE); wxString url = fn.GetFullPath(wxPATH_NATIVE); -#ifdef __WXMSW__ - // unc notation +#ifndef __UNIX__ + // unc notation, wxMSW if ( url.Find(wxT("\\\\")) == 0 ) { url = url.Mid(2); @@ -468,11 +524,17 @@ wxString wxFileSystem::FileNameToURL(const wxFileName& filename) else { url = wxT("/") + url; +#ifdef __WXMAC__ + url = wxT("/") + url; +#endif + } #endif url.Replace(g_nativePathString, g_unixPathString); - url = wxT("file://") + url; + url.Replace(wxT("%"), wxT("%25")); + url.Replace(wxT(":"), wxT("%3A")); + url = wxT("file:") + url; return url; } @@ -487,50 +549,10 @@ class wxFileSystemModule : public wxModule virtual bool OnInit() { wxFileSystem::AddHandler(new wxLocalFSHandler); - - #if wxUSE_MIMETYPE - gs_FSMimeFallbacks = new wxFileTypeInfo[6]; - gs_FSMimeFallbacks[0] = - wxFileTypeInfo(_T("image/jpeg"), - _T(""), - _T(""), - _T("JPEG image (from fallback)"), - _T("jpg"), _T("jpeg"), NULL); - gs_FSMimeFallbacks[1] = - wxFileTypeInfo(_T("image/gif"), - _T(""), - _T(""), - _T("GIF image (from fallback)"), - _T("gif"), NULL); - gs_FSMimeFallbacks[2] = - wxFileTypeInfo(_T("image/png"), - _T(""), - _T(""), - _T("PNG image (from fallback)"), - _T("png"), NULL); - gs_FSMimeFallbacks[3] = - wxFileTypeInfo(_T("image/bmp"), - _T(""), - _T(""), - _T("windows bitmap image (from fallback)"), - _T("bmp"), NULL); - gs_FSMimeFallbacks[4] = - wxFileTypeInfo(_T("text/html"), - _T(""), - _T(""), - _T("HTML document (from fallback)"), - _T("htm"), _T("html"), NULL); - gs_FSMimeFallbacks[5] = - // must terminate the table with this! - wxFileTypeInfo(); - #endif - return TRUE; + return true; } virtual void OnExit() { - #if wxUSE_MIMETYPE - delete [] gs_FSMimeFallbacks; - #endif wxFileSystem::CleanUpHandlers(); } };