diff options
author | Eike Rathke <erack@redhat.com> | 2019-07-11 15:50:07 +0200 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2021-05-10 16:33:53 +0200 |
commit | 8b3caa05594e7f9c3490bce75b8b37d0d3c99383 (patch) | |
tree | c281e7585d0e7d519a8fb5604da78d92ea577d6e | |
parent | b10555fce638c8b06a52a6f49bfb05d78a1755b6 (diff) |
Postpone loading of all external references, including INDIRECT()
... which can be constructed with an arbitrary URI text string not
an svExternal* token type, until link updates are allowed.
Reviewed-on: https://gerrit.libreoffice.org/75422
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
(cherry picked from commit b824b23860b2cf533d4f2428d4a750bd72576181)
Reviewed-on: https://gerrit.libreoffice.org/76304
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Change-Id: I2ce4de415ff99ace04c083c36c1383d76a4ef40d
(cherry picked from commit 31b1d2af8ce01804049168b7b0317d93d77a42d7)
(cherry picked from commit e374cd045665226e0af82e1ba787bcb2a3879d31)
-rw-r--r-- | sc/source/ui/docshell/externalrefmgr.cxx | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx index 445d06a8720b..01209a55c3dc 100644 --- a/sc/source/ui/docshell/externalrefmgr.cxx +++ b/sc/source/ui/docshell/externalrefmgr.cxx @@ -133,11 +133,12 @@ struct UpdateFormulaCell : public unary_function<ScFormulaCell*, void> { void operator() (ScFormulaCell* pCell) const { - // Check to make sure the cell really contains ocExternalRef. + // Check to make sure the cell really contains svExternal*. // External names, external cell and range references all have a - // ocExternalRef token. + // token of svExternal*. Additionally check for INDIRECT() that can be + // called with any constructed URI string. ScTokenArray* pCode = pCell->GetCode(); - if (!pCode->HasExternalRef()) + if (!pCode->HasExternalRef() && !pCode->HasOpCode(ocIndirect)) return; if (pCode->GetCodeError() != FormulaError::NONE) @@ -1662,6 +1663,17 @@ static std::unique_ptr<ScTokenArray> lcl_fillEmptyMatrix(const ScRange& rRange) return pArray; } +namespace { +bool isLinkUpdateAllowedInDoc(const ScDocument& rDoc) +{ + SfxObjectShell* pDocShell = rDoc.GetDocumentShell(); + if (!pDocShell) + return false; + + return pDocShell->GetEmbeddedObjectContainer().getUserAllowsLinkUpdate(); +} +} + ScExternalRefManager::ScExternalRefManager(ScDocument* pDoc) : mpDoc(pDoc), mbInReferenceMarking(false), @@ -1951,8 +1963,19 @@ ScExternalRefCache::TokenRef ScExternalRefManager::getSingleRefToken( pSrcDoc = getSrcDocument(nFileId); if (!pSrcDoc) { - // Source document not reachable. Throw a reference error. - pToken.reset(new FormulaErrorToken(FormulaError::NoRef)); + // Source document not reachable. +#if 0 + if (!isLinkUpdateAllowedInDoc(*mpDoc)) + { + // Indicate with specific error. + pToken.reset(new FormulaErrorToken(FormulaError::LinkFormulaNeedingCheck)); + } + else +#endif + { + // Throw a reference error. + pToken.reset(new FormulaErrorToken(FormulaError::NoRef)); + } return pToken; } @@ -2159,15 +2182,6 @@ void insertRefCellByIterator( } } -bool IsLinkUpdateAllowedInDoc(const ScDocument& rDoc) -{ - SfxObjectShell* pDocShell = rDoc.GetDocumentShell(); - if (!pDocShell) - return false; - - return pDocShell->GetEmbeddedObjectContainer().getUserAllowsLinkUpdate(); -} - } void ScExternalRefManager::insertRefCell(sal_uInt16 nFileId, const ScAddress& rCell) @@ -2377,8 +2391,8 @@ ScDocument* ScExternalRefManager::getInMemorySrcDocument(sal_uInt16 nFileId) if (!pFileName) return nullptr; - // Do not load document until it was allowed - if (!IsLinkUpdateAllowedInDoc(*mpDoc)) + // Do not load document until it was allowed. + if (!isLinkUpdateAllowedInDoc(*mpDoc)) return nullptr; ScDocument* pSrcDoc = nullptr; @@ -2487,6 +2501,10 @@ SfxObjectShellRef ScExternalRefManager::loadSrcDocument(sal_uInt16 nFileId, OUSt if (!isFileLoadable(aFile)) return nullptr; + // Do not load document until it was allowed. + if (!isLinkUpdateAllowedInDoc(*mpDoc)) + return nullptr; + OUString aOptions = pFileData->maFilterOptions; if ( !pFileData->maFilterName.isEmpty() ) rFilter = pFileData->maFilterName; // don't overwrite stored filter with guessed filter @@ -2625,9 +2643,9 @@ void ScExternalRefManager::maybeLinkExternalFile( sal_uInt16 nFileId, bool bDefe aOptions = pFileData->maFilterOptions; } - // Filter detection may access external links; defer it until we are allowed + // Filter detection may access external links; defer it until we are allowed. if (!bDeferFilterDetection) - bDeferFilterDetection = !IsLinkUpdateAllowedInDoc(*mpDoc); + bDeferFilterDetection = !isLinkUpdateAllowedInDoc(*mpDoc); // If a filter was already set (for example, loading the cached table), // don't call GetFilterName which has to access the source file. |