nss: upgrade to release 3.73
[LibreOffice.git] / sc / source / ui / dataprovider / csvdataprovider.cxx
blobe868e2269358307ec6570a92a87f3462f3128e18
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 */
10 #include <dataprovider.hxx>
11 #include <datatransformation.hxx>
12 #include <datamapper.hxx>
13 #include <stringutil.hxx>
15 #include <tools/stream.hxx>
16 #include <vcl/svapp.hxx>
17 #include <docsh.hxx>
18 #include <orcus/csv_parser.hpp>
19 #include <utility>
21 namespace {
23 class CSVHandler
25 ScDocument* mpDoc;
26 SCCOL mnCol;
27 SCROW mnRow;
29 public:
30 CSVHandler(ScDocument* pDoc) :
31 mpDoc(pDoc), mnCol(0), mnRow(0)
35 static void begin_parse() {}
36 static void end_parse() {}
37 static void begin_row() {}
38 void end_row()
40 ++mnRow;
41 mnCol = 0;
44 void cell(const char* p, size_t n, bool /*transient*/)
46 if (mnCol > mpDoc->MaxCol())
47 return;
49 double mfValue = 0.0;
50 if (ScStringUtil::parseSimpleNumber(p, n, '.', ',', mfValue))
52 mpDoc->SetValue(mnCol, mnRow, 0, mfValue);
54 else
56 OString aStr(p, n);
57 mpDoc->SetString(mnCol, mnRow, 0, OStringToOUString(aStr, RTL_TEXTENCODING_UTF8));
60 ++mnCol;
66 namespace sc {
67 CSVFetchThread::CSVFetchThread(
68 ScDocument& rDoc, const OUString& mrURL, std::function<void()> aImportFinishedHdl,
69 const std::vector<std::shared_ptr<sc::DataTransformation>>& rDataTransformations)
70 : Thread("CSV Fetch Thread")
71 , mrDocument(rDoc)
72 , maURL(mrURL)
73 , mbTerminate(false)
74 , maDataTransformations(rDataTransformations)
75 , maImportFinishedHdl(std::move(aImportFinishedHdl))
77 maConfig.delimiters.push_back(',');
78 maConfig.text_qualifier = '"';
81 CSVFetchThread::~CSVFetchThread()
85 bool CSVFetchThread::IsRequestedTerminate()
87 osl::MutexGuard aGuard(maMtxTerminate);
88 return mbTerminate;
91 void CSVFetchThread::RequestTerminate()
93 osl::MutexGuard aGuard(maMtxTerminate);
94 mbTerminate = true;
97 void CSVFetchThread::EndThread()
99 RequestTerminate();
102 void CSVFetchThread::execute()
104 OStringBuffer aBuffer(64000);
105 DataProvider::FetchStreamFromURL(maURL, aBuffer);
106 if (mbTerminate)
107 return;
109 CSVHandler aHdl(&mrDocument);
110 orcus::csv_parser<CSVHandler> parser(aBuffer.getStr(), aBuffer.getLength(), aHdl, maConfig);
111 parser.parse();
113 for (const auto& itr : maDataTransformations)
115 itr->Transform(mrDocument);
118 SolarMutexGuard aGuard;
119 maImportFinishedHdl();
122 CSVDataProvider::CSVDataProvider(ScDocument* pDoc, sc::ExternalDataSource& rDataSource):
123 DataProvider(rDataSource),
124 mpDocument(pDoc)
128 CSVDataProvider::~CSVDataProvider()
130 if (mxCSVFetchThread.is())
132 SolarMutexReleaser aReleaser;
133 mxCSVFetchThread->join();
137 void CSVDataProvider::Import()
139 // already importing data
140 if (mpDoc)
141 return;
143 mpDoc.reset(new ScDocument(SCDOCMODE_CLIP));
144 mpDoc->ResetClip(mpDocument, SCTAB(0));
145 mxCSVFetchThread = new CSVFetchThread(*mpDoc, mrDataSource.getURL(), std::bind(&CSVDataProvider::ImportFinished, this), mrDataSource.getDataTransformation());
146 mxCSVFetchThread->launch();
148 if (mbDeterministic)
150 SolarMutexReleaser aReleaser;
151 mxCSVFetchThread->join();
155 void CSVDataProvider::ImportFinished()
157 mrDataSource.getDBManager()->WriteToDoc(*mpDoc);
158 mpDoc.reset();
159 Refresh();
162 void CSVDataProvider::Refresh()
164 ScDocShell* pDocShell = static_cast<ScDocShell*>(mpDocument->GetDocumentShell());
165 if (pDocShell)
166 pDocShell->SetDocumentModified();
169 const OUString& CSVDataProvider::GetURL() const
171 return mrDataSource.getURL();
176 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */