X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/45c94d784d7e60f337485067d3a2f4706815eb4d..f5ba273ecd799f652736ce2bc830283787302a56:/src/common/fs_inet.cpp diff --git a/src/common/fs_inet.cpp b/src/common/fs_inet.cpp index f471a5bf83..d3b94f258d 100644 --- a/src/common/fs_inet.cpp +++ b/src/common/fs_inet.cpp @@ -23,7 +23,7 @@ limitation) #pragma implementation #endif -#include +#include "wx/wxprec.h" #ifdef __BORDLANDC__ #pragma hdrstop @@ -34,16 +34,17 @@ limitation) #define wxUSE_FS_INET 0 #endif -#if wxUSE_FS_INET +#if wxUSE_FILESYSTEM && wxUSE_FS_INET #ifndef WXPRECOMP -#include +#include "wx/wx.h" #endif #include "wx/wfstream.h" #include "wx/url.h" #include "wx/filesys.h" #include "wx/fs_inet.h" +#include "wx/module.h" class wxInetCacheNode : public wxObject { @@ -66,16 +67,41 @@ class wxInetCacheNode : public wxObject //-------------------------------------------------------------------------------- +static wxString StripProtocolAnchor(const wxString& location) +{ + wxString myloc(location.BeforeLast(wxT('#'))); + if (myloc.IsEmpty()) myloc = location.AfterFirst(wxT(':')); + else myloc = myloc.AfterFirst(wxT(':')); + + // fix malformed url: + if (myloc.Left(2) != wxT("//")) + { + if (myloc.GetChar(0) != wxT('/')) myloc = wxT("//") + myloc; + else myloc = wxT("/") + myloc; + } + if (myloc.Mid(2).Find(wxT('/')) == wxNOT_FOUND) myloc << wxT('/'); + + return myloc; +} + + + bool wxInternetFSHandler::CanOpen(const wxString& location) { wxString p = GetProtocol(location); - return (p == _T("http")) || (p == _T("ftp")); + if ((p == wxT("http")) || (p == wxT("ftp"))) + { + wxURL url(p + wxT(":") + StripProtocolAnchor(location)); + return (url.GetError() == wxURL_NOERR); + } + else + return FALSE; } wxFSFile* wxInternetFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location) { - wxString right = GetProtocol(location) + _T(":") + GetRightLocation(location); + wxString right = GetProtocol(location) + wxT(":") + StripProtocolAnchor(location); wxInputStream *s; wxString content; wxInetCacheNode *info; @@ -86,27 +112,30 @@ wxFSFile* wxInternetFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxStri if (info == NULL) { wxURL url(right); - s = url.GetInputStream(); - content = url.GetProtocol().GetContentType(); - if (content == wxEmptyString) content = GetMimeTypeFromExt(location); - if (s) + if (url.GetError() == wxURL_NOERR) { - wxChar buf[256]; - - wxGetTempFileName( _T("wxhtml"), buf); - info = new wxInetCacheNode(buf, content); - m_Cache.Put(right, info); - - { // ok, now copy it: - wxFileOutputStream sout((wxString)buf); - s -> Read(sout); // copy the stream + s = url.GetInputStream(); + content = url.GetProtocol().GetContentType(); + if (content == wxEmptyString) content = GetMimeTypeFromExt(location); + if (s) + { + wxChar buf[256]; + + wxGetTempFileName( wxT("wxhtml"), buf); + info = new wxInetCacheNode(buf, content); + m_Cache.Put(right, info); + + { // ok, now copy it: + wxFileOutputStream sout((wxString)buf); + s -> Read(sout); // copy the stream + } + delete s; } - delete s; + else + return (wxFSFile*) NULL; // we can't open the URL } else - { - return (wxFSFile*) NULL; // we can't open the URL - } + return (wxFSFile*) NULL; // incorrect URL } // Load item from cache: @@ -116,7 +145,8 @@ wxFSFile* wxInternetFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxStri return new wxFSFile(s, right, info->GetMime(), - GetAnchor(location)); + GetAnchor(location), + wxDateTime::Now()); } else return (wxFSFile*) NULL; } @@ -152,4 +182,4 @@ class wxFileSystemInternetModule : public wxModule IMPLEMENT_DYNAMIC_CLASS(wxFileSystemInternetModule, wxModule) -#endif // wxUSE_FS_INET +#endif // wxUSE_FILESYSTEM && wxUSE_FS_INET