summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2024-03-27 17:50:56 +0500
committerMike Kaganski <mike.kaganski@collabora.com>2024-03-27 17:50:56 +0500
commit1852648e4e5365fc0c6cc2a1647863d8329e9987 (patch)
tree23c24a6fc558ee205fd0fd86b60423f0a9d4c853
parentRevert "Use weak reference to SfxObjectShell in SfxEventHint to avoid use-aft... (diff)
downloadcore-1852648e4e5365fc0c6cc2a1647863d8329e9987.tar.gz
core-1852648e4e5365fc0c6cc2a1647863d8329e9987.zip
Revert "Reimplement OleComponentNative_Impl to use IGlobalInterfaceTable"
This reverts commit 6ea9f4fac8112267e78e210650b3c58a4c7a0e99.
-rw-r--r--embeddedobj/source/inc/oleembobj.hxx14
-rw-r--r--embeddedobj/source/msole/olecomponent.cxx531
-rw-r--r--embeddedobj/source/msole/olecomponent.hxx12
-rw-r--r--embeddedobj/source/msole/oleembed.cxx21
-rw-r--r--embeddedobj/source/msole/olevisual.cxx7
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;