[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-5.0' - 7 commits - configure.ac sc/inc sc/Library_sc.mk sc/source

Andras Timar andras.timar at collabora.com
Fri Feb 9 13:38:17 UTC 2018


 configure.ac                              |    2 
 sc/Library_sc.mk                          |    1 
 sc/inc/document.hxx                       |    8 +-
 sc/inc/documentlinkmgr.hxx                |    6 -
 sc/source/core/data/conditio.cxx          |    6 +
 sc/source/core/data/documen2.cxx          |    2 
 sc/source/core/data/documen8.cxx          |   23 ++++++
 sc/source/core/data/formulacell.cxx       |    7 -
 sc/source/core/inc/webservicelink.hxx     |   49 +++++++++++++
 sc/source/core/tool/interpr2.cxx          |    8 +-
 sc/source/core/tool/interpr7.cxx          |  105 ++++++++++++++++++++++-------
 sc/source/core/tool/rangenam.cxx          |    8 +-
 sc/source/core/tool/webservicelink.cxx    |  106 ++++++++++++++++++++++++++++++
 sc/source/filter/excel/excform.cxx        |    1 
 sc/source/filter/excel/excform8.cxx       |    1 
 sc/source/filter/excel/impop.cxx          |    1 
 sc/source/filter/excel/xicontent.cxx      |    6 +
 sc/source/filter/excel/xiname.cxx         |    3 
 sc/source/filter/oox/condformatbuffer.cxx |    2 
 sc/source/filter/oox/defnamesbuffer.cxx   |    2 
 sc/source/filter/oox/formulabuffer.cxx    |    4 +
 sc/source/ui/docshell/docsh4.cxx          |    4 -
 sc/source/ui/docshell/documentlinkmgr.cxx |   20 ++++-
 sc/source/ui/view/tabvwsh4.cxx            |    2 
 24 files changed, 330 insertions(+), 47 deletions(-)

New commits:
commit 50f971d878c4df9464b01721283ac6468edd6768
Author: Andras Timar <andras.timar at collabora.com>
Date:   Fri Feb 9 11:32:46 2018 +0100

    Bump version to 5.0-43
    
    Change-Id: I9b28bc646902aae65cfe52ce6405c425b3ffcc34

diff --git a/configure.ac b/configure.ac
index 9714815911d0..93616767d9c9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -9,7 +9,7 @@ dnl in order to create a configure script.
 # several non-alphanumeric characters, those are split off and used only for the
 # ABOUTBOXPRODUCTVERSIONSUFFIX in openoffice.lst. Why that is necessary, no idea.
 
-AC_INIT([Collabora Office],[5.0.10.42],[],[],[https://CollaboraOffice.com/])
+AC_INIT([Collabora Office],[5.0.10.43],[],[],[https://CollaboraOffice.com/])
 
 AC_PREREQ([2.59])
 
commit 98c91bbed113a847e605cab06735130406944d37
Author: Eike Rathke <erack at redhat.com>
Date:   Mon Jan 29 18:19:33 2018 +0100

    CheckLinkFormulaNeedingCheck() for named expressions
    
     This is a combination of 3 commits.
    
    CheckLinkFormulaNeedingCheck() for .ods named expressions
    
    This is specifically necessary for named expressions that are used
    in conditional format formulas, for which RPN is generated at a
    later stage, not during import.
    
    (cherry picked from commit eae9648e99be53ba441d9d8207aac6f3ce211ef2)
    
    CheckLinkFormulaNeedingCheck() for .xls named expressions
    
    (cherry picked from commit 8512f13c42ae3fbb287a555616fe10ff04295616)
    
    CheckLinkFormulaNeedingCheck() for .xlsx named expressions
    
    (cherry picked from commit a1f933ee2b9e23a505d937035821e9571cf4119c)
    
     Conflicts:
            sc/source/filter/oox/defnamesbuffer.cxx
    
    e03cb5767c34f8157a492a6d6c3b0700d065052d
    217c89822ab477a6c383d170ae739e44efd10fa3
    
    Change-Id: I54ab8dc14f81d6b18b0d17f448187d19d8e396fc
    Reviewed-on: https://gerrit.libreoffice.org/48858
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sc/source/core/tool/rangenam.cxx b/sc/source/core/tool/rangenam.cxx
index 4235ef772f22..f1f8b9d56052 100644
--- a/sc/source/core/tool/rangenam.cxx
+++ b/sc/source/core/tool/rangenam.cxx
@@ -63,9 +63,14 @@ ScRangeData::ScRangeData( ScDocument* pDok,
                 mnMaxCol    (-1)
 {
     if (!rSymbol.isEmpty())
-        CompileRangeData( rSymbol, pDoc->IsImportingXML());
+    {
         // Let the compiler set an error on unknown names for a subsequent
         // CompileUnresolvedXML().
+        const bool bImporting = pDoc->IsImportingXML();
+        CompileRangeData( rSymbol, bImporting);
+        if (bImporting)
+            pDoc->CheckLinkFormulaNeedingCheck( *pCode);
+    }
     else
     {
         // #i63513#/#i65690# don't leave pCode as NULL.
@@ -198,6 +203,7 @@ void ScRangeData::CompileUnresolvedXML( sc::CompileFormulaContext& rCxt )
         // Don't let the compiler set an error for unknown names on final
         // compile, errors are handled by the interpreter thereafter.
         CompileRangeData( aSymbol, false);
+        rCxt.getDoc()->CheckLinkFormulaNeedingCheck( *pCode);
     }
 }
 
diff --git a/sc/source/filter/excel/xiname.cxx b/sc/source/filter/excel/xiname.cxx
index c1bee5af50f6..344ecb6a8787 100644
--- a/sc/source/filter/excel/xiname.cxx
+++ b/sc/source/filter/excel/xiname.cxx
@@ -264,7 +264,10 @@ void XclImpName::InsertName(const ScTokenArray* pArray)
         }
     }
     if (pData)
+    {
+        GetDoc().CheckLinkFormulaNeedingCheck( *pData->GetCode());
         mpScData = pData;               // cache for later use
+    }
 }
 
 XclImpNameManager::XclImpNameManager( const XclImpRoot& rRoot ) :
diff --git a/sc/source/filter/oox/defnamesbuffer.cxx b/sc/source/filter/oox/defnamesbuffer.cxx
index fa2a0cf6b685..c4cb011d0a54 100644
--- a/sc/source/filter/oox/defnamesbuffer.cxx
+++ b/sc/source/filter/oox/defnamesbuffer.cxx
@@ -38,6 +38,7 @@
 #include "tokenarray.hxx"
 #include "tokenuno.hxx"
 #include "compiler.hxx"
+#include "document.hxx"
 
 namespace oox {
 namespace xls {
@@ -392,6 +393,7 @@ std::unique_ptr<ScTokenArray> DefinedName::getScTokens()
     // after, a resulting error must be reset.
     sal_uInt16 nErr = pArray->GetCodeError();
     aCompiler.CompileTokenArray();
+    getScDocument().CheckLinkFormulaNeedingCheck( *pArray);
     pArray->DelRPN();
     pArray->SetCodeError(nErr);
 
commit 2946443efeb9c4468d701d33581b241796b16c02
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Jan 25 13:20:27 2018 +0100

    CheckLinkFormulaNeedingCheck() for conditional format expressions
    
     This is a combination of 4 commits.
    
    Prepare CheckLinkFormulaNeedingCheck() to use either RPN or tokenized code
    
    Conditional format formulas aren't finally compiled until needed
    so the check will have to operate on the tokenized expression
    instead of RPN code.
    
    (cherry picked from commit faa0305ba3d0dc698fce4915d4f3a1fb52422380)
    
    CheckLinkFormulaNeedingCheck() for .ods conditional format expressions
    
    (cherry picked from commit 2930ba2ac5d9423f2848b968edcd8ddc71966186)
    
    CheckLinkFormulaNeedingCheck() for .xlsx conditional format expressions
    
    (cherry picked from commit fef24d9f999ee54d7936900485d97ff26656f517)
    
    CheckLinkFormulaNeedingCheck() for .xls conditional format expressions
    
    (cherry picked from commit af2a2a0c72db312902e466c36697b5c198041e82)
    
    45eb1ab5efa0ec9da2663f20427d2474ce300826
    31ede1a23223a798141a0891deeabd8cf88fff58
    afa112cc591b411d80ead48bf726788d361f6eb3
    
    Change-Id: I68837e9bd33f125ab47b10b1a6fa18175abd1627
    Reviewed-on: https://gerrit.libreoffice.org/48719
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index f087af6efc7a..862736713c25 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -471,6 +471,12 @@ void ScConditionEntry::CompileXML()
     Compile( GetExpression(aSrcPos, 0, 0, eTempGrammar1),
              GetExpression(aSrcPos, 1, 0, eTempGrammar2),
              aStrNmsp1, aStrNmsp2, eTempGrammar1, eTempGrammar2, true );
+
+    // Importing ocDde/ocWebservice?
+    if (pFormula1)
+        mpDoc->CheckLinkFormulaNeedingCheck(*pFormula1);
+    if (pFormula2)
+        mpDoc->CheckLinkFormulaNeedingCheck(*pFormula2);
 }
 
 void ScConditionEntry::SetSrcString( const OUString& rNew )
diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx
index f6a43a1d587e..7391e1cca5b4 100644
--- a/sc/source/core/data/documen8.cxx
+++ b/sc/source/core/data/documen8.cxx
@@ -1164,8 +1164,21 @@ void ScDocument::CheckLinkFormulaNeedingCheck( const ScTokenArray& rCode )
     if (HasLinkFormulaNeedingCheck())
         return;
 
-    if (rCode.HasOpCodeRPN(ocDde) || rCode.HasOpCodeRPN(ocWebservice))
-        SetLinkFormulaNeedingCheck(true);
+    // Prefer RPN over tokenized formula if available.
+    if (rCode.GetCodeLen())
+    {
+        if (rCode.HasOpCodeRPN(ocDde) || rCode.HasOpCodeRPN(ocWebservice))
+            SetLinkFormulaNeedingCheck(true);
+    }
+    else if (rCode.GetLen())
+    {
+        if (rCode.HasOpCode(ocDde) || rCode.HasOpCode(ocWebservice))
+            SetLinkFormulaNeedingCheck(true);
+    }
+    else
+    {
+        assert(!"called with empty ScTokenArray");
+    }
 }
 
 // TimerDelays etc.
diff --git a/sc/source/filter/excel/xicontent.cxx b/sc/source/filter/excel/xicontent.cxx
index 69e77b5f5444..b1889680d49c 100644
--- a/sc/source/filter/excel/xicontent.cxx
+++ b/sc/source/filter/excel/xicontent.cxx
@@ -641,7 +641,10 @@ void XclImpCondFormat::ReadCF( XclImpStream& rStrm )
         rFmlaConv.Convert( pTokArr, rStrm, nFmlaSize1, false, FT_CondFormat );
         // formula converter owns pTokArr -> create a copy of the token array
         if( pTokArr )
+        {
             xTokArr1.reset( pTokArr->Clone() );
+            GetDocPtr()->CheckLinkFormulaNeedingCheck( *xTokArr1);
+        }
     }
 
     ::std::unique_ptr< ScTokenArray > pTokArr2;
@@ -652,7 +655,10 @@ void XclImpCondFormat::ReadCF( XclImpStream& rStrm )
         rFmlaConv.Convert( pTokArr, rStrm, nFmlaSize2, false, FT_CondFormat );
         // formula converter owns pTokArr -> create a copy of the token array
         if( pTokArr )
+        {
             pTokArr2.reset( pTokArr->Clone() );
+            GetDocPtr()->CheckLinkFormulaNeedingCheck( *pTokArr2);
+        }
     }
 
     // *** create the Calc conditional formatting ***
diff --git a/sc/source/filter/oox/condformatbuffer.cxx b/sc/source/filter/oox/condformatbuffer.cxx
index 955b304c24eb..9ffcf514de6a 100644
--- a/sc/source/filter/oox/condformatbuffer.cxx
+++ b/sc/source/filter/oox/condformatbuffer.cxx
@@ -882,11 +882,13 @@ void CondFormatRule::finalizeImport()
         {
             pTokenArray2.reset(new ScTokenArray());
             ScTokenConversion::ConvertToTokenArray( rDoc, *pTokenArray2.get(), maModel.maFormulas[ 1 ] );
+            rDoc.CheckLinkFormulaNeedingCheck( *pTokenArray2.get());
         }
 
         ScTokenArray aTokenArray;
         OUString aStyleName = getStyles().createDxfStyle( maModel.mnDxfId );
         ScTokenConversion::ConvertToTokenArray( rDoc, aTokenArray, maModel.maFormulas[ 0 ] );
+        rDoc.CheckLinkFormulaNeedingCheck( aTokenArray);
         ScCondFormatEntry* pNewEntry = new ScCondFormatEntry(eOperator,
                                             &aTokenArray, pTokenArray2.get(), &rDoc, aPos, aStyleName);
         mpFormat->AddEntry(pNewEntry);
commit f68fcb620d8da46803be7daa0d4c3fe7a96d3490
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Jan 17 22:22:55 2018 +0100

    CheckLinkFormulaNeedingCheck() for .xls and .xlsx formula cells
    
     This is a combination of 3 commits.
    
    Move implementation to CheckLinkFormulaNeedingCheck() for further reuse
    
    (cherry picked from commit 55e484c7bcd3ef218e08d3fd93f97bf98fd8cb7f)
    
    CheckLinkFormulaNeedingCheck() for .xlsx cell formulas
    
    (cherry picked from commit f96dbc3dd9c33202f75e29ef49d962386595995d)
    
    CheckLinkFormulaNeedingCheck() for .xls cell formulas
    
    (cherry picked from commit 6bc48275558c3f76c4da25eb8af3c48583ac5599)
    
    a6dd195f7eb4d43483e87eeca59f651e7bf2dcb8
    2587fbc4fec39b6f2c8e733331815a2953dee308
    
    Change-Id: I541d2b6e12a88371c064b901b00e71206ee0c18e
    Reviewed-on: https://gerrit.libreoffice.org/48143
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index a4e65e137706..2e43cb1944fa 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1796,6 +1796,8 @@ public:
 
     bool            HasLinkFormulaNeedingCheck() const      { return bLinkFormulaNeedingCheck; }
     void            SetLinkFormulaNeedingCheck(bool bSet)   { bLinkFormulaNeedingCheck = bSet; }
+    /** Check token array and set link check if ocDde/ocWebservice is contained. */
+    SC_DLLPUBLIC void CheckLinkFormulaNeedingCheck( const ScTokenArray& rCode );
 
     static bool     CheckMacroWarn();
 
diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx
index 2bdfa30e3160..f6a43a1d587e 100644
--- a/sc/source/core/data/documen8.cxx
+++ b/sc/source/core/data/documen8.cxx
@@ -88,6 +88,7 @@
 #include "stringutil.hxx"
 #include <documentlinkmgr.hxx>
 #include <scopetools.hxx>
+#include <tokenarray.hxx>
 
 #include <boost/scoped_ptr.hpp>
 
@@ -1158,6 +1159,15 @@ void ScDocument::UpdateRefAreaLinks( UpdateRefMode eUpdateRefMode,
     }
 }
 
