+ char buf[BUF_TEMP_SIZE];
+
+ for ( ;; )
+ {
+ size_t bytes_read = Read(buf, WXSIZEOF(buf)).LastRead();
+ if ( !bytes_read )
+ break;
+
+ if ( stream_out.Write(buf, bytes_read).LastWrite() != bytes_read )
+ break;
+ }
+
+ return *this;
+}
+
+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
+ // from all other in that they handle two stream-related objects,
+ // the stream buffer and parent stream.
+
+ // I don't know whether it should be put as well in wxFileInputStream::OnSysSeek
+ if (m_lasterror==wxSTREAM_EOF)
+ m_lasterror=wxSTREAM_NO_ERROR;
+
+ /* RR: A call to SeekI() will automatically invalidate any previous
+ call to Ungetch(), otherwise it would be possible to SeekI() to
+ one position, unread some bytes there, SeekI() to another position
+ and the data would be corrupted.
+
+ GRG: Could add code here to try to navigate within the wback
+ buffer if possible, but is it really needed? It would only work
+ when seeking in wxFromCurrent mode, else it would invalidate
+ anyway... */
+
+ if (m_wback)
+ {
+ wxLogDebug( wxT("Seeking in stream which has data written back to it.") );
+
+ free(m_wback);
+ m_wback = NULL;
+ m_wbacksize = 0;
+ m_wbackcur = 0;
+ }
+
+ return OnSysSeek(pos, mode);
+}
+
+wxFileOffset wxInputStream::TellI() const
+{
+ wxFileOffset pos = OnSysTell();
+
+ if (pos != wxInvalidOffset)
+ pos -= (m_wbacksize - m_wbackcur);
+
+ return pos;