blob: cb7d2293d0bdd78a071aac898908ea7264e0ed7a [file] [log] [blame]
/**************************************************************
*
* 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_ucb.hxx"
/**************************************************************************
TODO
**************************************************************************
- remove root storage access workaround
*************************************************************************/
#include "com/sun/star/lang/DisposedException.hpp"
#include "com/sun/star/reflection/XProxyFactory.hpp"
#include "tdoc_uri.hxx"
#include "tdoc_stgelems.hxx"
using namespace com::sun::star;
using namespace tdoc_ucp;
//=========================================================================
//=========================================================================
//
// ParentStorageHolder Implementation.
//
//=========================================================================
//=========================================================================
ParentStorageHolder::ParentStorageHolder(
const uno::Reference< embed::XStorage > & xParentStorage,
const rtl::OUString & rUri )
: m_xParentStorage( xParentStorage ),
m_bParentIsRootStorage( false )
{
Uri aUri( rUri );
if ( aUri.isDocument() )
m_bParentIsRootStorage = true;
}
//=========================================================================
//=========================================================================
//
// Storage Implementation.
//
//=========================================================================
//=========================================================================
Storage::Storage( const uno::Reference< lang::XMultiServiceFactory > & xSMgr,
const rtl::Reference< StorageElementFactory > & xFactory,
const rtl::OUString & rUri,
const uno::Reference< embed::XStorage > & xParentStorage,
const uno::Reference< embed::XStorage > & xStorageToWrap )
: ParentStorageHolder( xParentStorage, Uri( rUri ).getParentUri() ),
m_xFactory( xFactory ),
m_xWrappedStorage( xStorageToWrap ),
m_xWrappedTransObj( xStorageToWrap, uno::UNO_QUERY ), // optional interface
m_xWrappedComponent( xStorageToWrap, uno::UNO_QUERY ),
m_xWrappedTypeProv( xStorageToWrap, uno::UNO_QUERY ),
m_bIsDocumentStorage( Uri( rUri ).isDocument() )
{
OSL_ENSURE( m_xWrappedStorage.is(),
"Storage::Storage: No storage to wrap!" );
OSL_ENSURE( m_xWrappedComponent.is(),
"Storage::Storage: No component to wrap!" );
OSL_ENSURE( m_xWrappedTypeProv.is(),
"Storage::Storage: No Type Provider!" );
// Use proxy factory service to create aggregatable proxy.
try
{
uno::Reference< reflection::XProxyFactory > xProxyFac(
xSMgr->createInstance(
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.reflection.ProxyFactory" ) ) ),
uno::UNO_QUERY );
if ( xProxyFac.is() )
{
m_xAggProxy = xProxyFac->createProxy( m_xWrappedStorage );
}
}
catch ( uno::Exception const & )
{
OSL_ENSURE( false, "Storage::Storage: Caught exception!" );
}
OSL_ENSURE( m_xAggProxy.is(),
"Storage::Storage: Wrapped storage cannot be aggregated!" );
if ( m_xAggProxy.is() )
{
osl_incrementInterlockedCount( &m_refCount );
{
// Solaris compiler problem:
// Extra block to enforce destruction of temporary object created
// in next statement _before_ osl_decrementInterlockedCount is
// called. Otherwise 'this' will destroy itself even before ctor
// is completed (See impl. of XInterface::release())!
m_xAggProxy->setDelegator(
static_cast< cppu::OWeakObject * >( this ) );
}
osl_decrementInterlockedCount( &m_refCount );
}
}
//=========================================================================
// virtual
Storage::~Storage()
{
if ( m_xAggProxy.is() )
m_xAggProxy->setDelegator( uno::Reference< uno::XInterface >() );
// Never dispose a document storage. Not owner!
if ( !isDocumentStorage() )
{
if ( m_xWrappedComponent.is() )
{
// "Auto-dispose"...
try
{
m_xWrappedComponent->dispose();
}
catch ( lang::DisposedException const & )
{
// might happen.
}
catch ( ... )
{
OSL_ENSURE( false, "Storage::~Storage - Caught exception!" );
}
}
}
}
//=========================================================================
//
// uno::XInterface
//
//=========================================================================
// virtual
uno::Any SAL_CALL Storage::queryInterface( const uno::Type& aType )
throw ( uno::RuntimeException )
{
// First, try to use interfaces implemented by myself and base class(es)
uno::Any aRet = StorageUNOBase::queryInterface( aType );
if ( aRet.hasValue() )
return aRet;
// Try to use requested interface from aggregated storage
return m_xAggProxy->queryAggregation( aType );
}
//=========================================================================
// virtual
void SAL_CALL Storage::acquire()
throw ()
{
osl_incrementInterlockedCount( &m_refCount );
}
//=========================================================================
// virtual
void SAL_CALL Storage::release()
throw ()
{
//#i120738, Storage::release overrides OWeakObject::release(),
//need call OWeakObject::release() to release OWeakObject::m_pWeakConnectionPoint
if ( m_refCount == 1 )
m_xFactory->releaseElement( this );
//delete this;
OWeakObject::release();
}
//=========================================================================
//
// lang::XTypeProvider
//
//=========================================================================
// virtual
uno::Sequence< uno::Type > SAL_CALL Storage::getTypes()
throw ( uno::RuntimeException )
{
return m_xWrappedTypeProv->getTypes();
}
//=========================================================================
// virtual
uno::Sequence< sal_Int8 > SAL_CALL Storage::getImplementationId()
throw ( uno::RuntimeException )
{
return m_xWrappedTypeProv->getImplementationId();
}
//=========================================================================
//
// lang::XComponent (base of embed::XStorage)
//
//=========================================================================
// virtual
void SAL_CALL Storage::dispose()
throw ( uno::RuntimeException )
{
m_xWrappedStorage->dispose();
}
//=========================================================================
// virtual
void SAL_CALL Storage::addEventListener(
const uno::Reference< lang::XEventListener >& xListener )
throw ( uno::RuntimeException )
{
m_xWrappedStorage->addEventListener( xListener );
}
//=========================================================================
// virtual
void SAL_CALL Storage::removeEventListener(
const uno::Reference< lang::XEventListener >& aListener )
throw (uno::RuntimeException)
{
m_xWrappedStorage->removeEventListener( aListener );
}
//=========================================================================
//
// container::XElementAccess (base of container::XNameAccess)
//
//=========================================================================
// virtual
uno::Type SAL_CALL Storage::getElementType()
throw ( uno::RuntimeException )
{
return m_xWrappedStorage->getElementType();
}
//=========================================================================
// virtual
::sal_Bool SAL_CALL Storage::hasElements()
throw ( uno::RuntimeException )
{
return m_xWrappedStorage->hasElements();
}
//=========================================================================
//
// container::XNameAccess (base of embed::XStorage)
//
//=========================================================================
// virtual
uno::Any SAL_CALL Storage::getByName( const ::rtl::OUString& aName )
throw ( container::NoSuchElementException,
lang::WrappedTargetException,
uno::RuntimeException )
{
return m_xWrappedStorage->getByName( aName );
}
//=========================================================================
// virtual
uno::Sequence< ::rtl::OUString > SAL_CALL Storage::getElementNames()
throw ( uno::RuntimeException )
{
return m_xWrappedStorage->getElementNames();
}
//=========================================================================
// virtual
::sal_Bool SAL_CALL Storage::hasByName( const ::rtl::OUString& aName )
throw ( uno::RuntimeException )
{
return m_xWrappedStorage->hasByName( aName );
}
//=========================================================================
//
// embed::XStorage
//
//=========================================================================
// virtual
void SAL_CALL Storage::copyToStorage(
const uno::Reference< embed::XStorage >& xDest )
throw ( embed::InvalidStorageException,
lang::IllegalArgumentException,
io::IOException,
embed::StorageWrappedTargetException,
uno::RuntimeException )
{
m_xWrappedStorage->copyToStorage( xDest );
}
//=========================================================================
// virtual
uno::Reference< io::XStream > SAL_CALL Storage::openStreamElement(
const ::rtl::OUString& aStreamName, sal_Int32 nOpenMode )
throw ( embed::InvalidStorageException,
lang::IllegalArgumentException,
packages::WrongPasswordException,
io::IOException,
embed::StorageWrappedTargetException,
uno::RuntimeException )
{
return m_xWrappedStorage->openStreamElement( aStreamName, nOpenMode );
}
//=========================================================================
// virtual
uno::Reference< io::XStream > SAL_CALL Storage::openEncryptedStreamElement(
const ::rtl::OUString& aStreamName,
sal_Int32 nOpenMode,
const ::rtl::OUString& aPassword )
throw ( embed::InvalidStorageException,
lang::IllegalArgumentException,
packages::NoEncryptionException,
packages::WrongPasswordException,
io::IOException,
embed::StorageWrappedTargetException,
uno::RuntimeException )
{
return m_xWrappedStorage->openEncryptedStreamElement(
aStreamName, nOpenMode, aPassword );
}
//=========================================================================
// virtual
uno::Reference< embed::XStorage > SAL_CALL Storage::openStorageElement(
const ::rtl::OUString& aStorName, sal_Int32 nOpenMode )
throw ( embed::InvalidStorageException,
lang::IllegalArgumentException,
io::IOException,
embed::StorageWrappedTargetException,
uno::RuntimeException )
{
return m_xWrappedStorage->openStorageElement( aStorName, nOpenMode );
}
//=========================================================================
// virtual
uno::Reference< io::XStream > SAL_CALL Storage::cloneStreamElement(
const ::rtl::OUString& aStreamName )
throw ( embed::InvalidStorageException,
lang::IllegalArgumentException,
packages::WrongPasswordException,
io::IOException,
embed::StorageWrappedTargetException,
uno::RuntimeException )
{
return m_xWrappedStorage->cloneStreamElement( aStreamName );
}
//=========================================================================
// virtual
uno::Reference< io::XStream > SAL_CALL Storage::cloneEncryptedStreamElement(
const ::rtl::OUString& aStreamName,
const ::rtl::OUString& aPassword )
throw ( embed::InvalidStorageException,
lang::IllegalArgumentException,
packages::NoEncryptionException,
packages::WrongPasswordException,
io::IOException,
embed::StorageWrappedTargetException,
uno::RuntimeException )
{
return m_xWrappedStorage->cloneEncryptedStreamElement( aStreamName,
aPassword );
}
//=========================================================================
// virtual
void SAL_CALL Storage::copyLastCommitTo(
const uno::Reference< embed::XStorage >& xTargetStorage )
throw ( embed::InvalidStorageException,
lang::IllegalArgumentException,
io::IOException,
embed::StorageWrappedTargetException,
uno::RuntimeException)
{
m_xWrappedStorage->copyLastCommitTo( xTargetStorage );
}
//=========================================================================
// virtual
void SAL_CALL Storage::copyStorageElementLastCommitTo(
const ::rtl::OUString& aStorName,
const uno::Reference< embed::XStorage >& xTargetStorage )
throw ( embed::InvalidStorageException,
lang::IllegalArgumentException,
io::IOException,
embed::StorageWrappedTargetException,
uno::RuntimeException)
{
m_xWrappedStorage->copyStorageElementLastCommitTo( aStorName, xTargetStorage );
}
//=========================================================================
// virtual
sal_Bool SAL_CALL Storage::isStreamElement(
const ::rtl::OUString& aElementName )
throw ( container::NoSuchElementException,
lang::IllegalArgumentException,
embed::InvalidStorageException,
uno::RuntimeException )
{
return m_xWrappedStorage->isStreamElement( aElementName );
}
//=========================================================================
// virtual
sal_Bool SAL_CALL Storage::isStorageElement(
const ::rtl::OUString& aElementName )
throw ( container::NoSuchElementException,
lang::IllegalArgumentException,
embed::InvalidStorageException,
uno::RuntimeException )
{
return m_xWrappedStorage->isStorageElement( aElementName );
}
//=========================================================================
// virtual
void SAL_CALL Storage::removeElement( const ::rtl::OUString& aElementName )
throw ( embed::InvalidStorageException,
lang::IllegalArgumentException,
container::NoSuchElementException,
io::IOException,
embed::StorageWrappedTargetException,
uno::RuntimeException )
{
m_xWrappedStorage->removeElement( aElementName );
}
//=========================================================================
// virtual
void SAL_CALL Storage::renameElement( const ::rtl::OUString& aEleName,
const ::rtl::OUString& aNewName )
throw ( embed::InvalidStorageException,
lang::IllegalArgumentException,
container::NoSuchElementException,
container::ElementExistException,
io::IOException,
embed::StorageWrappedTargetException,
uno::RuntimeException )
{
m_xWrappedStorage->renameElement( aEleName, aNewName );
}
//=========================================================================
// virtual
void SAL_CALL Storage::copyElementTo(
const ::rtl::OUString& aElementName,
const uno::Reference< embed::XStorage >& xDest,
const ::rtl::OUString& aNewName )
throw ( embed::InvalidStorageException,
lang::IllegalArgumentException,
container::NoSuchElementException,
container::ElementExistException,
io::IOException,
embed::StorageWrappedTargetException,
uno::RuntimeException )
{
m_xWrappedStorage->copyElementTo( aElementName, xDest, aNewName );
}
//=========================================================================
// virtual
void SAL_CALL Storage::moveElementTo(
const ::rtl::OUString& aElementName,
const uno::Reference< embed::XStorage >& xDest,
const ::rtl::OUString& rNewName )
throw ( embed::InvalidStorageException,
lang::IllegalArgumentException,
container::NoSuchElementException,
container::ElementExistException,
io::IOException,
embed::StorageWrappedTargetException,
uno::RuntimeException )
{
m_xWrappedStorage->moveElementTo( aElementName, xDest, rNewName );
}
//=========================================================================
//
// embed::XTransactedObject
//
//=========================================================================
// virtual
void SAL_CALL Storage::commit()
throw ( io::IOException,
lang::WrappedTargetException,
uno::RuntimeException )
{
// Never commit a root storage (-> has no parent)!
// Would lead in writing the whole document to disk.
uno::Reference< embed::XStorage > xParentStorage = getParentStorage();
if ( xParentStorage.is() )
{
OSL_ENSURE( m_xWrappedTransObj.is(), "No XTransactedObject interface!" );
if ( m_xWrappedTransObj.is() )
{
m_xWrappedTransObj->commit();
if ( !isParentARootStorage() )
{
uno::Reference< embed::XTransactedObject > xParentTA(
xParentStorage, uno::UNO_QUERY );
OSL_ENSURE( xParentTA.is(), "No XTransactedObject interface!" );
if ( xParentTA.is() )
xParentTA->commit();
}
}
}
}
//=========================================================================
// virtual
void SAL_CALL Storage::revert()
throw ( io::IOException,
lang::WrappedTargetException,
uno::RuntimeException )
{
uno::Reference< embed::XStorage > xParentStorage = getParentStorage();
if ( xParentStorage.is() )
{
OSL_ENSURE( m_xWrappedTransObj.is(), "No XTransactedObject interface!" );
if ( m_xWrappedTransObj.is() )
{
m_xWrappedTransObj->revert();
if ( !isParentARootStorage() )
{
uno::Reference< embed::XTransactedObject > xParentTA(
xParentStorage, uno::UNO_QUERY );
OSL_ENSURE( xParentTA.is(), "No XTransactedObject interface!" );
if ( xParentTA.is() )
xParentTA->revert();
}
}
}
}
//=========================================================================
//=========================================================================
//
// OutputStream Implementation.
//
//=========================================================================
//=========================================================================
OutputStream::OutputStream(
const uno::Reference< lang::XMultiServiceFactory > & xSMgr,
const rtl::OUString & rUri,
const uno::Reference< embed::XStorage > & xParentStorage,
const uno::Reference< io::XOutputStream > & xStreamToWrap )
: ParentStorageHolder( xParentStorage, Uri( rUri ).getParentUri() ),
m_xWrappedStream( xStreamToWrap ),
m_xWrappedComponent( xStreamToWrap, uno::UNO_QUERY ),
m_xWrappedTypeProv( xStreamToWrap, uno::UNO_QUERY )
{
OSL_ENSURE( m_xWrappedStream.is(),
"OutputStream::OutputStream: No stream to wrap!" );
OSL_ENSURE( m_xWrappedComponent.is(),
"OutputStream::OutputStream: No component to wrap!" );
OSL_ENSURE( m_xWrappedTypeProv.is(),
"OutputStream::OutputStream: No Type Provider!" );
// Use proxy factory service to create aggregatable proxy.
try
{
uno::Reference< reflection::XProxyFactory > xProxyFac(
xSMgr->createInstance(
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.reflection.ProxyFactory" ) ) ),
uno::UNO_QUERY );
if ( xProxyFac.is() )
{
m_xAggProxy = xProxyFac->createProxy( m_xWrappedStream );
}
}
catch ( uno::Exception const & )
{
OSL_ENSURE( false, "OutputStream::OutputStream: Caught exception!" );
}
OSL_ENSURE( m_xAggProxy.is(),
"OutputStream::OutputStream: Wrapped stream cannot be aggregated!" );
if ( m_xAggProxy.is() )
{
osl_incrementInterlockedCount( &m_refCount );
{
// Solaris compiler problem:
// Extra block to enforce destruction of temporary object created
// in next statement _before_ osl_decrementInterlockedCount is
// called. Otherwise 'this' will destroy itself even before ctor
// is completed (See impl. of XInterface::release())!
m_xAggProxy->setDelegator(
static_cast< cppu::OWeakObject * >( this ) );
}
osl_decrementInterlockedCount( &m_refCount );
}
}
//=========================================================================
// virtual
OutputStream::~OutputStream()
{
if ( m_xAggProxy.is() )
m_xAggProxy->setDelegator( uno::Reference< uno::XInterface >() );
}
//=========================================================================
//
// uno::XInterface
//
//=========================================================================
// virtual
uno::Any SAL_CALL OutputStream::queryInterface( const uno::Type& aType )
throw ( uno::RuntimeException )
{
uno::Any aRet = OutputStreamUNOBase::queryInterface( aType );
if ( aRet.hasValue() )
return aRet;
if ( m_xAggProxy.is() )
return m_xAggProxy->queryAggregation( aType );
else
return uno::Any();
}
//=========================================================================
//
// lang::XTypeProvider
//
//=========================================================================
// virtual
uno::Sequence< uno::Type > SAL_CALL OutputStream::getTypes()
throw ( uno::RuntimeException )
{
return m_xWrappedTypeProv->getTypes();
}
//=========================================================================
// virtual
uno::Sequence< sal_Int8 > SAL_CALL OutputStream::getImplementationId()
throw ( uno::RuntimeException )
{
return m_xWrappedTypeProv->getImplementationId();
}
//=========================================================================
//
// io::XOutputStream
//
//=========================================================================
// virtual
void SAL_CALL
OutputStream::writeBytes( const uno::Sequence< sal_Int8 >& aData )
throw ( io::NotConnectedException,
io::BufferSizeExceededException,
io::IOException,
uno::RuntimeException )
{
m_xWrappedStream->writeBytes( aData );
}
//=========================================================================
// virtual
void SAL_CALL
OutputStream::flush()
throw ( io::NotConnectedException,
io::BufferSizeExceededException,
io::IOException,
uno::RuntimeException )
{
m_xWrappedStream->flush();
}
//=========================================================================
// virtual
void SAL_CALL
OutputStream::closeOutput( )
throw ( io::NotConnectedException,
io::BufferSizeExceededException,
io::IOException,
uno::RuntimeException )
{
m_xWrappedStream->closeOutput();
// Release parent storage.
// Now, that the stream is closed/disposed it is not needed any longer.
setParentStorage( uno::Reference< embed::XStorage >() );
}
//=========================================================================
//
// lang::XComponent
//
//=========================================================================
// virtual
void SAL_CALL
OutputStream::dispose()
throw ( uno::RuntimeException )
{
m_xWrappedComponent->dispose();
// Release parent storage.
// Now, that the stream is closed/disposed it is not needed any longer.
setParentStorage( uno::Reference< embed::XStorage >() );
}
//=========================================================================
// virtual
void SAL_CALL
OutputStream::addEventListener(
const uno::Reference< lang::XEventListener >& xListener )
throw ( uno::RuntimeException )
{
m_xWrappedComponent->addEventListener( xListener );
}
//=========================================================================
// virtual
void SAL_CALL
OutputStream::removeEventListener(
const uno::Reference< lang::XEventListener >& aListener )
throw ( uno::RuntimeException )
{
m_xWrappedComponent->removeEventListener( aListener );
}
//=========================================================================
//=========================================================================
//
// Stream Implementation.
//
//=========================================================================
//=========================================================================
Stream::Stream(
const uno::Reference< lang::XMultiServiceFactory > & xSMgr,
const rtl::OUString & rUri,
const uno::Reference< embed::XStorage > & xParentStorage,
const uno::Reference< io::XStream > & xStreamToWrap )
: ParentStorageHolder( xParentStorage, Uri( rUri ).getParentUri() ),
m_xWrappedStream( xStreamToWrap ),
m_xWrappedOutputStream( xStreamToWrap->getOutputStream() ), // might be empty
m_xWrappedTruncate( m_xWrappedOutputStream, uno::UNO_QUERY ), // might be empty
m_xWrappedInputStream( xStreamToWrap->getInputStream(), uno::UNO_QUERY ),
m_xWrappedComponent( xStreamToWrap, uno::UNO_QUERY ),
m_xWrappedTypeProv( xStreamToWrap, uno::UNO_QUERY )
{
OSL_ENSURE( m_xWrappedStream.is(),
"OutputStream::OutputStream: No stream to wrap!" );
OSL_ENSURE( m_xWrappedComponent.is(),
"OutputStream::OutputStream: No component to wrap!" );
OSL_ENSURE( m_xWrappedTypeProv.is(),
"OutputStream::OutputStream: No Type Provider!" );
// Use proxy factory service to create aggregatable proxy.
try
{
uno::Reference< reflection::XProxyFactory > xProxyFac(
xSMgr->createInstance(
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.reflection.ProxyFactory" ) ) ),
uno::UNO_QUERY );
if ( xProxyFac.is() )
{
m_xAggProxy = xProxyFac->createProxy( m_xWrappedStream );
}
}
catch ( uno::Exception const & )
{
OSL_ENSURE( false, "OutputStream::OutputStream: Caught exception!" );
}
OSL_ENSURE( m_xAggProxy.is(),
"OutputStream::OutputStream: Wrapped stream cannot be aggregated!" );
if ( m_xAggProxy.is() )
{
osl_incrementInterlockedCount( &m_refCount );
{
// Solaris compiler problem:
// Extra block to enforce destruction of temporary object created
// in next statement _before_ osl_decrementInterlockedCount is
// called. Otherwise 'this' will destroy itself even before ctor
// is completed (See impl. of XInterface::release())!
m_xAggProxy->setDelegator(
static_cast< cppu::OWeakObject * >( this ) );
}
osl_decrementInterlockedCount( &m_refCount );
}
}
//=========================================================================
// virtual
Stream::~Stream()
{
if ( m_xAggProxy.is() )
m_xAggProxy->setDelegator( uno::Reference< uno::XInterface >() );
}
//=========================================================================
//
// uno::XInterface
//
//=========================================================================
// virtual
uno::Any SAL_CALL Stream::queryInterface( const uno::Type& aType )
throw ( uno::RuntimeException )
{
uno::Any aRet = StreamUNOBase::queryInterface( aType );
if ( aRet.hasValue() )
return aRet;
if ( m_xAggProxy.is() )
return m_xAggProxy->queryAggregation( aType );
else
return uno::Any();
}
//=========================================================================
//
// lang::XTypeProvider
//
//=========================================================================
// virtual
uno::Sequence< uno::Type > SAL_CALL Stream::getTypes()
throw ( uno::RuntimeException )
{
return m_xWrappedTypeProv->getTypes();
}
//=========================================================================
// virtual
uno::Sequence< sal_Int8 > SAL_CALL Stream::getImplementationId()
throw ( uno::RuntimeException )
{
return m_xWrappedTypeProv->getImplementationId();
}
//=========================================================================
//
// io::XStream.
//
//=========================================================================
// virtual
uno::Reference< io::XInputStream > SAL_CALL Stream::getInputStream()
throw( uno::RuntimeException )
{
return uno::Reference< io::XInputStream >( this );
}
//=========================================================================
// virtual
uno::Reference< io::XOutputStream > SAL_CALL Stream::getOutputStream()
throw( uno::RuntimeException )
{
return uno::Reference< io::XOutputStream >( this );
}
//=========================================================================
//
// io::XOutputStream.
//
//=========================================================================
// virtual
void SAL_CALL Stream::writeBytes( const uno::Sequence< sal_Int8 >& aData )
throw( io::NotConnectedException,
io::BufferSizeExceededException,
io::IOException,
uno::RuntimeException )
{
if ( m_xWrappedOutputStream.is() )
{
m_xWrappedOutputStream->writeBytes( aData );
commitChanges();
}
}
//=========================================================================
// virtual
void SAL_CALL Stream::flush()
throw( io::NotConnectedException,
io::BufferSizeExceededException,
io::IOException,
uno::RuntimeException )
{
if ( m_xWrappedOutputStream.is() )
{
m_xWrappedOutputStream->flush();
commitChanges();
}
}
//=========================================================================
// virtual
void SAL_CALL Stream::closeOutput()
throw( io::NotConnectedException,
io::IOException,
uno::RuntimeException )
{
if ( m_xWrappedOutputStream.is() )
{
m_xWrappedOutputStream->closeOutput();
commitChanges();
}
// Release parent storage.
// Now, that the stream is closed/disposed it is not needed any longer.
setParentStorage( uno::Reference< embed::XStorage >() );
}
//=========================================================================
//
// io::XTruncate.
//
//=========================================================================
// virtual
void SAL_CALL Stream::truncate()
throw( io::IOException,
uno::RuntimeException )
{
if ( m_xWrappedTruncate.is() )
{
m_xWrappedTruncate->truncate();
commitChanges();
}
}
//=========================================================================
//
// io::XInputStream.
//
//=========================================================================
// virtual
sal_Int32 SAL_CALL Stream::readBytes( uno::Sequence< sal_Int8 >& aData,
sal_Int32 nBytesToRead )
throw( io::NotConnectedException,
io::BufferSizeExceededException,
io::IOException,
uno::RuntimeException )
{
return m_xWrappedInputStream->readBytes( aData, nBytesToRead );
}
//=========================================================================
// virtual
sal_Int32 SAL_CALL Stream::readSomeBytes( uno::Sequence< sal_Int8 >& aData,
sal_Int32 nMaxBytesToRead )
throw( io::NotConnectedException,
io::BufferSizeExceededException,
io::IOException,
uno::RuntimeException )
{
return m_xWrappedInputStream->readSomeBytes( aData, nMaxBytesToRead );
}
//=========================================================================
// virtual
void SAL_CALL Stream::skipBytes( sal_Int32 nBytesToSkip )
throw( io::NotConnectedException,
io::BufferSizeExceededException,
io::IOException,
uno::RuntimeException )
{
m_xWrappedInputStream->skipBytes( nBytesToSkip );
}
//=========================================================================
// virtual
sal_Int32 SAL_CALL Stream::available()
throw( io::NotConnectedException,
io::IOException,
uno::RuntimeException )
{
return m_xWrappedInputStream->available();
}
//=========================================================================
// virtual
void SAL_CALL Stream::closeInput()
throw( io::NotConnectedException,
io::IOException,
uno::RuntimeException )
{
m_xWrappedInputStream->closeInput();
}
//=========================================================================
//
// lang::XComponent
//
//=========================================================================
// virtual
void SAL_CALL Stream::dispose()
throw ( uno::RuntimeException )
{
m_xWrappedComponent->dispose();
// Release parent storage.
// Now, that the stream is closed/disposed it is not needed any longer.
setParentStorage( uno::Reference< embed::XStorage >() );
}
//=========================================================================
// virtual
void SAL_CALL Stream::addEventListener(
const uno::Reference< lang::XEventListener >& xListener )
throw ( uno::RuntimeException )
{
m_xWrappedComponent->addEventListener( xListener );
}
//=========================================================================
// virtual
void SAL_CALL Stream::removeEventListener(
const uno::Reference< lang::XEventListener >& aListener )
throw ( uno::RuntimeException )
{
m_xWrappedComponent->removeEventListener( aListener );
}
//=========================================================================
//
// Non-UNO
//
//=========================================================================
void Stream::commitChanges()
throw( io::IOException )
{
uno::Reference< embed::XTransactedObject >
xParentTA( getParentStorage(), uno::UNO_QUERY );
OSL_ENSURE( xParentTA.is(), "No XTransactedObject interface!" );
if ( xParentTA.is() )
{
try
{
xParentTA->commit();
}
catch ( lang::WrappedTargetException const & )
{
throw io::IOException(); // @@@
}
}
}