#include "wx/module.h"
#endif
+#include "wx/sysopt.h"
#include "wx/wfstream.h"
#include "wx/mimetype.h"
#include "wx/filename.h"
#if wxUSE_MIMETYPE
static bool s_MinimalMimeEnsured = false;
- if (!s_MinimalMimeEnsured)
+
+ // Don't use mime types manager if the application doesn't need it and it would be
+ // cause an unacceptable delay, especially on startup.
+#if wxUSE_SYSTEM_OPTIONS
+ if ( !wxSystemOptions::GetOptionInt(wxT("filesys.no-mimetypesmanager")) )
+#endif
{
- static const wxFileTypeInfo fallbacks[] =
+ if (!s_MinimalMimeEnsured)
+ {
+ static const wxFileTypeInfo fallbacks[] =
+ {
+ wxFileTypeInfo(_T("image/jpeg"),
+ wxEmptyString,
+ wxEmptyString,
+ _T("JPEG image (from fallback)"),
+ _T("jpg"), _T("jpeg"), _T("JPG"), _T("JPEG"), wxNullPtr),
+ wxFileTypeInfo(_T("image/gif"),
+ wxEmptyString,
+ wxEmptyString,
+ _T("GIF image (from fallback)"),
+ _T("gif"), _T("GIF"), wxNullPtr),
+ wxFileTypeInfo(_T("image/png"),
+ wxEmptyString,
+ wxEmptyString,
+ _T("PNG image (from fallback)"),
+ _T("png"), _T("PNG"), wxNullPtr),
+ wxFileTypeInfo(_T("image/bmp"),
+ wxEmptyString,
+ wxEmptyString,
+ _T("windows bitmap image (from fallback)"),
+ _T("bmp"), _T("BMP"), wxNullPtr),
+ wxFileTypeInfo(_T("text/html"),
+ wxEmptyString,
+ wxEmptyString,
+ _T("HTML document (from fallback)"),
+ _T("htm"), _T("html"), _T("HTM"), _T("HTML"), wxNullPtr),
+ // must terminate the table with this!
+ wxFileTypeInfo()
+ };
+ wxTheMimeTypesManager->AddFallbacks(fallbacks);
+ s_MinimalMimeEnsured = true;
+ }
+
+ wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(ext);
+ if ( !ft || !ft -> GetMimeType(&mime) )
{
- wxFileTypeInfo(_T("image/jpeg"),
- wxEmptyString,
- wxEmptyString,
- _T("JPEG image (from fallback)"),
- _T("jpg"), _T("jpeg"), _T("JPG"), _T("JPEG"), wxNullPtr),
- wxFileTypeInfo(_T("image/gif"),
- wxEmptyString,
- wxEmptyString,
- _T("GIF image (from fallback)"),
- _T("gif"), _T("GIF"), wxNullPtr),
- wxFileTypeInfo(_T("image/png"),
- wxEmptyString,
- wxEmptyString,
- _T("PNG image (from fallback)"),
- _T("png"), _T("PNG"), wxNullPtr),
- wxFileTypeInfo(_T("image/bmp"),
- wxEmptyString,
- wxEmptyString,
- _T("windows bitmap image (from fallback)"),
- _T("bmp"), _T("BMP"), wxNullPtr),
- wxFileTypeInfo(_T("text/html"),
- wxEmptyString,
- wxEmptyString,
- _T("HTML document (from fallback)"),
- _T("htm"), _T("html"), _T("HTM"), _T("HTML"), wxNullPtr),
- // must terminate the table with this!
- wxFileTypeInfo()
- };
- wxTheMimeTypesManager->AddFallbacks(fallbacks);
- s_MinimalMimeEnsured = true;
+ mime = wxEmptyString;
+ }
+
+ delete ft;
+
+ return mime;
}
-
- wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(ext);
- if ( !ft || !ft -> GetMimeType(&mime) )
+ else
+#endif
{
- mime = wxEmptyString;
+ if ( ext.IsSameAs(wxT("htm"), false) || ext.IsSameAs(_T("html"), false) )
+ return wxT("text/html");
+ if ( ext.IsSameAs(wxT("jpg"), false) || ext.IsSameAs(_T("jpeg"), false) )
+ return wxT("image/jpeg");
+ if ( ext.IsSameAs(wxT("gif"), false) )
+ return wxT("image/gif");
+ if ( ext.IsSameAs(wxT("png"), false) )
+ return wxT("image/png");
+ if ( ext.IsSameAs(wxT("bmp"), false) )
+ return wxT("image/bmp");
+ return wxEmptyString;
}
-
- delete ft;
-
- return mime;
-#else
- if ( ext.IsSameAs(wxT("htm"), false) || ext.IsSameAs(_T("html"), false) )
- return wxT("text/html");
- if ( ext.IsSameAs(wxT("jpg"), false) || ext.IsSameAs(_T("jpeg"), false) )
- return wxT("image/jpeg");
- if ( ext.IsSameAs(wxT("gif"), false) )
- return wxT("image/gif");
- if ( ext.IsSameAs(wxT("png"), false) )
- return wxT("image/png");
- if ( ext.IsSameAs(wxT("bmp"), false) )
- return wxT("image/bmp");
- return wxEmptyString;
-#endif
}
for (int i = l-1; i >= 0; i--) {
c = location[i];
- if (c == wxT('#')) return location.Right(l-i-1);
- else if ((c == wxT('.')) || (c == wxT('/')) || (c == wxT('\\')) || (c == wxT(':'))) return wxEmptyString;
+ if (c == wxT('#'))
+ return location.Right(l-i-1);
+ else if ((c == wxT('/')) || (c == wxT('\\')) || (c == wxT(':')))
+ return wxEmptyString;
}
return wxEmptyString;
}
wxString fullpath = ms_root + fn.GetFullPath();
if (!wxFileExists(fullpath))
- return (wxFSFile*) NULL;
+ return NULL;
// we need to check whether we can really read from this file, otherwise
// wxFSFile is not going to work
if ( !is->Ok() )
{
delete is;
- return (wxFSFile*) NULL;
+ return NULL;
}
return new wxFSFile(is,
wxString wxLocalFSHandler::FindFirst(const wxString& spec, int flags)
{
wxFileName fn = wxFileSystem::URLToFileName(GetRightLocation(spec));
- return wxFindFirstFile(ms_root + fn.GetFullPath(), flags);
+ const wxString found = wxFindFirstFile(ms_root + fn.GetFullPath(), flags);
+ if ( found.empty() )
+ return found;
+ return wxFileSystem::FileNameToURL(found);
}
wxString wxLocalFSHandler::FindNext()
{
- return wxFindNextFile();
+ const wxString found = wxFindNextFile();
+ if ( found.empty() )
+ return found;
+ return wxFileSystem::FileNameToURL(found);
}
url.Replace(g_nativePathString, g_unixPathString);
url.Replace(wxT("%"), wxT("%25")); // '%'s must be replaced first!
url.Replace(wxT("#"), wxT("%23"));
-#ifndef __WXMSW__
- // even though encoding the colon is (AFAICS) the right thing to do, we
- // shouldn't do this under Windows because IE refuses to handle the
- // resulting file:// URLs and Firefox and Opera (and probably all the other
- // browsers as they need to be IE-compatible anyhow) open both the versions
- // with ':' and "%3A", so leave the colon alone to keep IE happy
+
+ // 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"));
-#endif // __WXMSW__
url = wxT("file:") + url;
return url;
}