X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d775fa82354a1f8d5db87ad1d71ab00ef7d9123c..02bcd285fac7124a41292d905609220005f51087:/src/common/stream.cpp diff --git a/src/common/stream.cpp b/src/common/stream.cpp index 87748a4fe6..2f26e6a330 100644 --- a/src/common/stream.cpp +++ b/src/common/stream.cpp @@ -18,10 +18,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "stream.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -376,14 +372,14 @@ size_t wxStreamBuffer::Read(void *buffer, size_t size) if ( m_stream ) m_stream->Reset(); - size_t read; + size_t readBytes; if ( !HasBuffer() ) { wxInputStream *inStream = GetInputStream(); wxCHECK_MSG( inStream, 0, _T("should have a stream in wxStreamBuffer") ); - read = inStream->OnSysRead(buffer, size); + readBytes = inStream->OnSysRead(buffer, size); } else // we have a buffer, use it { @@ -414,13 +410,13 @@ size_t wxStreamBuffer::Read(void *buffer, size_t size) } } - read = orig_size - size; + readBytes = orig_size - size; } if ( m_stream ) - m_stream->m_lastcount = read; + m_stream->m_lastcount = readBytes; - return read; + return readBytes; } // this should really be called "Copy()" @@ -434,7 +430,7 @@ size_t wxStreamBuffer::Read(wxStreamBuffer *dbuf) do { - nRead = Read(dbuf, WXSIZEOF(buf)); + nRead = Read(buf, WXSIZEOF(buf)); if ( nRead ) { nRead = dbuf->Write(buf, nRead); @@ -551,11 +547,11 @@ size_t wxStreamBuffer::Write(wxStreamBuffer *sbuf) return total; } -off_t wxStreamBuffer::Seek(off_t pos, wxSeekMode mode) +wxFileOffset wxStreamBuffer::Seek(wxFileOffset pos, wxSeekMode mode) { - off_t ret_off, diff; + wxFileOffset ret_off, diff; - off_t last_access = GetLastAccess(); + wxFileOffset last_access = GetLastAccess(); if ( !m_flushable ) { @@ -580,7 +576,9 @@ off_t wxStreamBuffer::Seek(off_t pos, wxSeekMode mode) } if (diff < 0 || diff > last_access) return wxInvalidOffset; - SetIntPosition(diff); + size_t int_diff = wx_truncate_cast(size_t, diff); + wxCHECK_MSG( (wxFileOffset)int_diff == diff, wxInvalidOffset, wxT("huge file not supported") ); + SetIntPosition(int_diff); return diff; } @@ -605,7 +603,9 @@ off_t wxStreamBuffer::Seek(off_t pos, wxSeekMode mode) } else { - SetIntPosition(diff); + size_t int_diff = wx_truncate_cast(size_t, diff); + wxCHECK_MSG( (wxFileOffset)int_diff == diff, wxInvalidOffset, wxT("huge file not supported") ); + SetIntPosition(int_diff); return pos; } @@ -619,9 +619,9 @@ off_t wxStreamBuffer::Seek(off_t pos, wxSeekMode mode) return wxInvalidOffset; } -off_t wxStreamBuffer::Tell() const +wxFileOffset wxStreamBuffer::Tell() const { - off_t pos; + wxFileOffset pos; // ask the stream for position if we have a real one if ( m_stream ) @@ -657,16 +657,42 @@ wxStreamBase::~wxStreamBase() { } -off_t wxStreamBase::OnSysSeek(off_t WXUNUSED(seek), wxSeekMode WXUNUSED(mode)) +size_t wxStreamBase::GetSize() const +{ + wxFileOffset length = GetLength(); + if ( length == wxInvalidOffset ) + return 0; + + const size_t len = wx_truncate_cast(size_t, length); + wxASSERT_MSG( len == length, _T("large files not supported") ); + + return len; +} + +wxFileOffset wxStreamBase::OnSysSeek(wxFileOffset WXUNUSED(seek), wxSeekMode WXUNUSED(mode)) { return wxInvalidOffset; } -off_t wxStreamBase::OnSysTell() const +wxFileOffset wxStreamBase::OnSysTell() const { return wxInvalidOffset; } +#if WXWIN_COMPATIBILITY_2_2 + +wxStreamError wxStreamBase::LastError() const +{ + return m_lasterror; +} + +size_t wxStreamBase::StreamSize() const +{ + return GetSize(); +} + +#endif // WXWIN_COMPATIBILITY_2_2 + // ---------------------------------------------------------------------------- // wxInputStream // ---------------------------------------------------------------------------- @@ -853,7 +879,7 @@ wxInputStream& wxInputStream::Read(wxOutputStream& stream_out) return *this; } -off_t wxInputStream::SeekI(off_t pos, wxSeekMode mode) +wxFileOffset wxInputStream::SeekI(wxFileOffset pos, wxSeekMode mode) { // RR: This code is duplicated in wxBufferedInputStream. This is // not really a good design, but buffered stream are different @@ -887,9 +913,9 @@ off_t wxInputStream::SeekI(off_t pos, wxSeekMode mode) return OnSysSeek(pos, mode); } -off_t wxInputStream::TellI() const +wxFileOffset wxInputStream::TellI() const { - off_t pos = OnSysTell(); + wxFileOffset pos = OnSysTell(); if (pos != wxInvalidOffset) pos -= (m_wbacksize - m_wbackcur); @@ -933,12 +959,12 @@ wxOutputStream& wxOutputStream::Write(wxInputStream& stream_in) return *this; } -off_t wxOutputStream::TellO() const +wxFileOffset wxOutputStream::TellO() const { return OnSysTell(); } -off_t wxOutputStream::SeekO(off_t pos, wxSeekMode mode) +wxFileOffset wxOutputStream::SeekO(wxFileOffset pos, wxSeekMode mode) { return OnSysSeek(pos, mode); } @@ -957,7 +983,7 @@ wxCountingOutputStream::wxCountingOutputStream () m_currentPos = 0; } -size_t wxCountingOutputStream::GetSize() const +wxFileOffset wxCountingOutputStream::GetLength() const { return m_lastcount; } @@ -972,20 +998,24 @@ size_t wxCountingOutputStream::OnSysWrite(const void *WXUNUSED(buffer), return m_currentPos; } -off_t wxCountingOutputStream::OnSysSeek(off_t pos, wxSeekMode mode) +wxFileOffset wxCountingOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) { + ssize_t new_pos = wx_truncate_cast(ssize_t, pos); + switch ( mode ) { case wxFromStart: - m_currentPos = pos; + wxCHECK_MSG( (wxFileOffset)new_pos == pos, wxInvalidOffset, wxT("huge position not supported") ); break; case wxFromEnd: - m_currentPos = m_lastcount + pos; + new_pos = m_lastcount + new_pos; + wxCHECK_MSG( (wxFileOffset)new_pos == (wxFileOffset)(m_lastcount + pos), wxInvalidOffset, wxT("huge position not supported") ); break; case wxFromCurrent: - m_currentPos += pos; + new_pos = m_currentPos + new_pos; + wxCHECK_MSG( (wxFileOffset)new_pos == (wxFileOffset)(m_currentPos + pos), wxInvalidOffset, wxT("huge position not supported") ); break; default: @@ -993,13 +1023,15 @@ off_t wxCountingOutputStream::OnSysSeek(off_t pos, wxSeekMode mode) return wxInvalidOffset; } + m_currentPos = new_pos; + if (m_currentPos > m_lastcount) m_lastcount = m_currentPos; return m_currentPos; } -off_t wxCountingOutputStream::OnSysTell() const +wxFileOffset wxCountingOutputStream::OnSysTell() const { return m_currentPos; } @@ -1063,7 +1095,7 @@ wxBufferedInputStream::wxBufferedInputStream(wxInputStream& s, wxBufferedInputStream::~wxBufferedInputStream() { - m_parent_i_stream->SeekI(-(off_t)m_i_streambuf->GetBytesLeft(), + m_parent_i_stream->SeekI(-(wxFileOffset)m_i_streambuf->GetBytesLeft(), wxFromCurrent); delete m_i_streambuf; @@ -1100,7 +1132,7 @@ wxInputStream& wxBufferedInputStream::Read(void *buf, size_t size) return *this; } -off_t wxBufferedInputStream::SeekI(off_t pos, wxSeekMode mode) +wxFileOffset wxBufferedInputStream::SeekI(wxFileOffset pos, wxSeekMode mode) { // RR: Look at wxInputStream for comments. @@ -1120,9 +1152,9 @@ off_t wxBufferedInputStream::SeekI(off_t pos, wxSeekMode mode) return m_i_streambuf->Seek(pos, mode); } -off_t wxBufferedInputStream::TellI() const +wxFileOffset wxBufferedInputStream::TellI() const { - off_t pos = m_i_streambuf->Tell(); + wxFileOffset pos = m_i_streambuf->Tell(); if (pos != wxInvalidOffset) pos -= (m_wbacksize - m_wbackcur); @@ -1135,12 +1167,12 @@ size_t wxBufferedInputStream::OnSysRead(void *buffer, size_t bufsize) return m_parent_i_stream->Read(buffer, bufsize).LastRead(); } -off_t wxBufferedInputStream::OnSysSeek(off_t seek, wxSeekMode mode) +wxFileOffset wxBufferedInputStream::OnSysSeek(wxFileOffset seek, wxSeekMode mode) { return m_parent_i_stream->SeekI(seek, mode); } -off_t wxBufferedInputStream::OnSysTell() const +wxFileOffset wxBufferedInputStream::OnSysTell() const { return m_parent_i_stream->TellI(); } @@ -1179,6 +1211,13 @@ wxBufferedOutputStream::~wxBufferedOutputStream() delete m_o_streambuf; } +bool wxBufferedOutputStream::Close() +{ + Sync(); + return IsOk(); +} + + wxOutputStream& wxBufferedOutputStream::Write(const void *buffer, size_t size) { m_lastcount = 0; @@ -1186,13 +1225,13 @@ wxOutputStream& wxBufferedOutputStream::Write(const void *buffer, size_t size) return *this; } -off_t wxBufferedOutputStream::SeekO(off_t pos, wxSeekMode mode) +wxFileOffset wxBufferedOutputStream::SeekO(wxFileOffset pos, wxSeekMode mode) { Sync(); return m_o_streambuf->Seek(pos, mode); } -off_t wxBufferedOutputStream::TellO() const +wxFileOffset wxBufferedOutputStream::TellO() const { return m_o_streambuf->Tell(); } @@ -1208,19 +1247,19 @@ size_t wxBufferedOutputStream::OnSysWrite(const void *buffer, size_t bufsize) return m_parent_o_stream->Write(buffer, bufsize).LastWrite(); } -off_t wxBufferedOutputStream::OnSysSeek(off_t seek, wxSeekMode mode) +wxFileOffset wxBufferedOutputStream::OnSysSeek(wxFileOffset seek, wxSeekMode mode) { return m_parent_o_stream->SeekO(seek, mode); } -off_t wxBufferedOutputStream::OnSysTell() const +wxFileOffset wxBufferedOutputStream::OnSysTell() const { return m_parent_o_stream->TellO(); } -size_t wxBufferedOutputStream::GetSize() const +wxFileOffset wxBufferedOutputStream::GetLength() const { - return m_parent_o_stream->GetSize() + m_o_streambuf->GetIntPosition(); + return m_parent_o_stream->GetLength() + m_o_streambuf->GetIntPosition(); } void wxBufferedOutputStream::SetOutputStreamBuffer(wxStreamBuffer *buffer) @@ -1242,5 +1281,4 @@ wxOutputStream& wxEndL(wxOutputStream& stream) return stream.Write(eol, wxStrlen(eol)); } -#endif - // wxUSE_STREAMS +#endif // wxUSE_STREAMS