From 9bc3af3e642709425476f6232a19fe4f1bbb42b8 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 20 May 2013 13:15:26 +0000 Subject: [PATCH] Fix return value of wxCountingOutputStream::LastWrite(). 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 | 1 + include/wx/stream.h | 7 ++++--- interface/wx/stream.h | 6 ++++-- src/common/stream.cpp | 21 +++++++++++---------- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 28c1415142..8b4fcddbaa 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -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). diff --git a/include/wx/stream.h b/include/wx/stream.h index 7f57e1f39c..b1746b84b5 100644 --- a/include/wx/stream.h +++ b/include/wx/stream.h @@ -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); diff --git a/interface/wx/stream.h b/interface/wx/stream.h index 7bed3174ca..51b983dd8a 100644 --- a/interface/wx/stream.h +++ b/interface/wx/stream.h @@ -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; }; diff --git a/src/common/stream.cpp b/src/common/stream.cpp index 94a1244b2b..2f91128cac 100644 --- a/src/common/stream.cpp +++ b/src/common/stream.cpp @@ -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; }