1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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/.
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>
18 #include <orcus/csv_parser.hpp>
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() {}
44 void cell(const char* p
, size_t n
, bool /*transient*/)
46 if (mnCol
> mpDoc
->MaxCol())
50 if (ScStringUtil::parseSimpleNumber(p
, n
, '.', ',', mfValue
))
52 mpDoc
->SetValue(mnCol
, mnRow
, 0, mfValue
);
57 mpDoc
->SetString(mnCol
, mnRow
, 0, OStringToOUString(aStr
, RTL_TEXTENCODING_UTF8
));
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")
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
);
91 void CSVFetchThread::RequestTerminate()
93 osl::MutexGuard
aGuard(maMtxTerminate
);
97 void CSVFetchThread::EndThread()
102 void CSVFetchThread::execute()
104 OStringBuffer
aBuffer(64000);
105 DataProvider::FetchStreamFromURL(maURL
, aBuffer
);
109 CSVHandler
aHdl(&mrDocument
);
110 orcus::csv_parser
<CSVHandler
> parser(aBuffer
.getStr(), aBuffer
.getLength(), aHdl
, maConfig
);
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
),
128 CSVDataProvider::~CSVDataProvider()
130 if (mxCSVFetchThread
.is())
132 SolarMutexReleaser aReleaser
;
133 mxCSVFetchThread
->join();
137 void CSVDataProvider::Import()
139 // already importing data
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();
150 SolarMutexReleaser aReleaser
;
151 mxCSVFetchThread
->join();
155 void CSVDataProvider::ImportFinished()
157 mrDataSource
.getDBManager()->WriteToDoc(*mpDoc
);
162 void CSVDataProvider::Refresh()
164 ScDocShell
* pDocShell
= static_cast<ScDocShell
*>(mpDocument
->GetDocumentShell());
166 pDocShell
->SetDocumentModified();
169 const OUString
& CSVDataProvider::GetURL() const
171 return mrDataSource
.getURL();
176 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */