]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix return value of wxCountingOutputStream::LastWrite().
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 20 May 2013 13:15:26 +0000 (13:15 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 20 May 2013 13:15:26 +0000 (13:15 +0000)
Don't reuse m_lastcount in wxCountingOutputStream to store the stream length,
this doesn't make any sense and results in LastWrite() returning completely
wrong results as it expects m_lastcount to be the number of bytes written by
the last operation.

Add m_lastPos member to store the stream length instead.

Also correct wxCountingOutputStream documentation.

Closes #15215.

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

docs/changes.txt
include/wx/stream.h
interface/wx/stream.h
src/common/stream.cpp

index 28c14151426abb1daddff23a234135a03920ac1d..8b4fcddbaafd1197ce88989d4166ee8162894228 100644 (file)
@@ -577,6 +577,7 @@ All:
 - Allow testing for symlink/FIFO/socket existence in wxFileName (David Hart).
 - Many important bug fixes in wxFileSystemWatcher (David Hart).
 - Add wxInputStream::ReadAll() and wxOutputStream::WriteAll() (Catalin Raceanu).
+- Fix wxCountingOutputStream::LastWrite() return value (Catalin Raceanu).
 - Add new wxFSW_EVENT_ATTRIB and wxFSW_EVENT_UNMOUNT flags (David Hart).
 - Add separate read/written bytes counters and per-direction NOWAIT and WAITALL
   flags to wxSocket (Rob Bresalier).
index 7f57e1f39c22e7e3e9a25f55afa9ec2d61fe394d..b1746b84b5cfe255afd5b19036c7aa02e8c4b448 100644 (file)
@@ -281,16 +281,17 @@ class WXDLLIMPEXP_BASE wxCountingOutputStream : public wxOutputStream
 public:
     wxCountingOutputStream();
 
-    wxFileOffset GetLength() const;
+    virtual wxFileOffset GetLength() const;
     bool Ok() const { return IsOk(); }
-    bool IsOk() const { return true; }
+    virtual bool IsOk() const { return true; }
 
 protected:
     virtual size_t OnSysWrite(const void *buffer, size_t size);
     virtual wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode);
     virtual wxFileOffset OnSysTell() const;
 
-    size_t m_currentPos;
+    size_t m_currentPos,
+           m_lastPos;
 
     DECLARE_DYNAMIC_CLASS(wxCountingOutputStream)
     wxDECLARE_NO_COPY_CLASS(wxCountingOutputStream);
index 7bed3174ca369459bf2bd3627a56c2a5f38d595f..51b983dd8ad9a1edab64fa7289a74252df3ff566 100644 (file)
@@ -753,9 +753,11 @@ public:
     virtual ~wxCountingOutputStream();
 
     /**
-        Returns the current size of the stream.
+        Returns the current length of the stream.
+
+        This is the amount of data written to the stream so far, in bytes.
     */
-    size_t GetSize() const;
+    virtual wxFileOffset GetLength() const;
 };
 
 
index 94a1244b2b2058bbbd51cd41e0dbdd2962b6f046..2f91128caca509991d291a7d0e0db7a2a703a7d6 100644 (file)
@@ -1117,22 +1117,23 @@ IMPLEMENT_DYNAMIC_CLASS(wxCountingOutputStream, wxOutputStream)
 
 wxCountingOutputStream::wxCountingOutputStream ()
 {
-     m_currentPos = 0;
+    m_currentPos =
+    m_lastPos = 0;
 }
 
 wxFileOffset wxCountingOutputStream::GetLength() const
 {
-    return m_lastcount;
+    return m_lastPos;
 }
 
 size_t wxCountingOutputStream::OnSysWrite(const void *WXUNUSED(buffer),
                                           size_t size)
 {
     m_currentPos += size;
-    if (m_currentPos > m_lastcount)
-        m_lastcount = m_currentPos;
+    if ( m_currentPos > m_lastPos )
+        m_lastPos = m_currentPos;
 
-    return m_currentPos;
+    return size;
 }
 
 wxFileOffset wxCountingOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode)
@@ -1146,12 +1147,12 @@ wxFileOffset wxCountingOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode
             break;
 
         case wxFromEnd:
-            new_pos = m_lastcount + new_pos;
-            wxCHECK_MSG( (wxFileOffset)new_pos == (wxFileOffset)(m_lastcount + pos), wxInvalidOffset, wxT("huge position not supported") );
+            new_pos += m_lastPos;
+            wxCHECK_MSG( (wxFileOffset)new_pos == (wxFileOffset)(m_lastPos + pos), wxInvalidOffset, wxT("huge position not supported") );
             break;
 
         case wxFromCurrent:
-            new_pos = m_currentPos + new_pos;
+            new_pos += m_currentPos;
             wxCHECK_MSG( (wxFileOffset)new_pos == (wxFileOffset)(m_currentPos + pos), wxInvalidOffset, wxT("huge position not supported") );
             break;
 
@@ -1162,8 +1163,8 @@ wxFileOffset wxCountingOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode
 
     m_currentPos = new_pos;
 
-    if (m_currentPos > m_lastcount)
-        m_lastcount = m_currentPos;
+    if ( m_currentPos > m_lastPos )
+        m_lastPos = m_currentPos;
 
     return m_currentPos;
 }