diff --git a/app/ui/MainWindow.ui b/app/ui/MainWindow.ui index 30bc87a..44aecb5 100644 --- a/app/ui/MainWindow.ui +++ b/app/ui/MainWindow.ui @@ -11,7 +11,7 @@ - QLop + SciQlop v0.0.1 true @@ -126,7 +126,7 @@ 0 0 800 - 26 + 28 diff --git a/core/include/Data/IDataProvider.h b/core/include/Data/IDataProvider.h index 6f4b5b6..59799d2 100644 --- a/core/include/Data/IDataProvider.h +++ b/core/include/Data/IDataProvider.h @@ -4,6 +4,7 @@ #include #include +#include #include @@ -26,14 +27,11 @@ class IDataProvider : public QObject { public: virtual ~IDataProvider() noexcept = default; - virtual std::shared_ptr - retrieveData(const DataProviderParameters ¶meters) const = 0; - - - virtual void requestDataLoading(const QVector &dateTimeList) = 0; + virtual void requestDataLoading(QUuid token, const QVector &dateTimeList) = 0; signals: - void dataProvided(std::shared_ptr dateSerie, const SqpDateTime &dateTime); + void dataProvided(QUuid token, std::shared_ptr dateSerie, + const SqpDateTime &dateTime); }; // Required for using shared_ptr in signals/slots diff --git a/core/include/Network/NetworkController.h b/core/include/Network/NetworkController.h new file mode 100644 index 0000000..0e36901 --- /dev/null +++ b/core/include/Network/NetworkController.h @@ -0,0 +1,30 @@ +#ifndef SCIQLOP_NETWORKCONTROLLER_H +#define SCIQLOP_NETWORKCONTROLLER_H + +#include +#include + +#include + +Q_DECLARE_LOGGING_CATEGORY(LOG_NetworkController) + +/** + * @brief The NetworkController class aims to handle all network connection of SciQlop. + */ +class NetworkController : public QObject { + Q_OBJECT +public: + explicit NetworkController(QObject *parent = 0); + + + void initialize(); + void finalize(); + +private: + void waitForFinish(); + + class NetworkControllerPrivate; + spimpl::unique_impl_ptr impl; +}; + +#endif // SCIQLOP_NETWORKCONTROLLER_H diff --git a/core/src/Network/NetworkController.cpp b/core/src/Network/NetworkController.cpp new file mode 100644 index 0000000..e015af4 --- /dev/null +++ b/core/src/Network/NetworkController.cpp @@ -0,0 +1,33 @@ +#include "Network/NetworkController.h" + +#include +#include + +Q_LOGGING_CATEGORY(LOG_NetworkController, "NetworkController") + +struct NetworkController::NetworkControllerPrivate { + explicit NetworkControllerPrivate(NetworkController *parent) : m_WorkingMutex{} {} + QMutex m_WorkingMutex; +}; + +NetworkController::NetworkController(QObject *parent) + : QObject(parent), impl{spimpl::make_unique_impl(this)} +{ +} + +void NetworkController::initialize() +{ + qCDebug(LOG_NetworkController()) << tr("NetworkController init") << QThread::currentThread(); + impl->m_WorkingMutex.lock(); + qCDebug(LOG_NetworkController()) << tr("NetworkController init END"); +} + +void NetworkController::finalize() +{ + impl->m_WorkingMutex.unlock(); +} + +void NetworkController::waitForFinish() +{ + QMutexLocker locker{&impl->m_WorkingMutex}; +} diff --git a/core/src/Variable/VariableController.cpp b/core/src/Variable/VariableController.cpp index 0e58f7e..24bebc2 100644 --- a/core/src/Variable/VariableController.cpp +++ b/core/src/Variable/VariableController.cpp @@ -11,26 +11,13 @@ #include #include #include +#include #include #include Q_LOGGING_CATEGORY(LOG_VariableController, "VariableController") -namespace { - -/// @todo Generates default dataseries, according to the provider passed in parameter. This method -/// will be deleted when the timerange is recovered from SciQlop -std::shared_ptr generateDefaultDataSeries(const IDataProvider &provider, - const SqpDateTime &dateTime) noexcept -{ - auto parameters = DataProviderParameters{dateTime}; - - return provider.retrieveData(parameters); -} - -} // namespace - struct VariableController::VariableControllerPrivate { explicit VariableControllerPrivate(VariableController *parent) : m_WorkingMutex{}, @@ -51,6 +38,7 @@ struct VariableController::VariableControllerPrivate { std::unordered_map, std::shared_ptr > m_VariableToProviderMap; + std::unordered_map, QUuid> m_VariableToToken; }; VariableController::VariableController(QObject *parent) @@ -132,16 +120,21 @@ void VariableController::createVariable(const QString &name, /// in sciqlop auto dateTime = impl->m_TimeController->dateTime(); if (auto newVariable = impl->m_VariableModel->createVariable(name, dateTime)) { + auto token = QUuid::createUuid(); // store the provider impl->m_VariableToProviderMap[newVariable] = provider; + impl->m_VariableToToken[newVariable] = token; auto addDateTimeAcquired = [ this, varW = std::weak_ptr{newVariable} ]( - auto dataSeriesAcquired, auto dateTimeToPutInCache) + QUuid token, auto dataSeriesAcquired, auto dateTimeToPutInCache) { if (auto variable = varW.lock()) { - impl->m_VariableCacheController->addDateTime(variable, dateTimeToPutInCache); - variable->setDataSeries(dataSeriesAcquired); + auto varToken = impl->m_VariableToToken.at(variable); + if (varToken == token) { + impl->m_VariableCacheController->addDateTime(variable, dateTimeToPutInCache); + variable->setDataSeries(dataSeriesAcquired); + } } }; @@ -180,8 +173,9 @@ void VariableController::onRequestDataLoading(std::shared_ptr variable if (!dateTimeListNotInCache.empty()) { // Ask the provider for each data on the dateTimeListNotInCache + auto token = impl->m_VariableToToken.at(variable); impl->m_VariableToProviderMap.at(variable)->requestDataLoading( - std::move(dateTimeListNotInCache)); + token, std::move(dateTimeListNotInCache)); } else { emit variable->updated(); diff --git a/gui/include/SqpApplication.h b/gui/include/SqpApplication.h index 87bc813..a23bd7f 100644 --- a/gui/include/SqpApplication.h +++ b/gui/include/SqpApplication.h @@ -16,6 +16,7 @@ Q_DECLARE_LOGGING_CATEGORY(LOG_SqpApplication) #define sqpApp (static_cast(QCoreApplication::instance())) class DataSourceController; +class NetworkController; class TimeController; class VariableController; class VisualizationController; @@ -38,6 +39,7 @@ public: /// Accessors for the differents sciqlop controllers DataSourceController &dataSourceController() noexcept; + NetworkController &networkController() noexcept; TimeController &timeController() noexcept; VariableController &variableController() noexcept; VisualizationController &visualizationController() noexcept; diff --git a/gui/src/SqpApplication.cpp b/gui/src/SqpApplication.cpp index c79f0f7..a50fa86 100644 --- a/gui/src/SqpApplication.cpp +++ b/gui/src/SqpApplication.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include