X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7912e6332f65d8c975df0a7bd64a0c2d8445c63f..878711c01c1b9ad5b97d35f379a048b8ce1bfb49:/src/common/filesys.cpp?ds=sidebyside diff --git a/src/common/filesys.cpp b/src/common/filesys.cpp index d335bf7e7a..4213f32dc4 100644 --- a/src/common/filesys.cpp +++ b/src/common/filesys.cpp @@ -25,6 +25,7 @@ #include "wx/filesys.h" #include "wx/mimetype.h" #include "wx/filename.h" +#include "wx/log.h" @@ -127,7 +128,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 +180,27 @@ 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 nativePath = wxFileSystem::URLToNativePath(right); - wxFileName fn(nativePath, wxPATH_UNIX); + wxString right = GetRightLocation(location); + wxFileName fn = wxFileSystem::URLToFileName(right); + wxString fullpath = ms_root + fn.GetFullPath(); - if (!wxFileExists(fn.GetFullPath())) + if (!wxFileExists(fullpath)) return (wxFSFile*) NULL; - return new wxFSFile(new wxFFileInputStream(fn.GetFullPath()), + return new wxFSFile(new wxFFileInputStream(fullpath), 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(right, flags); + wxFileName fn = wxFileSystem::URLToFileName(GetRightLocation(spec)); + return wxFindFirstFile(ms_root + fn.GetFullPath(), flags); } wxString wxLocalFSHandler::FindNext() @@ -422,56 +432,76 @@ const static wxString g_unixPathString(wxT("/")); const static wxString g_nativePathString(wxFILE_SEP_PATH); // Returns the native path for a file URL -wxString wxFileSystem::URLToNativePath( const wxString& url ) +wxFileName wxFileSystem::URLToFileName(const wxString& url) { - wxString path = url ; + wxString path = url; if ( path.Find(wxT("file://")) == 0 ) { - path = path.Mid(7) ; + 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(":")); -#ifndef __UNIX__ +#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) ; + 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 ; + path = wxT("//") + path; } #endif - path.Replace(g_unixPathString, g_nativePathString) ; + path.Replace(g_unixPathString, g_nativePathString); - return path ; + return wxFileName(path, wxPATH_NATIVE); } // Returns the file URL for a native path -wxString wxFileSystem::NativePathToURL( const wxString& path ) +wxString wxFileSystem::FileNameToURL(const wxFileName& filename) { - wxString url = path ; + wxFileName fn = filename; + fn.Normalize(wxPATH_NORM_DOTS | wxPATH_NORM_TILDE | wxPATH_NORM_ABSOLUTE); + wxString url = fn.GetFullPath(wxPATH_NATIVE); -#ifdef __WXMSW__ - // unc notation - if ( url.Find(wxT("\\\\")) == 0 ) - { - url = url.Mid(2) ; - } - else +#ifndef __UNIX__ + // unc notation, wxMSW + if ( url.Find(wxT("\\\\")) == 0 ) + { + url = url.Mid(2); + } + else + { + url = wxT("/") + url; +#ifdef __WXMAC__ + url = wxT("/") + url; +#endif + + } #endif - { - url = wxT("/") + url ; - } - url.Replace(g_nativePathString, g_unixPathString) ; - url = wxT("file://") + url ; - return url ; + url.Replace(g_nativePathString, g_unixPathString); + url.Replace(wxT("%"), wxT("%25")); + url.Replace(wxT(":"), wxT("%3A")); + url = wxT("file:") + url; + return url; }