[Libreoffice-commits] core.git: sc/source

Markus Mohrhard markus.mohrhard at googlemail.com
Wed Aug 16 14:18:17 UTC 2017


 sc/source/ui/dataprovider/csvdataprovider.cxx    |   12 ++++++++++--
 sc/source/ui/dataprovider/dataprovider.cxx       |   11 ++++++-----
 sc/source/ui/dataprovider/datatransformation.cxx |    8 ++++----
 sc/source/ui/dataprovider/htmldataprovider.cxx   |   17 ++++++++++++++---
 sc/source/ui/dataprovider/htmldataprovider.hxx   |    1 +
 sc/source/ui/inc/dataprovider.hxx                |   10 +++++++---
 sc/source/ui/inc/datatransformation.hxx          |   10 +++++-----
 7 files changed, 47 insertions(+), 22 deletions(-)

New commits:
commit 7299bdf02746d23de98d3237e47eba365a9657a5
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue Aug 15 19:58:04 2017 +0200

    external data: apply the transformation still in the fetch thread
    
    Change-Id: I0509a569f47fcf838ea5c102e6fd0c6e765a0152
    Reviewed-on: https://gerrit.libreoffice.org/41208
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/sc/source/ui/dataprovider/csvdataprovider.cxx b/sc/source/ui/dataprovider/csvdataprovider.cxx
index fb77b4096986..ed7302209896 100644
--- a/sc/source/ui/dataprovider/csvdataprovider.cxx
+++ b/sc/source/ui/dataprovider/csvdataprovider.cxx
@@ -8,6 +8,7 @@
  */
 
 #include <dataprovider.hxx>
+#include "datatransformation.hxx"
 #include <stringutil.hxx>
 
 #if defined(_WIN32)
