From 611f1c821f9d882f935ac62b0c566d4988f26d1c Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Sun, 22 Aug 2010 05:34:12 +0000 Subject: Bu::StreamStack works, it's tested, reasonably, it will be used first in the gats project in Gats::ProtocolGats. --- src/streamstack.cpp | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) (limited to 'src/streamstack.cpp') diff --git a/src/streamstack.cpp b/src/streamstack.cpp index 9e45cc4..c7f8af5 100644 --- a/src/streamstack.cpp +++ b/src/streamstack.cpp @@ -4,83 +4,203 @@ Bu::StreamStack::StreamStack() { } +Bu::StreamStack::StreamStack( Bu::Stream *pStream ) +{ + lFilts.prepend( pStream ); +} + Bu::StreamStack::~StreamStack() { + clearStack(); +} + +bool Bu::StreamStack::isEmpty() +{ + return lFilts.isEmpty(); +} + +bool Bu::StreamStack::hasStream() +{ + return !lFilts.isEmpty(); +} + +void Bu::StreamStack::setStream( Bu::Stream *pStream ) +{ + if( !lFilts.isEmpty() ) + throw Bu::ExceptionBase("There is already a stream set."); + + lFilts.prepend( pStream ); +} + +void Bu::StreamStack::clearStack() +{ + for( FilterList::iterator i = lFilts.begin(); i; i++ ) + { + delete *i; + } + + lFilts.clear(); +} + +void Bu::StreamStack::popFilter() +{ + if( lFilts.isEmpty() ) + return; + + delete lFilts.first(); + lFilts.erase( lFilts.begin() ); +} + +Bu::Stream *Bu::StreamStack::getTop() +{ + checkStack(); + + return lFilts.first(); +} + +Bu::Stream *Bu::StreamStack::getStream() +{ + checkStack(); + + return lFilts.last(); } void Bu::StreamStack::close() { + checkStack(); + + lFilts.first()->close(); } size_t Bu::StreamStack::read( void *pBuf, size_t nBytes ) { + checkStack(); + + return lFilts.first()->read( pBuf, nBytes ); } size_t Bu::StreamStack::write( const void *pBuf, size_t nBytes ) { + checkStack(); + + return lFilts.first()->write( pBuf, nBytes ); } size_t Bu::StreamStack::write( const Bu::FString &sBuf ) { + checkStack(); + + return lFilts.first()->write( sBuf ); } long Bu::StreamStack::tell() { + checkStack(); + + return lFilts.first()->tell(); } void Bu::StreamStack::seek( long offset ) { + checkStack(); + + lFilts.first()->seek( offset ); } void Bu::StreamStack::setPos( long pos ) { + checkStack(); + + lFilts.first()->setPos( pos ); } void Bu::StreamStack::setPosEnd( long pos ) { + checkStack(); + + lFilts.first()->setPosEnd( pos ); } bool Bu::StreamStack::isEos() { + checkStack(); + + return lFilts.first()->isEos(); } bool Bu::StreamStack::isOpen() { + checkStack(); + + return lFilts.first()->isOpen(); } void Bu::StreamStack::flush() { + checkStack(); + + lFilts.first()->flush(); } bool Bu::StreamStack::canRead() { + checkStack(); + + return lFilts.first()->canRead(); } bool Bu::StreamStack::canWrite() { + checkStack(); + + return lFilts.first()->canWrite(); } bool Bu::StreamStack::isReadable() { + checkStack(); + + return lFilts.first()->isReadable(); } bool Bu::StreamStack::isWritable() { + checkStack(); + + return lFilts.first()->isWritable(); } bool Bu::StreamStack::isSeekable() { + checkStack(); + + return lFilts.first()->isSeekable(); } bool Bu::StreamStack::isBlocking() { + checkStack(); + + return lFilts.first()->isBlocking(); } void Bu::StreamStack::setBlocking( bool bBlocking ) { + checkStack(); + + lFilts.first()->setBlocking( bBlocking ); } void Bu::StreamStack::setSize( long iSize ) { + checkStack(); + + lFilts.first()->setSize( iSize ); +} + +inline void Bu::StreamStack::checkStack() +{ + if( lFilts.isEmpty() ) + throw Bu::ExceptionBase("StreamStack is empty."); } -- cgit v1.2.3