diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
commit | 267c6f2ac71f92999e969232431ba04678e7437e (patch) | |
tree | 358c9467650e1d0a1d7227a21dac2e3d08b622b2 /sc/source/ui/inc/dataprovider.hxx | |
parent | Initial commit. (diff) | |
download | libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip |
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sc/source/ui/inc/dataprovider.hxx')
-rw-r--r-- | sc/source/ui/inc/dataprovider.hxx | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/sc/source/ui/inc/dataprovider.hxx b/sc/source/ui/inc/dataprovider.hxx new file mode 100644 index 0000000000..680bf38193 --- /dev/null +++ b/sc/source/ui/inc/dataprovider.hxx @@ -0,0 +1,149 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-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/. + */ + +#pragma once + +#include <memory> +#include <string_view> +#include <salhelper/thread.hxx> +#include <rtl/ustring.hxx> +#include <rtl/ref.hxx> +#include <osl/mutex.hxx> +#include <document.hxx> + +#include <rtl/strbuf.hxx> + +#include <atomic> +#include <vector> +//#include <map> + +#include <orcus/csv_parser.hpp> + +class SvStream; +class ScDBData; + +namespace sc { + +class DataTransformation; +class ExternalDataSource; + +class CSVFetchThread : public salhelper::Thread +{ + ScDocument& mrDocument; + OUString maURL; + + std::atomic<bool> mbTerminate; + + orcus::csv::parser_config maConfig; + + std::vector<std::shared_ptr<sc::DataTransformation>> maDataTransformations; + + std::function<void()> maImportFinishedHdl; + + +public: + CSVFetchThread(ScDocument& rDoc, OUString , std::function<void()> aImportFinishedHdl, + std::vector<std::shared_ptr<sc::DataTransformation>>&& mrDataTransformations); + virtual ~CSVFetchThread() override; + + void RequestTerminate(); + bool IsRequestedTerminate(); + void Terminate(); + void EndThread(); + + virtual void execute() override; +}; + +/** + * Abstract class for all data provider. + * + */ +class DataProvider +{ +protected: + /** + * If true make the threaded import deterministic for the tests. + */ + bool mbDeterministic; + sc::ExternalDataSource& mrDataSource; + +public: + DataProvider(sc::ExternalDataSource& rDataSource); + + virtual ~DataProvider(); + + virtual void Import() = 0; + + virtual const OUString& GetURL() const = 0; + + static std::unique_ptr<SvStream> FetchStreamFromURL(const OUString&, OStringBuffer& rBuffer); + + void setDeterministic(); +}; + +class CSVDataProvider : public DataProvider +{ + rtl::Reference<CSVFetchThread> mxCSVFetchThread; + ScDocument* mpDocument; + ScDocumentUniquePtr mpDoc; + + void Refresh(); + +public: + CSVDataProvider (ScDocument* pDoc, sc::ExternalDataSource& rDataSource); + virtual ~CSVDataProvider() override; + + virtual void Import() override; + + const OUString& GetURL() const override; + void ImportFinished(); +}; + +/** + * This class handles the copying of the data from the imported + * temporary document to the actual document. Additionally, in the future + * we may decide to store data transformations in this class. + * + * In addition this class also handles how to deal with excess data by for example extending the ScDBData or by only showing the first or last entries. + * + * TODO: move the DataProvider::WriteToDoc here + * + */ +class ScDBDataManager +{ + OUString maDBName; + ScDocument* mpDoc; + +public: + ScDBDataManager(OUString aDBName, ScDocument* pDoc); + ~ScDBDataManager(); + + void SetDatabase(const OUString& rDBName); + + ScDBData* getDBData(); + + void WriteToDoc(ScDocument& rDoc); +}; + +class DataProviderFactory +{ +private: + + static bool isInternalDataProvider(std::u16string_view rProvider); + +public: + + static std::shared_ptr<DataProvider> getDataProvider(ScDocument* pDoc, sc::ExternalDataSource& rDataSource); + + static std::vector<OUString> getDataProviders(); +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |