]> git.saurik.com Git - wxWidgets.git/commitdiff
Add FindLength()
authorMichael Wetherell <mike.wetherell@ntlworld.com>
Fri, 27 Oct 2006 08:54:00 +0000 (08:54 +0000)
committerMichael Wetherell <mike.wetherell@ntlworld.com>
Fri, 27 Oct 2006 08:54:00 +0000 (08:54 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42497 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/fileback.h
src/common/fileback.cpp

index 2f98bb7198d2ef9962860e317f5e805ea1b33329..5fda9c0c50c81662c69be0dc862b7ac4bfe610a2 100644 (file)
@@ -57,7 +57,13 @@ class WXDLLIMPEXP_BASE wxBackedInputStream : public wxInputStream
 public:
     wxBackedInputStream(const wxBackingFile& backer);
 
+    // If the length of the backer's parent stream is unknown then GetLength()
+    // returns wxInvalidOffset until the parent has been read to the end.
     wxFileOffset GetLength() const;
+
+    // Returns the length, reading the parent stream to the end if necessary.
+    wxFileOffset FindLength() const;
+
     bool IsSeekable() const { return true; }
 
 protected:
index 06d32ae99e08d653c28d26dd074fe14b47e509c6..bc5f2ff9dd7044fdeb136af950bb24c41a127750 100644 (file)
@@ -271,6 +271,29 @@ wxBackedInputStream::wxBackedInputStream(const wxBackingFile& backer)
 {
 }
 
+wxFileOffset wxBackedInputStream::GetLength() const
+{
+    return m_backer.m_impl->GetLength();
+}
+
+wxFileOffset wxBackedInputStream::FindLength() const
+{
+    wxFileOffset len = GetLength();
+
+    if (len == wxInvalidOffset && IsOk()) {
+        // read a byte at 7ff...ffe
+        wxFileOffset pos = 1;
+        pos <<= sizeof(pos) * 8 - 1;
+        pos = ~pos - 1;
+        char ch;
+        size_t size = 1;
+        m_backer.m_impl->ReadAt(pos, &ch, &size);
+        len = GetLength();
+    }
+
+    return len;
+}
+    
 size_t wxBackedInputStream::OnSysRead(void *buffer, size_t size)
 {
     if (!IsOk())
@@ -281,11 +304,6 @@ size_t wxBackedInputStream::OnSysRead(void *buffer, size_t size)
     return size;
 }
 
-wxFileOffset wxBackedInputStream::GetLength() const
-{
-    return m_backer.m_impl->GetLength();
-}
-
 wxFileOffset wxBackedInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode)
 {
     switch (mode) {