From bf53de3dfa4db68627f2935e6b2144835604df3a Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Fri, 16 Oct 2009 16:09:02 +0000 Subject: Finally added the substream class, and added getByPath (for properties) and getChildByPath (for groups) to the TafGroup class. --- src/substream.cpp | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 src/substream.cpp (limited to 'src/substream.cpp') diff --git a/src/substream.cpp b/src/substream.cpp new file mode 100644 index 0000000..ddb31b4 --- /dev/null +++ b/src/substream.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2007-2008 Xagasoft, All rights reserved. + * + * This file is part of the libbu++ library and is released under the + * terms of the license contained in the file LICENSE. + */ + +#include "bu/substream.h" + +Bu::SubStream::SubStream( Bu::Stream &rNext, long iSize ) : + Bu::Filter( rNext ), + iStart( 0 ), + iPos( 0 ), + iSize( iSize ) +{ + iStart = rNext.tell(); +} + +Bu::SubStream::~SubStream() +{ +} + +size_t Bu::SubStream::read( void *pBuf, size_t nBytes ) +{ + if( (long)nBytes > iSize-iPos ) + nBytes = iSize-iPos; + nBytes = rNext.read( pBuf, nBytes ); + iPos += nBytes; + return nBytes; +} + +size_t Bu::SubStream::write( const void *pBuf, size_t nBytes ) +{ + if( (long)nBytes > iSize-iPos ) + nBytes = iSize-iPos; + nBytes = rNext.write( pBuf, nBytes ); + iPos += nBytes; + return nBytes; +} + +void Bu::SubStream::start() +{ + // doesn't mean anything... +} + +size_t Bu::SubStream::stop() +{ + // doesn't mean anything... + return 0; +} + +void Bu::SubStream::close() +{ + // don't do anything? maybe... +} + +long Bu::SubStream::tell() +{ + return iPos; +} + +void Bu::SubStream::seek( long offset ) +{ + if( iPos+offset < 0 ) + offset = -iPos; + else if( iPos+offset > iSize ) + offset = iSize-iPos; + rNext.seek( offset ); + iPos += offset; +} + +void Bu::SubStream::setPos( long pos ) +{ + if( pos < 0 ) + pos = 0; + else if( pos > iSize ) + pos = iSize; + iPos = pos; + pos += iStart; + rNext.setPos( pos ); +} + +void Bu::SubStream::setPosEnd( long pos ) +{ + if( iSize-pos < 0 ) + pos = 0; + else if( iSize-pos > iSize ) + pos = iSize; + else + pos = iSize-pos; + iPos = pos; + rNext.setPos( iStart+pos ); +} + +bool Bu::SubStream::isEos() +{ + return rNext.isEos() || iPos == iSize; +} + +bool Bu::SubStream::canRead() +{ + return rNext.canRead() && (iPos < iSize); +} + +bool Bu::SubStream::canWrite() +{ + return rNext.canWrite() && (iPos < iSize); +} + -- cgit v1.2.3