[Libreoffice-commits] core.git: Branch 'distro/lhm/libreoffice-6-4+backports' - include/test offapi/com sc/inc sc/qa sc/source sw/inc sw/PythonTest_sw_python.mk sw/qa sw/source test/source

Samuel Mehrbrodt (via logerrit) logerrit at kemper.freedesktop.org
Wed Jan 8 11:13:15 UTC 2020


 include/test/style/xstyleloader.hxx         |    1 
 offapi/com/sun/star/style/XStyleLoader.idl  |    3 +
 sc/inc/tablink.hxx                          |    9 ++--
 sc/qa/extras/scstylefamiliesobj.cxx         |    1 
 sc/source/ui/docshell/tablink.cxx           |    5 ++
 sc/source/ui/unoobj/styleuno.cxx            |   22 ++++++++++-
 sw/PythonTest_sw_python.mk                  |    1 
 sw/inc/docsh.hxx                            |    3 -
 sw/inc/shellio.hxx                          |    7 +++
 sw/qa/python/testdocuments/xstyleloader.odt |binary
 sw/qa/python/xstyleloader.py                |   56 ++++++++++++++++++++++++++++
 sw/source/core/unocore/unostyle.cxx         |   24 ++++++++++--
 sw/source/uibase/app/docsh2.cxx             |    5 +-
 test/source/style/xstyleloader.cxx          |   30 +++++++++++++++
 14 files changed, 154 insertions(+), 13 deletions(-)

New commits:
commit 3871b7247f760cae30b3fb49c9efe0c9aaa95d06
Author:     Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
AuthorDate: Wed Dec 18 15:01:38 2019 +0100
Commit:     Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Wed Jan 8 12:12:44 2020 +0100

    XStyleLoader::loadStylesFromURL Allow loading from stream
    
    Change-Id: Iab0c301096118203466dd91c724c25f1283a0488
    Reviewed-on: https://gerrit.libreoffice.org/85392
    Tested-by: Jenkins
    Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
    (cherry picked from commit 0322a41224a7264bbe03a068647ab093bcc88f90)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/85728
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
    Tested-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

diff --git a/include/test/style/xstyleloader.hxx b/include/test/style/xstyleloader.hxx
index 4077d30327d0..ca34a72cf4b3 100644
--- a/include/test/style/xstyleloader.hxx
+++ b/include/test/style/xstyleloader.hxx
@@ -32,6 +32,7 @@ public:
 
     // XStyleLoader
     void testLoadStylesFromURL();
+    void testLoadStylesFromStream();
     // XStyleLoader2
     void testLoadStylesFromDocument();
 
diff --git a/offapi/com/sun/star/style/XStyleLoader.idl b/offapi/com/sun/star/style/XStyleLoader.idl
index a695b79dde21..2899f23d61b2 100644
--- a/offapi/com/sun/star/style/XStyleLoader.idl
+++ b/offapi/com/sun/star/style/XStyleLoader.idl
@@ -38,8 +38,10 @@ published interface XStyleLoader: com::sun::star::uno::XInterface
         defined in this document are loaded.</p>
          @param URL
              The directory and the filename from document with the styles
+             You can also load from stream. Use "private:stream" as the URL and the InputStream parameter below.
          @param aOptions
              Specifies which of the Style families the method should load.
+
          The <code>sequence<PropertyValue></code> has the following, optional items:
          <ul>
         <li> boolean LoadCellStyles </li>
@@ -48,6 +50,7 @@ published interface XStyleLoader: com::sun::star::uno::XInterface
         <li> boolean LoadPageStyles </li>
         <li> boolean LoadNumberingStyles </li>
         <li> boolean OverwriteStyles</li>
+        <li> com::sun::star::io::XInputStream InputStream (since LibreOffice 6.5)</li>
         </ul>
      <p>As the default, all supported style families are loaded and existing styles are overwritten.</p>
      */
