+ // lasterror is reset before all new IO calls
+ m_stream->m_lasterror = wxStream_NOERROR;
+
+ if ( !HasBuffer() )
+ {
+ m_stream->m_lastcount = inStream->OnSysRead(buffer, size);
+ }
+ else // we have a buffer, use it
+ {
+ size_t orig_size = size;
+
+ while ( size > 0 )
+ {
+ size_t left = GetDataLeft();
+
+ // if the requested number of bytes if greater than the buffer
+ // size, read data in chunks
+ if ( size > left )
+ {
+ GetFromBuffer(buffer, left);
+ size -= left;
+ buffer = (char *)buffer + left;
+
+ if ( !FillBuffer() )
+ {
+ SetError(wxStream_EOF);
+ break;
+ }
+ }
+ else // otherwise just do it in one gulp
+ {
+ GetFromBuffer(buffer, size);
+ size = 0;
+ }
+ }
+
+ m_stream->m_lastcount = orig_size - size;
+ }
+
+ return m_stream->m_lastcount;
+}
+
+// this should really be called "Copy()"
+size_t wxStreamBuffer::Read(wxStreamBuffer *dbuf)
+{
+ wxCHECK_MSG( m_mode != write, 0, _T("can't read from this buffer") );
+
+ char buf[BUF_TEMP_SIZE];
+ size_t nRead,
+ total = 0;
+
+ do
+ {
+ nRead = Read(dbuf, WXSIZEOF(buf));
+ if ( nRead )
+ {
+ nRead = dbuf->Write(buf, nRead);
+ total += nRead;
+ }
+ }
+ while ( nRead );