Fixed wxFileSystem::FileNameToURL() regression with UNC paths.
We cannot use wxURI to do the escaping, because wxFileSystem depends on use of nonstandard escaping and prefixes (wxURI eats away file:// prefix, while wxFileSystem uses it to signify UNC paths; wxFileSystem needs to escape #,: as well). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63901 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -656,6 +656,42 @@ wxFileName wxFileSystem::URLToFileName(const wxString& url)
|
|||||||
return wxFileName(path, wxPATH_NATIVE);
|
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
|
// Returns the file URL for a native path
|
||||||
wxString wxFileSystem::FileNameToURL(const wxFileName& filename)
|
wxString wxFileSystem::FileNameToURL(const wxFileName& filename)
|
||||||
{
|
{
|
||||||
@@ -680,24 +716,10 @@ wxString wxFileSystem::FileNameToURL(const wxFileName& filename)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
url.Replace(g_nativePathString, g_unixPathString);
|
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;
|
|
||||||
|
|
||||||
// Do wxURI- and common practice-compatible escaping: encode the string
|
// Do wxURI- and common practice-compatible escaping: encode the string
|
||||||
// into UTF-8, then escape anything non-ASCII:
|
// into UTF-8, then escape anything non-ASCII:
|
||||||
return wxURI(url).BuildURI();
|
return wxT("file:") + EscapeFileNameCharsInURL(url.utf8_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user