diff --git a/sc/inc/tablink.hxx b/sc/inc/tablink.hxx
index 7038bd345fae..eb5e2f665696 100644
--- a/sc/inc/tablink.hxx
+++ b/sc/inc/tablink.hxx
@@ -82,10 +82,11 @@ private:
     SfxMedium*          pMedium;
 
 public:
-                        ScDocumentLoader( const OUString& rFileName,
-                                          OUString& rFilterName, OUString& rOptions,
-                                          sal_uInt32 nRekCnt = 0, weld::Window* pInteractionParent = nullptr );
-                        ~ScDocumentLoader();
+    ScDocumentLoader(const OUString& rFileName, OUString& rFilterName, OUString& rOptions,
+                     sal_uInt32 nRekCnt = 0, weld::Window* pInteractionParent = nullptr,
+                     css::uno::Reference<css::io::XInputStream> xInputStream
+                     = css::uno::Reference<css::io::XInputStream>());
+    ~ScDocumentLoader();
     ScDocument*         GetDocument();
     ScDocShell*         GetDocShell()       { return pDocShell; }
     bool                IsError() const;
diff --git a/sc/qa/extras/scstylefamiliesobj.cxx b/sc/qa/extras/scstylefamiliesobj.cxx
index 26cbce051de5..991334d192b7 100644
--- a/sc/qa/extras/scstylefamiliesobj.cxx
+++ b/sc/qa/extras/scstylefamiliesobj.cxx
@@ -70,6 +70,7 @@ public:
 
     // XStyleLoader
     CPPUNIT_TEST(testLoadStylesFromDocument);
+    CPPUNIT_TEST(testLoadStylesFromStream);
     CPPUNIT_TEST(testLoadStylesFromURL);
 
     CPPUNIT_TEST_SUITE_END();
