diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2019-01-30 10:17:35 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2019-01-30 11:34:01 +0100 |
commit | f1e775470e68fb1ca1fee390c10064c55932180d (patch) | |
tree | 21c4a70282b2f0f12194b8c1c653259e51ace9b7 /sfx2 | |
parent | 7d6f30d04c51088b26815c241a7473c48822c6c3 (diff) |
framework: allow storeSelf() on the main thread
This is similar to commit 22aa6508e0a65e65a6f9410b498fe4fd6c236639
(framework: allow dispatching a command on the main thread, 2019-01-29),
except it addresses the scenario where save is performed with an UNO API
call, not with a dispatched command.
This way both load and save is possible on the main thread, providing a
safe way to interact with documents containing OLE objects on Windows.
Change-Id: I3516c944ece8ed0e26aa13fc9def5857b8344404
Reviewed-on: https://gerrit.libreoffice.org/67109
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
Diffstat (limited to 'sfx2')
-rw-r--r-- | sfx2/source/doc/sfxbasemodel.cxx | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx index e7f49fdb4b32..9d8b48f35cf4 100644 --- a/sfx2/source/doc/sfxbasemodel.cxx +++ b/sfx2/source/doc/sfxbasemodel.cxx @@ -125,6 +125,7 @@ #include "printhelper.hxx" #include <sfx2/sfxresid.hxx> #include <comphelper/profilezone.hxx> +#include <vcl/threadex.hxx> // namespaces @@ -1494,6 +1495,14 @@ sal_Bool SAL_CALL SfxBaseModel::isReadonly() return !m_pData->m_pObjectShell.is() || m_pData->m_pObjectShell->IsReadOnly(); } +/** + * Proxy around SfxObjectShell::Save_Impl(), as vcl::solarthread::syncExecute() + * does not seem to accept lambdas. + */ +static bool SaveImplStatic(SfxObjectShell* pThis, const SfxItemSet* pParams) +{ + return pThis->Save_Impl(pParams); +} // XStorable2 @@ -1507,6 +1516,7 @@ void SAL_CALL SfxBaseModel::storeSelf( const Sequence< beans::PropertyValue > SfxSaveGuard aSaveGuard(this, m_pData.get()); bool bCheckIn = false; + bool bOnMainThread = false; for ( sal_Int32 nInd = 0; nInd < aSeqArgs.getLength(); nInd++ ) { // check that only acceptable parameters are provided here @@ -1516,7 +1526,8 @@ void SAL_CALL SfxBaseModel::storeSelf( const Sequence< beans::PropertyValue > && aSeqArgs[nInd].Name != "VersionMajor" && aSeqArgs[nInd].Name != "FailOnWarning" && aSeqArgs[nInd].Name != "CheckIn" - && aSeqArgs[nInd].Name != "NoFileSync" ) + && aSeqArgs[nInd].Name != "NoFileSync" + && aSeqArgs[nInd].Name != "OnMainThread" ) { const OUString aMessage( "Unexpected MediaDescriptor parameter: " + aSeqArgs[nInd].Name ); throw lang::IllegalArgumentException( aMessage, Reference< XInterface >(), 1 ); @@ -1525,6 +1536,10 @@ void SAL_CALL SfxBaseModel::storeSelf( const Sequence< beans::PropertyValue > { aSeqArgs[nInd].Value >>= bCheckIn; } + else if (aSeqArgs[nInd].Name == "OnMainThread") + { + aSeqArgs[nInd].Value >>= bOnMainThread; + } } // Remove CheckIn property if needed @@ -1576,7 +1591,11 @@ void SAL_CALL SfxBaseModel::storeSelf( const Sequence< beans::PropertyValue > { // Tell the SfxMedium if we are in checkin instead of normal save m_pData->m_pObjectShell->GetMedium( )->SetInCheckIn( nSlotId == SID_CHECKIN ); - bRet = m_pData->m_pObjectShell->Save_Impl( pParams.get() ); + if (bOnMainThread) + bRet = vcl::solarthread::syncExecute( + std::bind(&SaveImplStatic, m_pData->m_pObjectShell.get(), pParams.get())); + else + bRet = m_pData->m_pObjectShell->Save_Impl(pParams.get()); m_pData->m_pObjectShell->GetMedium( )->SetInCheckIn( nSlotId != SID_CHECKIN ); } |