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