+void ScDocument::CheckLinkFormulaNeedingCheck( const ScTokenArray& rCode )
+{
+    if (HasLinkFormulaNeedingCheck())
+        return;
+
+    if (rCode.HasOpCodeRPN(ocDde) || rCode.HasOpCodeRPN(ocWebservice))
+        SetLinkFormulaNeedingCheck(true);
+}
+
 // TimerDelays etc.
 void ScDocument::KeyInput( const KeyEvent& )
 {
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 96316392ffc3..49d3133f42fe 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -1353,8 +1353,7 @@ void ScFormulaCell::CompileXML( sc::CompileFormulaContext& rCxt, ScProgress& rPr
 
     //  After loading, it must be known if ocDde/ocWebservice is in any formula
     //  (for external links warning, CompileXML is called at the end of loading XML file)
-    if (!pDocument->HasLinkFormulaNeedingCheck() && (pCode->HasOpCodeRPN(ocDde) || pCode->HasOpCodeRPN(ocWebservice)))
-        pDocument->SetLinkFormulaNeedingCheck(true);
+    pDocument->CheckLinkFormulaNeedingCheck(*pCode);
 
     //volatile cells must be added here for import
     if( pCode->IsRecalcModeAlways() || pCode->IsRecalcModeForced() ||
diff --git a/sc/source/filter/excel/excform.cxx b/sc/source/filter/excel/excform.cxx
index 08399552c2a3..14be167de85e 100644
--- a/sc/source/filter/excel/excform.cxx
+++ b/sc/source/filter/excel/excform.cxx
@@ -157,6 +157,7 @@ void ImportExcel::Formula(
     {
         pCell = new ScFormulaCell(&rDoc.getDoc(), aScPos, *pResult);
         pCell->GetCode()->WrapReference(aScPos, EXC_MAXCOL8, EXC_MAXROW8);
+        rDoc.getDoc().CheckLinkFormulaNeedingCheck( *pCell->GetCode());
         rDoc.getDoc().EnsureTable(aScPos.Tab());
         rDoc.setFormulaCell(aScPos, pCell);
         SetLastFormula(aScPos.Col(), aScPos.Row(), fCurVal, nXF, pCell);
diff --git a/sc/source/filter/excel/excform8.cxx b/sc/source/filter/excel/excform8.cxx
index ebe3b6445e57..c7e56afd1149 100644
--- a/sc/source/filter/excel/excform8.cxx
+++ b/sc/source/filter/excel/excform8.cxx
@@ -729,6 +729,7 @@ ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn,
                                         << nMerk0 << ocClose;
                                 aPool >> aStack;
                                 pExtName->CreateDdeData( GetDoc(), aApplic, aTopic );
+                                GetDoc().SetLinkFormulaNeedingCheck(true);
                             }
                         }
                         break;
diff --git a/sc/source/filter/excel/impop.cxx b/sc/source/filter/excel/impop.cxx
index 904209d2bb1b..69e536e64ed3 100644
--- a/sc/source/filter/excel/impop.cxx
+++ b/sc/source/filter/excel/impop.cxx
@@ -866,6 +866,7 @@ void ImportExcel::Shrfmla()
 
     ScFormulaCell* pCell = new ScFormulaCell(pD, aPos, *pErgebnis);
     pCell->GetCode()->WrapReference(aPos, EXC_MAXCOL8, EXC_MAXROW8);
+    rDoc.getDoc().CheckLinkFormulaNeedingCheck( *pCell->GetCode());
     rDoc.getDoc().EnsureTable(aPos.Tab());
     rDoc.setFormulaCell(aPos, pCell);
     pCell->SetNeedNumberFormat(false);
diff --git a/sc/source/filter/oox/formulabuffer.cxx b/sc/source/filter/oox/formulabuffer.cxx
index 189017d65196..2d20e9d73a53 100644
--- a/sc/source/filter/oox/formulabuffer.cxx
+++ b/sc/source/filter/oox/formulabuffer.cxx
@@ -229,6 +229,10 @@ void applyCellFormulas(
             continue;
 
         aCompiler.CompileTokenArray(); // Generate RPN tokens.
+
+        // Check if ocDde/ocWebservice is in any formula for external links warning.
+        rDoc.getDoc().CheckLinkFormulaNeedingCheck(*pCode);
+
         ScFormulaCell* pCell = new ScFormulaCell(&rDoc.getDoc(), aPos, pCode);
         rDoc.setFormulaCell(aPos, pCell);
         rCache.store(aPos, pCell);
commit 06cd169cf83561548e4e9f7a3cc597f395c8461c
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Jan 11 20:43:28 2018 +0000

    handle ocWebservice similarly to ocDde
    
    might have too much in here seeing as we don't need to worry about
    ocWebservice calling into itself
    
    Reviewed-on: https://gerrit.libreoffice.org/47819
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Eike Rathke <erack at redhat.com>
    (cherry picked from commit e1946d75a1095c2596d7815600454ff01fcd3270)
    Signed-off-by: Andras Timar <andras.timar at collabora.com>
    
    (cherry picked from commit 78c1ae24007d8098ee4f4add6d72e84411181785)
    
    (cherry picked from commit a09ca6b29b16f29e21ea65658c112eaf1cf7d819)
    
    Change-Id: I0145f38cc1c1f9ff514a496f7101d81cde9e7c67

diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk
index b22b2a0869ad..2c74f5952fed 100644
--- a/sc/Library_sc.mk
+++ b/sc/Library_sc.mk
@@ -283,6 +283,7 @@ $(eval $(call gb_Library_add_exception_objects,sc,\
     sc/source/core/tool/unitconv \
     sc/source/core/tool/userlist \
     sc/source/core/tool/viewopti \
+    sc/source/core/tool/webservicelink \
     sc/source/core/tool/zforauto \
     sc/source/filter/xml/datastreamimport \
     sc/source/filter/xml/XMLCalculationSettingsContext \
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index a254fb59641f..a4e65e137706 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -429,7 +429,7 @@ private:
     bool                bDetectiveDirty;
 
     sal_uInt8               nMacroCallMode;     // Macros per warning dialog disabled?
-    bool                bLinkFormulaNeedingCheck; // valid only after loading, for ocDde
+    bool                bLinkFormulaNeedingCheck; // valid only after loading, for ocDde and ocWebservice
 
     sal_uInt8               nVisSpellState;
 
diff --git a/sc/inc/documentlinkmgr.hxx b/sc/inc/documentlinkmgr.hxx
index cc42410ca3dc..d7972b14e5f0 100644
--- a/sc/inc/documentlinkmgr.hxx
+++ b/sc/inc/documentlinkmgr.hxx
@@ -53,9 +53,9 @@ public:
     bool idleCheckLinks();
 
     bool hasDdeLinks() const;
-    bool hasDdeOrOleLinks() const;
+    bool hasDdeOrOleOrWebServiceLinks() const;
 
-    bool updateDdeOrOleLinks(vcl::Window* pWin);
+    bool updateDdeOrOleOrWebServiceLinks(vcl::Window* pWin);
 
     bool updateDdeLink( const OUString& rAppl, const OUString& rTopic, const OUString& rItem );
 
@@ -63,7 +63,7 @@ public:
 
     void disconnectDdeLinks();
 private:
-    bool hasDdeOrOleLinks(bool bDde, bool bOle) const;
+    bool hasDdeOrOleOrWebServiceLinks(bool bDde, bool bOle, bool bWebService) const;
 };
 
 }
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 9a9b5705e5e2..96316392ffc3 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -1351,9 +1351,9 @@ void ScFormulaCell::CompileXML( sc::CompileFormulaContext& rCxt, ScProgress& rPr
             bChanged = true;
     }
 
-    //  After loading, it must be known if ocDde is in any formula
+    //  After loading, it must be known if ocDde/ocWebservice is in any formula
     //  (for external links warning, CompileXML is called at the end of loading XML file)
-    if (!pDocument->HasLinkFormulaNeedingCheck() && pCode->HasOpCodeRPN(ocDde))
+    if (!pDocument->HasLinkFormulaNeedingCheck() && (pCode->HasOpCodeRPN(ocDde) || pCode->HasOpCodeRPN(ocWebservice)))
         pDocument->SetLinkFormulaNeedingCheck(true);
 
     //volatile cells must be added here for import
diff --git a/sc/source/core/inc/webservicelink.hxx b/sc/source/core/inc/webservicelink.hxx
new file mode 100644
index 000000000000..e61ebfdb4347
--- /dev/null
+++ b/sc/source/core/inc/webservicelink.hxx
@@ -0,0 +1,49 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_SC_SOURCE_CORE_INC_WEBSERVICE_HXX
+#define INCLUDED_SC_SOURCE_CORE_INC_WEBSERVICE_HXX
+
+#include <address.hxx>
+#include <sfx2/lnkbase.hxx>
+#include <svl/broadcast.hxx>
+#include <types.hxx>
+
+class ScDocument;
+
+class ScWebServiceLink : public ::sfx2::SvBaseLink, public SvtBroadcaster
+{
+private:
+    ScDocument* pDoc;
+    OUString aURL; // connection/ link data
+    bool bHasResult; // is set aResult is useful
+    OUString aResult;
+
+public:
+    ScWebServiceLink(ScDocument* pD, const OUString& rURL);
+    virtual ~ScWebServiceLink() override;
+
+    // SvBaseLink override:
+    virtual ::sfx2::SvBaseLink::UpdateResult DataChanged(const OUString& rMimeType,
+                                                         const css::uno::Any& rValue) override;
+
+    // SvtBroadcaster override:
+    virtual void ListenersGone() override;
+
+    // for interpreter:
+
+    const OUString& GetResult() const { return aResult; }
+    bool HasResult() const { return bHasResult; }
+
+    const OUString& GetURL() const { return aURL; }
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sc/source/core/tool/interpr7.cxx b/sc/source/core/tool/interpr7.cxx
index 66cc47d06606..d5bf77fff167 100644
--- a/sc/source/core/tool/interpr7.cxx
+++ b/sc/source/core/tool/interpr7.cxx
@@ -10,6 +10,8 @@
 #include "interpre.hxx"
 #include <rtl/strbuf.hxx>
 #include <formula/errorcodes.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/linkmgr.hxx>
 #include <svtools/miscopt.hxx>
 #include <tools/urlobj.hxx>
 
@@ -21,6 +23,11 @@
 #include <datastreamgettime.hxx>
 #include <dpobject.hxx>
 #include <document.hxx>
+#include <tokenarray.hxx>
+#include <webservicelink.hxx>
+#include "formulacell.hxx"
+
+#include <sc.hrc>
 
 #include <boost/shared_ptr.hpp>
 #include <cstring>
@@ -146,6 +153,22 @@ void ScInterpreter::ScFilterXML()
     }
 }
 
+static ScWebServiceLink* lcl_GetWebServiceLink(const sfx2::LinkManager* pLinkMgr, const OUString& rURL)
+{
+    size_t nCount = pLinkMgr->GetLinks().size();
+    for (size_t i=0; i<nCount; ++i)
+    {
+        ::sfx2::SvBaseLink* pBase = *pLinkMgr->GetLinks()[i];
+        if (ScWebServiceLink* pLink = dynamic_cast<ScWebServiceLink*>(pBase))
+        {
+            if (pLink->GetURL() == rURL)
+                return pLink;
+        }
+    }
+
+    return nullptr;
+}
+
 void ScInterpreter::ScWebservice()
 {
     sal_uInt8 nParamCount = GetByte();
@@ -153,7 +176,7 @@ void ScInterpreter::ScWebservice()
     {
         OUString aURI = GetString().getString();
 
-        if(aURI.isEmpty())
+        if (aURI.isEmpty())
         {
             PushError( errNoValue );
             return;
@@ -163,52 +186,73 @@ void ScInterpreter::ScWebservice()
         INetProtocol eProtocol = aObj.GetProtocol();
         if (eProtocol != INetProtocol::Http && eProtocol != INetProtocol::Https)
         {
-            PushError( FormulaError::NoValue );
+            PushError(errNoValue);
             return;
         }
 
-        uno::Reference< ucb::XSimpleFileAccess3 > xFileAccess( ucb::SimpleFileAccess::create( comphelper::getProcessComponentContext() ), uno::UNO_QUERY );
-        if(!xFileAccess.is())
+        sfx2::LinkManager* pLinkMgr = pDok->GetLinkManager();
+        if (!pLinkMgr)
         {
             PushError( errNoValue );
             return;
         }
 
-        uno::Reference< io::XInputStream > xStream;
-        try {
-            xStream = xFileAccess->openFileRead( aURI );
-        }
-        catch (...)
-        {
-            // don't let any exceptions pass
-            PushError( errNoValue );
-            return;
-        }
-        if ( !xStream.is() )
+        // Need to reinterpret after loading (build links)
+        if (rArr.IsRecalcModeNormal())
+            rArr.SetExclusiveRecalcModeOnLoad();
+
+        //  while the link is not evaluated, idle must be disabled (to avoid circular references)
+        bool bOldEnabled = pDok->IsIdleEnabled();
+        pDok->EnableIdle(false);
+
+        // Get/ Create link object
+        ScWebServiceLink* pLink = lcl_GetWebServiceLink(pLinkMgr, aURI);
+
+        bool bWasError = (pMyFormulaCell && pMyFormulaCell->GetRawError() != 0);
+
+        if (!pLink)
         {
+            pLink = new ScWebServiceLink(pDok, aURI);
             PushError( errNoValue );
-            return;
-        }
+            if ( pLinkMgr->GetLinks().size() == 1 )                    // the first one?
+            {
+                SfxBindings* pBindings = pDok->GetViewBindings();
+                if (pBindings)
+                    pBindings->Invalidate( SID_LINKS );             // Link-Manager enabled
+            }
 
-        const sal_Int32 BUF_LEN = 8000;
-        uno::Sequence< sal_Int8 > buffer( BUF_LEN );
-        OStringBuffer aBuffer( 64000 );
+            //if the document was just loaded, but the ScDdeLink entry was missing, then
+            //don't update this link until the links are updated in response to the users
+            //decision
+            if (!pDok->HasLinkFormulaNeedingCheck())
+            {
+            PushError( errNoValue );
+            }
 
-        sal_Int32 nRead = 0;
-        while ( ( nRead = xStream->readBytes( buffer, BUF_LEN ) ) == BUF_LEN )
-        {
-            aBuffer.append( reinterpret_cast< const char* >( buffer.getConstArray() ), nRead );
+            if (pMyFormulaCell)
+            {
+                // StartListening after the Update to avoid circular references
+                pMyFormulaCell->StartListening(*pLink);
+            }
         }
-
-        if ( nRead > 0 )
+        else
         {
-            aBuffer.append( reinterpret_cast< const char* >( buffer.getConstArray() ), nRead );
+            if (pMyFormulaCell)
+                pMyFormulaCell->StartListening(*pLink);
         }
 
-        xStream->closeInput();
+        //  If an new Error from Reschedule appears when the link is executed then reset the errorflag
+        if (pMyFormulaCell && pMyFormulaCell->GetRawError() != 0 && !bWasError)
+            pMyFormulaCell->SetErrCode(0);
+
+        //  check the value
+        if (pLink->HasResult())
+            PushString(pLink->GetResult());
+        else
+            PushError(errNoValue);
 
-        OUString aContent = OStringToOUString( aBuffer.makeStringAndClear(), RTL_TEXTENCODING_UTF8 );
-        PushString( aContent );
+        pDok->EnableIdle(bOldEnabled);
+        pLinkMgr->CloseCachedComps();
     }
 }
 
diff --git a/sc/source/core/tool/webservicelink.cxx b/sc/source/core/tool/webservicelink.cxx
new file mode 100644
index 000000000000..0d9e32cdef60
--- /dev/null
+++ b/sc/source/core/tool/webservicelink.cxx
@@ -0,0 +1,106 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <comphelper/fileformat.h>
+#include <comphelper/string.hxx>
+#include <osl/thread.h>
+#include <sfx2/linkmgr.hxx>
+#include <sfx2/bindings.hxx>
+
+#include <com/sun/star/ucb/XSimpleFileAccess3.hpp>
+#include <com/sun/star/ucb/SimpleFileAccess.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
+
+#include <webservicelink.hxx>
+#include <brdcst.hxx>
+#include <document.hxx>
+#include <scmatrix.hxx>
+#include <patattr.hxx>
+#include <rechead.hxx>
+#include <rangeseq.hxx>
+#include <sc.hrc>
+#include <hints.hxx>
+
+ScWebServiceLink::ScWebServiceLink(ScDocument* pD, const OUString& rURL)
+    : ::sfx2::SvBaseLink(SfxLinkUpdateMode::ALWAYS, SotClipboardFormatId::STRING)
+    , pDoc(pD)
+    , aURL(rURL)
+    , bHasResult(false)
+{
+}
+
+ScWebServiceLink::~ScWebServiceLink() {}
+
+sfx2::SvBaseLink::UpdateResult ScWebServiceLink::DataChanged(const OUString&, const css::uno::Any&)
+{
+    aResult.clear();
+    bHasResult = false;
+
+    css::uno::Reference<css::ucb::XSimpleFileAccess3> xFileAccess(
+        css::ucb::SimpleFileAccess::create(comphelper::getProcessComponentContext()),
+        css::uno::UNO_QUERY);
+    if (!xFileAccess.is())
+        return ERROR_GENERAL;
+
+    css::uno::Reference<css::io::XInputStream> xStream;
+    try
+    {
+        xStream = xFileAccess->openFileRead(aURL);
+    }
+    catch (...)
+    {
+        // don't let any exceptions pass
+        return ERROR_GENERAL;
+    }
+    if (!xStream.is())
+        return ERROR_GENERAL;
+
+    const sal_Int32 BUF_LEN = 8000;
+    css::uno::Sequence<sal_Int8> buffer(BUF_LEN);
+    OStringBuffer aBuffer(64000);
+
+    sal_Int32 nRead = 0;
+    while ((nRead = xStream->readBytes(buffer, BUF_LEN)) == BUF_LEN)
+        aBuffer.append(reinterpret_cast<const char*>(buffer.getConstArray()), nRead);
+
+    if (nRead > 0)
+        aBuffer.append(reinterpret_cast<const char*>(buffer.getConstArray()), nRead);
+
+    xStream->closeInput();
+
+    aResult = OStringToOUString(aBuffer.makeStringAndClear(), RTL_TEXTENCODING_UTF8);
+    bHasResult = true;
+
+    //  Something happened...
+    if (HasListeners())
+    {
+        Broadcast(ScHint(SFX_HINT_DATACHANGED, ScAddress()));
+        pDoc->TrackFormulas(); // must happen immediately
+        pDoc->StartTrackTimer();
+    }
+
+    return SUCCESS;
+}
+
+void ScWebServiceLink::ListenersGone()
+{
+    ScDocument* pStackDoc = pDoc; // member pDoc can't be used after removing the link
+
+    sfx2::LinkManager* pLinkMgr = pDoc->GetLinkManager();
+    pLinkMgr->Remove(this); // deletes this
+
+    if (pLinkMgr->GetLinks().empty()) // deleted the last one ?
+    {
+        SfxBindings* pBindings = pStackDoc->GetViewBindings(); // don't use member pDoc!
+        if (pBindings)
+            pBindings->Invalidate(SID_LINKS);
+    }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sc/source/ui/docshell/docsh4.cxx b/sc/source/ui/docshell/docsh4.cxx
index ad8a75a44c58..2645c7f0c119 100644
--- a/sc/source/ui/docshell/docsh4.cxx
+++ b/sc/source/ui/docshell/docsh4.cxx
@@ -455,7 +455,7 @@ void ScDocShell::Execute( SfxRequest& rReq )
                     ReloadTabLinks();
                     aDocument.UpdateExternalRefLinks(GetActiveDialogParent());
 
-                    bool bAnyDde = aDocument.GetDocLinkManager().updateDdeOrOleLinks(GetActiveDialogParent());
+                    bool bAnyDde = aDocument.GetDocLinkManager().updateDdeOrOleOrWebServiceLinks(GetActiveDialogParent());
 
                     if (bAnyDde)
                     {
diff --git a/sc/source/ui/docshell/documentlinkmgr.cxx b/sc/source/ui/docshell/documentlinkmgr.cxx
index 8e5a5c3a02bb..ae8984b6950a 100644
--- a/sc/source/ui/docshell/documentlinkmgr.cxx
+++ b/sc/source/ui/docshell/documentlinkmgr.cxx
@@ -20,6 +20,7 @@
 #include <documentlinkmgr.hxx>
 #include <datastream.hxx>
 #include <ddelink.hxx>
+#include <webservicelink.hxx>
 #include <sc.hrc>
 #include <scresid.hxx>
 
@@ -115,15 +116,15 @@ bool DocumentLinkManager::idleCheckLinks()
 
 bool DocumentLinkManager::hasDdeLinks() const
 {
-    return hasDdeOrOleLinks(true, false);
+    return hasDdeOrOleOrWebServiceLinks(true, false, false);
 }
 
-bool DocumentLinkManager::hasDdeOrOleLinks() const
+bool DocumentLinkManager::hasDdeOrOleOrWebServiceLinks() const
 {
-    return hasDdeOrOleLinks(true, true);
+    return hasDdeOrOleOrWebServiceLinks(true, true, true);
 }
 
-bool DocumentLinkManager::hasDdeOrOleLinks(bool bDde, bool bOle) const
+bool DocumentLinkManager::hasDdeOrOleOrWebServiceLinks(bool bDde, bool bOle, bool bWebService) const
 {
     if (!mpImpl->mpLinkManager)
         return false;
@@ -136,12 +137,14 @@ bool DocumentLinkManager::hasDdeOrOleLinks(bool bDde, bool bOle) const
             return true;
         if (bOle && dynamic_cast<SdrEmbedObjectLink*>(pBase))
             return true;
+        if (bWebService && dynamic_cast<ScWebServiceLink*>(pBase))
+            return true;
     }
 
     return false;
 }
 
-bool DocumentLinkManager::updateDdeOrOleLinks( vcl::Window* pWin )
+bool DocumentLinkManager::updateDdeOrOleOrWebServiceLinks(vcl::Window* pWin)
 {
     if (!mpImpl->mpLinkManager)
         return false;
@@ -163,6 +166,13 @@ bool DocumentLinkManager::updateDdeOrOleLinks( vcl::Window* pWin )
             continue;
         }
 
+        ScWebServiceLink* pWebserviceLink = dynamic_cast<ScWebServiceLink*>(pBase);
+        if (pWebserviceLink)
+        {
+            pWebserviceLink->Update();
+            continue;
+        }
+
         ScDdeLink* pDdeLink = dynamic_cast<ScDdeLink*>(pBase);
         if (!pDdeLink)
             continue;
diff --git a/sc/source/ui/view/tabvwsh4.cxx b/sc/source/ui/view/tabvwsh4.cxx
index 0c9b036863c0..c7209c11aa77 100644
--- a/sc/source/ui/view/tabvwsh4.cxx
+++ b/sc/source/ui/view/tabvwsh4.cxx
@@ -1584,7 +1584,7 @@ void ScTabViewShell::Construct( TriState nForceDesignMode )
             if (!bLink)
             {
                 const sc::DocumentLinkManager& rMgr = rDoc.GetDocLinkManager();
-                if (rMgr.hasDdeOrOleLinks() || rDoc.HasAreaLinks() || rDoc.HasLinkFormulaNeedingCheck())
+                if (rDoc.HasLinkFormulaNeedingCheck() || rDoc.HasAreaLinks() || rMgr.hasDdeOrOleOrWebServiceLinks())
                     bLink = true;
             }
             if (bLink)
commit e7d2718b712b9811cc9e3aaf42e3fd8885a8223c
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Jan 11 14:16:15 2018 +0000

    Better handle ScDde formulas with missing dde-link entries
    
    typically each ScDde formula has a matching table:dde-link which
    results in a ScDdeLink getting inserted during the load. If that dde-link
    is missing then no ScDdeLink exists and ScDde() will create a new one without
    cached content. So detect that ScDde is used in the freshing loaded ods
    and defer fetching new content until the right time.
    
    only call GetHasMacroFunc to set SetHasMacroFunc
    
    and bHasMacroFunc is not accessed any other way, so this is an oxbow
    
    Reviewed-on: https://gerrit.libreoffice.org/47757
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>
    (cherry picked from commit b0597ba5d745974fce752e1b677451a19350d351)
    Reviewed-on: https://gerrit.libreoffice.org/47818
    Reviewed-by: Eike Rathke <erack at redhat.com>
    (cherry picked from commit 4ede45eb239b1604bca900c22481b7d13e4c2790)
    Signed-off-by: Andras Timar <andras.timar at collabora.com>
    
    (cherry picked from commit 3139914eb6379837fbf309642a63371128042db1)
    (cherry picked from commit ef93fb5ae0691cba777c9d2b24a3180e14281cbc)
    
    Change-Id: I016b53288076d83dd49e92e245346a5f7f560522

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index f5bcd9a46cf6..a254fb59641f 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -429,7 +429,7 @@ private:
     bool                bDetectiveDirty;
 
     sal_uInt8               nMacroCallMode;     // Macros per warning dialog disabled?
-    bool                bHasMacroFunc;      // valid only after loading
+    bool                bLinkFormulaNeedingCheck; // valid only after loading, for ocDde
 
     sal_uInt8               nVisSpellState;
 
@@ -1794,8 +1794,8 @@ public:
     sal_uInt8           GetMacroCallMode() const     { return nMacroCallMode; }
     void            SetMacroCallMode(sal_uInt8 nNew)     { nMacroCallMode = nNew; }
 
-    bool            GetHasMacroFunc() const      { return bHasMacroFunc; }
-    void            SetHasMacroFunc(bool bSet)   { bHasMacroFunc = bSet; }
+    bool            HasLinkFormulaNeedingCheck() const      { return bLinkFormulaNeedingCheck; }
+    void            SetLinkFormulaNeedingCheck(bool bSet)   { bLinkFormulaNeedingCheck = bSet; }
 
     static bool     CheckMacroWarn();
 
diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx
index 6940762c8c11..588aee4996b5 100644
--- a/sc/source/core/data/documen2.cxx
+++ b/sc/source/core/data/documen2.cxx
@@ -203,7 +203,7 @@ ScDocument::ScDocument( ScDocumentMode eMode, SfxObjectShell* pDocShell ) :
         bExpandRefs( false ),
         bDetectiveDirty( false ),
         nMacroCallMode( SC_MACROCALL_ALLOWED ),
-        bHasMacroFunc( false ),
+        bLinkFormulaNeedingCheck( false ),
         nVisSpellState( 0 ),
         nAsianCompression(SC_ASIANCOMPRESSION_INVALID),
         nAsianKerning(SC_ASIANKERNING_INVALID),
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index ceb7f68d6a6f..9a9b5705e5e2 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -1351,10 +1351,10 @@ void ScFormulaCell::CompileXML( sc::CompileFormulaContext& rCxt, ScProgress& rPr
             bChanged = true;
     }
 
-    //  Same as in Load: after loading, it must be known if ocMacro is in any formula
-    //  (for macro warning, CompileXML is called at the end of loading XML file)
-    if ( !pDocument->GetHasMacroFunc() && pCode->HasOpCodeRPN( ocMacro ) )
-        pDocument->SetHasMacroFunc( true );
+    //  After loading, it must be known if ocDde is in any formula
+    //  (for external links warning, CompileXML is called at the end of loading XML file)
+    if (!pDocument->HasLinkFormulaNeedingCheck() && pCode->HasOpCodeRPN(ocDde))
+        pDocument->SetLinkFormulaNeedingCheck(true);
 
     //volatile cells must be added here for import
     if( pCode->IsRecalcModeAlways() || pCode->IsRecalcModeForced() ||
diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index d82bc29eaff9..5f6b5af7d980 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -2421,8 +2421,14 @@ void ScInterpreter::ScDde()
                     pBindings->Invalidate( SID_LINKS );             // Link-Manager enablen
             }
 
+            //if the document was just loaded, but the ScDdeLink entry was missing, then
+            //don't update this link until the links are updated in response to the users
+            //decision
+            if (!pDok->HasLinkFormulaNeedingCheck())
+            {
                                     //TODO: evaluate asynchron ???
-            pLink->TryUpdate();     //  TryUpdate doesn't call Update multiple times
+                pLink->TryUpdate(); //  TryUpdate doesn't call Update multiple times
+            }
 
             if (pMyFormulaCell)
             {
diff --git a/sc/source/ui/docshell/docsh4.cxx b/sc/source/ui/docshell/docsh4.cxx
index 9fcf549c8920..ad8a75a44c58 100644
--- a/sc/source/ui/docshell/docsh4.cxx
+++ b/sc/source/ui/docshell/docsh4.cxx
@@ -477,6 +477,8 @@ void ScDocShell::Execute( SfxRequest& rReq )
                     rEmbeddedObjectContainer.setUserAllowsLinkUpdate(false);
                     rReq.Ignore();
                 }
+
+                rDoc.SetLinkFormulaNeedingCheck(false);
             }
             break;
 
diff --git a/sc/source/ui/view/tabvwsh4.cxx b/sc/source/ui/view/tabvwsh4.cxx
index ff3a5a1d94f1..0c9b036863c0 100644
--- a/sc/source/ui/view/tabvwsh4.cxx
+++ b/sc/source/ui/view/tabvwsh4.cxx
@@ -1584,7 +1584,7 @@ void ScTabViewShell::Construct( TriState nForceDesignMode )
             if (!bLink)
             {
                 const sc::DocumentLinkManager& rMgr = rDoc.GetDocLinkManager();
-                if (rMgr.hasDdeOrOleLinks() || rDoc.HasAreaLinks())
+                if (rMgr.hasDdeOrOleLinks() || rDoc.HasAreaLinks() || rDoc.HasLinkFormulaNeedingCheck())
                     bLink = true;
             }
             if (bLink)
commit 4c583da678dcc6978a4c26581ea7f993f90cc228
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Jan 10 14:27:35 2018 +0000

    limit WEBSERVICE to http[s] protocols
    
    and like excel...
    
    'For protocols that aren’t supported, such as ftp:// or file://, WEBSERVICE
    returns the #VALUE! error value.'
    
    Change-Id: I0e9c6fd3426fad56a199eafac48de9b0f23914b3
    (cherry picked from commit c6c3ed3c750a3c71cb57909c60773fde2c43cd2a)
    (cherry picked from commit defb648f718c3ea52c719313986a7188c6a6eafd)

diff --git a/sc/source/core/tool/interpr7.cxx b/sc/source/core/tool/interpr7.cxx
index ce69848d6f99..66cc47d06606 100644
--- a/sc/source/core/tool/interpr7.cxx
+++ b/sc/source/core/tool/interpr7.cxx
@@ -11,6 +11,7 @@
 #include <rtl/strbuf.hxx>
 #include <formula/errorcodes.hxx>
 #include <svtools/miscopt.hxx>
+#include <tools/urlobj.hxx>
 
 #include <com/sun/star/ucb/XSimpleFileAccess3.hpp>
 #include <com/sun/star/ucb/SimpleFileAccess.hpp>
@@ -158,6 +159,14 @@ void ScInterpreter::ScWebservice()
             return;
         }
 
+        INetURLObject aObj(aURI, INetProtocol::File);
+        INetProtocol eProtocol = aObj.GetProtocol();
+        if (eProtocol != INetProtocol::Http && eProtocol != INetProtocol::Https)
+        {
+            PushError( FormulaError::NoValue );
+            return;
+        }
+
         uno::Reference< ucb::XSimpleFileAccess3 > xFileAccess( ucb::SimpleFileAccess::create( comphelper::getProcessComponentContext() ), uno::UNO_QUERY );
         if(!xFileAccess.is())
         {


More information about the Libreoffice-commits mailing list