off_t wxStreamBuffer::Tell() const
{
- off_t pos = m_stream->OnSysTell();
- if ( pos == wxInvalidOffset )
- return wxInvalidOffset;
+ off_t pos;
+
+ // only ask the stream for position if we have a real stream and not a
+ // dummy one which we created ourselves, otherwise we'd call
+ // wxStream::OnSysTell() which would always return wxInvalidOffset
+ if ( !m_destroystream )
+ {
+ pos = m_stream->OnSysTell();
+ if ( pos == wxInvalidOffset )
+ return wxInvalidOffset;
+ }
+ else // no associated stream
+ {
+ pos = 0;
+ }
pos += GetIntPosition();
size_t wxInputStream::Ungetch(const void *buf, size_t bufsize)
{
+ if ( m_lasterror != wxSTREAM_NO_ERROR && m_lasterror != wxSTREAM_EOF )
+ {
+ // can't operate on this stream until the error is cleared
+ return 0;
+ }
+
char *ptrback = AllocSpaceWBack(bufsize);
if (!ptrback)
return 0;
+ // Eof() shouldn't return TRUE any longer
+ if ( m_lasterror == wxSTREAM_EOF )
+ m_lasterror = wxSTREAM_NO_ERROR;
+
memcpy(ptrback, buf, bufsize);
return bufsize;
}
bool wxInputStream::Ungetch(char c)
{
- void *ptrback = AllocSpaceWBack(1);
- if (!ptrback)
- return FALSE;
-
- *(char *)ptrback = c;
- return TRUE;
+ return Ungetch(&c, sizeof(char)) != 0;
}
char wxInputStream::GetC()