| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_svl.hxx" |
| |
| #include "oinputstreamcontainer.hxx" |
| #include <cppuhelper/typeprovider.hxx> |
| |
| using namespace ::com::sun::star; |
| |
| //----------------------------------------------- |
| OFSInputStreamContainer::OFSInputStreamContainer( const uno::Reference< io::XInputStream >& xStream ) |
| : m_xInputStream( xStream ) |
| , m_xSeekable( xStream, uno::UNO_QUERY ) |
| , m_bSeekable( sal_False ) |
| , m_bDisposed( sal_False ) |
| , m_pListenersContainer( NULL ) |
| { |
| m_bSeekable = m_xSeekable.is(); |
| } |
| |
| //----------------------------------------------- |
| OFSInputStreamContainer::~OFSInputStreamContainer() |
| { |
| if ( m_pListenersContainer ) |
| { |
| delete m_pListenersContainer; |
| m_pListenersContainer = NULL; |
| } |
| } |
| |
| //----------------------------------------------- |
| uno::Sequence< uno::Type > SAL_CALL OFSInputStreamContainer::getTypes() |
| throw ( uno::RuntimeException ) |
| { |
| static ::cppu::OTypeCollection* pTypeCollection = NULL ; |
| |
| if ( pTypeCollection == NULL ) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ) ; |
| |
| if ( pTypeCollection == NULL ) |
| { |
| if ( m_bSeekable ) |
| { |
| static ::cppu::OTypeCollection aTypeCollection( |
| ::getCppuType(( const uno::Reference< io::XStream >* )NULL ), |
| ::getCppuType(( const uno::Reference< io::XInputStream >* )NULL ), |
| ::getCppuType(( const uno::Reference< io::XSeekable >* )NULL ) ); |
| |
| pTypeCollection = &aTypeCollection ; |
| } |
| else |
| { |
| static ::cppu::OTypeCollection aTypeCollection( |
| ::getCppuType(( const uno::Reference< io::XStream >* )NULL ), |
| ::getCppuType(( const uno::Reference< io::XInputStream >* )NULL ) ); |
| |
| pTypeCollection = &aTypeCollection ; |
| } |
| } |
| } |
| |
| return pTypeCollection->getTypes() ; |
| |
| } |
| |
| //----------------------------------------------- |
| uno::Any SAL_CALL OFSInputStreamContainer::queryInterface( const uno::Type& rType ) |
| throw( uno::RuntimeException ) |
| { |
| // Attention: |
| // Don't use mutex or guard in this method!!! Is a method of XInterface. |
| |
| uno::Any aReturn; |
| if ( m_bSeekable ) |
| aReturn = uno::Any( ::cppu::queryInterface( rType, |
| static_cast< io::XStream* >( this ), |
| static_cast< io::XInputStream* >( this ), |
| static_cast< io::XSeekable* >( this ) ) ); |
| else |
| aReturn = uno::Any( ::cppu::queryInterface( rType, |
| static_cast< io::XStream* >( this ), |
| static_cast< io::XInputStream* >( this ) ) ); |
| |
| if ( aReturn.hasValue() == sal_True ) |
| return aReturn ; |
| |
| return ::cppu::OWeakObject::queryInterface( rType ) ; |
| } |
| |
| //----------------------------------------------- |
| void SAL_CALL OFSInputStreamContainer::acquire() |
| throw() |
| { |
| ::cppu::OWeakObject::acquire(); |
| } |
| |
| //----------------------------------------------- |
| void SAL_CALL OFSInputStreamContainer::release() |
| throw() |
| { |
| ::cppu::OWeakObject::release(); |
| } |
| |
| //----------------------------------------------- |
| sal_Int32 SAL_CALL OFSInputStreamContainer::readBytes( uno::Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead ) |
| throw ( io::NotConnectedException, |
| io::BufferSizeExceededException, |
| io::IOException, |
| uno::RuntimeException ) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_bDisposed ) |
| throw lang::DisposedException(); |
| |
| if ( !m_xInputStream.is() ) |
| throw uno::RuntimeException(); |
| |
| return m_xInputStream->readBytes( aData, nBytesToRead ); |
| } |
| |
| //----------------------------------------------- |
| sal_Int32 SAL_CALL OFSInputStreamContainer::readSomeBytes( uno::Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead ) |
| throw ( io::NotConnectedException, |
| io::BufferSizeExceededException, |
| io::IOException, |
| uno::RuntimeException ) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_bDisposed ) |
| throw lang::DisposedException(); |
| |
| if ( !m_xInputStream.is() ) |
| throw uno::RuntimeException(); |
| |
| return m_xInputStream->readSomeBytes( aData, nMaxBytesToRead ); |
| } |
| |
| //----------------------------------------------- |
| void SAL_CALL OFSInputStreamContainer::skipBytes( sal_Int32 nBytesToSkip ) |
| throw ( io::NotConnectedException, |
| io::BufferSizeExceededException, |
| io::IOException, |
| uno::RuntimeException ) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_bDisposed ) |
| throw lang::DisposedException(); |
| |
| if ( !m_xInputStream.is() ) |
| throw uno::RuntimeException(); |
| |
| m_xInputStream->skipBytes( nBytesToSkip ); |
| } |
| |
| //----------------------------------------------- |
| sal_Int32 SAL_CALL OFSInputStreamContainer::available( ) |
| throw ( io::NotConnectedException, |
| io::IOException, |
| uno::RuntimeException ) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_bDisposed ) |
| throw lang::DisposedException(); |
| |
| if ( !m_xInputStream.is() ) |
| throw uno::RuntimeException(); |
| |
| return m_xInputStream->available(); |
| } |
| |
| //----------------------------------------------- |
| void SAL_CALL OFSInputStreamContainer::closeInput( ) |
| throw ( io::NotConnectedException, |
| io::IOException, |
| uno::RuntimeException ) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_bDisposed ) |
| throw lang::DisposedException(); |
| |
| if ( !m_xInputStream.is() ) |
| throw uno::RuntimeException(); |
| |
| dispose(); |
| } |
| |
| //----------------------------------------------- |
| uno::Reference< io::XInputStream > SAL_CALL OFSInputStreamContainer::getInputStream() |
| throw ( uno::RuntimeException ) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_bDisposed ) |
| throw lang::DisposedException(); |
| |
| if ( !m_xInputStream.is() ) |
| return uno::Reference< io::XInputStream >(); |
| |
| return uno::Reference< io::XInputStream >( static_cast< io::XInputStream* >( this ), uno::UNO_QUERY ); |
| } |
| |
| //----------------------------------------------- |
| uno::Reference< io::XOutputStream > SAL_CALL OFSInputStreamContainer::getOutputStream() |
| throw ( uno::RuntimeException ) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_bDisposed ) |
| throw lang::DisposedException(); |
| |
| return uno::Reference< io::XOutputStream >(); |
| } |
| |
| //----------------------------------------------- |
| void SAL_CALL OFSInputStreamContainer::seek( sal_Int64 location ) |
| throw ( lang::IllegalArgumentException, |
| io::IOException, |
| uno::RuntimeException ) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_bDisposed ) |
| throw lang::DisposedException(); |
| |
| if ( !m_xSeekable.is() ) |
| throw uno::RuntimeException(); |
| |
| m_xSeekable->seek( location ); |
| } |
| |
| //----------------------------------------------- |
| sal_Int64 SAL_CALL OFSInputStreamContainer::getPosition() |
| throw ( io::IOException, |
| uno::RuntimeException) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_bDisposed ) |
| throw lang::DisposedException(); |
| |
| if ( !m_xSeekable.is() ) |
| throw uno::RuntimeException(); |
| |
| return m_xSeekable->getPosition(); |
| } |
| |
| //----------------------------------------------- |
| sal_Int64 SAL_CALL OFSInputStreamContainer::getLength() |
| throw ( io::IOException, |
| uno::RuntimeException ) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_bDisposed ) |
| throw lang::DisposedException(); |
| |
| if ( !m_xSeekable.is() ) |
| throw uno::RuntimeException(); |
| |
| return m_xSeekable->getLength(); |
| } |
| |
| //----------------------------------------------- |
| void SAL_CALL OFSInputStreamContainer::dispose( ) |
| throw ( uno::RuntimeException ) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_bDisposed ) |
| throw lang::DisposedException(); |
| |
| if ( !m_xInputStream.is() ) |
| throw uno::RuntimeException(); |
| |
| m_xInputStream->closeInput(); |
| |
| if ( m_pListenersContainer ) |
| { |
| lang::EventObject aSource( static_cast< ::cppu::OWeakObject*>( this ) ); |
| m_pListenersContainer->disposeAndClear( aSource ); |
| } |
| |
| m_bDisposed = sal_True; |
| } |
| |
| //----------------------------------------------- |
| void SAL_CALL OFSInputStreamContainer::addEventListener( const uno::Reference< lang::XEventListener >& xListener ) |
| throw ( uno::RuntimeException ) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_bDisposed ) |
| throw lang::DisposedException(); |
| |
| if ( !m_pListenersContainer ) |
| m_pListenersContainer = new ::cppu::OInterfaceContainerHelper( m_aMutex ); |
| |
| m_pListenersContainer->addInterface( xListener ); |
| } |
| |
| //----------------------------------------------- |
| void SAL_CALL OFSInputStreamContainer::removeEventListener( const uno::Reference< lang::XEventListener >& xListener ) |
| throw ( uno::RuntimeException ) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_bDisposed ) |
| throw lang::DisposedException(); |
| |
| if ( m_pListenersContainer ) |
| m_pListenersContainer->removeInterface( xListener ); |
| } |
| |
| |
| |