/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org 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 version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ #ifndef _INC_OLEEMBOBJ_HXX_ #define _INC_OLEEMBOBJ_HXX_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace cppu { class OMultiTypeInterfaceContainerHelper; } class VerbExecutionController { // the following mutex is allowed to be locked only for variables initialization, so no deadlock can be caused ::osl::Mutex m_aVerbExecutionMutex; sal_Bool m_bVerbExecutionInProgress; oslThreadIdentifier m_nVerbExecutionThreadIdentifier; sal_Bool m_bChangedOnVerbExecution; sal_Bool m_bWasEverActive; sal_Int32 m_nNotificationLock; public: VerbExecutionController() : m_bVerbExecutionInProgress( sal_False ) , m_nVerbExecutionThreadIdentifier( 0 ) , m_bChangedOnVerbExecution( sal_False ) , m_bWasEverActive( sal_False ) , m_nNotificationLock( 0 ) {} #ifdef WNT void StartControlExecution(); sal_Bool EndControlExecution_WasModified(); void ModificationNotificationIsDone(); #endif void LockNotification(); void UnlockNotification(); // no need to lock anything to check the value of the numeric members sal_Bool CanDoNotification() { return ( !m_bVerbExecutionInProgress && !m_bWasEverActive && !m_nNotificationLock ); } // ... or to change it void ObjectIsActive() { m_bWasEverActive = sal_True; } }; class VerbExecutionControllerGuard { VerbExecutionController& m_rController; public: VerbExecutionControllerGuard( VerbExecutionController& rController ) : m_rController( rController ) { m_rController.LockNotification(); } ~VerbExecutionControllerGuard() { m_rController.UnlockNotification(); } }; class OleComponent; class OwnView_Impl; class OleEmbeddedObject : public ::cppu::WeakImplHelper5 < ::com::sun::star::embed::XEmbeddedObject , ::com::sun::star::embed::XEmbedPersist , ::com::sun::star::embed::XLinkageSupport , ::com::sun::star::embed::XInplaceObject , ::com::sun::star::container::XChild > { friend class OleComponent; ::osl::Mutex m_aMutex; OleComponent* m_pOleComponent; ::cppu::OMultiTypeInterfaceContainerHelper* m_pInterfaceContainer; sal_Bool m_bReadOnly; sal_Int32 m_bDisposed; sal_Int32 m_nObjectState; sal_Int32 m_nTargetState; sal_Int32 m_nUpdateMode; ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xFactory; ::com::sun::star::uno::Sequence< sal_Int8 > m_aClassID; ::rtl::OUString m_aClassName; ::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedClient > m_xClientSite; ::rtl::OUString m_aContainerName; ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseListener > m_xClosePreventer; sal_Bool m_bWaitSaveCompleted; sal_Bool m_bNewVisReplInStream; ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > m_xNewCachedVisRepl; ::rtl::OUString m_aNewEntryName; ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > m_xNewParentStorage; ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > m_xNewObjectStream; sal_Bool m_bStoreLoaded; ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > m_xCachedVisualRepresentation; sal_Bool m_bVisReplInitialized; sal_Bool m_bVisReplInStream; sal_Bool m_bStoreVisRepl; sal_Bool m_bIsLink; // TODO/LATER: may need to cache more than one aspect in future sal_Bool m_bHasCachedSize; // the object has cached size ::com::sun::star::awt::Size m_aCachedSize; sal_Int64 m_nCachedAspect; sal_Bool m_bHasSizeToSet; // the object has cached size that should be set to OLE component ::com::sun::star::awt::Size m_aSizeToSet; // this size might be different from the cached one ( scaling is applied ) sal_Int64 m_nAspectToSet; // cache the status of the object // TODO/LATER: may need to cache more than one aspect in future sal_Bool m_bGotStatus; sal_Int64 m_nStatus; sal_Int64 m_nStatusAspect; // embedded object related stuff ::rtl::OUString m_aEntryName; ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > m_xParentStorage; ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > m_xObjectStream; // link related stuff ::rtl::OUString m_aLinkURL; // ??? // points to own view provider if the the object has no server OwnView_Impl* m_pOwnView; // whether the object should be initialized from clipboard in case of default initialization sal_Bool m_bFromClipboard; ::rtl::OUString m_aTempURL; ::rtl::OUString m_aTempDumpURL; // STAMPIT solution // the following member is used during verb execution to detect whether the verb execution modifies the object VerbExecutionController m_aVerbExecutionController; // if the following member is set, the object works in wrapper mode ::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedObject > m_xWrappedObject; sal_Bool m_bTriedConversion; ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xParent; protected: ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > TryToGetAcceptableFormat_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xStream ) throw ( ::com::sun::star::uno::Exception ); ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > GetNewFilledTempStream_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xInStream ) throw( ::com::sun::star::io::IOException ); #ifdef WNT void SwitchComponentToRunningState_Impl(); #endif void MakeEventListenerNotification_Impl( const ::rtl::OUString& aEventName ); #ifdef WNT void StateChangeNotification_Impl( sal_Bool bBeforeChange, sal_Int32 nOldState, sal_Int32 nNewState ); ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > GetStreamForSaving(); ::com::sun::star::uno::Sequence< sal_Int32 > GetIntermediateVerbsSequence_Impl( sal_Int32 nNewState ); ::com::sun::star::uno::Sequence< sal_Int32 > GetReachableStatesList_Impl( const ::com::sun::star::uno::Sequence< ::com::sun::star::embed::VerbDescriptor >& aVerbList ); #endif void CloseComponent(); void Dispose(); void SwitchOwnPersistence( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xNewParentStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xNewObjectStream, const ::rtl::OUString& aNewName ); void SwitchOwnPersistence( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xNewParentStorage, const ::rtl::OUString& aNewName ); void GetRidOfComponent(); void StoreToLocation_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, const ::rtl::OUString& sEntName, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs, sal_Bool bSaveAs ) throw ( ::com::sun::star::uno::Exception ); #ifdef WNT void StoreObjectToStream( ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > xOutStream ) throw ( ::com::sun::star::uno::Exception ); #endif void InsertVisualCache_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xTargetStream, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xCachedVisualRepresentation ) throw ( ::com::sun::star::uno::Exception ); void RemoveVisualCache_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xTargetStream ) throw ( ::com::sun::star::uno::Exception ); void SetVisReplInStream( sal_Bool bExists ); sal_Bool HasVisReplInStream(); ::com::sun::star::embed::VisualRepresentation GetVisualRepresentationInNativeFormat_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > xCachedVisRepr ) throw ( ::com::sun::star::uno::Exception ); ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > TryToRetrieveCachedVisualRepresentation_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xStream, sal_Bool bAllowRepair50 = sal_False ) throw (); #ifdef WNT sal_Bool SaveObject_Impl(); sal_Bool OnShowWindow_Impl( sal_Bool bShow ); void CreateOleComponent_Impl( OleComponent* pOleComponent = NULL ); void CreateOleComponentAndLoad_Impl( OleComponent* pOleComponent = NULL ); void CreateOleComponentFromClipboard_Impl( OleComponent* pOleComponent = NULL ); #endif void SetObjectIsLink_Impl( sal_Bool bIsLink ) { m_bIsLink = bIsLink; } #ifdef WNT ::rtl::OUString CreateTempURLEmpty_Impl(); ::rtl::OUString GetTempURL_Impl(); #endif ::rtl::OUString GetContainerName_Impl() { return m_aContainerName; } // the following 4 methods are related to switch to wrapping mode void MoveListeners(); ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > CreateTemporarySubstorage( ::rtl::OUString& o_aStorageName ); ::rtl::OUString MoveToTemporarySubstream(); sal_Bool TryToConvertToOOo(); public: // in case a new object must be created the class ID must be specified OleEmbeddedObject( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xFactory, const ::com::sun::star::uno::Sequence< sal_Int8 >& aClassID, const ::rtl::OUString& aClassName ); // in case object will be loaded from a persistent entry or from a file the class ID will be detected on loading // factory can do it for OOo objects, but for OLE objects OS dependent code is required OleEmbeddedObject( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xFactory, sal_Bool bLink ); #ifdef WNT // this constructor let object be initialized from clipboard OleEmbeddedObject( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xFactory ); #endif virtual ~OleEmbeddedObject(); #ifdef WNT void OnIconChanged_Impl(); void OnViewChanged_Impl(); void OnClosed_Impl(); #endif // XEmbeddedObject virtual void SAL_CALL changeState( sal_Int32 nNewState ) throw ( ::com::sun::star::embed::UnreachableStateException, ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL getReachableStates() throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::RuntimeException ); virtual sal_Int32 SAL_CALL getCurrentState() throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL doVerb( sal_Int32 nVerbID ) throw ( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::embed::WrongStateException, ::com::sun::star::embed::UnreachableStateException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Sequence< ::com::sun::star::embed::VerbDescriptor > SAL_CALL getSupportedVerbs() throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL setClientSite( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedClient >& xClient ) throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedClient > SAL_CALL getClientSite() throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL update() throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL setUpdateMode( sal_Int32 nMode ) throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::RuntimeException ); virtual sal_Int64 SAL_CALL getStatus( sal_Int64 nAspect ) throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL setContainerName( const ::rtl::OUString& sName ) throw ( ::com::sun::star::uno::RuntimeException ); // XVisualObject virtual void SAL_CALL setVisualAreaSize( sal_Int64 nAspect, const ::com::sun::star::awt::Size& aSize ) throw ( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::awt::Size SAL_CALL getVisualAreaSize( sal_Int64 nAspect ) throw ( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::embed::VisualRepresentation SAL_CALL getPreferredVisualRepresentation( ::sal_Int64 nAspect ) throw ( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual sal_Int32 SAL_CALL getMapUnit( sal_Int64 nAspect ) throw ( ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); // XEmbedPersist virtual void SAL_CALL setPersistentEntry( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, const ::rtl::OUString& sEntName, sal_Int32 nEntryConnectionMode, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs ) throw ( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::embed::WrongStateException, ::com::sun::star::io::IOException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL storeToEntry( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, const ::rtl::OUString& sEntName, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs ) throw ( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::embed::WrongStateException, ::com::sun::star::io::IOException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL storeAsEntry( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, const ::rtl::OUString& sEntName, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs ) throw ( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::embed::WrongStateException, ::com::sun::star::io::IOException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL saveCompleted( sal_Bool bUseNew ) throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL hasEntry() throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::RuntimeException ); virtual ::rtl::OUString SAL_CALL getEntryName() throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::RuntimeException ); // XLinkageSupport virtual void SAL_CALL breakLink( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, const ::rtl::OUString& sEntName ) throw ( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::embed::WrongStateException, ::com::sun::star::io::IOException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL isLink() throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::RuntimeException); virtual ::rtl::OUString SAL_CALL getLinkURL() throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); // XCommonEmbedPersist virtual void SAL_CALL storeOwn() throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::io::IOException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL isReadonly() throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL reload( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs ) throw ( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::embed::WrongStateException, ::com::sun::star::io::IOException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); // XClassifiedObject virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getClassID() throw ( ::com::sun::star::uno::RuntimeException ); virtual ::rtl::OUString SAL_CALL getClassName() throw ( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL setClassInfo( const ::com::sun::star::uno::Sequence< sal_Int8 >& aClassID, const ::rtl::OUString& aClassName ) throw ( ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException ); // XStateChangeBroadcaster virtual void SAL_CALL addStateChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStateChangeListener >& xListener ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeStateChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStateChangeListener >& xListener ) throw (::com::sun::star::uno::RuntimeException); // XComponentSupplier virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable > SAL_CALL getComponent() throw ( ::com::sun::star::uno::RuntimeException ); // XCloseable virtual void SAL_CALL close( sal_Bool DeliverOwnership ) throw ( ::com::sun::star::util::CloseVetoException, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL addCloseListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseListener >& Listener ) throw ( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL removeCloseListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseListener >& Listener ) throw ( ::com::sun::star::uno::RuntimeException ); // XEventBroadcaster virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XEventListener >& Listener ) throw ( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XEventListener >& Listener ) throw ( ::com::sun::star::uno::RuntimeException ); // XInplaceObject ( only for wrapping scenario here ) virtual void SAL_CALL setObjectRectangles( const ::com::sun::star::awt::Rectangle& aPosRect, const ::com::sun::star::awt::Rectangle& aClipRect ) throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL enableModeless( sal_Bool bEnable ) throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL translateAccelerators( const ::com::sun::star::uno::Sequence< ::com::sun::star::awt::KeyEvent >& aKeys ) throw ( ::com::sun::star::embed::WrongStateException, ::com::sun::star::uno::RuntimeException ); // XChild ( only for wrapping scenario here ) virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getParent( ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL setParent( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& Parent ) throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException); }; #endif