added wxStd{In,Out}putStream classes (closes #10637)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60483 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
272
src/common/stdstream.cpp
Normal file
272
src/common/stdstream.cpp
Normal file
@@ -0,0 +1,272 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wx/stdstream.h
|
||||
// Purpose: Implementation of std::istream and std::ostream derived
|
||||
// wrappers for wxInputStream and wxOutputStream
|
||||
// Author: Jonathan Liu <net147@gmail.com>
|
||||
// Created: 2009-05-02
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2009 Jonathan Liu
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// ==========================================================================
|
||||
// Declarations
|
||||
// ==========================================================================
|
||||
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#if wxUSE_STD_IOSTREAM
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#endif
|
||||
|
||||
#include "wx/stdstream.h"
|
||||
|
||||
#include <ios>
|
||||
#include <istream>
|
||||
#include <ostream>
|
||||
#include <streambuf>
|
||||
|
||||
// ==========================================================================
|
||||
// Helpers
|
||||
// ==========================================================================
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
inline bool
|
||||
IosSeekDirToWxSeekMode(std::ios_base::seekdir way,
|
||||
wxSeekMode& seekMode)
|
||||
{
|
||||
switch ( way )
|
||||
{
|
||||
case std::ios_base::beg:
|
||||
seekMode = wxFromStart;
|
||||
break;
|
||||
case std::ios_base::cur:
|
||||
seekMode = wxFromCurrent;
|
||||
break;
|
||||
case std::ios_base::end:
|
||||
seekMode = wxFromEnd;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
// ==========================================================================
|
||||
// wxStdInputStreamBuffer
|
||||
// ==========================================================================
|
||||
|
||||
wxStdInputStreamBuffer::wxStdInputStreamBuffer(wxInputStream& stream) :
|
||||
m_stream(stream), m_lastChar(EOF)
|
||||
{
|
||||
}
|
||||
|
||||
std::streambuf *
|
||||
wxStdInputStreamBuffer::setbuf(char *WXUNUSED(s),
|
||||
std::streamsize WXUNUSED(n))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
std::streampos
|
||||
wxStdInputStreamBuffer::seekoff(std::streamoff off,
|
||||
std::ios_base::seekdir way,
|
||||
std::ios_base::openmode which)
|
||||
{
|
||||
wxSeekMode seekMode;
|
||||
|
||||
if ( !IosSeekDirToWxSeekMode(way, seekMode) )
|
||||
return -1;
|
||||
if ( !(which & std::ios_base::in) )
|
||||
return -1;
|
||||
|
||||
off_t newPos = m_stream.SeekI((off_t) off, seekMode);
|
||||
|
||||
if ( newPos != wxInvalidOffset )
|
||||
return (std::streampos) newPos;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::streampos
|
||||
wxStdInputStreamBuffer::seekpos(std::streampos sp,
|
||||
std::ios_base::openmode which)
|
||||
{
|
||||
if ( !(which & std::ios_base::in) )
|
||||
return -1;
|
||||
|
||||
off_t newPos = m_stream.SeekI((off_t) sp);
|
||||
|
||||
if ( newPos != wxInvalidOffset )
|
||||
return (std::streampos) newPos;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::streamsize
|
||||
wxStdInputStreamBuffer::showmanyc()
|
||||
{
|
||||
if ( m_stream.CanRead() && (off_t) m_stream.GetSize() > m_stream.TellI() )
|
||||
return m_stream.GetSize() - m_stream.TellI();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::streamsize
|
||||
wxStdInputStreamBuffer::xsgetn(char *s, std::streamsize n)
|
||||
{
|
||||
m_stream.Read((void *) s, (size_t) n);
|
||||
|
||||
std::streamsize read = m_stream.LastRead();
|
||||
|
||||
if ( read > 0 )
|
||||
m_lastChar = (unsigned char) s[read - 1];
|
||||
|
||||
return read;
|
||||
}
|
||||
|
||||
int
|
||||
wxStdInputStreamBuffer::underflow()
|
||||
{
|
||||
int ch = m_stream.GetC();
|
||||
|
||||
if ( m_stream.LastRead() == 1 )
|
||||
{
|
||||
m_stream.Ungetch((char) ch);
|
||||
return ch;
|
||||
}
|
||||
else
|
||||
{
|
||||
return EOF;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
wxStdInputStreamBuffer::uflow()
|
||||
{
|
||||
int ch = m_stream.GetC();
|
||||
|
||||
if ( m_stream.LastRead() == 1 )
|
||||
{
|
||||
m_lastChar = ch;
|
||||
return ch;
|
||||
}
|
||||
else
|
||||
{
|
||||
return EOF;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
wxStdInputStreamBuffer::pbackfail(int c)
|
||||
{
|
||||
if ( c == EOF )
|
||||
{
|
||||
if ( m_lastChar == EOF )
|
||||
return EOF;
|
||||
|
||||
c = m_lastChar;
|
||||
m_lastChar = EOF;
|
||||
}
|
||||
|
||||
return m_stream.Ungetch((char) c) ? c : EOF;
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
// wxStdInputStream
|
||||
// ==========================================================================
|
||||
|
||||
wxStdInputStream::wxStdInputStream(wxInputStream& stream) :
|
||||
std::istream(NULL), m_streamBuffer(stream)
|
||||
{
|
||||
std::ios::init(&m_streamBuffer);
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
// wxStdOutputStreamBuffer
|
||||
// ==========================================================================
|
||||
|
||||
wxStdOutputStreamBuffer::wxStdOutputStreamBuffer(wxOutputStream& stream) :
|
||||
m_stream(stream)
|
||||
{
|
||||
}
|
||||
|
||||
std::streambuf *
|
||||
wxStdOutputStreamBuffer::setbuf(char *WXUNUSED(s),
|
||||
std::streamsize WXUNUSED(n))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
std::streampos
|
||||
wxStdOutputStreamBuffer::seekoff(std::streamoff off,
|
||||
std::ios_base::seekdir way,
|
||||
std::ios_base::openmode which)
|
||||
{
|
||||
wxSeekMode seekMode;
|
||||
|
||||
if ( !IosSeekDirToWxSeekMode(way, seekMode) )
|
||||
return -1;
|
||||
if ( !(which & std::ios_base::out) )
|
||||
return -1;
|
||||
|
||||
off_t newPos = m_stream.SeekO((off_t) off, seekMode);
|
||||
|
||||
if ( newPos != wxInvalidOffset )
|
||||
return (std::streampos) newPos;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::streampos
|
||||
wxStdOutputStreamBuffer::seekpos(std::streampos sp,
|
||||
std::ios_base::openmode which)
|
||||
{
|
||||
if ( !(which & std::ios_base::out) )
|
||||
return -1;
|
||||
|
||||
off_t newPos = m_stream.SeekO((off_t) sp);
|
||||
|
||||
if ( newPos != wxInvalidOffset )
|
||||
return (std::streampos) newPos;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::streamsize
|
||||
wxStdOutputStreamBuffer::xsputn(const char *s,
|
||||
std::streamsize n)
|
||||
{
|
||||
m_stream.Write((const void *) s, (size_t) n);
|
||||
return (std::streamsize) m_stream.LastWrite();
|
||||
}
|
||||
|
||||
int
|
||||
wxStdOutputStreamBuffer::overflow(int c)
|
||||
{
|
||||
m_stream.PutC(c);
|
||||
return m_stream.IsOk() ? c : EOF;
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
// wxStdOutputStream
|
||||
// ==========================================================================
|
||||
|
||||
wxStdOutputStream::wxStdOutputStream(wxOutputStream& stream) :
|
||||
std::ostream(NULL), m_streamBuffer(stream)
|
||||
{
|
||||
std::ios::init(&m_streamBuffer);
|
||||
}
|
||||
|
||||
#endif // wxUSE_STD_IOSTREAM
|
Reference in New Issue
Block a user