X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5526e819eca4465ed5520d49bccfebc6a28045e0..b53aea81d2e102224b452ef5bf7aee1132f37c6f:/src/common/fs_inet.cpp?ds=sidebyside diff --git a/src/common/fs_inet.cpp b/src/common/fs_inet.cpp index acb0c25831..2ed1f2e865 100644 --- a/src/common/fs_inet.cpp +++ b/src/common/fs_inet.cpp @@ -1,36 +1,27 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: fs_inet.cpp +// Name: src/common/fs_inet.cpp // Purpose: HTTP and FTP file system // Author: Vaclav Slavik // Copyright: (c) 1999 Vaclav Slavik -// Licence: wxWindows Licence +// RCS-ID: $Id$ +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -/* +#include "wx/wxprec.h" -REMARKS : - -This FS creates local cache (in /tmp directory). The cache is freed -on program exit. - -Size of cache is limited to cca 1000 items (due to GetTempFileName -limitation) - - -*/ - -#ifdef __GNUG__ -#pragma implementation +#ifdef __BORLANDC__ + #pragma hdrstop #endif -#include - -#ifdef __BORDLANDC__ -#pragma hdrstop +#if !wxUSE_SOCKETS + #undef wxUSE_FS_INET + #define wxUSE_FS_INET 0 #endif -#ifndef WXPRECOMP -#include +#if wxUSE_FILESYSTEM && wxUSE_FS_INET + +#ifndef WX_PRECOMP + #include "wx/module.h" #endif #include "wx/wfstream.h" @@ -38,93 +29,138 @@ limitation) #include "wx/filesys.h" #include "wx/fs_inet.h" -class wxInetCacheNode : public wxObject +// ---------------------------------------------------------------------------- +// Helper classes +// ---------------------------------------------------------------------------- + +// This stream deletes the file when destroyed +class wxTemporaryFileInputStream : public wxFileInputStream { - private: - wxString m_Temp; - wxString m_Mime; +public: + wxTemporaryFileInputStream(const wxString& filename) : + wxFileInputStream(filename), m_filename(filename) {} + + virtual ~wxTemporaryFileInputStream() + { + // NB: copied from wxFileInputStream dtor, we need to do it before + // wxRemoveFile + if (m_file_destroy) + { + delete m_file; + m_file_destroy = false; + } + wxRemoveFile(m_filename); + } - public: - wxInetCacheNode(const wxString& l, const wxString& m) : wxObject() {m_Temp = l; m_Mime = m;} - const wxString& GetTemp() const {return m_Temp;} - const wxString& GetMime() const {return m_Mime;} +protected: + wxString m_filename; }; +// ---------------------------------------------------------------------------- +// wxInternetFSHandler +// ---------------------------------------------------------------------------- +static wxString StripProtocolAnchor(const wxString& location) +{ + wxString myloc(location.BeforeLast(wxT('#'))); + if (myloc.empty()) myloc = location.AfterFirst(wxT(':')); + else myloc = myloc.AfterFirst(wxT(':')); + + // fix malformed url: + if (!myloc.Left(2).IsSameAs(wxT("//"))) + { + if (myloc.GetChar(0) != wxT('/')) myloc = wxT("//") + myloc; + else myloc = wxT("/") + myloc; + } + if (myloc.Mid(2).Find(wxT('/')) == wxNOT_FOUND) myloc << wxT('/'); - -//-------------------------------------------------------------------------------- -// wxInternetFSHandler -//-------------------------------------------------------------------------------- + return myloc; +} bool wxInternetFSHandler::CanOpen(const wxString& location) { +#if wxUSE_URL wxString p = GetProtocol(location); - return (p == "http") || (p == "ftp"); + if ((p == wxT("http")) || (p == wxT("ftp"))) + { + wxURL url(p + wxT(":") + StripProtocolAnchor(location)); + return (url.GetError() == wxURL_NOERR); + } +#endif + return false; } - - -wxFSFile* wxInternetFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location) +wxFSFile* wxInternetFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), + const wxString& location) { - wxString right = GetProtocol(location) + ":" + GetRightLocation(location); - wxInputStream *s; - wxString content; - wxInetCacheNode *info; - - info = (wxInetCacheNode*) m_Cache.Get(right); - - // Add item into cache: - 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 !wxUSE_URL + return NULL; +#else + wxString right = + GetProtocol(location) + wxT(":") + StripProtocolAnchor(location); + + wxURL url(right); + if (url.GetError() == wxURL_NOERR) + { + wxInputStream *s = url.GetInputStream(); + wxString content = url.GetProtocol().GetContentType(); + if (s) + { + wxString tmpfile = + wxFileName::CreateTempFileName(wxT("wxhtml")); + + { // now copy streams content to temporary file: + wxFileOutputStream sout(tmpfile); + s->Read(sout); } delete s; + + return new wxFSFile(new wxTemporaryFileInputStream(tmpfile), + right, + content, + GetAnchor(location) +#if wxUSE_DATETIME + , wxDateTime::Now() +#endif // wxUSE_DATETIME + ); } - else return NULL; //we can't open the URL } - // Load item from cache: - s = new wxFileInputStream(info -> GetTemp()); - if (s) { - return new wxFSFile(s, - right, - info -> GetMime(), - GetAnchor(location)); - } - else return NULL; + return NULL; // incorrect URL +#endif } - -wxInternetFSHandler::~wxInternetFSHandler() +class wxFileSystemInternetModule : public wxModule { - wxNode *n; - wxInetCacheNode *n2; - - m_Cache.BeginFind(); - while ((n = m_Cache.Next()) != NULL) { - n2 = (wxInetCacheNode*) n -> GetData(); - wxRemoveFile(n2 -> GetTemp()); - delete n2; - } -} + DECLARE_DYNAMIC_CLASS(wxFileSystemInternetModule) + public: + wxFileSystemInternetModule() : + wxModule(), + m_handler(NULL) + { + } + + virtual bool OnInit() + { + m_handler = new wxInternetFSHandler; + wxFileSystem::AddHandler(m_handler); + return true; + } + virtual void OnExit() + { + delete wxFileSystem::RemoveHandler(m_handler); + } + + private: + wxFileSystemHandler* m_handler; +}; +IMPLEMENT_DYNAMIC_CLASS(wxFileSystemInternetModule, wxModule) +#endif // wxUSE_FILESYSTEM && wxUSE_FS_INET