diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2024-03-27 17:50:56 +0500 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2024-03-27 17:50:56 +0500 |
commit | 1852648e4e5365fc0c6cc2a1647863d8329e9987 (patch) | |
tree | 23c24a6fc558ee205fd0fd86b60423f0a9d4c853 | |
parent | Revert "Use weak reference to SfxObjectShell in SfxEventHint to avoid use-aft... (diff) | |
download | core-1852648e4e5365fc0c6cc2a1647863d8329e9987.tar.gz core-1852648e4e5365fc0c6cc2a1647863d8329e9987.zip |
Revert "Reimplement OleComponentNative_Impl to use IGlobalInterfaceTable"
This reverts commit 6ea9f4fac8112267e78e210650b3c58a4c7a0e99.
-rw-r--r-- | embeddedobj/source/inc/oleembobj.hxx | 14 | ||||
-rw-r--r-- | embeddedobj/source/msole/olecomponent.cxx | 531 | ||||
-rw-r--r-- | embeddedobj/source/msole/olecomponent.hxx | 12 | ||||
-rw-r--r-- | embeddedobj/source/msole/oleembed.cxx | 21 | ||||
-rw-r--r-- | embeddedobj/source/msole/olevisual.cxx | 7 |
5 files changed, 228 insertions, 357 deletions
diff --git a/embeddedobj/source/inc/oleembobj.hxx b/embeddedobj/source/inc/oleembobj.hxx index 274ecfaf8847..a59a33551f06 100644 --- a/embeddedobj/source/inc/oleembobj.hxx +++ b/embeddedobj/source/inc/oleembobj.hxx @@ -453,18 +453,4 @@ public: css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; }; -class ClearedMutexArea -{ -public: - ClearedMutexArea(osl::ResettableMutexGuard& guard) - : m_guard(guard) - { - m_guard.clear(); - } - ~ClearedMutexArea() { m_guard.reset(); } - -private: - osl::ResettableMutexGuard& m_guard; -}; - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/embeddedobj/source/msole/olecomponent.cxx b/embeddedobj/source/msole/olecomponent.cxx index da10b9d9d233..fccad3dc9577 100644 --- a/embeddedobj/source/msole/olecomponent.cxx +++ b/embeddedobj/source/msole/olecomponent.cxx @@ -42,7 +42,6 @@ #include <o3tl/char16_t2wchar_t.hxx> #include <o3tl/unit_conversion.hxx> #include <systools/win32/comtools.hxx> -#include <vcl/svapp.hxx> #include <vcl/threadex.hxx> #include "graphconvert.hxx" @@ -60,81 +59,23 @@ using namespace ::comphelper; #define MAX_ENUM_ELE 20 #define FORMATS_NUM 3 +typedef std::vector< FORMATETC* > FormatEtcList; + FORMATETC const pFormatTemplates[FORMATS_NUM] = { { CF_ENHMETAFILE, nullptr, 0, -1, TYMED_ENHMF }, { CF_METAFILEPICT, nullptr, 0, -1, TYMED_MFPICT }, { CF_BITMAP, nullptr, 0, -1, TYMED_GDI } }; -// We have at least one single-threaded apartment (STA) in the process (the VCL Main thread, which -// is the GUI thread), and a multithreaded apartment (MTA) for most of other threads. OLE objects -// may be created in either: in interactive mode, this typically happens in the STA; when serving -// external requests, this may be either in STA (when explicit "OnMainThread" argument is passed to -// loadComponentFromURL, and the instantiation of the object happens during the load), or in MTA -// (the thread actually serving the incoming calls). -// -// The objects typically can only be used in the appartment where they were instantiated. This means -// that e.g. a call to IOleObject::Close will fail, if it is performed in a different thread, when -// it was started in the main thread. And vice versa, opening a document in a handler thread, then -// trying to interact with the OLE object in GUI would fail. -// -// To handle this, several workarounds were implemented in the past; the mentioned "OnMainThread" -// argument is one of these, allowing open document requests be processed not in the handler threads -// that receired the request, but in the main thread which will then be used for interaction. Also -// OleComponent::GetExtent was changed to check if the first call to IDataObject::GetData failed -// with RPC_E_WRONG_THREAD, and then retry in the main thread. -// -// But ultimately every call to the OLE object needs such checks. E.g., failing to close the object -// keeps the server running, effectively leaking resources, until it crashes/freezes after multiple -// iterations. -// -// Currently, OleComponentNative_Impl is implemented using IGlobalInterfaceTable, which allows to -// register an object in process-global instance of the table from the thread that instantiated the -// object, and obtain a "cookie" (a number); and then use that cookie from any thread to access that -// object. The global table will do its magic to provide either the original object (when it is -// requested from the same apartment as used for its registration), or a "proxy", which will marshal -// all calls to the proper thread, transparently for the caller. This implementation should obsolete -// the previous workarounds (in theory). -// -// m_pGlobalTable is the reference to the global table. -// The storage object gets registered in the global table immediately when it's created. -// But the OLE object itself can't be registered immediately, before it is run: an attempt to call -// RegisterInterfaceInGlobal with such a newly created OLE object fails with CO_E_OBJNOTCONNECTED. -// Thus, the initial reference to the OLE object (which at this stage seems to be apartment-neutral) -// is stored to m_pObj. Only when it is run, it is registered in the global table. -// -// Indeed, the implicit change of the thread is a blocking operation, which opens a wonderful new -// opportunities for shiny deadlocks. Thus, precautions are needed to avoid them. -// -// When the OLE object is accessed by m_pObj (should be only in initialization code!), no measures -// are taken to change locking. But when it is accessed by getObj() - which may return the proxy - -// the calls are guarded by a SolarMutexReleaser, to allow the other thread do its job. -// -// There are at least two other mutexes in play here. One is in OleEmbeddedObject, that holds the -// OleComponent. The calls to OleComponent's methods are also wrapped there into unlock/lock pairs -// (see OleEmbeddedObject::changeState). The other is in OleComponent itself. For now, I see no -// deadlocks caused by that mutex, so no unlock/lock is introduced for that. It may turn out to be -// required eventually. -class OleComponentNative_Impl -{ -public: +struct OleComponentNative_Impl { sal::systools::COMReference< IUnknown > m_pObj; + sal::systools::COMReference< IOleObject > m_pOleObject; + sal::systools::COMReference< IViewObject2 > m_pViewObject2; + sal::systools::COMReference< IStorage > m_pIStorage; + FormatEtcList m_aFormatsList; uno::Sequence< datatransfer::DataFlavor > m_aSupportedGraphFormats; - // The getters may return a proxy, that redirects the calls to another thread. - // Thus, calls to methods of returned objects must be inside solar mutex releaser. - auto getStorage() const { return getInterface<IStorage>(m_nStorage); } - auto getObj() const { return m_nOleObject ? getInterface<IUnknown>(m_nOleObject) : m_pObj; } - template <typename T> - auto get() const { return getObj().QueryInterface<T>(sal::systools::COM_QUERY); } - - void registerStorage(IStorage* pStorage) { registerInterface(pStorage, m_nStorage); } - void registerObj() { registerInterface(m_pObj.get(), m_nOleObject); } - - bool IsStorageRegistered() const { return m_nStorage != 0; } - OleComponentNative_Impl() - : m_pGlobalTable(CLSID_StdGlobalInterfaceTable, nullptr, CLSCTX_INPROC_SERVER) { // TODO: Extend format list m_aSupportedGraphFormats = { @@ -166,14 +107,6 @@ public: }; } - ~OleComponentNative_Impl() - { - if (m_nOleObject) - m_pGlobalTable->RevokeInterfaceFromGlobal(m_nOleObject); - if (m_nStorage) - m_pGlobalTable->RevokeInterfaceFromGlobal(m_nStorage); - } - bool ConvertDataForFlavor( const STGMEDIUM& aMedium, const datatransfer::DataFlavor& aFlavor, uno::Any& aResult ); @@ -181,39 +114,8 @@ public: bool GraphicalFlavor( const datatransfer::DataFlavor& aFlavor ); uno::Sequence< datatransfer::DataFlavor > GetFlavorsForAspects( sal_uInt32 nSupportedAspects ); - - sal::systools::COMReference<IStorage> CreateNewStorage(const OUString& url); - -private: - sal::systools::COMReference<IGlobalInterfaceTable> m_pGlobalTable; - DWORD m_nStorage = 0; - DWORD m_nOleObject = 0; - - template <typename T> sal::systools::COMReference<T> getInterface(DWORD cookie) const - { - sal::systools::COMReference<T> result; - HRESULT hr = m_pGlobalTable->GetInterfaceFromGlobal(cookie, IID_PPV_ARGS(&result)); - SAL_WARN_IF(FAILED(hr), "embeddedobj.ole", - "GetInterfaceFromGlobal failed: is cookie " << cookie << " not registered?"); - return result; - } - - template <typename T> void registerInterface(T* pInterface, DWORD& cookie) - { - assert(cookie == 0); // do not set again - HRESULT hr = m_pGlobalTable->RegisterInterfaceInGlobal(pInterface, __uuidof(T), &cookie); - SAL_WARN_IF(FAILED(hr), "embeddedobj.ole", "RegisterInterfaceInGlobal failed"); - } }; -namespace -{ -struct SafeSolarMutexReleaser -{ - SolarMutexGuard guard; // To make sure we actually hold it prior to release - SolarMutexReleaser releaser; -}; -} static DWORD GetAspectFromFlavor( const datatransfer::DataFlavor& aFlavor ) { @@ -245,6 +147,23 @@ static OUString GetFlavorSuffixFromAspect( DWORD nAsp ) } +static HRESULT OpenIStorageFromURL_Impl( const OUString& aURL, IStorage** ppIStorage ) +{ + OSL_ENSURE( ppIStorage, "The pointer must not be empty!" ); + + OUString aFilePath; + if ( !ppIStorage || ::osl::FileBase::getSystemPathFromFileURL( aURL, aFilePath ) != ::osl::FileBase::E_None ) + throw uno::RuntimeException(); // TODO: something dangerous happened + + return StgOpenStorage( o3tl::toW(aFilePath.getStr()), + nullptr, + STGM_READWRITE | STGM_TRANSACTED, // | STGM_DELETEONRELEASE, + nullptr, + 0, + ppIStorage ); +} + + bool OleComponentNative_Impl::ConvertDataForFlavor( const STGMEDIUM& aMedium, const datatransfer::DataFlavor& aFlavor, uno::Any& aResult ) @@ -401,10 +320,12 @@ OleComponent::OleComponent( const uno::Reference< uno::XComponentContext >& xCon : m_pInterfaceContainer( nullptr ) , m_bDisposed( false ) , m_bModified( false ) -, m_pNativeImpl( std::make_unique<OleComponentNative_Impl>() ) +, m_pNativeImpl( new OleComponentNative_Impl() ) , m_pUnoOleObject( pUnoOleObject ) , m_pOleWrapClientSite( nullptr ) , m_pImplAdviseSink( nullptr ) +, m_nOLEMiscFlags( 0 ) +, m_nAdvConn( 0 ) , m_xContext( xContext ) , m_bOleInitialized( false ) , m_bWorkaroundActive( false ) @@ -442,6 +363,14 @@ OleComponent::~OleComponent() Dispose(); } catch( const uno::Exception& ) {} } + + for (auto const& format : m_pNativeImpl->m_aFormatsList) + { + delete format; + } + m_pNativeImpl->m_aFormatsList.clear(); + + delete m_pNativeImpl; } void OleComponent::Dispose() @@ -499,37 +428,30 @@ void OleComponent::disconnectEmbeddedObject() } -OUString OleComponent::getTempURL() const +void OleComponent::CreateNewIStorage_Impl() { + // TODO: in future a global memory could be used instead of file. + + // write the stream to the temporary file + OUString aTempURL; + OSL_ENSURE( m_pUnoOleObject, "Unexpected object absence!" ); if ( m_pUnoOleObject ) - return m_pUnoOleObject->CreateTempURLEmpty_Impl(); + aTempURL = m_pUnoOleObject->CreateTempURLEmpty_Impl(); else - return GetNewTempFileURL_Impl(m_xContext); -} - - -sal::systools::COMReference<IStorage> OleComponentNative_Impl::CreateNewStorage(const OUString& url) -{ - if (IsStorageRegistered()) - throw io::IOException(); // TODO:the object is already initialized - // TODO: in future a global memory could be used instead of file. + aTempURL = GetNewTempFileURL_Impl( m_xContext ); - // write the stream to the temporary file - if (url.isEmpty()) + if ( !aTempURL.getLength() ) throw uno::RuntimeException(); // TODO // open an IStorage based on the temporary file OUString aTempFilePath; - if (osl::FileBase::getSystemPathFromFileURL(url, aTempFilePath) != osl::FileBase::E_None) + if ( ::osl::FileBase::getSystemPathFromFileURL( aTempURL, aTempFilePath ) != ::osl::FileBase::E_None ) throw uno::RuntimeException(); // TODO: something dangerous happened - sal::systools::COMReference<IStorage> pStorage; - HRESULT hr = StgCreateDocfile( o3tl::toW(aTempFilePath.getStr()), STGM_CREATE | STGM_READWRITE | STGM_TRANSACTED | STGM_DELETEONRELEASE, 0, &pStorage ); - if (FAILED(hr) || !pStorage) + HRESULT hr = StgCreateDocfile( o3tl::toW(aTempFilePath.getStr()), STGM_CREATE | STGM_READWRITE | STGM_TRANSACTED | STGM_DELETEONRELEASE, 0, &m_pNativeImpl->m_pIStorage ); + if ( FAILED( hr ) || !m_pNativeImpl->m_pIStorage ) throw io::IOException(); // TODO: transport error code? - registerStorage(pStorage); - return pStorage; } @@ -559,19 +481,16 @@ uno::Sequence< datatransfer::DataFlavor > OleComponentNative_Impl::GetFlavorsFor void OleComponent::RetrieveObjectDataFlavors_Impl() { - if (!m_pNativeImpl->m_pObj) + if ( !m_pNativeImpl->m_pOleObject ) throw embed::WrongStateException(); // TODO: the object is in wrong state if ( !m_aDataFlavors.getLength() ) { - if (auto pDataObject = m_pNativeImpl->get<IDataObject>()) + sal::systools::COMReference< IDataObject > pDataObject(m_pNativeImpl->m_pObj, sal::systools::COM_QUERY); + if ( pDataObject ) { - HRESULT hr; sal::systools::COMReference< IEnumFORMATETC > pFormatEnum; - { - SafeSolarMutexReleaser releaser; - hr = pDataObject->EnumFormatEtc(DATADIR_GET, &pFormatEnum); - } + HRESULT hr = pDataObject->EnumFormatEtc( DATADIR_GET, &pFormatEnum ); if ( SUCCEEDED( hr ) && pFormatEnum ) { FORMATETC pElem[ MAX_ENUM_ELE ]; @@ -611,20 +530,19 @@ void OleComponent::RetrieveObjectDataFlavors_Impl() } -void OleComponent::InitializeObject_Impl() +bool OleComponent::InitializeObject_Impl() // There will be no static objects! { if ( !m_pNativeImpl->m_pObj ) - throw embed::WrongStateException(); + return false; // the linked object will be detected here OSL_ENSURE( m_pUnoOleObject, "Unexpected object absence!" ); if ( m_pUnoOleObject ) m_pUnoOleObject->SetObjectIsLink_Impl( m_pNativeImpl->m_pObj.QueryInterface<IOleLink>(sal::systools::COM_QUERY).is() ); - auto pViewObject2(m_pNativeImpl->m_pObj.QueryInterface<IViewObject2>(sal::systools::COM_QUERY)); - if (!pViewObject2) - throw uno::RuntimeException(); // TODO + if ( !m_pNativeImpl->m_pViewObject2.set(m_pNativeImpl->m_pObj, sal::systools::COM_QUERY) ) + return false; // remove all the caches if ( sal::systools::COMReference< IOleCache > pIOleCache{ m_pNativeImpl->m_pObj, sal::systools::COM_QUERY } ) @@ -647,24 +565,23 @@ void OleComponent::InitializeObject_Impl() hr2 = pIOleCache->Cache( &aFormat, ADVFCACHE_ONSAVE, &nConn ); } - auto pOleObject(m_pNativeImpl->m_pObj.QueryInterface<IOleObject>(sal::systools::COM_QUERY)); - if (!pOleObject) - throw uno::RuntimeException(); // Static objects are not supported, they should be inserted as graphics + if ( !m_pNativeImpl->m_pOleObject.set(m_pNativeImpl->m_pObj, sal::systools::COM_QUERY) ) + return false; // Static objects are not supported, they should be inserted as graphics - DWORD nOLEMiscFlags(0); - pOleObject->GetMiscStatus(DVASPECT_CONTENT, reinterpret_cast<DWORD*>(&nOLEMiscFlags)); + m_pNativeImpl->m_pOleObject->GetMiscStatus( DVASPECT_CONTENT, reinterpret_cast<DWORD*>(&m_nOLEMiscFlags) ); // TODO: use other misc flags also // the object should have drawable aspect even in case it supports only iconic representation - // if ( nOLEMiscFlags & OLEMISC_ONLYICONIC ) + // if ( m_nOLEMiscFlags & OLEMISC_ONLYICONIC ) - pOleObject->SetClientSite(m_pOleWrapClientSite); + m_pNativeImpl->m_pOleObject->SetClientSite( m_pOleWrapClientSite ); // the only need in this registration is workaround for close notification - DWORD nAdvConn(0); - pOleObject->Advise(m_pImplAdviseSink, reinterpret_cast<DWORD*>(&nAdvConn)); - pViewObject2->SetAdvise(DVASPECT_CONTENT, 0, m_pImplAdviseSink); + m_pNativeImpl->m_pOleObject->Advise( m_pImplAdviseSink, reinterpret_cast<DWORD*>(&m_nAdvConn) ); + m_pNativeImpl->m_pViewObject2->SetAdvise( DVASPECT_CONTENT, 0, m_pImplAdviseSink ); - OleSetContainedObject(pOleObject, TRUE); + OleSetContainedObject( m_pNativeImpl->m_pOleObject, TRUE ); + + return true; } namespace @@ -699,62 +616,62 @@ void OleComponent::LoadEmbeddedObject( const OUString& aTempURL ) if ( !aTempURL.getLength() ) throw lang::IllegalArgumentException(); // TODO - if (m_pNativeImpl->IsStorageRegistered()) + if ( m_pNativeImpl->m_pIStorage ) throw io::IOException(); // TODO the object is already initialized or wrong initialization is done // open an IStorage based on the temporary file - OUString aFilePath; - if (osl::FileBase::getSystemPathFromFileURL(aTempURL, aFilePath) != ::osl::FileBase::E_None) - throw uno::RuntimeException(); // TODO: something dangerous happened + HRESULT hr = OpenIStorageFromURL_Impl( aTempURL, &m_pNativeImpl->m_pIStorage ); - sal::systools::COMReference<IStorage> pStorage; - HRESULT hr = StgOpenStorage(o3tl::toW(aFilePath.getStr()), nullptr, - STGM_READWRITE | STGM_TRANSACTED, // | STGM_DELETEONRELEASE, - nullptr, 0, &pStorage); - if (FAILED(hr) || !pStorage) + if ( FAILED( hr ) || !m_pNativeImpl->m_pIStorage ) throw io::IOException(); // TODO: transport error code? - m_pNativeImpl->registerStorage(pStorage); - - hr = OleLoadSeh(pStorage, &m_pNativeImpl->m_pObj); - if (FAILED(hr)) + hr = OleLoadSeh(m_pNativeImpl->m_pIStorage, &m_pNativeImpl->m_pObj); + if ( FAILED( hr ) || !m_pNativeImpl->m_pObj ) + { throw uno::RuntimeException(); + } - InitializeObject_Impl(); + if ( !InitializeObject_Impl() ) + throw uno::RuntimeException(); // TODO } void OleComponent::CreateObjectFromClipboard() { - auto pStorage(m_pNativeImpl->CreateNewStorage(getTempURL())); - if (!pStorage) + if ( m_pNativeImpl->m_pIStorage ) + throw io::IOException(); // TODO:the object is already initialized + + CreateNewIStorage_Impl(); + if ( !m_pNativeImpl->m_pIStorage ) throw uno::RuntimeException(); // TODO IDataObject * pDO = nullptr; HRESULT hr = OleGetClipboard( &pDO ); - if (FAILED(hr)) - throw uno::RuntimeException(); - - hr = OleQueryCreateFromData(pDO); - if (S_OK == hr) + if( SUCCEEDED( hr ) && pDO ) { - hr = OleCreateFromData( pDO, - IID_IUnknown, - OLERENDER_DRAW, // OLERENDER_FORMAT - nullptr, // &aFormat, - nullptr, - pStorage, - IID_PPV_ARGS_Helper(&m_pNativeImpl->m_pObj) ); - if (FAILED(hr)) - throw uno::RuntimeException(); - } - else - { - // Static objects are not supported - pDO->Release(); + hr = OleQueryCreateFromData( pDO ); + if( S_OK == GetScode( hr ) ) + { + hr = OleCreateFromData( pDO, + IID_IUnknown, + OLERENDER_DRAW, // OLERENDER_FORMAT + nullptr, // &aFormat, + nullptr, + m_pNativeImpl->m_pIStorage, + reinterpret_cast<void**>(&m_pNativeImpl->m_pObj) ); + } + else + { + // Static objects are not supported + pDO->Release(); + } } - InitializeObject_Impl(); + if ( FAILED( hr ) || !m_pNativeImpl->m_pObj ) + throw uno::RuntimeException(); + + if ( !InitializeObject_Impl() ) + throw uno::RuntimeException(); // TODO } @@ -765,8 +682,11 @@ void OleComponent::CreateNewEmbeddedObject( const uno::Sequence< sal_Int8 >& aSe if ( !GetClassIDFromSequence_Impl( aSeqCLSID, aClsID ) ) throw lang::IllegalArgumentException(); // TODO - auto pStorage(m_pNativeImpl->CreateNewStorage(getTempURL())); - if (!pStorage) + if ( m_pNativeImpl->m_pIStorage ) + throw io::IOException(); // TODO:the object is already initialized + + CreateNewIStorage_Impl(); + if ( !m_pNativeImpl->m_pIStorage ) throw uno::RuntimeException(); // TODO // FORMATETC aFormat = { CF_METAFILEPICT, NULL, nAspect, -1, TYMED_MFPICT }; // for OLE..._DRAW should be NULL @@ -776,12 +696,14 @@ void OleComponent::CreateNewEmbeddedObject( const uno::Sequence< sal_Int8 >& aSe OLERENDER_DRAW, // OLERENDER_FORMAT nullptr, // &aFormat, nullptr, - pStorage, - IID_PPV_ARGS_Helper(&m_pNativeImpl->m_pObj) ); - if (FAILED(hr)) + m_pNativeImpl->m_pIStorage, + reinterpret_cast<void**>(&m_pNativeImpl->m_pObj) ); + + if ( FAILED( hr ) || !m_pNativeImpl->m_pObj ) throw uno::RuntimeException(); // TODO - InitializeObject_Impl(); + if ( !InitializeObject_Impl() ) + throw uno::RuntimeException(); // TODO // TODO: getExtent??? } @@ -800,8 +722,11 @@ void OleComponent::CreateObjectFromData( const uno::Reference< datatransfer::XTr void OleComponent::CreateObjectFromFile( const OUString& aFileURL ) { - auto pStorage(m_pNativeImpl->CreateNewStorage(getTempURL())); - if (!pStorage) + if ( m_pNativeImpl->m_pIStorage ) + throw io::IOException(); // TODO:the object is already initialized + + CreateNewIStorage_Impl(); + if ( !m_pNativeImpl->m_pIStorage ) throw uno::RuntimeException(); // TODO: OUString aFilePath; @@ -814,19 +739,24 @@ void OleComponent::CreateObjectFromFile( const OUString& aFileURL ) OLERENDER_DRAW, // OLERENDER_FORMAT nullptr, nullptr, - pStorage, - IID_PPV_ARGS_Helper(&m_pNativeImpl->m_pObj) ); - if (FAILED(hr)) + m_pNativeImpl->m_pIStorage, + reinterpret_cast<void**>(&m_pNativeImpl->m_pObj) ); + + if ( FAILED( hr ) || !m_pNativeImpl->m_pObj ) throw uno::RuntimeException(); // TODO - InitializeObject_Impl(); + if ( !InitializeObject_Impl() ) + throw uno::RuntimeException(); // TODO } void OleComponent::CreateLinkFromFile( const OUString& aFileURL ) { - auto pStorage(m_pNativeImpl->CreateNewStorage(getTempURL())); - if (!pStorage) + if ( m_pNativeImpl->m_pIStorage ) + throw io::IOException(); // TODO:the object is already initialized + + CreateNewIStorage_Impl(); + if ( !m_pNativeImpl->m_pIStorage ) throw uno::RuntimeException(); // TODO: OUString aFilePath; @@ -838,33 +768,31 @@ void OleComponent::CreateLinkFromFile( const OUString& aFileURL ) OLERENDER_DRAW, // OLERENDER_FORMAT nullptr, nullptr, - pStorage, - IID_PPV_ARGS_Helper(&m_pNativeImpl->m_pObj) ); - if (FAILED(hr)) + m_pNativeImpl->m_pIStorage, + reinterpret_cast<void**>(&m_pNativeImpl->m_pObj) ); + + if ( FAILED( hr ) || !m_pNativeImpl->m_pObj ) throw uno::RuntimeException(); // TODO - InitializeObject_Impl(); + if ( !InitializeObject_Impl() ) + throw uno::RuntimeException(); // TODO } void OleComponent::InitEmbeddedCopyOfLink( rtl::Reference<OleComponent> const & pOleLinkComponent ) { - if (!pOleLinkComponent) + if ( !pOleLinkComponent || !pOleLinkComponent->m_pNativeImpl->m_pObj ) throw lang::IllegalArgumentException(); // TODO - auto pOleLinkComponentObj(pOleLinkComponent->m_pNativeImpl->getObj()); - if (!pOleLinkComponentObj) - throw lang::IllegalArgumentException(); - - // the object must be already disconnected from the temporary URL - auto pStorage(m_pNativeImpl->CreateNewStorage(getTempURL())); - - SafeSolarMutexReleaser releaser; + if ( m_pNativeImpl->m_pIStorage ) + throw io::IOException(); // TODO:the object is already initialized - auto pDataObject(pOleLinkComponentObj.QueryInterface<IDataObject>(sal::systools::COM_QUERY)); + sal::systools::COMReference< IDataObject > pDataObject(pOleLinkComponent->m_pNativeImpl->m_pObj, sal::systools::COM_QUERY); if ( pDataObject && SUCCEEDED( OleQueryCreateFromData( pDataObject ) ) ) { - if (!pStorage) + // the object must be already disconnected from the temporary URL + CreateNewIStorage_Impl(); + if ( !m_pNativeImpl->m_pIStorage ) throw uno::RuntimeException(); // TODO: OleCreateFromData( pDataObject, @@ -872,13 +800,13 @@ void OleComponent::InitEmbeddedCopyOfLink( rtl::Reference<OleComponent> const & OLERENDER_DRAW, nullptr, nullptr, - pStorage, - IID_PPV_ARGS_Helper(&m_pNativeImpl->m_pObj) ); + m_pNativeImpl->m_pIStorage, + reinterpret_cast<void**>(&m_pNativeImpl->m_pObj) ); } if ( !m_pNativeImpl->m_pObj ) { - auto pOleLink(pOleLinkComponentObj.QueryInterface<IOleLink>(sal::systools::COM_QUERY)); + sal::systools::COMReference< IOleLink > pOleLink(m_pNativeImpl->m_pObj, sal::systools::COM_QUERY); if ( !pOleLink ) throw io::IOException(); // TODO: the object doesn't support IOleLink @@ -910,8 +838,8 @@ void OleComponent::InitEmbeddedCopyOfLink( rtl::Reference<OleComponent> const & OLERENDER_DRAW, // OLERENDER_FORMAT nullptr, nullptr, - pStorage, - IID_PPV_ARGS_Helper(&m_pNativeImpl->m_pObj) ); + m_pNativeImpl->m_pIStorage, + reinterpret_cast<void**>(&m_pNativeImpl->m_pObj) ); } } @@ -923,29 +851,33 @@ void OleComponent::InitEmbeddedCopyOfLink( rtl::Reference<OleComponent> const & if ( SUCCEEDED( hr ) && pBindCtx ) { sal::systools::COMReference< IStorage > pObjectStorage; - hr = pMoniker->BindToStorage(pBindCtx, nullptr, IID_PPV_ARGS(&pObjectStorage)); + hr = pMoniker->BindToStorage( pBindCtx, nullptr, IID_IStorage, reinterpret_cast<void**>(&pObjectStorage) ); if ( SUCCEEDED( hr ) && pObjectStorage ) { - hr = pObjectStorage->CopyTo(0, nullptr, nullptr, pStorage); + hr = pObjectStorage->CopyTo( 0, nullptr, nullptr, m_pNativeImpl->m_pIStorage ); if ( SUCCEEDED( hr ) ) - hr = OleLoadSeh(pStorage, &m_pNativeImpl->m_pObj); + hr = OleLoadSeh(m_pNativeImpl->m_pIStorage, &m_pNativeImpl->m_pObj); } } } } - InitializeObject_Impl(); + // If object could not be created the only way is to use graphical representation + if ( !m_pNativeImpl->m_pObj ) + throw uno::RuntimeException(); // TODO + + if ( !InitializeObject_Impl() ) + throw uno::RuntimeException(); // TODO } void OleComponent::RunObject() { - auto pOleObject(m_pNativeImpl->get<IOleObject>()); - OSL_ENSURE(pOleObject, "The pointer can not be set to NULL here!"); - if (!pOleObject) + OSL_ENSURE( m_pNativeImpl->m_pOleObject, "The pointer can not be set to NULL here!" ); + if ( !m_pNativeImpl->m_pOleObject ) throw embed::WrongStateException(); // TODO: the object is in wrong state - if (!OleIsRunning(pOleObject)) + if ( !OleIsRunning( m_pNativeImpl->m_pOleObject ) ) { HRESULT hr = OleRun( m_pNativeImpl->m_pObj ); @@ -956,9 +888,6 @@ void OleComponent::RunObject() else throw io::IOException(); } - // Only now, when the object is activated, it can be registered in the global table; - // before this point, RegisterInterfaceInGlobal would return CO_E_OBJNOTCONNECTED - m_pNativeImpl->registerObj(); } } @@ -984,31 +913,20 @@ awt::Size OleComponent::CalculateWithFactor( const awt::Size& aSize, void OleComponent::CloseObject() { - auto pOleObject(m_pNativeImpl->get<IOleObject>()); - if (pOleObject && OleIsRunning(pOleObject)) - { - SafeSolarMutexReleaser releaser; - HRESULT hr = pOleObject->Close(OLECLOSE_NOSAVE); // must be saved before - SAL_WARN_IF(FAILED(hr), "embeddedobj.ole", "IOleObject::Close failed"); - } + if ( m_pNativeImpl->m_pOleObject && OleIsRunning( m_pNativeImpl->m_pOleObject ) ) + m_pNativeImpl->m_pOleObject->Close( OLECLOSE_NOSAVE ); // must be saved before } uno::Sequence< embed::VerbDescriptor > OleComponent::GetVerbList() { - auto pOleObject(m_pNativeImpl->get<IOleObject>()); - if (!pOleObject) + if ( !m_pNativeImpl->m_pOleObject ) throw embed::WrongStateException(); // TODO: the object is in wrong state if( !m_aVerbList.getLength() ) { sal::systools::COMReference< IEnumOLEVERB > pEnum; - HRESULT hr; - { - SafeSolarMutexReleaser releaser; - hr = pOleObject->EnumVerbs(&pEnum); - } - if (SUCCEEDED(hr)) + if( SUCCEEDED( m_pNativeImpl->m_pOleObject->EnumVerbs( &pEnum ) ) ) { OLEVERB szEle[ MAX_ENUM_ELE ]; ULONG nNum = 0; @@ -1016,7 +934,7 @@ uno::Sequence< embed::VerbDescriptor > OleComponent::GetVerbList() do { - hr = pEnum->Next(MAX_ENUM_ELE, szEle, &nNum); + HRESULT hr = pEnum->Next( MAX_ENUM_ELE, szEle, &nNum ); if( hr == S_OK || hr == S_FALSE ) { m_aVerbList.realloc( nSeqSize += nNum ); @@ -1042,17 +960,16 @@ uno::Sequence< embed::VerbDescriptor > OleComponent::GetVerbList() void OleComponent::ExecuteVerb( sal_Int32 nVerbID ) { - RunObject(); - - auto pOleObject(m_pNativeImpl->get<IOleObject>()); - if (!pOleObject) + if ( !m_pNativeImpl->m_pOleObject ) throw embed::WrongStateException(); // TODO - SafeSolarMutexReleaser releaser; + HRESULT hr = OleRun( m_pNativeImpl->m_pOleObject ); + if ( FAILED( hr ) ) + throw io::IOException(); // TODO: a specific exception that transport error code can be thrown here // TODO: probably extents should be set here and stored in aRect // TODO: probably the parent window also should be set - HRESULT hr = pOleObject->DoVerb(nVerbID, nullptr, m_pOleWrapClientSite, 0, nullptr, nullptr); + hr = m_pNativeImpl->m_pOleObject->DoVerb( nVerbID, nullptr, m_pOleWrapClientSite, 0, nullptr, nullptr ); if ( FAILED( hr ) ) throw io::IOException(); // TODO @@ -1061,29 +978,22 @@ void OleComponent::ExecuteVerb( sal_Int32 nVerbID ) void OleComponent::SetHostName( const OUString& aEmbDocName ) { - auto pOleObject(m_pNativeImpl->get<IOleObject>()); - if (!pOleObject) + if ( !m_pNativeImpl->m_pOleObject ) throw embed::WrongStateException(); // TODO: the object is in wrong state - SafeSolarMutexReleaser releaser; - pOleObject->SetHostNames(L"app name", o3tl::toW(aEmbDocName.getStr())); + m_pNativeImpl->m_pOleObject->SetHostNames( L"app name", o3tl::toW( aEmbDocName.getStr() ) ); } void OleComponent::SetExtent( const awt::Size& aVisAreaSize, sal_Int64 nAspect ) { - auto pOleObject(m_pNativeImpl->get<IOleObject>()); - if (!pOleObject) + if ( !m_pNativeImpl->m_pOleObject ) throw embed::WrongStateException(); // TODO: the object is in wrong state DWORD nMSAspect = static_cast<DWORD>(nAspect); // first 32 bits are for MS aspects SIZEL aSize = { aVisAreaSize.Width, aVisAreaSize.Height }; - HRESULT hr; - { - SafeSolarMutexReleaser releaser; - hr = pOleObject->SetExtent(nMSAspect, &aSize); - } + HRESULT hr = m_pNativeImpl->m_pOleObject->SetExtent( nMSAspect, &aSize ); if ( FAILED( hr ) ) { @@ -1099,7 +1009,7 @@ void OleComponent::SetExtent( const awt::Size& aVisAreaSize, sal_Int64 nAspect ) awt::Size OleComponent::GetExtent( sal_Int64 nAspect ) { - if (!m_pNativeImpl->m_pObj) + if ( !m_pNativeImpl->m_pOleObject ) throw embed::WrongStateException(); // TODO: the object is in wrong state DWORD nMSAspect = static_cast<DWORD>(nAspect); // first 32 bits are for MS aspects @@ -1109,17 +1019,14 @@ awt::Size OleComponent::GetExtent( sal_Int64 nAspect ) if ( nMSAspect == DVASPECT_CONTENT ) { // Try to get the size from the replacement image first - if (auto pDataObject = m_pNativeImpl->get<IDataObject>()) + sal::systools::COMReference< IDataObject > pDataObject(m_pNativeImpl->m_pObj, sal::systools::COM_QUERY); + if ( pDataObject ) { STGMEDIUM aMedium; FORMATETC aFormat = pFormatTemplates[1]; // use windows metafile format aFormat.dwAspect = nMSAspect; - HRESULT hr; - { - SafeSolarMutexReleaser releaser; - hr = pDataObject->GetData(&aFormat, &aMedium); - } + HRESULT hr = pDataObject->GetData( &aFormat, &aMedium ); if (hr == RPC_E_WRONG_THREAD) { @@ -1195,18 +1102,13 @@ awt::Size OleComponent::GetExtent( sal_Int64 nAspect ) awt::Size OleComponent::GetCachedExtent( sal_Int64 nAspect ) { - auto pViewObject2(m_pNativeImpl->get<IViewObject2>()); - if (!pViewObject2) + if (!m_pNativeImpl->m_pViewObject2) throw embed::WrongStateException(); // TODO: the object is in wrong state DWORD nMSAspect = static_cast<DWORD>(nAspect); // first 32 bits are for MS aspects SIZEL aSize; - HRESULT hr; - { - SafeSolarMutexReleaser releaser; - hr = pViewObject2->GetExtent(nMSAspect, -1, nullptr, &aSize); - } + HRESULT hr = m_pNativeImpl->m_pViewObject2->GetExtent( nMSAspect, -1, nullptr, &aSize ); if ( FAILED( hr ) ) { @@ -1227,17 +1129,12 @@ awt::Size OleComponent::GetCachedExtent( sal_Int64 nAspect ) awt::Size OleComponent::GetRecommendedExtent( sal_Int64 nAspect ) { - auto pOleObject(m_pNativeImpl->get<IOleObject>()); - if (!pOleObject) + if ( !m_pNativeImpl->m_pOleObject ) throw embed::WrongStateException(); // TODO: the object is in wrong state DWORD nMSAspect = static_cast<DWORD>(nAspect); // first 32 bits are for MS aspects SIZEL aSize; - HRESULT hr; - { - SafeSolarMutexReleaser releaser; - hr = pOleObject->GetExtent(nMSAspect, &aSize); - } + HRESULT hr = m_pNativeImpl->m_pOleObject->GetExtent( nMSAspect, &aSize ); if ( FAILED( hr ) ) { SAL_WARN("embeddedobj.ole", " OleComponent::GetRecommendedExtent: GetExtent() failed"); @@ -1250,31 +1147,22 @@ awt::Size OleComponent::GetRecommendedExtent( sal_Int64 nAspect ) sal_Int64 OleComponent::GetMiscStatus( sal_Int64 nAspect ) { - auto pOleObject(m_pNativeImpl->get<IOleObject>()); - if (!pOleObject) + if ( !m_pNativeImpl->m_pOleObject ) throw embed::WrongStateException(); // TODO: the object is in wrong state - DWORD nResult = 0; - { - SafeSolarMutexReleaser releaser; - pOleObject->GetMiscStatus(static_cast<DWORD>(nAspect), &nResult); - } + DWORD nResult; + m_pNativeImpl->m_pOleObject->GetMiscStatus( static_cast<DWORD>(nAspect), &nResult ); return static_cast<sal_Int64>(nResult); // first 32 bits are for MS flags } uno::Sequence< sal_Int8 > OleComponent::GetCLSID() { - auto pOleObject(m_pNativeImpl->get<IOleObject>()); - if (!pOleObject) + if ( !m_pNativeImpl->m_pOleObject ) throw embed::WrongStateException(); // TODO: the object is in wrong state GUID aCLSID; - HRESULT hr; - { - SafeSolarMutexReleaser releaser; - hr = pOleObject->GetUserClassID(&aCLSID); - } + HRESULT hr = m_pNativeImpl->m_pOleObject->GetUserClassID( &aCLSID ); if ( FAILED( hr ) ) throw io::IOException(); // TODO: @@ -1288,14 +1176,16 @@ uno::Sequence< sal_Int8 > OleComponent::GetCLSID() bool OleComponent::IsDirty() { + if ( !m_pNativeImpl->m_pOleObject ) + throw embed::WrongStateException(); // TODO: the object is in wrong state + if ( IsWorkaroundActive() ) return true; - auto pPersistStorage(m_pNativeImpl->get<IPersistStorage>()); + sal::systools::COMReference< IPersistStorage > pPersistStorage(m_pNativeImpl->m_pObj, sal::systools::COM_QUERY); if ( !pPersistStorage ) throw io::IOException(); // TODO - SafeSolarMutexReleaser releaser; HRESULT hr = pPersistStorage->IsDirty(); return ( hr != S_FALSE ); } @@ -1303,45 +1193,41 @@ bool OleComponent::IsDirty() void OleComponent::StoreOwnTmpIfNecessary() { - auto pOleObject(m_pNativeImpl->get<IOleObject>()); - if (!pOleObject) + if ( !m_pNativeImpl->m_pOleObject ) throw embed::WrongStateException(); // TODO: the object is in wrong state - auto pPersistStorage(m_pNativeImpl->get<IPersistStorage>()); + sal::systools::COMReference< IPersistStorage > pPersistStorage(m_pNativeImpl->m_pObj, sal::systools::COM_QUERY); if ( !pPersistStorage ) throw io::IOException(); // TODO - SafeSolarMutexReleaser releaser; - if ( m_bWorkaroundActive || pPersistStorage->IsDirty() != S_FALSE ) { - auto pStorage(m_pNativeImpl->getStorage()); - HRESULT hr = OleSave(pPersistStorage, pStorage, TRUE); + HRESULT hr = OleSave( pPersistStorage, m_pNativeImpl->m_pIStorage, TRUE ); if ( FAILED( hr ) ) { // Till now was required only for AcrobatReader7.0.8 GUID aCLSID; - hr = pOleObject->GetUserClassID(&aCLSID); + hr = m_pNativeImpl->m_pOleObject->GetUserClassID( &aCLSID ); if ( FAILED( hr ) ) { SAL_WARN("embeddedobj.ole", "OleComponent::StoreOwnTmpIfNecessary: GetUserClassID() failed"); throw io::IOException(); // TODO } - hr = WriteClassStg(pStorage, aCLSID); + hr = WriteClassStg( m_pNativeImpl->m_pIStorage, aCLSID ); if ( FAILED( hr ) ) throw io::IOException(); // TODO // the result of the following call is not checked because some objects, for example AcrobatReader7.0.8 // return error even in case the saving was done correctly - hr = pPersistStorage->Save(pStorage, TRUE); + hr = pPersistStorage->Save( m_pNativeImpl->m_pIStorage, TRUE ); // another workaround for AcrobatReader7.0.8 object, this object might think that it is not changed // when it has been created from file, although it must be saved m_bWorkaroundActive = true; } - hr = pStorage->Commit(STGC_DEFAULT); + hr = m_pNativeImpl->m_pIStorage->Commit( STGC_DEFAULT ); if ( FAILED( hr ) ) throw io::IOException(); // TODO @@ -1533,7 +1419,7 @@ uno::Any SAL_CALL OleComponent::getTransferData( const datatransfer::DataFlavor& if ( m_bDisposed ) throw lang::DisposedException(); // TODO - if (!m_pNativeImpl->m_pObj) + if ( !m_pNativeImpl->m_pOleObject ) throw embed::WrongStateException(); // TODO: the object is in wrong state uno::Any aResult; @@ -1544,7 +1430,7 @@ uno::Any SAL_CALL OleComponent::getTransferData( const datatransfer::DataFlavor& DWORD nRequestedAspect = GetAspectFromFlavor( aFlavor ); // if own icon is set and icon aspect is requested the own icon can be returned directly - auto pDataObject(m_pNativeImpl->get<IDataObject>()); + sal::systools::COMReference< IDataObject > pDataObject(m_pNativeImpl->m_pObj, sal::systools::COM_QUERY); if ( !pDataObject ) throw io::IOException(); // TODO: transport error code @@ -1571,11 +1457,7 @@ uno::Any SAL_CALL OleComponent::getTransferData( const datatransfer::DataFlavor& FORMATETC aFormat = pFormatTemplates[nInd]; aFormat.dwAspect = nRequestedAspect; - HRESULT hr; - { - SafeSolarMutexReleaser releaser; - hr = pDataObject->GetData(&aFormat, &aMedium); - } + HRESULT hr = pDataObject->GetData( &aFormat, &aMedium ); if ( SUCCEEDED( hr ) ) { bSupportedFlavor = m_pNativeImpl->ConvertDataForFlavor( aMedium, aFlavor, aResult ); @@ -1634,6 +1516,9 @@ uno::Sequence< datatransfer::DataFlavor > SAL_CALL OleComponent::getTransferData if ( m_bDisposed ) throw lang::DisposedException(); // TODO + if ( !m_pNativeImpl->m_pOleObject ) + throw embed::WrongStateException(); // TODO: the object is in wrong state + RetrieveObjectDataFlavors_Impl(); return m_aDataFlavors; @@ -1646,7 +1531,13 @@ sal_Bool SAL_CALL OleComponent::isDataFlavorSupported( const datatransfer::DataF if ( m_bDisposed ) throw lang::DisposedException(); // TODO - RetrieveObjectDataFlavors_Impl(); + if ( !m_pNativeImpl->m_pOleObject ) + throw embed::WrongStateException(); // TODO: the object is in wrong state + + if ( !m_aDataFlavors.getLength() ) + { + RetrieveObjectDataFlavors_Impl(); + } for ( auto const & supportedFormat : std::as_const(m_aDataFlavors) ) if ( supportedFormat.MimeType.equals( aFlavor.MimeType ) && supportedFormat.DataType == aFlavor.DataType ) @@ -1696,7 +1587,7 @@ sal_Int64 SAL_CALL OleComponent::getSomething( const css::uno::Sequence< sal_Int { uno::Sequence < sal_Int8 > aCLSID = GetCLSID(); if ( MimeConfigurationHelper::ClassIDsEqual( aIdentifier, aCLSID ) ) - return comphelper::getSomething_cast(m_pNativeImpl->m_pObj.get()); + return comphelper::getSomething_cast(static_cast<IUnknown*>(m_pNativeImpl->m_pObj)); // compatibility hack for old versions: CLSID was used in wrong order (SvGlobalName order) sal_Int32 nLength = aIdentifier.getLength(); @@ -1713,7 +1604,7 @@ sal_Int64 SAL_CALL OleComponent::getSomething( const css::uno::Sequence< sal_Int aIdentifier[2] == aCLSID[1] && aIdentifier[1] == aCLSID[2] && aIdentifier[0] == aCLSID[3] ) - return comphelper::getSomething_cast(m_pNativeImpl->m_pObj.get()); + return reinterpret_cast<sal_Int64>(static_cast<IUnknown*>(m_pNativeImpl->m_pObj)); } } catch ( const uno::Exception& ) diff --git a/embeddedobj/source/msole/olecomponent.hxx b/embeddedobj/source/msole/olecomponent.hxx index e08d5a69b2f4..5a96b64fcbfc 100644 --- a/embeddedobj/source/msole/olecomponent.hxx +++ b/embeddedobj/source/msole/olecomponent.hxx @@ -41,7 +41,7 @@ namespace comphelper { class OleWrapperClientSite; class OleWrapperAdviseSink; class OleEmbeddedObject; -class OleComponentNative_Impl; +struct OleComponentNative_Impl; class OleComponent : public ::cppu::WeakImplHelper< css::util::XCloseable, css::lang::XComponent, css::lang::XUnoTunnel, css::util::XModifiable, @@ -52,12 +52,15 @@ class OleComponent : public ::cppu::WeakImplHelper< css::util::XCloseable, css:: bool m_bDisposed; bool m_bModified; - std::unique_ptr<OleComponentNative_Impl> m_pNativeImpl; + OleComponentNative_Impl* m_pNativeImpl; OleEmbeddedObject* m_pUnoOleObject; OleWrapperClientSite* m_pOleWrapClientSite; OleWrapperAdviseSink* m_pImplAdviseSink; + sal_Int32 m_nOLEMiscFlags; + sal_Int32 m_nAdvConn; + css::uno::Sequence< css::embed::VerbDescriptor > m_aVerbList; css::uno::Sequence< css::datatransfer::DataFlavor > m_aDataFlavors; @@ -69,10 +72,9 @@ class OleComponent : public ::cppu::WeakImplHelper< css::util::XCloseable, css:: // such objects report the dirty state wrongly sometimes and do not allow to store them any time bool m_bWorkaroundActive; - void InitializeObject_Impl(); - - OUString getTempURL() const; + bool InitializeObject_Impl(); + void CreateNewIStorage_Impl(); void RetrieveObjectDataFlavors_Impl(); void Dispose(); diff --git a/embeddedobj/source/msole/oleembed.cxx b/embeddedobj/source/msole/oleembed.cxx index 63d5f700b089..d06969925109 100644 --- a/embeddedobj/source/msole/oleembed.cxx +++ b/embeddedobj/source/msole/oleembed.cxx @@ -495,12 +495,12 @@ void SAL_CALL OleEmbeddedObject::changeState( sal_Int32 nNewState ) // the loaded state must be set before, because of notifications! m_nObjectState = nNewState; - aGuard.clear(); { VerbExecutionControllerGuard aVerbGuard( m_aVerbExecutionController ); m_pOleComponent->CloseObject(); } + aGuard.clear(); StateChangeNotification_Impl( false, nOldState, m_nObjectState ); aGuard.reset(); } @@ -863,11 +863,9 @@ void SAL_CALL OleEmbeddedObject::doVerb( sal_Int32 nVerbID ) // ==== the STAMPIT related solution ============================= m_aVerbExecutionController.StartControlExecution(); - { - ClearedMutexArea clearedMutex(aGuard); - m_pOleComponent->ExecuteVerb(nVerbID); - m_pOleComponent->SetHostName(m_aContainerName); - } + + m_pOleComponent->ExecuteVerb( nVerbID ); + m_pOleComponent->SetHostName( m_aContainerName ); // ==== the STAMPIT related solution ============================= bool bModifiedOnExecution = m_aVerbExecutionController.EndControlExecution_WasModified(); @@ -974,7 +972,7 @@ uno::Sequence< embed::VerbDescriptor > SAL_CALL OleEmbeddedObject::getSupportedV } // end wrapping related part ==================== - osl::ClearableMutexGuard aGuard(m_aMutex); + ::osl::MutexGuard aGuard( m_aMutex ); if ( m_bDisposed ) throw lang::DisposedException(); // TODO @@ -991,7 +989,6 @@ uno::Sequence< embed::VerbDescriptor > SAL_CALL OleEmbeddedObject::getSupportedV // throw embed::NeedsRunningStateException(); // TODO: // } - aGuard.clear(); return m_pOleComponent->GetVerbList(); } else @@ -1131,7 +1128,7 @@ sal_Int64 SAL_CALL OleEmbeddedObject::getStatus( sal_Int64 } // end wrapping related part ==================== - osl::ResettableMutexGuard aGuard(m_aMutex); + ::osl::MutexGuard aGuard( m_aMutex ); if ( m_bDisposed ) throw lang::DisposedException(); // TODO @@ -1146,10 +1143,8 @@ sal_Int64 SAL_CALL OleEmbeddedObject::getStatus( sal_Int64 nResult = m_nStatus; else if ( m_pOleComponent ) { - { - ClearedMutexArea clearedMutex(aGuard); - m_nStatus = m_pOleComponent->GetMiscStatus(nAspect); - } + + m_nStatus = m_pOleComponent->GetMiscStatus( nAspect ); m_nStatusAspect = nAspect; m_bGotStatus = true; nResult = m_nStatus; diff --git a/embeddedobj/source/msole/olevisual.cxx b/embeddedobj/source/msole/olevisual.cxx index bcbacffe5d64..7d8de650db3e 100644 --- a/embeddedobj/source/msole/olevisual.cxx +++ b/embeddedobj/source/msole/olevisual.cxx @@ -325,7 +325,7 @@ embed::VisualRepresentation SAL_CALL OleEmbeddedObject::getPreferredVisualRepres } // end wrapping related part ==================== - osl::ResettableMutexGuard aGuard(m_aMutex); + ::osl::MutexGuard aGuard( m_aMutex ); if ( m_bDisposed ) throw lang::DisposedException(); // TODO @@ -364,10 +364,7 @@ embed::VisualRepresentation SAL_CALL OleEmbeddedObject::getPreferredVisualRepres cppu::UnoType<uno::Sequence< sal_Int8 >>::get() ); embed::VisualRepresentation aVisualRepr; - { - ClearedMutexArea clearedMutex(aGuard); - aVisualRepr.Data = m_pOleComponent->getTransferData(aDataFlavor); - } + aVisualRepr.Data = m_pOleComponent->getTransferData( aDataFlavor ); aVisualRepr.Flavor = aDataFlavor; uno::Sequence< sal_Int8 > aVisReplSeq; |