X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3bb0b01c290489c73816dfaccf16568757c1a731..405d8f465740a78d2d19a2b108ac8fd65ff1a5e2:/src/common/fs_inet.cpp?ds=sidebyside diff --git a/src/common/fs_inet.cpp b/src/common/fs_inet.cpp index 3745300208..cba29271dc 100644 --- a/src/common/fs_inet.cpp +++ b/src/common/fs_inet.cpp @@ -20,25 +20,30 @@ limitation) */ #ifdef __GNUG__ -#pragma implementation +#pragma implementation "fs_inet.h" #endif -#include +#include "wx/wxprec.h" #ifdef __BORDLANDC__ #pragma hdrstop #endif -#if wxUSE_FS_INET +#if !wxUSE_SOCKETS + #undef wxUSE_FS_INET + #define wxUSE_FS_INET 0 +#endif + +#if wxUSE_FILESYSTEM && wxUSE_FS_INET #ifndef WXPRECOMP -#include #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 { @@ -61,16 +66,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); + } + + 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; @@ -78,42 +108,45 @@ wxFSFile* wxInternetFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxStri info = (wxInetCacheNode*) m_Cache.Get(right); // Add item into cache: - if (info != NULL) + if (info == NULL) { wxURL url(right); - s = url.GetInputStream(); - content = url.GetProtocol().GetContentType(); - if (content == wxEmptyString) content = GetMimeTypeFromExt(location); - if (s) - { - char buf[256]; - - wxGetTempFileName( "wxhtml", buf); - info = new wxInetCacheNode(buf, content); - m_Cache.Put(right, info); - - { // ok, now copy it: - wxFileOutputStream sout(buf); - s -> Read(sout); // copy the stream + if (url.GetError() == wxURL_NOERR) + { + 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: s = new wxFileInputStream(info->GetTemp()); - if (s) - { - return new wxFSFile(s, - right, - info->GetMime(), - GetAnchor(location)); - } - else return (wxFSFile*) NULL; + if (!s) + return (wxFSFile*) NULL; + + return new wxFSFile(s, + right, + info->GetMime(), + GetAnchor(location), + wxDateTime::Now()); } @@ -124,7 +157,7 @@ wxInternetFSHandler::~wxInternetFSHandler() wxInetCacheNode *n2; m_Cache.BeginFind(); - while ((n = m_Cache.Next()) != NULL) + while ((n = m_Cache.Next()) != NULL) { n2 = (wxInetCacheNode*) n->GetData(); wxRemoveFile(n2->GetTemp()); @@ -132,4 +165,19 @@ wxInternetFSHandler::~wxInternetFSHandler() } } -#endif // wxUSE_FS_INET +class wxFileSystemInternetModule : public wxModule +{ + DECLARE_DYNAMIC_CLASS(wxFileSystemInternetModule) + + public: + virtual bool OnInit() + { + wxFileSystem::AddHandler(new wxInternetFSHandler); + return TRUE; + } + virtual void OnExit() {} +}; + +IMPLEMENT_DYNAMIC_CLASS(wxFileSystemInternetModule, wxModule) + +#endif // wxUSE_FILESYSTEM && wxUSE_FS_INET