X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/84b46c356ebc657a292ebe616eb51c821772da8f..7b9da2077d0975db6c965a85c91d5aca671ab5e3:/src/common/stream.cpp?ds=sidebyside diff --git a/src/common/stream.cpp b/src/common/stream.cpp index 2bce4c881e..ed5190b1dc 100644 --- a/src/common/stream.cpp +++ b/src/common/stream.cpp @@ -15,31 +15,45 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include -#include -#include -#include #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/defs.h" #endif +#if wxUSE_STREAMS + +#include +#include "wx/stream.h" +#include "wx/datstrm.h" +#include "wx/objstrm.h" + +#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_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_mode(mode), m_destroybuf(FALSE), m_destroystream(TRUE) { + m_stream = new wxStreamBase(); } wxStreamBuffer::wxStreamBuffer(const wxStreamBuffer& buffer) @@ -53,36 +67,15 @@ wxStreamBuffer::wxStreamBuffer(const wxStreamBuffer& buffer) m_stream = buffer.m_stream; m_mode = buffer.m_mode; m_destroybuf = FALSE; + m_destroystream = FALSE; } wxStreamBuffer::~wxStreamBuffer() { if (m_destroybuf) wxDELETEA(m_buffer_start); -} - -bool wxStreamBuffer::WriteBack(const char *buf, size_t bufsize) -{ - char *ptrback; - - ptrback = AllocSpaceWBack(bufsize); - if (!ptrback) - return FALSE; - - memcpy(ptrback, buf, bufsize); - return TRUE; -} - -bool wxStreamBuffer::WriteBack(char c) -{ - char *ptrback; - - ptrback = AllocSpaceWBack(1); - if (!ptrback) - return FALSE; - - *ptrback = c; - return TRUE; + if (m_destroystream) + delete m_stream; } void wxStreamBuffer::SetBufferIO(char *buffer_start, char *buffer_end) @@ -101,7 +94,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,48 +112,14 @@ void wxStreamBuffer::SetBufferIO(size_t bufsize) void wxStreamBuffer::ResetBuffer() { + m_stream->m_lasterror = wxStream_NOERROR; + m_stream->m_lastcount = 0; if (m_mode == read) m_buffer_pos = m_buffer_end; else m_buffer_pos = m_buffer_start; } -char *wxStreamBuffer::AllocSpaceWBack(size_t needed_size) -{ - char *temp_b; - - m_wbacksize += needed_size; - - if (!m_wback) - temp_b = (char *)malloc(m_wbacksize); - else - temp_b = (char *)realloc(m_wback, m_wbacksize); - - if (!temp_b) - return NULL; - return (char *)((size_t)m_wback+(m_wbacksize-needed_size)); -} - -size_t wxStreamBuffer::GetWBack(char *buf, size_t bsize) -{ - size_t s_toget = m_wbacksize-m_wbackcur; - - if (bsize < s_toget) - s_toget = bsize; - - memcpy(buf, (m_wback+m_wbackcur), s_toget); - - m_wbackcur += s_toget; - if (m_wbackcur == m_wbacksize) { - free(m_wback); - m_wback = (char *)NULL; - m_wbacksize = 0; - m_wbackcur = 0; - } - - return s_toget; -} - bool wxStreamBuffer::FillBuffer() { size_t count; @@ -205,10 +165,17 @@ void wxStreamBuffer::PutToBuffer(const void *buffer, size_t size) size_t s_toput = m_buffer_end-m_buffer_pos; if (s_toput < size && !m_fixed) { - m_buffer_start = (char *)realloc(m_buffer_start, m_buffer_size+size); - // I round a bit - m_buffer_size += size; - m_buffer_end = m_buffer_start+m_buffer_size; + if (!m_buffer_start) + SetBufferIO(size); + else { + size_t delta = m_buffer_pos-m_buffer_start; + + m_buffer_start = (char *)realloc(m_buffer_start, m_buffer_size+size); + m_buffer_pos = m_buffer_start + delta; + // I round a bit + m_buffer_size += size; + m_buffer_end = m_buffer_start+m_buffer_size; + } s_toput = size; } if (s_toput > size) @@ -226,13 +193,32 @@ void wxStreamBuffer::PutChar(char c) return; } - if (!GetDataLeft() && !FlushBuffer()) + if (GetDataLeft() == 0 && !FlushBuffer()) { + CHECK_ERROR(wxStream_WRITE_ERR); return; + } PutToBuffer(&c, 1); m_stream->m_lastcount = 1; } +char wxStreamBuffer::Peek() +{ + char c; + + wxASSERT(m_stream != NULL && m_buffer_size != 0); + + if (!GetDataLeft()) { + CHECK_ERROR(wxStream_READ_ERR); + return 0; + } + + GetFromBuffer(&c, 1); + m_buffer_pos--; + + return c; +} + char wxStreamBuffer::GetChar() { char c; @@ -244,33 +230,31 @@ 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); + if (m_mode == write) + return 0; + // ------------------ // Buffering disabled // ------------------ - m_stream->m_lastcount = GetWBack((char *)buffer, size); - size -= m_stream->m_lastcount; - if (size == 0) - return; - - buffer = (void *)((char *)buffer+m_stream->m_lastcount); - - if (!m_buffer_size) { - m_stream->m_lastcount += m_stream->OnSysRead(buffer, size); - return; - } + m_stream->m_lasterror = wxStream_NOERROR; + if (!m_buffer_size) + return (m_stream->m_lastcount += m_stream->OnSysRead(buffer, size)); // ----------------- // Buffering enabled @@ -288,8 +272,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_EOF); + return (m_stream->m_lastcount = orig_size-size); } } else { @@ -298,21 +282,39 @@ 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; + + if (m_mode == write) + return 0; + + while (bytes_read != 0) { + 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); + if (m_mode == read) + return 0; + // ------------------ // 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 && m_fixed) + return (m_stream->m_lastcount = m_stream->OnSysWrite(buffer, size)); // ------------------ // Buffering enabled @@ -325,15 +327,18 @@ void wxStreamBuffer::Write(const void *buffer, size_t size) // First case: the buffer to write is larger than the stream buffer, // we split it - if (size > buf_left) { + // NB: If stream buffer isn't fixed (as for wxMemoryOutputStream), + // we always go to the second case. + if (size > buf_left && m_fixed) { PutToBuffer(buffer, buf_left); size -= buf_left; 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 +348,28 @@ 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; + wxInputStream *in_stream; + + if (m_mode == read) + return 0; + + in_stream = (wxInputStream *)sbuf->Stream(); + + while (bytes_count == BUF_TEMP_SIZE) { + b_count2 = sbuf->Read(buf, bytes_count); + bytes_count = Write(buf, b_count2); + if (b_count2 > bytes_count) + in_stream->Ungetch(buf+bytes_count, b_count2-bytes_count); + s += bytes_count; + } + return s; } off_t wxStreamBuffer::Seek(off_t pos, wxSeekMode mode) @@ -352,7 +378,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; @@ -371,7 +397,9 @@ off_t wxStreamBuffer::Seek(off_t pos, wxSeekMode mode) diff = pos + GetIntPosition(); if ( (diff > last_access) || (diff < 0) ) { - ret_off = m_stream->OnSysSeek(pos, wxFromCurrent); + // We must take into account the fact that we have read something + // previously. + ret_off = m_stream->OnSysSeek(diff-last_access, wxFromCurrent); ResetBuffer(); return ret_off; } else { @@ -392,7 +420,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 +429,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 +450,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; } @@ -445,330 +475,409 @@ off_t wxStreamBase::OnSysTell() const // ---------------------------------------------------------------------------- wxInputStream::wxInputStream() - : wxStreamBase() + : wxStreamBase(), + m_wback(NULL), m_wbacksize(0), m_wbackcur(0) { - m_i_destroybuf = TRUE; - m_i_streambuf = new wxStreamBuffer(*this, wxStreamBuffer::read); } -wxInputStream::wxInputStream(wxStreamBuffer *buffer) - : wxStreamBase() +wxInputStream::~wxInputStream() { - m_i_destroybuf = FALSE; - m_i_streambuf = buffer; + if (m_wback) + free(m_wback); } -wxInputStream::~wxInputStream() +char *wxInputStream::AllocSpaceWBack(size_t needed_size) +{ + char *temp_b; + size_t old_size; + + old_size = m_wbacksize; + m_wbacksize += needed_size; + + if (!m_wback) + temp_b = (char *)malloc(m_wbacksize); + else + temp_b = (char *)realloc(m_wback, m_wbacksize); + + if (!temp_b) + return NULL; + m_wback = temp_b; + + memmove(m_wback+needed_size, m_wback, old_size); + + return (char *)(m_wback); +} + +size_t wxInputStream::GetWBack(char *buf, size_t bsize) +{ + size_t s_toget = m_wbacksize-m_wbackcur; + + if (!m_wback) + return 0; + + if (bsize < s_toget) + s_toget = bsize; + + memcpy(buf, (m_wback+m_wbackcur), s_toget); + + m_wbackcur += s_toget; + if (m_wbackcur == m_wbacksize) { + free(m_wback); + m_wback = (char *)NULL; + m_wbacksize = 0; + m_wbackcur = 0; + } + + return s_toget; +} + +size_t wxInputStream::Ungetch(const void *buf, size_t bufsize) { - if (m_i_destroybuf) - delete m_i_streambuf; + char *ptrback; + + ptrback = AllocSpaceWBack(bufsize); + if (!ptrback) + return 0; + + memcpy(ptrback, buf, bufsize); + return bufsize; +} + +bool wxInputStream::Ungetch(char c) +{ + char *ptrback; + + ptrback = AllocSpaceWBack(1); + if (!ptrback) + return FALSE; + + *ptrback = c; + return TRUE; } char wxInputStream::GetC() { char c; - m_i_streambuf->Read(&c, 1); + Read(&c, 1); return c; } wxInputStream& wxInputStream::Read(void *buffer, size_t size) { - m_i_streambuf->Read(buffer, size); - // wxStreamBuffer sets all variables for us + size_t retsize; + char *buf = (char *)buffer; + + retsize = GetWBack(buf, size); + if (retsize == size) { + m_lastcount = size; + m_lasterror = wxStream_NOERROR; + return *this; + } + size -= retsize; + buf += retsize; + + m_lastcount = OnSysRead(buf, size); return *this; } char wxInputStream::Peek() { - if (!m_i_streambuf->GetDataLeft()) - m_i_streambuf->FillBuffer(); + char c; - return *(m_i_streambuf->GetBufferPos()); + Read(&c, 1); + if (m_lasterror == wxStream_NOERROR) { + Ungetch(c); + return c; + } + return 0; } -#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; } off_t wxInputStream::SeekI(off_t pos, wxSeekMode mode) { - return m_i_streambuf->Seek(pos, mode); + //should be check and improve, just to remove a slight bug ! + // I don't know whether it should be put as well in wxFileInputStream::OnSysSeek ? + if (m_lasterror==wxSTREAM_EOF) m_lasterror=wxSTREAM_NOERROR; + + return OnSysSeek(pos, mode); } off_t wxInputStream::TellI() const { - return m_i_streambuf->Tell(); + return OnSysTell(); } // -------------------- // Overloaded operators // -------------------- -wxInputStream& wxInputStream::operator>>(wxString& line) +#if wxUSE_SERIAL +wxInputStream& wxInputStream::operator>>(wxObject *& obj) { - wxDataInputStream s(*this); - - line = s.ReadLine(); + wxObjectInputStream obj_s(*this); + obj = obj_s.LoadObject(); return *this; } +#endif + -wxInputStream& wxInputStream::operator>>(char& c) +// ---------------------------------------------------------------------------- +// wxOutputStream +// ---------------------------------------------------------------------------- +wxOutputStream::wxOutputStream() + : wxStreamBase() { - c = GetC(); - return *this; } -wxInputStream& wxInputStream::operator>>(short& i) +wxOutputStream::~wxOutputStream() { - long l; +} - *this >> l; - i = (short)l; +wxOutputStream& wxOutputStream::Write(const void *buffer, size_t size) +{ + m_lastcount = OnSysWrite(buffer, size); return *this; } -wxInputStream& wxInputStream::operator>>(int& i) +wxOutputStream& wxOutputStream::Write(wxInputStream& stream_in) { - long l; - - *this >> l; - i = (short)l; + stream_in.Read(*this); return *this; } -wxInputStream& wxInputStream::operator>>(long& i) +off_t wxOutputStream::TellO() const { - /* I only implemented a simple integer parser */ - int c, sign; - - while (isspace( c = GetC() ) ) - /* Do nothing */ ; + return OnSysTell(); +} - i = 0; - if (! (c == '-' || isdigit(c)) ) { - InputStreamBuffer()->WriteBack(c); - return *this; - } +off_t wxOutputStream::SeekO(off_t pos, wxSeekMode mode) +{ + return OnSysSeek(pos, mode); +} - if (c == '-') { - sign = -1; - c = GetC(); - } else - sign = 1; +void wxOutputStream::Sync() +{ +} - while (isdigit(c)) { - i = i*10 + c; - c = GetC(); - } +#if wxUSE_SERIAL +wxOutputStream& wxOutputStream::operator<<(wxObject& obj) +{ + wxObjectOutputStream obj_s(*this); + obj_s.SaveObject(obj); + return *this; +} +#endif - i *= sign; +// ---------------------------------------------------------------------------- +// wxCountingOutputStream +// ---------------------------------------------------------------------------- - return *this; +wxCountingOutputStream::wxCountingOutputStream () + : wxOutputStream() +{ + m_currentPos = 0; } -wxInputStream& wxInputStream::operator>>(double& f) +size_t wxCountingOutputStream::GetSize() const { - /* I only implemented a simple float parser */ - int c, sign; + return m_lastcount; +} - while (isspace( c = GetC() ) ) - /* Do nothing */ ; +size_t wxCountingOutputStream::OnSysWrite(const void *WXUNUSED(buffer), size_t size) +{ + m_currentPos += size; + if (m_currentPos > m_lastcount) m_lastcount = m_currentPos; + return m_currentPos; +} - f = 0.0; - if (! (c == '-' || isdigit(c)) ) { - InputStreamBuffer()->WriteBack(c); - return *this; +off_t wxCountingOutputStream::OnSysSeek(off_t pos, wxSeekMode mode) +{ + if (mode == wxFromStart) + { + m_currentPos = pos; } - - if (c == '-') { - sign = -1; - c = GetC(); - } else - sign = 1; - - while (isdigit(c)) { - f = f*10 + (c - '0'); - c = GetC(); + if (mode == wxFromEnd) + { + m_currentPos = m_lastcount + pos; } - - if (c == '.') { - double f_multiplicator = (double) 0.1; - c = GetC(); - - while (isdigit(c)) { - f += (c-'0')*f_multiplicator; - f_multiplicator /= 10; - c = GetC(); - } + else + { + m_currentPos += pos; } - - f *= sign; - - return *this; + if (m_currentPos > m_lastcount) m_lastcount = m_currentPos; + + return m_currentPos; // ? } -#if wxUSE_SERIAL -wxInputStream& wxInputStream::operator>>(wxObject *& obj) +off_t wxCountingOutputStream::OnSysTell() const { - wxObjectInputStream obj_s(*this); - obj = obj_s.LoadObject(); - return *this; + return m_currentPos; // ? } -#endif - - + // ---------------------------------------------------------------------------- -// wxOutputStream +// wxFilterInputStream // ---------------------------------------------------------------------------- -wxOutputStream::wxOutputStream() - : wxStreamBase() + +wxFilterInputStream::wxFilterInputStream() + : wxInputStream() { - m_o_destroybuf = TRUE; - m_o_streambuf = new wxStreamBuffer(*this, wxStreamBuffer::write); } -wxOutputStream::wxOutputStream(wxStreamBuffer *buffer) - : wxStreamBase() +wxFilterInputStream::wxFilterInputStream(wxInputStream& stream) + : wxInputStream() { - m_o_destroybuf = FALSE; - m_o_streambuf = buffer; + m_parent_i_stream = &stream; } -wxOutputStream::~wxOutputStream() +wxFilterInputStream::~wxFilterInputStream() { - if (m_o_destroybuf) - delete m_o_streambuf; } -wxOutputStream& wxOutputStream::Write(const void *buffer, size_t size) +// ---------------------------------------------------------------------------- +// wxFilterOutputStream +// ---------------------------------------------------------------------------- +wxFilterOutputStream::wxFilterOutputStream() + : wxOutputStream() { - m_o_streambuf->Write(buffer, size); - return *this; } -wxOutputStream& wxOutputStream::Write(wxInputStream& stream_in) +wxFilterOutputStream::wxFilterOutputStream(wxOutputStream& stream) + : wxOutputStream() { - stream_in.Read(*this); - return *this; + m_parent_o_stream = &stream; } -off_t wxOutputStream::TellO() const +wxFilterOutputStream::~wxFilterOutputStream() { - return m_o_streambuf->Tell(); } -off_t wxOutputStream::SeekO(off_t pos, wxSeekMode mode) +// ---------------------------------------------------------------------------- +// wxBufferedInputStream +// ---------------------------------------------------------------------------- +wxBufferedInputStream::wxBufferedInputStream(wxInputStream& s) + : wxFilterInputStream(s) { - return m_o_streambuf->Seek(pos, mode); + m_i_streambuf = new wxStreamBuffer(*this, wxStreamBuffer::read); + m_i_streambuf->SetBufferIO(1024); } -void wxOutputStream::Sync() +wxBufferedInputStream::~wxBufferedInputStream() { - m_o_streambuf->FlushBuffer(); + delete m_i_streambuf; } -wxOutputStream& wxOutputStream::operator<<(const char *string) +char wxBufferedInputStream::Peek() { - return Write(string, strlen(string)); + return m_i_streambuf->Peek(); } -wxOutputStream& wxOutputStream::operator<<(wxString& string) +wxInputStream& wxBufferedInputStream::Read(void *buffer, size_t size) { - return Write(string, string.Len()); + size_t retsize; + char *buf = (char *)buffer; + + retsize = GetWBack(buf, size); + m_lastcount = retsize; + if (retsize == size) { + m_lasterror = wxStream_NOERROR; + return *this; + } + size -= retsize; + buf += retsize; + + m_i_streambuf->Read(buf, size); + + return *this; } -wxOutputStream& wxOutputStream::operator<<(char c) +off_t wxBufferedInputStream::SeekI(off_t pos, wxSeekMode mode) { - return Write(&c, 1); + return m_i_streambuf->Seek(pos, mode); } -wxOutputStream& wxOutputStream::operator<<(short i) +off_t wxBufferedInputStream::TellI() const { - wxString strint; - - strint.Printf("%i", i); - return Write(strint, strint.Len()); + return m_i_streambuf->Tell(); } -wxOutputStream& wxOutputStream::operator<<(int i) +size_t wxBufferedInputStream::OnSysRead(void *buffer, size_t bufsize) { - wxString strint; - - strint.Printf("%i", i); - return Write(strint, strint.Len()); + return m_parent_i_stream->Read(buffer, bufsize).LastRead(); } -wxOutputStream& wxOutputStream::operator<<(long i) +off_t wxBufferedInputStream::OnSysSeek(off_t seek, wxSeekMode mode) { - wxString strlong; + return m_parent_i_stream->SeekI(seek, mode); +} - strlong.Printf("%i", i); - return Write((const char *)strlong, strlong.Len()); +off_t wxBufferedInputStream::OnSysTell() const +{ + return m_parent_i_stream->TellI(); } -wxOutputStream& wxOutputStream::operator<<(double f) +// ---------------------------------------------------------------------------- +// wxBufferedOutputStream +// ---------------------------------------------------------------------------- + +wxBufferedOutputStream::wxBufferedOutputStream(wxOutputStream& s) + : wxFilterOutputStream(s) { - wxString strfloat; + m_o_streambuf = new wxStreamBuffer(*this, wxStreamBuffer::write); + m_o_streambuf->SetBufferIO(1024); +} - strfloat.Printf("%f", f); - return Write(strfloat, strfloat.Len()); +wxBufferedOutputStream::~wxBufferedOutputStream() +{ + delete m_o_streambuf; } -#if wxUSE_SERIAL -wxOutputStream& wxOutputStream::operator<<(wxObject& obj) +wxOutputStream& wxBufferedOutputStream::Write(const void *buffer, size_t size) { - wxObjectOutputStream obj_s(*this); - obj_s.SaveObject(obj); + m_lastcount = 0; + m_o_streambuf->Write(buffer, size); return *this; } -#endif -// ---------------------------------------------------------------------------- -// wxFilterInputStream -// ---------------------------------------------------------------------------- -wxFilterInputStream::wxFilterInputStream() - : wxInputStream(NULL) +off_t wxBufferedOutputStream::SeekO(off_t pos, wxSeekMode mode) { - // WARNING streambuf set to NULL ! + return m_o_streambuf->Seek(pos, mode); } -wxFilterInputStream::wxFilterInputStream(wxInputStream& stream) - : wxInputStream(stream.InputStreamBuffer()) +off_t wxBufferedOutputStream::TellO() const { - m_parent_i_stream = &stream; + return m_o_streambuf->Tell(); } -wxFilterInputStream::~wxFilterInputStream() +void wxBufferedOutputStream::Sync() { + m_o_streambuf->FlushBuffer(); + m_parent_o_stream->Sync(); } -// ---------------------------------------------------------------------------- -// wxFilterOutputStream -// ---------------------------------------------------------------------------- -wxFilterOutputStream::wxFilterOutputStream() - : wxOutputStream(NULL) +size_t wxBufferedOutputStream::OnSysWrite(const void *buffer, size_t bufsize) { + return m_parent_o_stream->Write(buffer, bufsize).LastWrite(); } -wxFilterOutputStream::wxFilterOutputStream(wxOutputStream& stream) - : wxOutputStream(stream.OutputStreamBuffer()) +off_t wxBufferedOutputStream::OnSysSeek(off_t seek, wxSeekMode mode) { - m_parent_o_stream = &stream; + return m_parent_o_stream->SeekO(seek, mode); } -wxFilterOutputStream::~wxFilterOutputStream() +off_t wxBufferedOutputStream::OnSysTell() const { + return m_parent_o_stream->TellO(); } // ---------------------------------------------------------------------------- @@ -779,7 +888,14 @@ wxOutputStream& wxEndL(wxOutputStream& stream) { #ifdef __MSW__ return stream.Write("\r\n", 2); +#else +#ifdef __WXMAC__ + return stream.Write("\r", 1); #else return stream.Write("\n", 1); #endif +#endif } + +#endif + // wxUSE_STREAMS