From 8c3dbc46b3558a8a1935492f88c1a2a4873ce57e Mon Sep 17 00:00:00 2001 From: Michael Wetherell Date: Fri, 27 Oct 2006 07:06:41 +0000 Subject: [PATCH] Add wxFS_SEEKABLE open flag. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42488 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/filesys.h | 10 ++++++++-- src/common/filesys.cpp | 12 +++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/include/wx/filesys.h b/include/wx/filesys.h index 2ad665581b..27ba3bf2b6 100644 --- a/include/wx/filesys.h +++ b/include/wx/filesys.h @@ -166,6 +166,13 @@ protected: // kinds of files (HTPP, FTP, local, tar.gz etc..) //-------------------------------------------------------------------------------- +// Open Bit Flags +enum { + wxFS_READ = 1, // Open for reading + wxFS_WRITE = 2, // Open for writing + wxFS_SEEKABLE = 4 // Returned stream will be seekable +}; + class WXDLLIMPEXP_BASE wxFileSystem : public wxObject { public: @@ -187,7 +194,7 @@ public: // It first tries to open the file in relative scope // (based on ChangePathTo()'s value) and then as an absolute // path. - wxFSFile* OpenFile(const wxString& location); + wxFSFile* OpenFile(const wxString& location, int flags = wxFS_READ); // Finds first/next file that matches spec wildcard. flags can be wxDIR for restricting // the query to directories or wxFILE for files only or 0 for either. @@ -205,7 +212,6 @@ public: // Removes FS handler static wxFileSystemHandler* RemoveHandler(wxFileSystemHandler *handler); - // Returns true if there is a handler which can open the given location. static bool HasHandlerForPath(const wxString& location); diff --git a/src/common/filesys.cpp b/src/common/filesys.cpp index 57fc6e3712..d63b432e72 100644 --- a/src/common/filesys.cpp +++ b/src/common/filesys.cpp @@ -27,6 +27,7 @@ #include "wx/mimetype.h" #include "wx/filename.h" #include "wx/tokenzr.h" +#include "wx/fileback.h" //-------------------------------------------------------------------------------- @@ -357,7 +358,7 @@ void wxFileSystem::ChangePathTo(const wxString& location, bool is_dir) -wxFSFile* wxFileSystem::OpenFile(const wxString& location) +wxFSFile* wxFileSystem::OpenFile(const wxString& location, int flags) { wxString loc = MakeCorrectPath(location); unsigned i, ln; @@ -410,6 +411,15 @@ wxFSFile* wxFileSystem::OpenFile(const wxString& location) node = node->GetNext(); } } + + if (s && (flags & wxFS_SEEKABLE) != 0 && !s->GetStream()->IsSeekable()) + { + wxBackedInputStream *stream; + stream = new wxBackedInputStream(s->DetachStream()); + stream->FindLength(); + s->SetStream(stream); + } + return (s); } -- 2.45.2