X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/84b46c356ebc657a292ebe616eb51c821772da8f..89c684ef8280e2d91096da2d96ba36e24a1fb917:/src/common/stream.cpp?ds=sidebyside diff --git a/src/common/stream.cpp b/src/common/stream.cpp index 2bce4c881e..728d50b5cf 100644 --- a/src/common/stream.cpp +++ b/src/common/stream.cpp @@ -24,22 +24,31 @@ #pragma hdrstop #endif +#define BUF_TEMP_SIZE 10000 + // ---------------------------------------------------------------------------- // wxStreamBuffer // ---------------------------------------------------------------------------- +#define CHECK_ERROR(err) \ + if (m_stream->m_lasterror == wxStream_NOERROR) \ + m_stream->m_lasterror = err + wxStreamBuffer::wxStreamBuffer(wxStreamBase& stream, BufMode mode) : m_buffer_start(NULL), m_buffer_end(NULL), m_buffer_pos(NULL), - m_buffer_size(0), m_fixed(TRUE), m_flushable(TRUE), m_stream(&stream), - m_mode(mode), m_destroybuf(FALSE) + m_buffer_size(0), m_wback(NULL), m_wbacksize(0), m_wbackcur(0), + m_fixed(TRUE), m_flushable(TRUE), m_stream(&stream), + m_mode(mode), m_destroybuf(FALSE), m_destroystream(FALSE) { } wxStreamBuffer::wxStreamBuffer(BufMode mode) : m_buffer_start(NULL), m_buffer_end(NULL), m_buffer_pos(NULL), - m_buffer_size(0), m_fixed(TRUE), m_flushable(FALSE), m_stream(NULL), - m_mode(mode), m_destroybuf(FALSE) + m_buffer_size(0), m_wback(NULL), m_wbacksize(0), m_wbackcur(0), + m_fixed(TRUE), m_flushable(FALSE), m_stream(NULL), + m_mode(mode), m_destroybuf(FALSE), m_destroystream(TRUE) { + m_stream = new wxStreamBase(); } wxStreamBuffer::wxStreamBuffer(const wxStreamBuffer& buffer) @@ -53,24 +62,32 @@ wxStreamBuffer::wxStreamBuffer(const wxStreamBuffer& buffer) m_stream = buffer.m_stream; m_mode = buffer.m_mode; m_destroybuf = FALSE; + m_destroystream = FALSE; + m_wback = NULL; + m_wbacksize = 0; + m_wbackcur = 0; } wxStreamBuffer::~wxStreamBuffer() { + if (m_wback) + free(m_wback); if (m_destroybuf) wxDELETEA(m_buffer_start); + if (m_destroystream) + delete m_stream; } -bool wxStreamBuffer::WriteBack(const char *buf, size_t bufsize) +size_t wxStreamBuffer::WriteBack(const char *buf, size_t bufsize) { char *ptrback; ptrback = AllocSpaceWBack(bufsize); if (!ptrback) - return FALSE; + return 0; memcpy(ptrback, buf, bufsize); - return TRUE; + return bufsize; } bool wxStreamBuffer::WriteBack(char c) @@ -101,7 +118,8 @@ void wxStreamBuffer::SetBufferIO(size_t bufsize) { char *b_start; - wxDELETE(m_buffer_start); + if (m_destroybuf) + wxDELETEA(m_buffer_start); if (!bufsize) { m_buffer_start = NULL; @@ -118,6 +136,7 @@ void wxStreamBuffer::SetBufferIO(size_t bufsize) void wxStreamBuffer::ResetBuffer() { + m_stream->m_lasterror = wxStream_NOERROR; if (m_mode == read) m_buffer_pos = m_buffer_end; else @@ -137,7 +156,9 @@ char *wxStreamBuffer::AllocSpaceWBack(size_t needed_size) if (!temp_b) return NULL; - return (char *)((size_t)m_wback+(m_wbacksize-needed_size)); + m_wback = temp_b; + + return (char *)(m_wback+(m_wbacksize-needed_size)); } size_t wxStreamBuffer::GetWBack(char *buf, size_t bsize) @@ -226,8 +247,10 @@ void wxStreamBuffer::PutChar(char c) return; } - if (!GetDataLeft() && !FlushBuffer()) + if (!GetDataLeft() && !FlushBuffer()) { + CHECK_ERROR(wxStream_READ_ERR); return; + } PutToBuffer(&c, 1); m_stream->m_lastcount = 1; @@ -244,15 +267,17 @@ char wxStreamBuffer::GetChar() return c; } - if (!GetDataLeft() && !FillBuffer()) + if (!GetDataLeft()) { + CHECK_ERROR(wxStream_READ_ERR); return 0; + } GetFromBuffer(&c, 1); m_stream->m_lastcount = 1; return c; } -void wxStreamBuffer::Read(void *buffer, size_t size) +size_t wxStreamBuffer::Read(void *buffer, size_t size) { wxASSERT(m_stream != NULL); @@ -260,17 +285,16 @@ void wxStreamBuffer::Read(void *buffer, size_t size) // Buffering disabled // ------------------ + m_stream->m_lasterror = wxStream_NOERROR; m_stream->m_lastcount = GetWBack((char *)buffer, size); size -= m_stream->m_lastcount; if (size == 0) - return; + return m_stream->m_lastcount; buffer = (void *)((char *)buffer+m_stream->m_lastcount); - if (!m_buffer_size) { - m_stream->m_lastcount += m_stream->OnSysRead(buffer, size); - return; - } + if (!m_buffer_size) + return (m_stream->m_lastcount += m_stream->OnSysRead(buffer, size)); // ----------------- // Buffering enabled @@ -288,8 +312,8 @@ void wxStreamBuffer::Read(void *buffer, size_t size) buffer = (char *)buffer + buf_left; // ANSI C++ violation. if (!FillBuffer()) { - m_stream->m_lastcount = orig_size-size; - return; + CHECK_ERROR(wxStream_READ_ERR); + return (m_stream->m_lastcount = orig_size-size); } } else { @@ -298,10 +322,23 @@ void wxStreamBuffer::Read(void *buffer, size_t size) break; } } - m_stream->m_lastcount += orig_size; + return (m_stream->m_lastcount += orig_size); } -void wxStreamBuffer::Write(const void *buffer, size_t size) +size_t wxStreamBuffer::Read(wxStreamBuffer *s_buf) +{ + char buf[BUF_TEMP_SIZE]; + size_t s = 0, bytes_read = BUF_TEMP_SIZE; + + while (bytes_read == BUF_TEMP_SIZE) { + bytes_read = Read(buf, bytes_read); + bytes_read = s_buf->Write(buf, bytes_read); + s += bytes_read; + } + return s; +} + +size_t wxStreamBuffer::Write(const void *buffer, size_t size) { wxASSERT(m_stream != NULL); @@ -309,10 +346,9 @@ void wxStreamBuffer::Write(const void *buffer, size_t size) // Buffering disabled // ------------------ - if (!m_buffer_size) { - m_stream->m_lastcount = m_stream->OnSysWrite(buffer, size); - return; - } + m_stream->m_lasterror = wxStream_NOERROR; + if (!m_buffer_size) + return (m_stream->m_lastcount = m_stream->OnSysWrite(buffer, size)); // ------------------ // Buffering enabled @@ -331,9 +367,10 @@ void wxStreamBuffer::Write(const void *buffer, size_t size) buffer = (char *)buffer + buf_left; // ANSI C++ violation. if (!FlushBuffer()) { - m_stream->m_lastcount = orig_size-size; - return; + CHECK_ERROR(wxStream_WRITE_ERR); + return (m_stream->m_lastcount = orig_size-size); } + m_buffer_pos = m_buffer_start; } else { @@ -343,7 +380,22 @@ void wxStreamBuffer::Write(const void *buffer, size_t size) break; } } - m_stream->m_lastcount = orig_size; + return (m_stream->m_lastcount = orig_size); +} + +size_t wxStreamBuffer::Write(wxStreamBuffer *sbuf) +{ + char buf[BUF_TEMP_SIZE]; + size_t s = 0, bytes_count = BUF_TEMP_SIZE, b_count2; + + while (bytes_count == BUF_TEMP_SIZE) { + b_count2 = sbuf->Read(buf, bytes_count); + bytes_count = Write(buf, b_count2); + if (b_count2 > bytes_count) + sbuf->WriteBack(buf+bytes_count, b_count2-bytes_count); + s += bytes_count; + } + return s; } off_t wxStreamBuffer::Seek(off_t pos, wxSeekMode mode) @@ -352,7 +404,7 @@ off_t wxStreamBuffer::Seek(off_t pos, wxSeekMode mode) last_access = GetLastAccess(); - if (m_fixed) { + if (!m_flushable) { diff = pos + GetIntPosition(); if (diff < 0 || diff > last_access) return wxInvalidOffset; @@ -392,7 +444,7 @@ off_t wxStreamBuffer::Tell() const { off_t pos; - if (!m_fixed) { + if (m_flushable) { pos = m_stream->OnSysTell(); if (pos == wxInvalidOffset) return wxInvalidOffset; @@ -401,8 +453,10 @@ off_t wxStreamBuffer::Tell() const return GetIntPosition(); } -size_t wxStreamBuffer::GetDataLeft() const +size_t wxStreamBuffer::GetDataLeft() { + if (m_buffer_end == m_buffer_pos && m_flushable) + FillBuffer(); return m_buffer_end-m_buffer_pos; } @@ -420,17 +474,17 @@ wxStreamBase::~wxStreamBase() { } -size_t wxStreamBase::OnSysRead(void *buffer, size_t size) +size_t wxStreamBase::OnSysRead(void *WXUNUSED(buffer), size_t WXUNUSED(size)) { return 0; } -size_t wxStreamBase::OnSysWrite(const void *buffer, size_t bufsize) +size_t wxStreamBase::OnSysWrite(const void *WXUNUSED(buffer), size_t WXUNUSED(bufsize)) { return 0; } -off_t wxStreamBase::OnSysSeek(off_t seek, wxSeekMode mode) +off_t wxStreamBase::OnSysSeek(off_t WXUNUSED(seek), wxSeekMode WXUNUSED(mode)) { return wxInvalidOffset; } @@ -480,23 +534,20 @@ wxInputStream& wxInputStream::Read(void *buffer, size_t size) char wxInputStream::Peek() { - if (!m_i_streambuf->GetDataLeft()) - m_i_streambuf->FillBuffer(); + m_i_streambuf->GetDataLeft(); return *(m_i_streambuf->GetBufferPos()); } -#define BUF_TEMP_SIZE 10000 wxInputStream& wxInputStream::Read(wxOutputStream& stream_out) { char buf[BUF_TEMP_SIZE]; size_t bytes_read = BUF_TEMP_SIZE; - while (bytes_read == BUF_TEMP_SIZE && stream_out.LastError() != wxStream_NOERROR) { + while (bytes_read == BUF_TEMP_SIZE) { bytes_read = Read(buf, bytes_read).LastRead(); - - stream_out.Write(buf, bytes_read); + bytes_read = stream_out.Write(buf, bytes_read).LastWrite(); } return *this; }