From 67490613cad577ebc33df98cec33fd2cbd5491b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BCdiger=20Timm?= Date: Fri, 26 Nov 2004 16:12:29 +0000 Subject: [PATCH] INTEGRATION: CWS leanobjects (1.2.32); FILE MERGED 2004/11/23 13:54:56 mba 1.2.32.5: #i37278#: wrong return value 2004/11/22 09:19:40 mba 1.2.32.4: #i37278#: some problems with moving and copying objects 2004/11/19 14:57:27 mba 1.2.32.3: #i37278#: allow to load objects on demand 2004/11/18 16:48:10 mba 1.2.32.2: #i37278#: make objects loadable on demand 2004/11/18 10:58:40 mba 1.2.32.1: #i37278#: make objects loadable on demand --- .../container/embeddedobjectcontainer.cxx | 139 +++++++++++++----- 1 file changed, 104 insertions(+), 35 deletions(-) diff --git a/comphelper/source/container/embeddedobjectcontainer.cxx b/comphelper/source/container/embeddedobjectcontainer.cxx index 543a0d69f28b..90b8c8553a4d 100644 --- a/comphelper/source/container/embeddedobjectcontainer.cxx +++ b/comphelper/source/container/embeddedobjectcontainer.cxx @@ -2,9 +2,9 @@ * * $RCSfile: embeddedobjectcontainer.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: obo $ $Date: 2004-11-17 15:35:58 $ + * last change: $Author: rt $ $Date: 2004-11-26 17:12:29 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -205,6 +205,27 @@ EmbeddedObjectContainer::~EmbeddedObjectContainer() delete pImpl; } +void EmbeddedObjectContainer::CloseEmbeddedObjects() +{ + EmbeddedObjectContainerNameMap::iterator aIt = pImpl->maObjectContainer.begin(); + while ( aIt != pImpl->maObjectContainer.end() ) + { + uno::Reference < util::XCloseable > xClose( (*aIt).second, uno::UNO_QUERY ); + if ( xClose.is() ) + { + try + { + xClose->close( sal_True ); + } + catch ( uno::Exception& ) + { + } + } + + aIt++; + } +} + ::rtl::OUString EmbeddedObjectContainer::CreateUniqueObjectName() { ::rtl::OUString aPersistName = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Object ") ); @@ -319,10 +340,6 @@ uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::GetEmbeddedOb // insert object into my list AddEmbeddedObject( xObj, rName ); } - - // TODO/LATER: necessary optimization: running state should not be required - if ( xObj.is() && xObj->getCurrentState() == embed::EmbedStates::LOADED ) - xObj->changeState( embed::EmbedStates::RUNNING ); } catch ( uno::Exception& ) { @@ -351,7 +368,7 @@ uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::CreateEmbedde AddEmbeddedObject( xObj, rNewName ); - // TODO/LATER: necessary optimization: running state should not be required + // a freshly created object should be running always if ( xObj.is() && xObj->getCurrentState() == embed::EmbedStates::LOADED ) xObj->changeState( embed::EmbedStates::RUNNING ); } @@ -512,9 +529,12 @@ uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::InsertEmbedde uno::Reference < embed::XEmbeddedObject > xRet = GetEmbeddedObject( rNewName ); try { - // no object could be created, so withdraw insertion - if ( !xRet.is() ) + if ( xRet.is() ) + // no object could be created, so withdraw insertion pImpl->mxStorage->removeElement( rNewName ); + else + // freshly created objects always should be running! + xRet->changeState( embed::EmbedStates::RUNNING ); } catch ( uno::Exception& ) { @@ -537,6 +557,9 @@ uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::InsertEmbedde pImpl->mxStorage, rNewName, aMedium, uno::Sequence < beans::PropertyValue >() ), uno::UNO_QUERY ); uno::Reference < embed::XEmbedPersist > xPersist( xObj, uno::UNO_QUERY ); + // freshly created objects always should be running! + xObj->changeState( embed::EmbedStates::RUNNING ); + // possible optimization: store later! if ( xPersist.is()) xPersist->storeOwn(); @@ -563,7 +586,7 @@ uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::InsertEmbedde xObj = uno::Reference < embed::XEmbeddedObject >( xFactory->createInstanceLink( pImpl->mxStorage, rNewName, aMedium, uno::Sequence < beans::PropertyValue >() ), uno::UNO_QUERY ); - // TODO/LATER: necessary optimization: running state should not be required + // a freshly created object should be in running state if ( xObj.is() && xObj->getCurrentState() == embed::EmbedStates::LOADED ) { uno::Sequence< sal_Int32 > aSupportedStates = xObj->getReachableStates(); @@ -584,16 +607,59 @@ uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::InsertEmbedde return xObj; } -uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::CopyEmbeddedObject( const uno::Reference < embed::XEmbeddedObject >& xObj, ::rtl::OUString& rName ) +sal_Bool EmbeddedObjectContainer::CopyEmbeddedObject( const uno::Reference < embed::XEmbeddedObject >& xObj, ::rtl::OUString& rName ) { - uno::Reference < embed::XEmbeddedObject > xRet; if ( !rName.getLength() ) rName = CreateUniqueObjectName(); - if ( StoreEmbeddedObject( xObj, rName, sal_True ) ) - // create an object from it - xRet = GetEmbeddedObject( rName ); - return xRet; + return StoreEmbeddedObject( xObj, rName, sal_True ); +} + +sal_Bool EmbeddedObjectContainer::MoveEmbeddedObject( EmbeddedObjectContainer& rSrc, const uno::Reference < embed::XEmbeddedObject >& xObj, ::rtl::OUString& rName ) +{ + // get the object name before(!) it is assigned to a new storage + uno::Reference < embed::XEmbedPersist > xPersist( xObj, uno::UNO_QUERY ); + ::rtl::OUString aName; + if ( xPersist.is() ) + aName = xPersist->getEntryName(); + + // now move the object to the new container; the returned name is the new persist name in this container + sal_Bool bRet = InsertEmbeddedObject( xObj, rName ); + if ( bRet ) + { + // now remove the object from the former container + bRet = sal_False; + EmbeddedObjectContainerNameMap::iterator aIt = rSrc.pImpl->maObjectContainer.begin(); + while ( aIt != rSrc.pImpl->maObjectContainer.end() ) + { + if ( (*aIt).second == xObj ) + { + rSrc.pImpl->maObjectContainer.erase( aIt ); + bRet = sal_True; + break; + } + + aIt++; + } + + OSL_ENSURE( bRet, "Object not found for removal!" ); + if ( xPersist.is() ) + { + // now it's time to remove the storage from the container storage + try + { + if ( xPersist.is() ) + rSrc.pImpl->mxStorage->removeElement( aName ); + } + catch ( uno::Exception& ) + { + OSL_ENSURE( sal_False, "Failed to remove object from storage!" ); + bRet = sal_False; + } + } + } + + return bRet; } sal_Bool EmbeddedObjectContainer::RemoveEmbeddedObject( const ::rtl::OUString& rName, sal_Bool bClose ) @@ -637,8 +703,9 @@ sal_Bool EmbeddedObjectContainer::MoveEmbeddedObject( const ::rtl::OUString& rNa uno::Reference < embed::XStorage > xOld = pImpl->mxStorage->openStorageElement( rName, embed::ElementModes::READ ); uno::Reference < embed::XStorage > xNew = rCnt.pImpl->mxStorage->openStorageElement( rName, embed::ElementModes::READWRITE ); xOld->copyToStorage( xNew ); - return sal_True; } + + return sal_True; } catch ( uno::Exception& ) { @@ -739,9 +806,6 @@ sal_Bool EmbeddedObjectContainer::RemoveEmbeddedObject( const uno::Reference < e else // objects without persistence need to stay in running state if they shall not be closed xObj->changeState( embed::EmbedStates::RUNNING ); - - // remove replacement image (if there is one) - RemoveGraphicStream( aName ); } catch ( uno::Exception& ) { @@ -749,18 +813,6 @@ sal_Bool EmbeddedObjectContainer::RemoveEmbeddedObject( const uno::Reference < e } } - // now it's time to remove the storage from the container storage - try - { - if ( xPersist.is() ) - pImpl->mxStorage->removeElement( aName ); - } - catch ( uno::Exception& ) - { - return sal_False; - } - - // forget object sal_Bool bFound = sal_False; EmbeddedObjectContainerNameMap::iterator aIt = pImpl->maObjectContainer.begin(); while ( aIt != pImpl->maObjectContainer.end() ) @@ -771,11 +823,28 @@ sal_Bool EmbeddedObjectContainer::RemoveEmbeddedObject( const uno::Reference < e bFound = sal_True; break; } - else - aIt++; + + aIt++; } - OSL_ENSURE( bFound, "Removing unknown object!" ); + OSL_ENSURE( bFound, "Object not found for removal!" ); + if ( xPersist.is() ) + { + // remove replacement image (if there is one) + RemoveGraphicStream( aName ); + + // now it's time to remove the storage from the container storage + try + { + if ( xPersist.is() ) + pImpl->mxStorage->removeElement( aName ); + } + catch ( uno::Exception& ) + { + OSL_ENSURE( sal_False, "Failed to remove object from storage!" ); + return sal_False; + } + } return sal_True; }