/************************************************************************* * * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: NeonInputStream.cxx,v $ * * $Revision: 1.9 $ * * last change: $Author: hr $ $Date: 2006-06-20 05:36:21 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. * * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2005 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * ************************************************************************/ #include "NeonInputStream.hxx" #ifndef _RTL_MEMORY_H_ #include #endif using namespace cppu; using namespace rtl; using namespace com::sun::star::io; using namespace com::sun::star::uno; using namespace webdav_ucp; // ------------------------------------------------------------------- // Constructor // ------------------------------------------------------------------- NeonInputStream::NeonInputStream( void ) : mLen( 0 ), mPos( 0 ) { } // ------------------------------------------------------------------- // Destructor // ------------------------------------------------------------------- NeonInputStream::~NeonInputStream( void ) { } // ------------------------------------------------------------------- // AddToStream // Allows the caller to add some data to the "end" of the stream // ------------------------------------------------------------------- void NeonInputStream::AddToStream( const char * inBuf, sal_Int32 inLen ) { mInputBuffer.realloc( sal::static_int_cast(mLen) + inLen ); rtl_copyMemory( mInputBuffer.getArray() + mLen, inBuf, inLen ); mLen += inLen; } // ------------------------------------------------------------------- // queryInterface // ------------------------------------------------------------------- Any NeonInputStream::queryInterface( const Type &type ) throw( RuntimeException ) { Any aRet = ::cppu::queryInterface( type, static_cast< XInputStream * >( this ), static_cast< XSeekable * >( this ) ); return aRet.hasValue() ? aRet : OWeakObject::queryInterface( type ); } // ------------------------------------------------------------------- // readBytes // "Reads" the specified number of bytes from the stream // ------------------------------------------------------------------- sal_Int32 SAL_CALL NeonInputStream::readBytes( ::com::sun::star::uno::Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead ) throw( ::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException ) { // Work out how much we're actually going to write sal_Int32 theBytes2Read = nBytesToRead; sal_Int32 theBytesLeft = sal::static_int_cast(mLen - mPos); if ( theBytes2Read > theBytesLeft ) theBytes2Read = theBytesLeft; // Realloc buffer. aData.realloc( theBytes2Read ); // Write the data rtl_copyMemory( aData.getArray(), mInputBuffer.getConstArray() + mPos, theBytes2Read ); // Update our stream position for next time mPos += theBytes2Read; return theBytes2Read; } // ------------------------------------------------------------------- // readSomeBytes // ------------------------------------------------------------------- sal_Int32 SAL_CALL NeonInputStream::readSomeBytes( ::com::sun::star::uno::Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead ) throw( ::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException ) { // Warning: What should this be doing ? return readBytes( aData, nMaxBytesToRead ); } // ------------------------------------------------------------------- // skipBytes // Moves the current stream position forward // ------------------------------------------------------------------- void SAL_CALL NeonInputStream::skipBytes( sal_Int32 nBytesToSkip ) throw( ::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException ) { mPos += nBytesToSkip; if ( mPos >= mLen ) mPos = mLen; } // ------------------------------------------------------------------- // available // Returns the number of unread bytes currently remaining on the stream // ------------------------------------------------------------------- sal_Int32 SAL_CALL NeonInputStream::available( ) throw( ::com::sun::star::io::NotConnectedException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException ) { return sal::static_int_cast(mLen - mPos); } // ------------------------------------------------------------------- // closeInput // ------------------------------------------------------------------- void SAL_CALL NeonInputStream::closeInput( void ) throw( ::com::sun::star::io::NotConnectedException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException ) { } // ------------------------------------------------------------------- // seek // ------------------------------------------------------------------- void SAL_CALL NeonInputStream::seek( sal_Int64 location ) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException ) { if ( location < 0 ) throw ::com::sun::star::lang::IllegalArgumentException(); if ( location <= mLen ) mPos = location; else throw ::com::sun::star::lang::IllegalArgumentException(); } // ------------------------------------------------------------------- // getPosition // ------------------------------------------------------------------- sal_Int64 SAL_CALL NeonInputStream::getPosition() throw( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException ) { return mPos; } // ------------------------------------------------------------------- // getLength // ------------------------------------------------------------------- sal_Int64 SAL_CALL NeonInputStream::getLength() throw( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException ) { return mLen; }