X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/03647350fc7cd141953c72e0284e928847d30f44..e96be167e76f2225de04d9c30d66b41a303fcccf:/src/common/filesys.cpp diff --git a/src/common/filesys.cpp b/src/common/filesys.cpp index 1e3740864e..f94b3f5d91 100644 --- a/src/common/filesys.cpp +++ b/src/common/filesys.cpp @@ -255,7 +255,7 @@ wxFSFile* wxLocalFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& #else #error One of wxUSE_FILE or wxUSE_FFILE must be set to 1 for wxFSHandler to work #endif - if ( !is->Ok() ) + if ( !is->IsOk() ) { delete is; return NULL; @@ -355,7 +355,7 @@ void wxFileSystem::ChangePathTo(const wxString& location, bool is_dir) if (is_dir) { - if (m_Path.length() > 0 && m_Path.Last() != wxT('/') && m_Path.Last() != wxT(':')) + if (!m_Path.empty() && m_Path.Last() != wxT('/') && m_Path.Last() != wxT(':')) m_Path << wxT('/'); } @@ -656,6 +656,42 @@ wxFileName wxFileSystem::URLToFileName(const wxString& url) return wxFileName(path, wxPATH_NATIVE); } +// Escapes non-ASCII and others characters in file: URL to be valid URLs +static wxString EscapeFileNameCharsInURL(const char *in) +{ + wxString s; + + for ( const unsigned char *p = (const unsigned char*)in; *p; ++p ) + { + const unsigned char c = *p; + + // notice that all colons *must* be encoded in the paths used by + // wxFileSystem even though this makes URLs produced by this method + // unusable with IE under Windows as it requires "file:///c:/foo.bar" + // and doesn't accept "file:///c%3a/foo.bar" -- but then we never made + // any guarantees about general suitability of the strings returned by + // this method, they must work with wxFileSystem only and not encoding + // the colon breaks handling of + // "http://wherever/whatever.zip#zip:filename.ext" URLs so we really + // can't do this without heavy changes to the parsing code here, in + // particular in GetRightLocation() + + if ( c == '/' || c == '-' || c == '.' || c == '_' || c == '~' || + (c >= '0' && c <= '9') || + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') ) + { + s << c; + } + else + { + s << wxString::Format("%%%02x", c); + } + } + + return s; +} + // Returns the file URL for a native path wxString wxFileSystem::FileNameToURL(const wxFileName& filename) { @@ -680,21 +716,10 @@ wxString wxFileSystem::FileNameToURL(const wxFileName& filename) #endif url.Replace(g_nativePathString, g_unixPathString); - url.Replace(wxT("%"), wxT("%25")); // '%'s must be replaced first! - url.Replace(wxT("#"), wxT("%23")); - - // notice that all colons *must* be encoded in the paths used by - // wxFileSystem even though this makes URLs produced by this method - // unusable with IE under Windows as it requires "file:///c:/foo.bar" and - // doesn't accept "file:///c%3a/foo.bar" -- but then we never made any - // guarantees about general suitability of the strings returned by this - // method, they must work with wxFileSystem only and not encoding the colon - // breaks handling of "http://wherever/whatever.zip#zip:filename.ext" URLs - // so we really can't do this without heavy changes to the parsing code - // here, in particular in GetRightLocation() - url.Replace(wxT(":"), wxT("%3A")); - url = wxT("file:") + url; - return url; + + // Do wxURI- and common practice-compatible escaping: encode the string + // into UTF-8, then escape anything non-ASCII: + return wxT("file:") + EscapeFileNameCharsInURL(url.utf8_str()); }