Added wxWrapperInputStream class.

This stream allows to wrap another stream. This is a useful base class for
adapter classes providing stream interface on top of something else, like the
upcoming wxFSInputStream.

See #14185.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71205 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-04-16 13:53:45 +00:00
parent 11527fc9f0
commit f5ef4d69b7
3 changed files with 190 additions and 0 deletions

View File

@@ -36,6 +36,7 @@
#include <ctype.h>
#include "wx/datstrm.h"
#include "wx/textfile.h"
#include "wx/scopeguard.h"
// ----------------------------------------------------------------------------
// constants
@@ -1446,6 +1447,93 @@ void wxBufferedOutputStream::SetOutputStreamBuffer(wxStreamBuffer *buffer)
m_o_streambuf = buffer;
}
// ---------------------------------------------------------------------------
// wxWrapperInputStream implementation
// ---------------------------------------------------------------------------
wxWrapperInputStream::wxWrapperInputStream()
{
m_lasterror = wxSTREAM_READ_ERROR;
}
wxWrapperInputStream::wxWrapperInputStream(wxInputStream& stream)
: wxFilterInputStream(stream)
{
SynchronizeLastError();
}
wxWrapperInputStream::wxWrapperInputStream(wxInputStream *stream)
: wxFilterInputStream(stream)
{
if ( m_parent_i_stream )
SynchronizeLastError();
else
m_lasterror = wxSTREAM_READ_ERROR;
}
void wxWrapperInputStream::InitParentStream(wxInputStream& stream)
{
wxCHECK_RET( !m_parent_i_stream, "Can't init parent stream twice" );
m_parent_i_stream = &stream;
SynchronizeLastError();
}
void wxWrapperInputStream::InitParentStream(wxInputStream* stream)
{
wxCHECK_RET( !m_parent_i_stream, "Can't init parent stream twice" );
m_parent_i_stream = stream;
if ( m_parent_i_stream )
{
m_owns = true;
SynchronizeLastError();
}
}
wxFileOffset wxWrapperInputStream::GetLength() const
{
wxCHECK_MSG(m_parent_i_stream, wxInvalidOffset, "Stream not valid");
wxON_BLOCK_EXIT_THIS0(wxWrapperInputStream::SynchronizeLastError);
return m_parent_i_stream->GetLength();
}
bool wxWrapperInputStream::IsSeekable() const
{
wxCHECK_MSG(m_parent_i_stream, false, "Stream not valid");
return m_parent_i_stream->IsSeekable();
}
size_t wxWrapperInputStream::OnSysRead(void *buffer, size_t size)
{
wxCHECK_MSG(m_parent_i_stream, false, "Stream not valid");
wxON_BLOCK_EXIT_THIS0(wxWrapperInputStream::SynchronizeLastError);
m_parent_i_stream->Read(buffer, size);
return m_parent_i_stream->LastRead();
}
wxFileOffset wxWrapperInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode)
{
wxCHECK_MSG(IsSeekable(), false, "Stream not seekable");
wxON_BLOCK_EXIT_THIS0(wxWrapperInputStream::SynchronizeLastError);
return m_parent_i_stream->SeekI (pos, mode);
}
wxFileOffset wxWrapperInputStream::OnSysTell() const
{
wxCHECK_MSG(m_parent_i_stream, false, "Stream not valid");
wxON_BLOCK_EXIT_THIS0(wxWrapperInputStream::SynchronizeLastError);
return m_parent_i_stream->TellI();
}
// ----------------------------------------------------------------------------
// Some IOManip function
// ----------------------------------------------------------------------------