diff options
author | Tamás Zolnai <tamas.zolnai@collabora.com> | 2019-03-25 13:28:27 +0100 |
---|---|---|
committer | Tamás Zolnai <tamas.zolnai@collabora.com> | 2019-03-26 19:09:46 +0100 |
commit | 41dc917b9b55b8c0c4307ffc58a1fb7257df2b69 (patch) | |
tree | 52ea7fbb48fd3877c95c4efab76971cc48b27485 /sfx2 | |
parent | cd19a7664a25eda786bb76feefb40ebcbf79a54d (diff) |
Generate MSO lock files when the related MSO compat. option is set
Added a new compatibility option to the Tools -> Load / Save ->
Microsoft.
When this option is set on the UI or or set in the configuration files
LO generates lock files for MSO supported file formats, similar to
the lock files MSO generates itself.
Change-Id: I2f882723841162add01be9d3f7285a5162a60331
Reviewed-on: https://gerrit.libreoffice.org/69678
Tested-by: Jenkins
Reviewed-by: Tamás Zolnai <tamas.zolnai@collabora.com>
Diffstat (limited to 'sfx2')
-rw-r--r-- | sfx2/source/doc/docfile.cxx | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/sfx2/source/doc/docfile.cxx b/sfx2/source/doc/docfile.cxx index 167a52130c12..64e0523f8c60 100644 --- a/sfx2/source/doc/docfile.cxx +++ b/sfx2/source/doc/docfile.cxx @@ -115,6 +115,7 @@ #include <sot/storage.hxx> #include <unotools/saveopt.hxx> #include <svl/documentlockfile.hxx> +#include <svl/msodocumentlockfile.hxx> #include <com/sun/star/document/DocumentRevisionListPersistence.hpp> #include <helper.hxx> @@ -132,6 +133,7 @@ #include <vcl/weld.hxx> #include <vcl/svapp.hxx> #include <tools/diagnose_ex.h> +#include <unotools/fltrcfg.hxx> #include <com/sun/star/io/WrongFormatException.hpp> @@ -264,6 +266,7 @@ public: bool m_bSalvageMode:1; bool m_bVersionsAlreadyLoaded:1; bool m_bLocked:1; + bool m_bMSOLockFileCreated : 1; bool m_bDisableUnlockWebDAV:1; bool m_bGotDateTime:1; bool m_bRemoveBackup:1; @@ -344,6 +347,7 @@ SfxMedium_Impl::SfxMedium_Impl() : m_bSalvageMode( false ), m_bVersionsAlreadyLoaded( false ), m_bLocked( false ), + m_bMSOLockFileCreated( false ), m_bDisableUnlockWebDAV( false ), m_bGotDateTime( false ), m_bRemoveBackup( false ), @@ -1415,6 +1419,15 @@ SfxMedium::LockFileResult SfxMedium::LockOrigFileOnDemand( bool bLoading, bool b try { ::svt::DocumentLockFile aLockFile( pImpl->m_aLogicName ); + + std::unique_ptr<svt::MSODocumentLockFile> pMSOLockFile; + const SvtFilterOptions& rOpt = SvtFilterOptions::Get(); + if (rOpt.IsMSOLockFileCreationIsEnabled() && svt::MSODocumentLockFile::IsMSOSupportedFileFormat(pImpl->m_aLogicName)) + { + pMSOLockFile.reset(new svt::MSODocumentLockFile(pImpl->m_aLogicName)); + pImpl->m_bMSOLockFileCreated = true; + } + bool bIoErr = false; if (!bHandleSysLocked) @@ -1422,6 +1435,8 @@ SfxMedium::LockFileResult SfxMedium::LockOrigFileOnDemand( bool bLoading, bool b try { bResult = aLockFile.CreateOwnLockFile(); + if(pMSOLockFile) + bResult &= pMSOLockFile->CreateOwnLockFile(); } catch (const uno::Exception&) { @@ -1446,6 +1461,9 @@ SfxMedium::LockFileResult SfxMedium::LockOrigFileOnDemand( bool bLoading, bool b bResult = true; // take the ownership over the lock file aLockFile.OverwriteOwnLockFile(); + + if(pMSOLockFile) + pMSOLockFile->OverwriteOwnLockFile(); } } @@ -1500,6 +1518,9 @@ SfxMedium::LockFileResult SfxMedium::LockOrigFileOnDemand( bool bLoading, bool b { // take the ownership over the lock file bResult = aLockFile.OverwriteOwnLockFile(); + + if(pMSOLockFile) + pMSOLockFile->OverwriteOwnLockFile(); } else if (bLoading && !bHandleSysLocked) eResult = LockFileResult::FailedLockFile; @@ -3055,6 +3076,31 @@ void SfxMedium::UnlockFile( bool bReleaseLockStream ) } catch( const uno::Exception& ) {} + + if(pImpl->m_bMSOLockFileCreated) + { + ::svt::MSODocumentLockFile aMSOLockFile( pImpl->m_aLogicName ); + + try + { + pImpl->m_bLocked = false; + // TODO/LATER: A warning could be shown in case the file is not the own one + aMSOLockFile.RemoveFile(); + } + catch( const io::WrongFormatException& ) + { + try + { + // erase the empty or corrupt file + aMSOLockFile.RemoveFileDirectly(); + } + catch( const uno::Exception& ) + {} + } + catch( const uno::Exception& ) + {} + pImpl->m_bMSOLockFileCreated = false; + } #endif } |