diff options
author | Eike Rathke <erack@redhat.com> | 2017-06-14 23:30:57 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2017-06-20 19:50:25 +0200 |
commit | 4175045ebe4c895ff4617fbcdaacbbb058751597 (patch) | |
tree | 76e5b31054e88624c25e6a78fb0b7867f076ea46 | |
parent | 4be3f2b3a9294c22de68b586d84328ec08906b84 (diff) |
Resolves: tdf#104875 defer filter detection to first load/update of external
This is a combination of 2 commits.
This could never have been meant
Since commit 67b374980f340faa2695001984aaf98886a32fad
executing ScDocumentLoader::GetFilterName() twice if there was no stored
filter, and still executing it if there was one, even if the comment says we
shouldn't.
(cherry picked from commit 1bc793f8ab8f9b4ce435bd3585f9579df4a11819)
Resolves: tdf#104875 defer filter detection to first load/update of external
Attempting to access all linked external documents right on load time was
specifically nasty for non-local URIs (unmounted smb, http, ...)
(cherry picked from commit 416752b9e4bc4605c479d3eff7797be9f0ef2a38)
f4a7414dfe36875b505c73b8c963b650eeffe204
Change-Id: Iaf4b88e63b3987fb661df0e9b095f06b29076894
Reviewed-on: https://gerrit.libreoffice.org/38820
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
-rw-r--r-- | sc/inc/externalrefmgr.hxx | 2 | ||||
-rw-r--r-- | sc/source/ui/docshell/externalrefmgr.cxx | 13 |
2 files changed, 8 insertions, 7 deletions
diff --git a/sc/inc/externalrefmgr.hxx b/sc/inc/externalrefmgr.hxx index 434685c085b3..4863757f9eb7 100644 --- a/sc/inc/externalrefmgr.hxx +++ b/sc/inc/externalrefmgr.hxx @@ -782,7 +782,7 @@ private: */ ScDocument& cacheNewDocShell( sal_uInt16 nFileId, SrcShell& rSrcShell ); - void maybeLinkExternalFile(sal_uInt16 nFileId); + void maybeLinkExternalFile( sal_uInt16 nFileId, bool bDeferFilterDetection = false ); /** * Try to create a "real" file name from the relative path. The original diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx index 285cbddbd169..a897d263ae14 100644 --- a/sc/source/ui/docshell/externalrefmgr.cxx +++ b/sc/source/ui/docshell/externalrefmgr.cxx @@ -2491,7 +2491,6 @@ SfxObjectShellRef ScExternalRefManager::loadSrcDocument(sal_uInt16 nFileId, OUSt rFilter = pFileData->maFilterName; // don't overwrite stored filter with guessed filter else ScDocumentLoader::GetFilterName(aFile, rFilter, aOptions, true, false); - ScDocumentLoader::GetFilterName(aFile, rFilter, aOptions, true, false); std::shared_ptr<const SfxFilter> pFilter = ScDocShell::Factory().GetFilterContainer()->GetFilter4FilterName(rFilter); if (pFileData->maRelativeName.isEmpty()) @@ -2606,7 +2605,7 @@ bool ScExternalRefManager::isFileLoadable(const OUString& rFile) const return true; // for http and others, Exists doesn't work, but the URL can still be opened } -void ScExternalRefManager::maybeLinkExternalFile(sal_uInt16 nFileId) +void ScExternalRefManager::maybeLinkExternalFile( sal_uInt16 nFileId, bool bDeferFilterDetection ) { if (maLinkedDocs.count(nFileId)) // file already linked, or the link has been broken. @@ -2626,7 +2625,9 @@ void ScExternalRefManager::maybeLinkExternalFile(sal_uInt16 nFileId) } // If a filter was already set (for example, loading the cached table), // don't call GetFilterName which has to access the source file. - if (aFilter.isEmpty()) + // If filter detection is deferred, the next successfull loadSrcDocument() + // will update SrcFileData filter name. + if (aFilter.isEmpty() && !bDeferFilterDetection) ScDocumentLoader::GetFilterName(*pFileName, aFilter, aOptions, true, false); sfx2::LinkManager* pLinkMgr = mpDoc->GetLinkManager(); if (!pLinkMgr) @@ -2636,8 +2637,8 @@ void ScExternalRefManager::maybeLinkExternalFile(sal_uInt16 nFileId) } ScExternalRefLink* pLink = new ScExternalRefLink(mpDoc, nFileId, aFilter); OSL_ENSURE(pFileName, "ScExternalRefManager::maybeLinkExternalFile: file name pointer is NULL"); - OUString aTmp = aFilter; - pLinkMgr->InsertFileLink(*pLink, OBJECT_CLIENT_FILE, *pFileName, &aTmp); + pLinkMgr->InsertFileLink(*pLink, OBJECT_CLIENT_FILE, *pFileName, + (aFilter.isEmpty() && bDeferFilterDetection ? nullptr : &aFilter)); pLink->SetDoReferesh(false); pLink->Update(); @@ -2655,7 +2656,7 @@ void ScExternalRefManager::addFilesToLinkManager() "sc.ui", "ScExternalRefManager::addFilesToLinkManager: files overflow"); const sal_uInt16 nSize = static_cast<sal_uInt16>( std::min<size_t>( maSrcFiles.size(), SAL_MAX_UINT16)); for (sal_uInt16 nFileId = 0; nFileId < nSize; ++nFileId) - maybeLinkExternalFile( nFileId); + maybeLinkExternalFile( nFileId, true); } void ScExternalRefManager::SrcFileData::maybeCreateRealFileName(const OUString& rOwnDocName) |