From b7775a521f7b7bfd61970b531e8730876cf8094a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 16 Apr 2012 13:53:49 +0000 Subject: [PATCH] Add wxFSInputStream providing stream interface to wxFileSystem. This class allows using virtual wxFSFiles with any wx functions taking streams. E.g. it makes it possible to load images and animations from wxFileSystem. Closes #14185. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71206 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/filesys.h | 13 +++++++++++++ interface/wx/filesys.h | 38 ++++++++++++++++++++++++++++++++++++++ src/common/filesys.cpp | 24 ++++++++++++++++++++++++ 4 files changed, 76 insertions(+) diff --git a/docs/changes.txt b/docs/changes.txt index a145245ed7..eaa94e96a1 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -469,6 +469,7 @@ Major new features in this release All: - Added wxLogFormatter to allow customizing wxLog output (Sébastien Gallou). +- Added wxFSInputStream for reading data from wxFileSystem (Armel Asselin). - Added "%z" support to wxDateTime::Format() and Parse() (Armel Asselin). - Add wxHTTP::SetPostBuffer(wxMemoryBuffer) and SetPostText() (Eran Ifrah). - Fix wrong time zone used in wxDateTime::UNow(). diff --git a/include/wx/filesys.h b/include/wx/filesys.h index 51f06fad21..026fff1f28 100644 --- a/include/wx/filesys.h +++ b/include/wx/filesys.h @@ -293,7 +293,20 @@ protected: static wxString ms_root; }; +// Stream reading data from wxFSFile: this allows to use virtual files with any +// wx functions accepting streams. +class WXDLLIMPEXP_BASE wxFSInputStream : public wxWrapperInputStream +{ +public: + // Notice that wxFS_READ is implied in flags. + wxFSInputStream(const wxString& filename, int flags = 0); + virtual ~wxFSInputStream(); +private: + wxFSFile* m_file; + + wxDECLARE_NO_COPY_CLASS(wxFSInputStream); +}; #endif // wxUSE_FILESYSTEM diff --git a/interface/wx/filesys.h b/interface/wx/filesys.h index 17157177da..94ea102527 100644 --- a/interface/wx/filesys.h +++ b/interface/wx/filesys.h @@ -463,3 +463,41 @@ protected: static wxString GetRightLocation(const wxString& location); }; + +/** + Input stream for virtual file stream files. + + The stream reads data from wxFSFile obtained from wxFileSystem. It is + especially useful to allow using virtual files with other wxWidgets + functions and classes working with streams, e.g. for loading images or + animations from virtual files and not only physical ones. + + @library{wxbase} + @category{streams} + + @see wxWrapperInputStream, wxFSFile + + @since 2.9.4 +*/ +class wxFSInputStream : public wxWrapperInputStream +{ +public: + /** + Create a stream associated with the data of the given virtual file + system file. + + @param filename + The name of the input file passed to wxFileSystem::OpenFile(). + @param flags + Combination of flags from wxFileSystemOpenFlags. ::wxFS_READ is + implied, i.e. it is always added to the flags value. + + Use wxStreamBase::IsOk() to verify if the constructor succeeded. + */ + wxFileInputStream(const wxString& filename, int flags = 0); + + /** + Returns @true if the stream is initialized and ready. + */ + bool IsOk() const; +}; diff --git a/src/common/filesys.cpp b/src/common/filesys.cpp index 4f7becfebb..f4533871e2 100644 --- a/src/common/filesys.cpp +++ b/src/common/filesys.cpp @@ -756,5 +756,29 @@ class wxFileSystemModule : public wxModule 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 -- 2.45.2