From: Michael Wetherell <mike.wetherell@ntlworld.com>
Date: Fri, 27 Oct 2006 07:06:41 +0000 (+0000)
Subject: Add wxFS_SEEKABLE open flag.
X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/8c3dbc46b3558a8a1935492f88c1a2a4873ce57e

Add wxFS_SEEKABLE open flag.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42488 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---

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);
 }