diff --git a/sc/source/ui/docshell/tablink.cxx b/sc/source/ui/docshell/tablink.cxx
index 80eb7cca743a..6b430467e640 100644
--- a/sc/source/ui/docshell/tablink.cxx
+++ b/sc/source/ui/docshell/tablink.cxx
@@ -514,7 +514,8 @@ SfxMedium* ScDocumentLoader::CreateMedium( const OUString& rFileName, std::share
 
 ScDocumentLoader::ScDocumentLoader(const OUString& rFileName,
                                    OUString& rFilterName, OUString& rOptions,
-                                   sal_uInt32 nRekCnt, weld::Window* pInteractionParent)
+                                   sal_uInt32 nRekCnt, weld::Window* pInteractionParent,
+                                   css::uno::Reference<css::io::XInputStream> xInputStream)
     : pDocShell(nullptr)
     , pMedium(nullptr)
 {
@@ -524,6 +525,8 @@ ScDocumentLoader::ScDocumentLoader(const OUString& rFileName,
     std::shared_ptr<const SfxFilter> pFilter = ScDocShell::Factory().GetFilterContainer()->GetFilter4FilterName( rFilterName );
 
     pMedium = CreateMedium(rFileName, pFilter, rOptions, pInteractionParent);
+    if (xInputStream.is())
+        pMedium->setStreamToLoadFrom(xInputStream, true);
     if ( pMedium->GetError() != ERRCODE_NONE )
         return ;
 
diff --git a/sc/source/ui/unoobj/styleuno.cxx b/sc/source/ui/unoobj/styleuno.cxx
index 3d61f1a29925..4a8d185e70aa 100644
--- a/sc/source/ui/unoobj/styleuno.cxx
+++ b/sc/source/ui/unoobj/styleuno.cxx
@@ -529,7 +529,27 @@ void SAL_CALL ScStyleFamiliesObj::loadStylesFromURL( const OUString& aURL,
 
     OUString aFilter;     // empty - detect
     OUString aFiltOpt;
-    ScDocumentLoader aLoader( aURL, aFilter, aFiltOpt );
+    uno::Reference<io::XInputStream> xInputStream;
+    if (aURL == "private:stream")
+    {
+        for (const auto& rProp : aOptions)
+        {
+            if (rProp.Name == "InputStream")
+            {
+                rProp.Value >>= xInputStream;
+                if (!xInputStream.is())
+                {
+                    throw lang::IllegalArgumentException(
+                        "Parameter 'InputStream' could not be converted "
+                        "to type 'com::sun::star::io::XInputStream'",
+                        nullptr, 0);
+                }
+                break;
+            }
+        }
+    }
+
+    ScDocumentLoader aLoader( aURL, aFilter, aFiltOpt, 0, nullptr, xInputStream );
 
     ScDocShell* pSource = aLoader.GetDocShell();
 
diff --git a/sw/PythonTest_sw_python.mk b/sw/PythonTest_sw_python.mk
index 6e699f5caa1d..b1c96a5c26ab 100644
--- a/sw/PythonTest_sw_python.mk
+++ b/sw/PythonTest_sw_python.mk
@@ -41,6 +41,7 @@ $(eval $(call gb_PythonTest_add_modules,sw_python,$(SRCDIR)/sw/qa/python,\
 	xscriptprovider \
 	xtextfieldssupplier \
 	xcontrolshape \
+	xstyleloader \
 	xtextcontent \
 	xtextrange \
 	xtext \
diff --git a/sw/inc/docsh.hxx b/sw/inc/docsh.hxx
index 08eaf82c3e67..b198654b2296 100644
--- a/sw/inc/docsh.hxx
+++ b/sw/inc/docsh.hxx
@@ -284,8 +284,7 @@ public:
 
     void ToggleLayoutMode(SwView* pView);
 
-    ErrCode LoadStylesFromFile( const OUString& rURL, SwgReaderOption const & rOpt,
-                                bool bUnoCall );
+    ErrCode LoadStylesFromFile(const OUString& rURL, SwgReaderOption& rOpt, bool bUnoCall);
     void InvalidateModel();
     void ReactivateModel();
 
diff --git a/sw/inc/shellio.hxx b/sw/inc/shellio.hxx
index 82da722ac10d..a959136a5244 100644
--- a/sw/inc/shellio.hxx
+++ b/sw/inc/shellio.hxx
@@ -112,6 +112,7 @@ class SwgReaderOption
     bool m_bTextFormats;
     bool m_bNumRules;
     bool m_bMerge;
+    css::uno::Reference<css::io::XInputStream> m_xInputStream;
 public:
     void ResetAllFormatsOnly() { m_bFrameFormats = m_bPageDescs = m_bTextFormats = m_bNumRules = m_bMerge = false; }
     bool IsFormatsOnly() const { return m_bFrameFormats || m_bPageDescs || m_bTextFormats || m_bNumRules || m_bMerge; }
@@ -135,6 +136,12 @@ public:
     void SetASCIIOpts( const SwAsciiOptions& rOpts ) { aASCIIOpts = rOpts; }
     void ResetASCIIOpts() { aASCIIOpts.Reset(); }
 
+    css::uno::Reference<css::io::XInputStream>& GetInputStream() { return m_xInputStream; }
+    void SetInputStream(css::uno::Reference<css::io::XInputStream>& xInputStream)
+    {
+        m_xInputStream = xInputStream;
+    }
+
     SwgReaderOption()
         { ResetAllFormatsOnly(); aASCIIOpts.Reset(); }
 };
diff --git a/sw/qa/python/testdocuments/xstyleloader.odt b/sw/qa/python/testdocuments/xstyleloader.odt
new file mode 100644
index 000000000000..921623f16077
Binary files /dev/null and b/sw/qa/python/testdocuments/xstyleloader.odt differ
diff --git a/sw/qa/python/xstyleloader.py b/sw/qa/python/xstyleloader.py
new file mode 100644
index 000000000000..ed2d7ffca4a4
--- /dev/null
+++ b/sw/qa/python/xstyleloader.py
@@ -0,0 +1,56 @@
+#! /usr/bin/env python
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+#
+# 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/.
+#
+
+import os
+import pathlib
+import unittest
+import unohelper
+import uno
+
+from org.libreoffice.unotest import UnoInProcess, makeCopyFromTDOC
+from com.sun.star.beans import PropertyValue
+
+
+class TestXStyleLoader(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        cls._uno = UnoInProcess()
+        cls._uno.setUp()
+
+    @classmethod
+    def tearDownClass(cls):
+        cls._uno.tearDown()
+
+    def test_loadStyleFromStream(self):
+        xDoc = self.__class__._uno.openEmptyWriterDoc()
+        self.assertIsNotNone(xDoc)
+
+        xServiceManager = self.__class__._uno.xContext.ServiceManager
+        simpleFileAccess = xServiceManager.createInstance(
+            "com.sun.star.ucb.SimpleFileAccess")
+        xInputStream = simpleFileAccess.openFileRead(
+            pathlib.Path(makeCopyFromTDOC("xstyleloader.odt")).as_uri())
+
+        p1 = PropertyValue(Name="InputStream", Value=xInputStream)
+        p2 = PropertyValue(Name="LoadTextStyles", Value=True)
+
+        styles = xDoc.getStyleFamilies()
+        styles.loadStylesFromURL("private:stream", [p1, p2])
+        textStyles = styles.getByName("ParagraphStyles")
+        self.assertTrue(textStyles.hasByName("Test_Template"))
+
+        xDoc.close(True)
+
+
+if __name__ == '__main__':
+    unittest.main()
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sw/source/core/unocore/unostyle.cxx b/sw/source/core/unocore/unostyle.cxx
index 2169cb9cd285..bfbe6ea509a7 100644
--- a/sw/source/core/unocore/unostyle.cxx
+++ b/sw/source/core/unocore/unostyle.cxx
@@ -79,8 +79,10 @@
 #include <com/sun/star/beans/NamedValue.hpp>
 #include <com/sun/star/drawing/BitmapMode.hpp>
 #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
 #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
 #include <com/sun/star/document/XEventsSupplier.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
 #include <istyleaccess.hxx>
 #include <GetMetricVal.hxx>
 #include <fmtfsize.hxx>
@@ -114,6 +116,11 @@
 #include <set>
 #include <limits>
 
+using namespace css;
+using namespace css::io;
+using namespace css::lang;
+using namespace css::uno;
+
 class SwXStyle;
 class SwStyleProperties_Impl;
 
@@ -548,9 +555,10 @@ void SwXStyleFamilies::loadStylesFromURL(const OUString& rURL,
     aOpt.SetMerge(false);
     for(const auto& rProperty: aOptions)
     {
-        if(rProperty.Value.getValueType() != cppu::UnoType<bool>::get())
-            continue;
-        const bool bValue = rProperty.Value.get<bool>();
+        bool bValue = false;
+        if(rProperty.Value.getValueType() == cppu::UnoType<bool>::get())
+            bValue = rProperty.Value.get<bool>();
+
         if(rProperty.Name == UNO_NAME_OVERWRITE_STYLES)
             aOpt.SetMerge(!bValue);
         else if(rProperty.Name == UNO_NAME_LOAD_NUMBERING_STYLES)
@@ -561,6 +569,16 @@ void SwXStyleFamilies::loadStylesFromURL(const OUString& rURL,
             aOpt.SetFrameFormats(bValue);
         else if(rProperty.Name == UNO_NAME_LOAD_TEXT_STYLES)
             aOpt.SetTextFormats(bValue);
+        else if(rProperty.Name == "InputStream")
+        {
+            Reference<XInputStream> xInputStream;
+            if (rProperty.Value >>= xInputStream)
+                aOpt.SetInputStream(xInputStream);
+            else
+                throw IllegalArgumentException("Parameter 'InputStream' could not be converted to "
+                                               "type 'com::sun::star::io::XInputStream'",
+                                               nullptr, 0);
+        }
     }
     const ErrCode nErr = m_pDocShell->LoadStylesFromFile( rURL, aOpt, true );
     if(nErr)
diff --git a/sw/source/uibase/app/docsh2.cxx b/sw/source/uibase/app/docsh2.cxx
index c69b3e2d889f..785733ff0757 100644
--- a/sw/source/uibase/app/docsh2.cxx
+++ b/sw/source/uibase/app/docsh2.cxx
@@ -1561,8 +1561,7 @@ void SwDocShell::ReloadFromHtml( const OUString& rStreamName, SwSrcView* pSrcVie
         m_xDoc->getIDocumentState().ResetModified();
 }
 
-ErrCode SwDocShell::LoadStylesFromFile( const OUString& rURL,
-                    SwgReaderOption const & rOpt, bool bUnoCall )
+ErrCode SwDocShell::LoadStylesFromFile(const OUString& rURL, SwgReaderOption& rOpt, bool bUnoCall)
 {
     ErrCode nErr = ERRCODE_NONE;
 
@@ -1571,6 +1570,8 @@ ErrCode SwDocShell::LoadStylesFromFile( const OUString& rURL,
 
     // search for filter in WebDocShell, too
     SfxMedium aMed( rURL, StreamMode::STD_READ );
+    if (rURL == "private:stream")
+        aMed.setStreamToLoadFrom(rOpt.GetInputStream(), true);
     std::shared_ptr<const SfxFilter> pFlt;
     aMatcher.DetectFilter( aMed, pFlt );
     if(!pFlt)
diff --git a/test/source/style/xstyleloader.cxx b/test/source/style/xstyleloader.cxx
index 725351b2bbe5..afb3559da7b3 100644
--- a/test/source/style/xstyleloader.cxx
+++ b/test/source/style/xstyleloader.cxx
@@ -11,16 +11,21 @@
 
 #include <com/sun/star/beans/XPropertySet.hpp>
 #include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
 #include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
 #include <com/sun/star/style/XStyle.hpp>
 #include <com/sun/star/style/XStyleLoader2.hpp>
 
+#include <com/sun/star/uno/Any.hxx>
 #include <com/sun/star/uno/Reference.hxx>
 #include <com/sun/star/uno/Sequence.hxx>
 
 #include <rtl/ustring.hxx>
 #include <cppunit/extensions/HelperMacros.h>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/storagehelper.hxx>
 
+using namespace comphelper;
 using namespace css;
 using namespace css::uno;
 
@@ -54,6 +59,31 @@ void XStyleLoader::testLoadStylesFromDocument()
     checkStyleProperties(xFamilySupplier);
 }
 
+void XStyleLoader::testLoadStylesFromStream()
+{
+    uno::Reference<style::XStyleLoader2> xStyleLoader(init(), uno::UNO_QUERY_THROW);
+
+    uno::Reference<sheet::XSpreadsheetDocument> xDoc(getTargetDoc(), uno::UNO_SET_THROW);
+    const OUString aFileURL = getTestURL();
+    const uno::Reference<io::XInputStream> xInputStream
+        = OStorageHelper::GetInputStreamFromURL(aFileURL, getProcessComponentContext());
+
+    uno::Sequence<beans::PropertyValue> aOptions = xStyleLoader->getStyleLoaderOptions();
+    auto nLength = aOptions.getLength();
+    aOptions.realloc(nLength + 1);
+    beans::PropertyValue aInputStream;
+    aInputStream.Name = "InputStream";
+    uno::Any aTmp;
+    aTmp <<= xInputStream;
+    aInputStream.Value = aTmp;
+    aOptions[nLength] = aInputStream;
+
+    xStyleLoader->loadStylesFromURL("private:stream", aOptions);
+
+    uno::Reference<style::XStyleFamiliesSupplier> xFamilySupplier(xDoc, UNO_QUERY_THROW);
+    checkStyleProperties(xFamilySupplier);
+}
+
 void XStyleLoader::checkStyleProperties(
     uno::Reference<style::XStyleFamiliesSupplier> const& xFamilySupplier)
 {


More information about the Libreoffice-commits mailing list