diff options
author | Eike Rathke <erack@redhat.com> | 2019-07-11 15:50:07 +0200 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2019-07-29 14:31:14 +0200 |
commit | 31b1d2af8ce01804049168b7b0317d93d77a42d7 (patch) | |
tree | ff45d0f58fb6f473da2c5a9971379c718e84306d | |
parent | 43bf332aeede732557378e81765f29b704b17188 (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
-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 1dc2be93efc9..153647a2813b 100644 --- a/sc/source/ui/docshell/externalrefmgr.cxx +++ b/sc/source/ui/docshell/externalrefmgr.cxx @@ -132,11 +132,12 @@ struct UpdateFormulaCell { 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) @@ -1657,6 +1658,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), @@ -1946,8 +1958,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; } @@ -2154,15 +2177,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) @@ -2373,8 +2387,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; @@ -2483,6 +2497,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 @@ -2621,9 +2639,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. |