@@ -64,11 +65,13 @@ public:
 
 namespace sc {
 
-CSVFetchThread::CSVFetchThread(ScDocument& rDoc, const OUString& mrURL, Idle* pIdle):
+CSVFetchThread::CSVFetchThread(ScDocument& rDoc, const OUString& mrURL, Idle* pIdle,
+        const std::vector<std::shared_ptr<sc::DataTransformation>>& rDataTransformations):
         Thread("CSV Fetch Thread"),
         mrDocument(rDoc),
         maURL (mrURL),
         mbTerminate(false),
+        maDataTransformations(rDataTransformations),
         mpIdle(pIdle)
 {
     maConfig.delimiters.push_back(',');
@@ -107,6 +110,11 @@ void CSVFetchThread::execute()
     orcus::csv_parser<CSVHandler> parser(aBuffer.getStr(), aBuffer.getLength(), aHdl, maConfig);
     parser.parse();
 
+    for (auto& itr : maDataTransformations)
+    {
+        itr->Transform(mrDocument);
+    }
+
     SolarMutexGuard aGuard;
     mpIdle->Start();
 }
@@ -137,7 +145,7 @@ void CSVDataProvider::Import()
 
     mpDoc.reset(new ScDocument(SCDOCMODE_CLIP));
     mpDoc->ResetClip(mpDocument, (SCTAB)0);
-    mxCSVFetchThread = new CSVFetchThread(*mpDoc, maURL, &maIdle);
+    mxCSVFetchThread = new CSVFetchThread(*mpDoc, maURL, &maIdle, mpDBDataManager->getDataTransformation());
     mxCSVFetchThread->launch();
 
     if (mbDeterministic)
diff --git a/sc/source/ui/dataprovider/dataprovider.cxx b/sc/source/ui/dataprovider/dataprovider.cxx
index 4efc255be20d..67f4394726e2 100644
--- a/sc/source/ui/dataprovider/dataprovider.cxx
+++ b/sc/source/ui/dataprovider/dataprovider.cxx
@@ -177,10 +177,6 @@ DataProvider::~DataProvider()
 void ScDBDataManager::WriteToDoc(ScDocument& rDoc)
 {
     // first apply all data transformations
-    for (auto& itr : maDataTransformations)
-    {
-        itr->Transform(rDoc);
-    }
 
     bool bShrunk = false;
     SCCOL nStartCol = 0;
@@ -222,11 +218,16 @@ void ScDBDataManager::SetDatabase(const OUString& rDBName)
     maDBName = rDBName;
 }
 
-void ScDBDataManager::AddDataTransformation(std::unique_ptr<sc::DataTransformation> mpDataTransformation)
+void ScDBDataManager::AddDataTransformation(std::shared_ptr<sc::DataTransformation> mpDataTransformation)
 {
     maDataTransformations.push_back(std::move(mpDataTransformation));
 }
 
+const std::vector<std::shared_ptr<sc::DataTransformation>>& ScDBDataManager::getDataTransformation() const
+{
+    return maDataTransformations;
+}
+
 ScDBData* ScDBDataManager::getDBData()
 {
     ScDBData* pDBData = mpDoc->GetDBCollection()->getNamedDBs().findByUpperName(ScGlobal::pCharClass->uppercase(maDBName));
diff --git a/sc/source/ui/dataprovider/datatransformation.cxx b/sc/source/ui/dataprovider/datatransformation.cxx
index b4251dc7201a..15e30b0f13c7 100644
--- a/sc/source/ui/dataprovider/datatransformation.cxx
+++ b/sc/source/ui/dataprovider/datatransformation.cxx
@@ -35,7 +35,7 @@ ColumnRemoveTransformation::~ColumnRemoveTransformation()
 {
 }
 
-void ColumnRemoveTransformation::Transform(ScDocument& rDoc)
+void ColumnRemoveTransformation::Transform(ScDocument& rDoc) const
 {
     rDoc.DeleteCol(0, 0, MAXROW, 0, mnCol, 1);
 }
@@ -46,7 +46,7 @@ SplitColumnTransformation::SplitColumnTransformation(SCCOL nCol, sal_Unicode cSe
 {
 }
 
-void SplitColumnTransformation::Transform(ScDocument& rDoc)
+void SplitColumnTransformation::Transform(ScDocument& rDoc) const
 {
     rDoc.InsertCol(0, 0, MAXROW, 0, mnCol + 1, 1);
 
@@ -75,7 +75,7 @@ MergeColumnTransformation::MergeColumnTransformation(SCCOL nCol1, SCCOL nCol2, c
 {
 }
 
-void MergeColumnTransformation::Transform(ScDocument& rDoc)
+void MergeColumnTransformation::Transform(ScDocument& rDoc) const
 {
     SCROW nEndRow1 = getLastRow(rDoc, mnCol1);
     SCROW nEndRow2 = getLastRow(rDoc, mnCol2);
@@ -96,7 +96,7 @@ SortTransformation::SortTransformation(const ScSortParam& rSortParam):
 {
 }
 
-void SortTransformation::Transform(ScDocument& rDoc)
+void SortTransformation::Transform(ScDocument& rDoc) const
 {
     rDoc.Sort(0, maSortParam, false, false, nullptr, nullptr);
 }
diff --git a/sc/source/ui/dataprovider/htmldataprovider.cxx b/sc/source/ui/dataprovider/htmldataprovider.cxx
index 61160c07d309..9ea070782ae4 100644
--- a/sc/source/ui/dataprovider/htmldataprovider.cxx
+++ b/sc/source/ui/dataprovider/htmldataprovider.cxx
@@ -8,6 +8,7 @@
  */
 
 #include "htmldataprovider.hxx"
+#include "datatransformation.hxx"
 #include <salhelper/thread.hxx>
 
 #include <libxml/HTMLparser.h>
@@ -25,6 +26,7 @@ class HTMLFetchThread : public salhelper::Thread
     ScDocument& mrDocument;
     OUString maURL;
     OUString maID;
+    const std::vector<std::shared_ptr<sc::DataTransformation>> maDataTransformations;
 
     Idle* mpIdle;
 
@@ -34,16 +36,19 @@ class HTMLFetchThread : public salhelper::Thread
     void handleCell(xmlNodePtr pCell, SCROW nRow, SCCOL nCol);
 
 public:
-    HTMLFetchThread(ScDocument& rDoc, const OUString&, const OUString& rID, Idle* pIdle);
+    HTMLFetchThread(ScDocument& rDoc, const OUString&, const OUString& rID, Idle* pIdle,
+            const std::vector<std::shared_ptr<sc::DataTransformation>>& rTransformations);
 
     virtual void execute() override;
 };
 
-HTMLFetchThread::HTMLFetchThread(ScDocument& rDoc, const OUString& rURL, const OUString& rID, Idle* pIdle):
+HTMLFetchThread::HTMLFetchThread(ScDocument& rDoc, const OUString& rURL, const OUString& rID, Idle* pIdle,
+        const std::vector<std::shared_ptr<sc::DataTransformation>>& rTransformations):
     salhelper::Thread("HTML Fetch Thread"),
     mrDocument(rDoc),
     maURL(rURL),
     maID(rID),
+    maDataTransformations(rTransformations),
     mpIdle(pIdle)
 {
 }
@@ -196,6 +201,11 @@ void HTMLFetchThread::execute()
     xmlXPathFreeNodeSetList(pXmlXpathObj);
     xmlXPathFreeContext(pXmlXpathCtx);
 
+    for (auto& itr : maDataTransformations)
+    {
+        itr->Transform(mrDocument);
+    }
+
     SolarMutexGuard aGuard;
     mpIdle->Start();
 }
@@ -228,7 +238,8 @@ void HTMLDataProvider::Import()
 
     mpDoc.reset(new ScDocument(SCDOCMODE_CLIP));
     mpDoc->ResetClip(mpDocument, (SCTAB)0);
-    mxHTMLFetchThread = new HTMLFetchThread(*mpDoc, maURL, maID, &maIdle);
+    mxHTMLFetchThread = new HTMLFetchThread(*mpDoc, maURL, maID, &maIdle,
+            mpDBDataManager->getDataTransformation());
     mxHTMLFetchThread->launch();
 
     if (mbDeterministic)
diff --git a/sc/source/ui/dataprovider/htmldataprovider.hxx b/sc/source/ui/dataprovider/htmldataprovider.hxx
index adbcf37baf5e..36f3a95ece1c 100644
--- a/sc/source/ui/dataprovider/htmldataprovider.hxx
+++ b/sc/source/ui/dataprovider/htmldataprovider.hxx
@@ -15,6 +15,7 @@
 namespace sc {
 
 class HTMLFetchThread;
+class DataTransformation;
 
 class HTMLDataProvider : public DataProvider
 {
diff --git a/sc/source/ui/inc/dataprovider.hxx b/sc/source/ui/inc/dataprovider.hxx
index bd5561e382c8..474eff87a427 100644
--- a/sc/source/ui/inc/dataprovider.hxx
+++ b/sc/source/ui/inc/dataprovider.hxx
@@ -57,11 +57,14 @@ class CSVFetchThread : public salhelper::Thread
 
     orcus::csv::parser_config maConfig;
 
+    std::vector<std::shared_ptr<sc::DataTransformation>> maDataTransformations;
+
     Idle* mpIdle;
 
 
 public:
-    CSVFetchThread(ScDocument& rDoc, const OUString&, Idle* pIdle);
+    CSVFetchThread(ScDocument& rDoc, const OUString&, Idle* pIdle,
+            const std::vector<std::shared_ptr<sc::DataTransformation>>& mrDataTransformations);
     virtual ~CSVFetchThread() override;
 
     void RequestTerminate();
@@ -134,7 +137,7 @@ class ScDBDataManager
     OUString maDBName;
     ScDocument* mpDoc;
 
-    std::vector<std::unique_ptr<sc::DataTransformation>> maDataTransformations;
+    std::vector<std::shared_ptr<sc::DataTransformation>> maDataTransformations;
 
 public:
     ScDBDataManager(const OUString& rDBName, bool bAllowResize, ScDocument* pDoc);
@@ -142,7 +145,8 @@ public:
 
     void SetDatabase(const OUString& rDBName);
 
-    void AddDataTransformation(std::unique_ptr<sc::DataTransformation> mpDataTransformation);
+    void AddDataTransformation(std::shared_ptr<sc::DataTransformation> mpDataTransformation);
+    const std::vector<std::shared_ptr<sc::DataTransformation>>& getDataTransformation() const;
 
     ScDBData* getDBData();
 
diff --git a/sc/source/ui/inc/datatransformation.hxx b/sc/source/ui/inc/datatransformation.hxx
index 7fef5ac472ae..88c81e345182 100644
--- a/sc/source/ui/inc/datatransformation.hxx
+++ b/sc/source/ui/inc/datatransformation.hxx
@@ -28,7 +28,7 @@ protected:
 public:
     virtual ~DataTransformation();
 
-    virtual void Transform(ScDocument& rDoc) = 0;
+    virtual void Transform(ScDocument& rDoc) const = 0;
 
 };
 
@@ -41,7 +41,7 @@ public:
     ColumnRemoveTransformation(SCCOL nCol);
     virtual ~ColumnRemoveTransformation() override;
 
-    virtual void Transform(ScDocument& rDoc) override;
+    virtual void Transform(ScDocument& rDoc) const override;
 };
 
 class SC_DLLPUBLIC SplitColumnTransformation : public DataTransformation
@@ -52,7 +52,7 @@ class SC_DLLPUBLIC SplitColumnTransformation : public DataTransformation
 public:
 
     SplitColumnTransformation(SCCOL nCol, sal_Unicode cSeparator);
-    virtual void Transform(ScDocument& rDoc) override;
+    virtual void Transform(ScDocument& rDoc) const override;
 };
 
 class SC_DLLPUBLIC MergeColumnTransformation : public DataTransformation
@@ -64,7 +64,7 @@ class SC_DLLPUBLIC MergeColumnTransformation : public DataTransformation
 public:
 
     MergeColumnTransformation(SCCOL nCol1, SCCOL nCol2, const OUString& rMergeString);
-    virtual void Transform(ScDocument& rDoc) override;
+    virtual void Transform(ScDocument& rDoc) const  override;
 };
 
 class SC_DLLPUBLIC SortTransformation : public DataTransformation
@@ -74,7 +74,7 @@ public:
 
     SortTransformation(const ScSortParam& rParam);
 
-    virtual void Transform(ScDocument& rDoc) override;
+    virtual void Transform(ScDocument& rDoc) const override;
 };
 
 }


More information about the Libreoffice-commits mailing list