1*bfd08df8SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*bfd08df8SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*bfd08df8SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*bfd08df8SAndrew Rist * distributed with this work for additional information 6*bfd08df8SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*bfd08df8SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*bfd08df8SAndrew Rist * "License"); you may not use this file except in compliance 9*bfd08df8SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*bfd08df8SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*bfd08df8SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*bfd08df8SAndrew Rist * software distributed under the License is distributed on an 15*bfd08df8SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*bfd08df8SAndrew Rist * KIND, either express or implied. See the License for the 17*bfd08df8SAndrew Rist * specific language governing permissions and limitations 18*bfd08df8SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*bfd08df8SAndrew Rist *************************************************************/ 21*bfd08df8SAndrew Rist 22*bfd08df8SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_embeddedobj.hxx" 26cdf0e10cSrcweir #include <com/sun/star/embed/EmbedUpdateModes.hpp> 27cdf0e10cSrcweir #include <com/sun/star/embed/EmbedStates.hpp> 28cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp> 29cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp> 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include <cppuhelper/interfacecontainer.h> 32cdf0e10cSrcweir 33cdf0e10cSrcweir #include <oleembobj.hxx> 34cdf0e10cSrcweir #include <olecomponent.hxx> 35cdf0e10cSrcweir 36cdf0e10cSrcweir #include "ownview.hxx" 37cdf0e10cSrcweir 38cdf0e10cSrcweir using namespace ::com::sun::star; 39cdf0e10cSrcweir 40cdf0e10cSrcweir sal_Bool KillFile_Impl( const ::rtl::OUString& aURL, const uno::Reference< lang::XMultiServiceFactory >& xFactory ); 41cdf0e10cSrcweir 42cdf0e10cSrcweir 43cdf0e10cSrcweir //------------------------------------------------------ 44cdf0e10cSrcweir OleEmbeddedObject::OleEmbeddedObject( const uno::Reference< lang::XMultiServiceFactory >& xFactory, 45cdf0e10cSrcweir const uno::Sequence< sal_Int8 >& aClassID, 46cdf0e10cSrcweir const ::rtl::OUString& aClassName ) 47cdf0e10cSrcweir : m_pOleComponent( NULL ) 48cdf0e10cSrcweir , m_pInterfaceContainer( NULL ) 49cdf0e10cSrcweir , m_bReadOnly( sal_False ) 50cdf0e10cSrcweir , m_bDisposed( sal_False ) 51cdf0e10cSrcweir , m_nObjectState( -1 ) 52cdf0e10cSrcweir , m_nTargetState( -1 ) 53cdf0e10cSrcweir , m_nUpdateMode ( embed::EmbedUpdateModes::ALWAYS_UPDATE ) 54cdf0e10cSrcweir , m_xFactory( xFactory ) 55cdf0e10cSrcweir , m_aClassID( aClassID ) 56cdf0e10cSrcweir , m_aClassName( aClassName ) 57cdf0e10cSrcweir , m_bWaitSaveCompleted( sal_False ) 58cdf0e10cSrcweir , m_bNewVisReplInStream( sal_True ) 59cdf0e10cSrcweir , m_bStoreLoaded( sal_False ) 60cdf0e10cSrcweir , m_bVisReplInitialized( sal_False ) 61cdf0e10cSrcweir , m_bVisReplInStream( sal_False ) 62cdf0e10cSrcweir , m_bStoreVisRepl( sal_False ) 63cdf0e10cSrcweir , m_bIsLink( sal_False ) 64cdf0e10cSrcweir , m_bHasCachedSize( sal_False ) 65cdf0e10cSrcweir , m_nCachedAspect( 0 ) 66cdf0e10cSrcweir , m_bHasSizeToSet( sal_False ) 67cdf0e10cSrcweir , m_nAspectToSet( 0 ) 68cdf0e10cSrcweir , m_bGotStatus( sal_False ) 69cdf0e10cSrcweir , m_nStatus( 0 ) 70cdf0e10cSrcweir , m_nStatusAspect( 0 ) 71cdf0e10cSrcweir , m_pOwnView( NULL ) 72cdf0e10cSrcweir , m_bFromClipboard( sal_False ) 73cdf0e10cSrcweir , m_bTriedConversion( sal_False ) 74cdf0e10cSrcweir { 75cdf0e10cSrcweir } 76cdf0e10cSrcweir 77cdf0e10cSrcweir //------------------------------------------------------ 78cdf0e10cSrcweir // In case of loading from persistent entry the classID of the object 79cdf0e10cSrcweir // will be retrieved from the entry, during construction it is unknown 80cdf0e10cSrcweir OleEmbeddedObject::OleEmbeddedObject( const uno::Reference< lang::XMultiServiceFactory >& xFactory, sal_Bool bLink ) 81cdf0e10cSrcweir : m_pOleComponent( NULL ) 82cdf0e10cSrcweir , m_pInterfaceContainer( NULL ) 83cdf0e10cSrcweir , m_bReadOnly( sal_False ) 84cdf0e10cSrcweir , m_bDisposed( sal_False ) 85cdf0e10cSrcweir , m_nObjectState( -1 ) 86cdf0e10cSrcweir , m_nTargetState( -1 ) 87cdf0e10cSrcweir , m_nUpdateMode( embed::EmbedUpdateModes::ALWAYS_UPDATE ) 88cdf0e10cSrcweir , m_xFactory( xFactory ) 89cdf0e10cSrcweir , m_bWaitSaveCompleted( sal_False ) 90cdf0e10cSrcweir , m_bNewVisReplInStream( sal_True ) 91cdf0e10cSrcweir , m_bStoreLoaded( sal_False ) 92cdf0e10cSrcweir , m_bVisReplInitialized( sal_False ) 93cdf0e10cSrcweir , m_bVisReplInStream( sal_False ) 94cdf0e10cSrcweir , m_bStoreVisRepl( sal_False ) 95cdf0e10cSrcweir , m_bIsLink( bLink ) 96cdf0e10cSrcweir , m_bHasCachedSize( sal_False ) 97cdf0e10cSrcweir , m_nCachedAspect( 0 ) 98cdf0e10cSrcweir , m_bHasSizeToSet( sal_False ) 99cdf0e10cSrcweir , m_nAspectToSet( 0 ) 100cdf0e10cSrcweir , m_bGotStatus( sal_False ) 101cdf0e10cSrcweir , m_nStatus( 0 ) 102cdf0e10cSrcweir , m_nStatusAspect( 0 ) 103cdf0e10cSrcweir , m_pOwnView( NULL ) 104cdf0e10cSrcweir , m_bFromClipboard( sal_False ) 105cdf0e10cSrcweir , m_bTriedConversion( sal_False ) 106cdf0e10cSrcweir { 107cdf0e10cSrcweir } 108cdf0e10cSrcweir #ifdef WNT 109cdf0e10cSrcweir //------------------------------------------------------ 110cdf0e10cSrcweir // this constructor let object be initialized from clipboard 111cdf0e10cSrcweir OleEmbeddedObject::OleEmbeddedObject( const uno::Reference< lang::XMultiServiceFactory >& xFactory ) 112cdf0e10cSrcweir : m_pOleComponent( NULL ) 113cdf0e10cSrcweir , m_pInterfaceContainer( NULL ) 114cdf0e10cSrcweir , m_bReadOnly( sal_False ) 115cdf0e10cSrcweir , m_bDisposed( sal_False ) 116cdf0e10cSrcweir , m_nObjectState( -1 ) 117cdf0e10cSrcweir , m_nTargetState( -1 ) 118cdf0e10cSrcweir , m_nUpdateMode( embed::EmbedUpdateModes::ALWAYS_UPDATE ) 119cdf0e10cSrcweir , m_xFactory( xFactory ) 120cdf0e10cSrcweir , m_bWaitSaveCompleted( sal_False ) 121cdf0e10cSrcweir , m_bNewVisReplInStream( sal_True ) 122cdf0e10cSrcweir , m_bStoreLoaded( sal_False ) 123cdf0e10cSrcweir , m_bVisReplInitialized( sal_False ) 124cdf0e10cSrcweir , m_bVisReplInStream( sal_False ) 125cdf0e10cSrcweir , m_bStoreVisRepl( sal_False ) 126cdf0e10cSrcweir , m_bIsLink( sal_False ) 127cdf0e10cSrcweir , m_bHasCachedSize( sal_False ) 128cdf0e10cSrcweir , m_nCachedAspect( 0 ) 129cdf0e10cSrcweir , m_bHasSizeToSet( sal_False ) 130cdf0e10cSrcweir , m_nAspectToSet( 0 ) 131cdf0e10cSrcweir , m_bGotStatus( sal_False ) 132cdf0e10cSrcweir , m_nStatus( 0 ) 133cdf0e10cSrcweir , m_nStatusAspect( 0 ) 134cdf0e10cSrcweir , m_pOwnView( NULL ) 135cdf0e10cSrcweir , m_bFromClipboard( sal_True ) 136cdf0e10cSrcweir , m_bTriedConversion( sal_False ) 137cdf0e10cSrcweir { 138cdf0e10cSrcweir } 139cdf0e10cSrcweir #endif 140cdf0e10cSrcweir //------------------------------------------------------ 141cdf0e10cSrcweir OleEmbeddedObject::~OleEmbeddedObject() 142cdf0e10cSrcweir { 143cdf0e10cSrcweir OSL_ENSURE( !m_pInterfaceContainer && !m_pOleComponent && !m_xObjectStream.is(), 144cdf0e10cSrcweir "The object is not closed! DISASTER is possible!" ); 145cdf0e10cSrcweir 146cdf0e10cSrcweir if ( m_pOleComponent || m_pInterfaceContainer || m_xObjectStream.is() ) 147cdf0e10cSrcweir { 148cdf0e10cSrcweir // the component must be cleaned during closing 149cdf0e10cSrcweir m_refCount++; // to avoid crash 150cdf0e10cSrcweir try { 151cdf0e10cSrcweir Dispose(); 152cdf0e10cSrcweir } catch( uno::Exception& ) {} 153cdf0e10cSrcweir } 154cdf0e10cSrcweir 155cdf0e10cSrcweir if ( m_aTempURL.getLength() ) 156cdf0e10cSrcweir KillFile_Impl( m_aTempURL, m_xFactory ); 157cdf0e10cSrcweir 158cdf0e10cSrcweir if ( m_aTempDumpURL.getLength() ) 159cdf0e10cSrcweir KillFile_Impl( m_aTempDumpURL, m_xFactory ); 160cdf0e10cSrcweir } 161cdf0e10cSrcweir 162cdf0e10cSrcweir //------------------------------------------------------ 163cdf0e10cSrcweir void OleEmbeddedObject::MakeEventListenerNotification_Impl( const ::rtl::OUString& aEventName ) 164cdf0e10cSrcweir { 165cdf0e10cSrcweir if ( m_pInterfaceContainer ) 166cdf0e10cSrcweir { 167cdf0e10cSrcweir ::cppu::OInterfaceContainerHelper* pContainer = 168cdf0e10cSrcweir m_pInterfaceContainer->getContainer( 169cdf0e10cSrcweir ::getCppuType( ( const uno::Reference< document::XEventListener >*) NULL ) ); 170cdf0e10cSrcweir if ( pContainer != NULL ) 171cdf0e10cSrcweir { 172cdf0e10cSrcweir document::EventObject aEvent( static_cast< ::cppu::OWeakObject* >( this ), aEventName ); 173cdf0e10cSrcweir ::cppu::OInterfaceIteratorHelper pIterator(*pContainer); 174cdf0e10cSrcweir while (pIterator.hasMoreElements()) 175cdf0e10cSrcweir { 176cdf0e10cSrcweir try 177cdf0e10cSrcweir { 178cdf0e10cSrcweir ((document::XEventListener*)pIterator.next())->notifyEvent( aEvent ); 179cdf0e10cSrcweir } 180cdf0e10cSrcweir catch( uno::RuntimeException& ) 181cdf0e10cSrcweir { 182cdf0e10cSrcweir } 183cdf0e10cSrcweir } 184cdf0e10cSrcweir } 185cdf0e10cSrcweir } 186cdf0e10cSrcweir } 187cdf0e10cSrcweir #ifdef WNT 188cdf0e10cSrcweir //---------------------------------------------- 189cdf0e10cSrcweir void OleEmbeddedObject::StateChangeNotification_Impl( sal_Bool bBeforeChange, sal_Int32 nOldState, sal_Int32 nNewState ) 190cdf0e10cSrcweir { 191cdf0e10cSrcweir if ( m_pInterfaceContainer ) 192cdf0e10cSrcweir { 193cdf0e10cSrcweir ::cppu::OInterfaceContainerHelper* pContainer = m_pInterfaceContainer->getContainer( 194cdf0e10cSrcweir ::getCppuType( ( const uno::Reference< embed::XStateChangeListener >*) NULL ) ); 195cdf0e10cSrcweir if ( pContainer != NULL ) 196cdf0e10cSrcweir { 197cdf0e10cSrcweir lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >( this ) ); 198cdf0e10cSrcweir ::cppu::OInterfaceIteratorHelper pIterator(*pContainer); 199cdf0e10cSrcweir 200cdf0e10cSrcweir while (pIterator.hasMoreElements()) 201cdf0e10cSrcweir { 202cdf0e10cSrcweir if ( bBeforeChange ) 203cdf0e10cSrcweir { 204cdf0e10cSrcweir try 205cdf0e10cSrcweir { 206cdf0e10cSrcweir ((embed::XStateChangeListener*)pIterator.next())->changingState( aSource, nOldState, nNewState ); 207cdf0e10cSrcweir } 208cdf0e10cSrcweir catch( uno::Exception& ) 209cdf0e10cSrcweir { 210cdf0e10cSrcweir // even if the listener complains ignore it for now 211cdf0e10cSrcweir } 212cdf0e10cSrcweir } 213cdf0e10cSrcweir else 214cdf0e10cSrcweir { 215cdf0e10cSrcweir try 216cdf0e10cSrcweir { 217cdf0e10cSrcweir ((embed::XStateChangeListener*)pIterator.next())->stateChanged( aSource, nOldState, nNewState ); 218cdf0e10cSrcweir } 219cdf0e10cSrcweir catch( uno::Exception& ) 220cdf0e10cSrcweir { 221cdf0e10cSrcweir // if anything happened it is problem of listener, ignore it 222cdf0e10cSrcweir } 223cdf0e10cSrcweir } 224cdf0e10cSrcweir } 225cdf0e10cSrcweir } 226cdf0e10cSrcweir } 227cdf0e10cSrcweir } 228cdf0e10cSrcweir #endif 229cdf0e10cSrcweir //------------------------------------------------------ 230cdf0e10cSrcweir void OleEmbeddedObject::GetRidOfComponent() 231cdf0e10cSrcweir { 232cdf0e10cSrcweir #ifdef WNT 233cdf0e10cSrcweir if ( m_pOleComponent ) 234cdf0e10cSrcweir { 235cdf0e10cSrcweir if ( m_nObjectState != -1 && m_nObjectState != embed::EmbedStates::LOADED ) 236cdf0e10cSrcweir SaveObject_Impl(); 237cdf0e10cSrcweir 238cdf0e10cSrcweir m_pOleComponent->removeCloseListener( m_xClosePreventer ); 239cdf0e10cSrcweir try 240cdf0e10cSrcweir { 241cdf0e10cSrcweir m_pOleComponent->close( sal_False ); 242cdf0e10cSrcweir } 243cdf0e10cSrcweir catch( uno::Exception& ) 244cdf0e10cSrcweir { 245cdf0e10cSrcweir // TODO: there should be a special listener to wait for component closing 246cdf0e10cSrcweir // and to notify object, may be object itself can be such a listener 247cdf0e10cSrcweir m_pOleComponent->addCloseListener( m_xClosePreventer ); 248cdf0e10cSrcweir throw; 249cdf0e10cSrcweir } 250cdf0e10cSrcweir 251cdf0e10cSrcweir m_pOleComponent->disconnectEmbeddedObject(); 252cdf0e10cSrcweir m_pOleComponent->release(); 253cdf0e10cSrcweir m_pOleComponent = NULL; 254cdf0e10cSrcweir } 255cdf0e10cSrcweir #endif 256cdf0e10cSrcweir } 257cdf0e10cSrcweir 258cdf0e10cSrcweir //------------------------------------------------------ 259cdf0e10cSrcweir void OleEmbeddedObject::Dispose() 260cdf0e10cSrcweir { 261cdf0e10cSrcweir if ( m_pInterfaceContainer ) 262cdf0e10cSrcweir { 263cdf0e10cSrcweir lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >( this ) ); 264cdf0e10cSrcweir m_pInterfaceContainer->disposeAndClear( aSource ); 265cdf0e10cSrcweir delete m_pInterfaceContainer; 266cdf0e10cSrcweir m_pInterfaceContainer = NULL; 267cdf0e10cSrcweir } 268cdf0e10cSrcweir 269cdf0e10cSrcweir if ( m_pOwnView ) 270cdf0e10cSrcweir { 271cdf0e10cSrcweir m_pOwnView->Close(); 272cdf0e10cSrcweir m_pOwnView->release(); 273cdf0e10cSrcweir m_pOwnView = NULL; 274cdf0e10cSrcweir } 275cdf0e10cSrcweir 276cdf0e10cSrcweir if ( m_pOleComponent ) 277cdf0e10cSrcweir try { 278cdf0e10cSrcweir GetRidOfComponent(); 279cdf0e10cSrcweir } catch( uno::Exception& ) 280cdf0e10cSrcweir { 281cdf0e10cSrcweir m_bDisposed = true; 282cdf0e10cSrcweir throw; // TODO: there should be a special listener that will close object when 283cdf0e10cSrcweir // component is finally closed 284cdf0e10cSrcweir } 285cdf0e10cSrcweir 286cdf0e10cSrcweir if ( m_xObjectStream.is() ) 287cdf0e10cSrcweir { 288cdf0e10cSrcweir uno::Reference< lang::XComponent > xComp( m_xObjectStream, uno::UNO_QUERY ); 289cdf0e10cSrcweir OSL_ENSURE( xComp.is(), "Storage stream doesn't support XComponent!\n" ); 290cdf0e10cSrcweir 291cdf0e10cSrcweir if ( xComp.is() ) 292cdf0e10cSrcweir { 293cdf0e10cSrcweir try { 294cdf0e10cSrcweir xComp->dispose(); 295cdf0e10cSrcweir } catch( uno::Exception& ) {} 296cdf0e10cSrcweir } 297cdf0e10cSrcweir m_xObjectStream = uno::Reference< io::XStream >(); 298cdf0e10cSrcweir } 299cdf0e10cSrcweir 300cdf0e10cSrcweir m_xParentStorage = uno::Reference< embed::XStorage >(); 301cdf0e10cSrcweir 302cdf0e10cSrcweir m_bDisposed = true; 303cdf0e10cSrcweir } 304cdf0e10cSrcweir 305cdf0e10cSrcweir //------------------------------------------------------ 306cdf0e10cSrcweir uno::Sequence< sal_Int8 > SAL_CALL OleEmbeddedObject::getClassID() 307cdf0e10cSrcweir throw ( uno::RuntimeException ) 308cdf0e10cSrcweir { 309cdf0e10cSrcweir // begin wrapping related part ==================== 310cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject; 311cdf0e10cSrcweir if ( xWrappedObject.is() ) 312cdf0e10cSrcweir { 313cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 314cdf0e10cSrcweir return xWrappedObject->getClassID(); 315cdf0e10cSrcweir } 316cdf0e10cSrcweir // end wrapping related part ==================== 317cdf0e10cSrcweir 318cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 319cdf0e10cSrcweir if ( m_bDisposed ) 320cdf0e10cSrcweir throw lang::DisposedException(); // TODO 321cdf0e10cSrcweir 322cdf0e10cSrcweir return m_aClassID; 323cdf0e10cSrcweir } 324cdf0e10cSrcweir 325cdf0e10cSrcweir //------------------------------------------------------ 326cdf0e10cSrcweir ::rtl::OUString SAL_CALL OleEmbeddedObject::getClassName() 327cdf0e10cSrcweir throw ( uno::RuntimeException ) 328cdf0e10cSrcweir { 329cdf0e10cSrcweir // begin wrapping related part ==================== 330cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject; 331cdf0e10cSrcweir if ( xWrappedObject.is() ) 332cdf0e10cSrcweir { 333cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 334cdf0e10cSrcweir return xWrappedObject->getClassName(); 335cdf0e10cSrcweir } 336cdf0e10cSrcweir // end wrapping related part ==================== 337cdf0e10cSrcweir 338cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 339cdf0e10cSrcweir if ( m_bDisposed ) 340cdf0e10cSrcweir throw lang::DisposedException(); // TODO 341cdf0e10cSrcweir 342cdf0e10cSrcweir return m_aClassName; 343cdf0e10cSrcweir } 344cdf0e10cSrcweir 345cdf0e10cSrcweir //------------------------------------------------------ 346cdf0e10cSrcweir void SAL_CALL OleEmbeddedObject::setClassInfo( 347cdf0e10cSrcweir const uno::Sequence< sal_Int8 >& aClassID, const ::rtl::OUString& aClassName ) 348cdf0e10cSrcweir throw ( lang::NoSupportException, 349cdf0e10cSrcweir uno::RuntimeException ) 350cdf0e10cSrcweir { 351cdf0e10cSrcweir // begin wrapping related part ==================== 352cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject; 353cdf0e10cSrcweir if ( xWrappedObject.is() ) 354cdf0e10cSrcweir { 355cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 356cdf0e10cSrcweir xWrappedObject->setClassInfo( aClassID, aClassName ); 357cdf0e10cSrcweir return; 358cdf0e10cSrcweir } 359cdf0e10cSrcweir // end wrapping related part ==================== 360cdf0e10cSrcweir 361cdf0e10cSrcweir // the object class info can not be changed explicitly 362cdf0e10cSrcweir throw lang::NoSupportException(); //TODO: 363cdf0e10cSrcweir } 364cdf0e10cSrcweir 365cdf0e10cSrcweir //------------------------------------------------------ 366cdf0e10cSrcweir uno::Reference< util::XCloseable > SAL_CALL OleEmbeddedObject::getComponent() 367cdf0e10cSrcweir throw ( uno::RuntimeException ) 368cdf0e10cSrcweir { 369cdf0e10cSrcweir // begin wrapping related part ==================== 370cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject; 371cdf0e10cSrcweir if ( xWrappedObject.is() ) 372cdf0e10cSrcweir { 373cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 374cdf0e10cSrcweir return xWrappedObject->getComponent(); 375cdf0e10cSrcweir } 376cdf0e10cSrcweir // end wrapping related part ==================== 377cdf0e10cSrcweir 378cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 379cdf0e10cSrcweir if ( m_bDisposed ) 380cdf0e10cSrcweir throw lang::DisposedException(); // TODO 381cdf0e10cSrcweir 382cdf0e10cSrcweir if ( m_nObjectState == -1 ) // || m_nObjectState == embed::EmbedStates::LOADED ) 383cdf0e10cSrcweir { 384cdf0e10cSrcweir // the object is still not running 385cdf0e10cSrcweir throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object is not loaded!\n" ), 386cdf0e10cSrcweir uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) ); 387cdf0e10cSrcweir } 388cdf0e10cSrcweir 389cdf0e10cSrcweir // if ( m_bWaitSaveCompleted ) 390cdf0e10cSrcweir // throw embed::WrongStateException( 391cdf0e10cSrcweir // ::rtl::OUString::createFromAscii( "The object waits for saveCompleted() call!\n" ), 392cdf0e10cSrcweir // uno::Reference< uno::XInterface >( reinterpret_cast< ::cppu::OWeakObject* >(this) ) ); 393cdf0e10cSrcweir 394cdf0e10cSrcweir if ( !m_pOleComponent ) 395cdf0e10cSrcweir { 396cdf0e10cSrcweir // TODO/LATER: Is it correct??? 397cdf0e10cSrcweir return uno::Reference< util::XCloseable >(); 398cdf0e10cSrcweir // throw uno::RuntimeException(); // TODO 399cdf0e10cSrcweir } 400cdf0e10cSrcweir 401cdf0e10cSrcweir return uno::Reference< util::XCloseable >( static_cast< ::cppu::OWeakObject* >( m_pOleComponent ), uno::UNO_QUERY ); 402cdf0e10cSrcweir } 403cdf0e10cSrcweir 404cdf0e10cSrcweir //---------------------------------------------- 405cdf0e10cSrcweir void SAL_CALL OleEmbeddedObject::addStateChangeListener( const uno::Reference< embed::XStateChangeListener >& xListener ) 406cdf0e10cSrcweir throw ( uno::RuntimeException ) 407cdf0e10cSrcweir { 408cdf0e10cSrcweir // begin wrapping related part ==================== 409cdf0e10cSrcweir uno::Reference< embed::XStateChangeBroadcaster > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY ); 410cdf0e10cSrcweir if ( xWrappedObject.is() ) 411cdf0e10cSrcweir { 412cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 413cdf0e10cSrcweir xWrappedObject->addStateChangeListener( xListener ); 414cdf0e10cSrcweir return; 415cdf0e10cSrcweir } 416cdf0e10cSrcweir // end wrapping related part ==================== 417cdf0e10cSrcweir 418cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 419cdf0e10cSrcweir if ( m_bDisposed ) 420cdf0e10cSrcweir throw lang::DisposedException(); // TODO 421cdf0e10cSrcweir 422cdf0e10cSrcweir if ( !m_pInterfaceContainer ) 423cdf0e10cSrcweir m_pInterfaceContainer = new ::cppu::OMultiTypeInterfaceContainerHelper( m_aMutex ); 424cdf0e10cSrcweir 425cdf0e10cSrcweir m_pInterfaceContainer->addInterface( ::getCppuType( (const uno::Reference< embed::XStateChangeListener >*)0 ), 426cdf0e10cSrcweir xListener ); 427cdf0e10cSrcweir } 428cdf0e10cSrcweir 429cdf0e10cSrcweir //---------------------------------------------- 430cdf0e10cSrcweir void SAL_CALL OleEmbeddedObject::removeStateChangeListener( 431cdf0e10cSrcweir const uno::Reference< embed::XStateChangeListener >& xListener ) 432cdf0e10cSrcweir throw (uno::RuntimeException) 433cdf0e10cSrcweir { 434cdf0e10cSrcweir // begin wrapping related part ==================== 435cdf0e10cSrcweir uno::Reference< embed::XStateChangeBroadcaster > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY ); 436cdf0e10cSrcweir if ( xWrappedObject.is() ) 437cdf0e10cSrcweir { 438cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 439cdf0e10cSrcweir xWrappedObject->removeStateChangeListener( xListener ); 440cdf0e10cSrcweir return; 441cdf0e10cSrcweir } 442cdf0e10cSrcweir // end wrapping related part ==================== 443cdf0e10cSrcweir 444cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 445cdf0e10cSrcweir if ( m_pInterfaceContainer ) 446cdf0e10cSrcweir m_pInterfaceContainer->removeInterface( ::getCppuType( (const uno::Reference< embed::XStateChangeListener >*)0 ), 447cdf0e10cSrcweir xListener ); 448cdf0e10cSrcweir } 449cdf0e10cSrcweir 450cdf0e10cSrcweir 451cdf0e10cSrcweir //---------------------------------------------- 452cdf0e10cSrcweir void SAL_CALL OleEmbeddedObject::close( sal_Bool bDeliverOwnership ) 453cdf0e10cSrcweir throw ( util::CloseVetoException, 454cdf0e10cSrcweir uno::RuntimeException ) 455cdf0e10cSrcweir { 456cdf0e10cSrcweir // begin wrapping related part ==================== 457cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject; 458cdf0e10cSrcweir if ( xWrappedObject.is() ) 459cdf0e10cSrcweir { 460cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 461cdf0e10cSrcweir xWrappedObject->close( bDeliverOwnership ); 462cdf0e10cSrcweir return; 463cdf0e10cSrcweir } 464cdf0e10cSrcweir // end wrapping related part ==================== 465cdf0e10cSrcweir 466cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 467cdf0e10cSrcweir if ( m_bDisposed ) 468cdf0e10cSrcweir throw lang::DisposedException(); // TODO 469cdf0e10cSrcweir 470cdf0e10cSrcweir uno::Reference< uno::XInterface > xSelfHold( static_cast< ::cppu::OWeakObject* >( this ) ); 471cdf0e10cSrcweir lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >( this ) ); 472cdf0e10cSrcweir 473cdf0e10cSrcweir if ( m_pInterfaceContainer ) 474cdf0e10cSrcweir { 475cdf0e10cSrcweir ::cppu::OInterfaceContainerHelper* pContainer = 476cdf0e10cSrcweir m_pInterfaceContainer->getContainer( ::getCppuType( ( const uno::Reference< util::XCloseListener >*) NULL ) ); 477cdf0e10cSrcweir if ( pContainer != NULL ) 478cdf0e10cSrcweir { 479cdf0e10cSrcweir ::cppu::OInterfaceIteratorHelper pIterator(*pContainer); 480cdf0e10cSrcweir while (pIterator.hasMoreElements()) 481cdf0e10cSrcweir { 482cdf0e10cSrcweir try 483cdf0e10cSrcweir { 484cdf0e10cSrcweir ((util::XCloseListener*)pIterator.next())->queryClosing( aSource, bDeliverOwnership ); 485cdf0e10cSrcweir } 486cdf0e10cSrcweir catch( uno::RuntimeException& ) 487cdf0e10cSrcweir { 488cdf0e10cSrcweir pIterator.remove(); 489cdf0e10cSrcweir } 490cdf0e10cSrcweir } 491cdf0e10cSrcweir } 492cdf0e10cSrcweir 493cdf0e10cSrcweir pContainer = m_pInterfaceContainer->getContainer( 494cdf0e10cSrcweir ::getCppuType( ( const uno::Reference< util::XCloseListener >*) NULL ) ); 495cdf0e10cSrcweir if ( pContainer != NULL ) 496cdf0e10cSrcweir { 497cdf0e10cSrcweir ::cppu::OInterfaceIteratorHelper pCloseIterator(*pContainer); 498cdf0e10cSrcweir while (pCloseIterator.hasMoreElements()) 499cdf0e10cSrcweir { 500cdf0e10cSrcweir try 501cdf0e10cSrcweir { 502cdf0e10cSrcweir ((util::XCloseListener*)pCloseIterator.next())->notifyClosing( aSource ); 503cdf0e10cSrcweir } 504cdf0e10cSrcweir catch( uno::RuntimeException& ) 505cdf0e10cSrcweir { 506cdf0e10cSrcweir pCloseIterator.remove(); 507cdf0e10cSrcweir } 508cdf0e10cSrcweir } 509cdf0e10cSrcweir } 510cdf0e10cSrcweir } 511cdf0e10cSrcweir 512cdf0e10cSrcweir Dispose(); 513cdf0e10cSrcweir } 514cdf0e10cSrcweir 515cdf0e10cSrcweir //---------------------------------------------- 516cdf0e10cSrcweir void SAL_CALL OleEmbeddedObject::addCloseListener( const uno::Reference< util::XCloseListener >& xListener ) 517cdf0e10cSrcweir throw ( uno::RuntimeException ) 518cdf0e10cSrcweir { 519cdf0e10cSrcweir // begin wrapping related part ==================== 520cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject; 521cdf0e10cSrcweir if ( xWrappedObject.is() ) 522cdf0e10cSrcweir { 523cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 524cdf0e10cSrcweir xWrappedObject->addCloseListener( xListener ); 525cdf0e10cSrcweir return; 526cdf0e10cSrcweir } 527cdf0e10cSrcweir // end wrapping related part ==================== 528cdf0e10cSrcweir 529cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 530cdf0e10cSrcweir if ( m_bDisposed ) 531cdf0e10cSrcweir throw lang::DisposedException(); // TODO 532cdf0e10cSrcweir 533cdf0e10cSrcweir if ( !m_pInterfaceContainer ) 534cdf0e10cSrcweir m_pInterfaceContainer = new ::cppu::OMultiTypeInterfaceContainerHelper( m_aMutex ); 535cdf0e10cSrcweir 536cdf0e10cSrcweir m_pInterfaceContainer->addInterface( ::getCppuType( (const uno::Reference< util::XCloseListener >*)0 ), xListener ); 537cdf0e10cSrcweir } 538cdf0e10cSrcweir 539cdf0e10cSrcweir //---------------------------------------------- 540cdf0e10cSrcweir void SAL_CALL OleEmbeddedObject::removeCloseListener( const uno::Reference< util::XCloseListener >& xListener ) 541cdf0e10cSrcweir throw (uno::RuntimeException) 542cdf0e10cSrcweir { 543cdf0e10cSrcweir // begin wrapping related part ==================== 544cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject; 545cdf0e10cSrcweir if ( xWrappedObject.is() ) 546cdf0e10cSrcweir { 547cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 548cdf0e10cSrcweir xWrappedObject->removeCloseListener( xListener ); 549cdf0e10cSrcweir return; 550cdf0e10cSrcweir } 551cdf0e10cSrcweir // end wrapping related part ==================== 552cdf0e10cSrcweir 553cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 554cdf0e10cSrcweir if ( m_bDisposed ) 555cdf0e10cSrcweir throw lang::DisposedException(); // TODO 556cdf0e10cSrcweir 557cdf0e10cSrcweir if ( m_pInterfaceContainer ) 558cdf0e10cSrcweir m_pInterfaceContainer->removeInterface( ::getCppuType( (const uno::Reference< util::XCloseListener >*)0 ), 559cdf0e10cSrcweir xListener ); 560cdf0e10cSrcweir } 561cdf0e10cSrcweir 562cdf0e10cSrcweir //------------------------------------------------------ 563cdf0e10cSrcweir void SAL_CALL OleEmbeddedObject::addEventListener( const uno::Reference< document::XEventListener >& xListener ) 564cdf0e10cSrcweir throw ( uno::RuntimeException ) 565cdf0e10cSrcweir { 566cdf0e10cSrcweir // begin wrapping related part ==================== 567cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject; 568cdf0e10cSrcweir if ( xWrappedObject.is() ) 569cdf0e10cSrcweir { 570cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 571cdf0e10cSrcweir xWrappedObject->addEventListener( xListener ); 572cdf0e10cSrcweir return; 573cdf0e10cSrcweir } 574cdf0e10cSrcweir // end wrapping related part ==================== 575cdf0e10cSrcweir 576cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 577cdf0e10cSrcweir if ( m_bDisposed ) 578cdf0e10cSrcweir throw lang::DisposedException(); // TODO 579cdf0e10cSrcweir 580cdf0e10cSrcweir if ( !m_pInterfaceContainer ) 581cdf0e10cSrcweir m_pInterfaceContainer = new ::cppu::OMultiTypeInterfaceContainerHelper( m_aMutex ); 582cdf0e10cSrcweir 583cdf0e10cSrcweir m_pInterfaceContainer->addInterface( ::getCppuType( (const uno::Reference< document::XEventListener >*)0 ), xListener ); 584cdf0e10cSrcweir } 585cdf0e10cSrcweir 586cdf0e10cSrcweir //------------------------------------------------------ 587cdf0e10cSrcweir void SAL_CALL OleEmbeddedObject::removeEventListener( 588cdf0e10cSrcweir const uno::Reference< document::XEventListener >& xListener ) 589cdf0e10cSrcweir throw ( uno::RuntimeException ) 590cdf0e10cSrcweir { 591cdf0e10cSrcweir // begin wrapping related part ==================== 592cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject; 593cdf0e10cSrcweir if ( xWrappedObject.is() ) 594cdf0e10cSrcweir { 595cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 596cdf0e10cSrcweir xWrappedObject->removeEventListener( xListener ); 597cdf0e10cSrcweir return; 598cdf0e10cSrcweir } 599cdf0e10cSrcweir // end wrapping related part ==================== 600cdf0e10cSrcweir 601cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 602cdf0e10cSrcweir if ( m_bDisposed ) 603cdf0e10cSrcweir throw lang::DisposedException(); // TODO 604cdf0e10cSrcweir 605cdf0e10cSrcweir if ( m_pInterfaceContainer ) 606cdf0e10cSrcweir m_pInterfaceContainer->removeInterface( ::getCppuType( (const uno::Reference< document::XEventListener >*)0 ), 607cdf0e10cSrcweir xListener ); 608cdf0e10cSrcweir } 609cdf0e10cSrcweir 610cdf0e10cSrcweir // XInplaceObject ( wrapper related implementation ) 611cdf0e10cSrcweir //------------------------------------------------------ 612cdf0e10cSrcweir void SAL_CALL OleEmbeddedObject::setObjectRectangles( const awt::Rectangle& aPosRect, 613cdf0e10cSrcweir const awt::Rectangle& aClipRect ) 614cdf0e10cSrcweir throw ( embed::WrongStateException, 615cdf0e10cSrcweir uno::Exception, 616cdf0e10cSrcweir uno::RuntimeException ) 617cdf0e10cSrcweir { 618cdf0e10cSrcweir // begin wrapping related part ==================== 619cdf0e10cSrcweir uno::Reference< embed::XInplaceObject > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY ); 620cdf0e10cSrcweir if ( xWrappedObject.is() ) 621cdf0e10cSrcweir { 622cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 623cdf0e10cSrcweir xWrappedObject->setObjectRectangles( aPosRect, aClipRect ); 624cdf0e10cSrcweir return; 625cdf0e10cSrcweir } 626cdf0e10cSrcweir // end wrapping related part ==================== 627cdf0e10cSrcweir 628cdf0e10cSrcweir throw embed::WrongStateException(); 629cdf0e10cSrcweir } 630cdf0e10cSrcweir 631cdf0e10cSrcweir //------------------------------------------------------ 632cdf0e10cSrcweir void SAL_CALL OleEmbeddedObject::enableModeless( sal_Bool bEnable ) 633cdf0e10cSrcweir throw ( embed::WrongStateException, 634cdf0e10cSrcweir uno::Exception, 635cdf0e10cSrcweir uno::RuntimeException ) 636cdf0e10cSrcweir { 637cdf0e10cSrcweir // begin wrapping related part ==================== 638cdf0e10cSrcweir uno::Reference< embed::XInplaceObject > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY ); 639cdf0e10cSrcweir if ( xWrappedObject.is() ) 640cdf0e10cSrcweir { 641cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 642cdf0e10cSrcweir xWrappedObject->enableModeless( bEnable ); 643cdf0e10cSrcweir return; 644cdf0e10cSrcweir } 645cdf0e10cSrcweir // end wrapping related part ==================== 646cdf0e10cSrcweir 647cdf0e10cSrcweir throw embed::WrongStateException(); 648cdf0e10cSrcweir } 649cdf0e10cSrcweir 650cdf0e10cSrcweir //------------------------------------------------------ 651cdf0e10cSrcweir void SAL_CALL OleEmbeddedObject::translateAccelerators( 652cdf0e10cSrcweir const uno::Sequence< awt::KeyEvent >& aKeys ) 653cdf0e10cSrcweir throw ( embed::WrongStateException, 654cdf0e10cSrcweir uno::RuntimeException ) 655cdf0e10cSrcweir { 656cdf0e10cSrcweir // begin wrapping related part ==================== 657cdf0e10cSrcweir uno::Reference< embed::XInplaceObject > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY ); 658cdf0e10cSrcweir if ( xWrappedObject.is() ) 659cdf0e10cSrcweir { 660cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 661cdf0e10cSrcweir xWrappedObject->translateAccelerators( aKeys ); 662cdf0e10cSrcweir return; 663cdf0e10cSrcweir } 664cdf0e10cSrcweir // end wrapping related part ==================== 665cdf0e10cSrcweir 666cdf0e10cSrcweir // throw embed::WrongStateException(); 667cdf0e10cSrcweir } 668cdf0e10cSrcweir 669cdf0e10cSrcweir // XChild 670cdf0e10cSrcweir //------------------------------------------------------ 671cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::uno::XInterface > SAL_CALL OleEmbeddedObject::getParent() throw (::com::sun::star::uno::RuntimeException) 672cdf0e10cSrcweir { 673cdf0e10cSrcweir // begin wrapping related part ==================== 674cdf0e10cSrcweir uno::Reference< container::XChild > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY ); 675cdf0e10cSrcweir if ( xWrappedObject.is() ) 676cdf0e10cSrcweir { 677cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 678cdf0e10cSrcweir return xWrappedObject->getParent(); 679cdf0e10cSrcweir } 680cdf0e10cSrcweir // end wrapping related part ==================== 681cdf0e10cSrcweir 682cdf0e10cSrcweir return m_xParent; 683cdf0e10cSrcweir } 684cdf0e10cSrcweir 685cdf0e10cSrcweir //------------------------------------------------------ 686cdf0e10cSrcweir void SAL_CALL OleEmbeddedObject::setParent( const com::sun::star::uno::Reference< com::sun::star::uno::XInterface >& xParent ) throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException) 687cdf0e10cSrcweir { 688cdf0e10cSrcweir // begin wrapping related part ==================== 689cdf0e10cSrcweir uno::Reference< container::XChild > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY ); 690cdf0e10cSrcweir if ( xWrappedObject.is() ) 691cdf0e10cSrcweir { 692cdf0e10cSrcweir // the object was converted to OOo embedded object, the current implementation is now only a wrapper 693cdf0e10cSrcweir xWrappedObject->setParent( xParent ); 694cdf0e10cSrcweir return; 695cdf0e10cSrcweir } 696cdf0e10cSrcweir // end wrapping related part ==================== 697cdf0e10cSrcweir 698cdf0e10cSrcweir m_xParent = xParent; 699cdf0e10cSrcweir } 700cdf0e10cSrcweir 701