#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;
}
return new wxFSFile(is,
- right,
+ location,
wxEmptyString,
GetAnchor(location)
#if wxUSE_DATETIME
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('/');
}
path = wxURI::Unescape(path);
-#ifdef __WXMSW__
+#ifdef __WINDOWS__
// 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('/'))
+ if ( path.length() > 1 && (path[0u] == wxT('/') && path [1u] != wxT('/')) )
{
path = path.Mid(1);
}
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)
{
#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;
// Do wxURI- and common practice-compatible escaping: encode the string
// into UTF-8, then escape anything non-ASCII:
- return wxURI(url).BuildURI();
+ return wxT("file:") + EscapeFileNameCharsInURL(url.utf8_str());
}
IMPLEMENT_DYNAMIC_CLASS(wxFileSystemModule, wxModule)
+//// wxFSInputStream
+
+wxFSInputStream::wxFSInputStream(const wxString& filename, int flags)
+{
+ wxFileSystem fs;
+ m_file = fs.OpenFile(filename, flags | wxFS_READ);
+
+ if ( m_file )
+ {
+ wxInputStream* const stream = m_file->GetStream();
+ if ( stream )
+ {
+ // Notice that we pass the stream by reference: it shouldn't be
+ // deleted by us as it's owned by m_file already.
+ InitParentStream(*stream);
+ }
+ }
+}
+
+wxFSInputStream::~wxFSInputStream()
+{
+ delete m_file;
+}
+
#endif
// wxUSE_FILESYSTEM