#include "wx/stream.h"
#include "wx/datstrm.h"
#include "wx/objstrm.h"
+#include "wx/textfile.h"
// ----------------------------------------------------------------------------
// constants
wxStreamBuffer::wxStreamBuffer(wxStreamBase& stream, BufMode mode)
{
+ Init();
+
m_stream = &stream;
m_mode = mode;
wxStreamBuffer::wxStreamBuffer(BufMode mode)
{
- m_stream = new wxStreamBase;
+ Init();
+
+ wxASSERT_MSG(mode != read_write, wxT("you have to use the other ctor for read_write mode") );
+ if ( mode == read )
+ m_stream = new wxInputStream;
+ else if ( mode == write)
+ m_stream = new wxOutputStream;
+ else
+ m_stream = NULL;
+
m_mode = mode;
m_flushable = FALSE;
m_buffer_size = len;
// if we own it, we free it
- m_destroybuf = !takeOwnership;
+ m_destroybuf = takeOwnership;
ResetBuffer();
}
char c;
self->Read(&c, 1);
- if ( GetLastError() == wxSTREAM_EOF )
+
+ // some streams can know that they're at EOF before actually trying to
+ // read beyond the end of stream (e.g. files) while others have no way of
+ // knowing it, so to provide the same behaviour in all cases we only
+ // return TRUE from here if the character really couldn't be read
+ if ( !self->LastRead() && GetLastError() == wxSTREAM_EOF )
{
return TRUE;
}
wxBufferedInputStream::~wxBufferedInputStream()
{
- m_parent_i_stream->SeekI(-m_i_streambuf->GetBytesLeft(), wxFromCurrent);
+ m_parent_i_stream->SeekI(-(off_t)m_i_streambuf->GetBytesLeft(),
+ wxFromCurrent);
delete m_i_streambuf;
}
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
+ static const wxChar *eol = wxTextFile::GetEOL();
+
+ return stream.Write(eol, wxStrlen(eol));
}
#endif