AmdaProvider.cpp
129 lines
| 3.9 KiB
| text/x-c
|
CppLexer
|
r377 | #include "AmdaProvider.h" | ||
|
r380 | #include "AmdaResultParser.h" | ||
|
r378 | #include <Data/DataProviderParameters.h> | ||
r388 | #include <Network/NetworkController.h> | |||
#include <SqpApplication.h> | ||||
#include <Variable/Variable.h> | ||||
|
r378 | |||
#include <QNetworkAccessManager> | ||||
#include <QNetworkReply> | ||||
|
r379 | #include <QTemporaryFile> | ||
r388 | #include <QThread> | |||
|
r377 | |||
Q_LOGGING_CATEGORY(LOG_AmdaProvider, "AmdaProvider") | ||||
|
r378 | namespace { | ||
/// URL format for a request on AMDA server. The parameters are as follows: | ||||
/// - %1: start date | ||||
/// - %2: end date | ||||
/// - %3: parameter id | ||||
const auto AMDA_URL_FORMAT = QStringLiteral( | ||||
"http://amda.irap.omp.eu/php/rest/" | ||||
"getParameter.php?startTime=%1&stopTime=%2¶meterID=%3&sampling=60&outputFormat=ASCII&" | ||||
"timeFormat=ISO8601&gzip=0"); | ||||
/// Dates format passed in the URL (e.g 2013-09-23T09:00) | ||||
const auto AMDA_TIME_FORMAT = QStringLiteral("yyyy-MM-ddThh:ss"); | ||||
/// Formats a time to a date that can be passed in URL | ||||
QString dateFormat(double sqpDateTime) noexcept | ||||
{ | ||||
auto dateTime = QDateTime::fromMSecsSinceEpoch(sqpDateTime * 1000.); | ||||
return dateTime.toString(AMDA_TIME_FORMAT); | ||||
} | ||||
r388 | ||||
|
r378 | } // namespace | ||
|
r377 | struct AmdaProvider::AmdaProviderPrivate { | ||
|
r408 | SqpDateTime m_DateTime{}; | ||
|
r378 | std::unique_ptr<QNetworkAccessManager> m_AccessManager{nullptr}; | ||
QNetworkReply *m_Reply{nullptr}; | ||||
r388 | // std::unique_ptr<QTemporaryFile> m_File{nullptr}; | |||
|
r378 | QUuid m_Token; | ||
|
r377 | }; | ||
AmdaProvider::AmdaProvider() : impl{spimpl::make_unique_impl<AmdaProviderPrivate>()} | ||||
{ | ||||
r388 | qCDebug(LOG_NetworkController()) << tr("AmdaProvider::AmdaProvider") | |||
<< QThread::currentThread(); | ||||
if (auto app = sqpApp) { | ||||
auto &networkController = app->networkController(); | ||||
connect(this, &AmdaProvider::requestConstructed, &networkController, | ||||
&NetworkController::onProcessRequested); | ||||
} | ||||
|
r377 | } | ||
|
r408 | void AmdaProvider::requestDataLoading(QUuid token, const DataProviderParameters ¶meters) | ||
|
r377 | { | ||
// NOTE: Try to use multithread if possible | ||||
|
r408 | const auto times = parameters.m_Times; | ||
for (const auto &dateTime : qAsConst(times)) { | ||||
retrieveData(token, dateTime); | ||||
|
r377 | } | ||
} | ||||
|
r408 | void AmdaProvider::retrieveData(QUuid token, const SqpDateTime &dateTime) | ||
|
r378 | { | ||
// /////////// // | ||||
// Creates URL // | ||||
// /////////// // | ||||
|
r408 | auto startDate = dateFormat(dateTime.m_TStart); | ||
auto endDate = dateFormat(dateTime.m_TEnd); | ||||
|
r378 | auto productId = QStringLiteral("imf(0)"); | ||
auto url = QUrl{QString{AMDA_URL_FORMAT}.arg(startDate, endDate, productId)}; | ||||
r388 | auto tempFile = std::make_shared<QTemporaryFile>(); | |||
|
r378 | |||
r388 | // LAMBDA | |||
auto httpDownloadFinished = [this, tempFile](QNetworkReply *reply, QUuid dataId) noexcept { | ||||
|
r379 | |||
r388 | if (tempFile) { | |||
auto replyReadAll = reply->readAll(); | ||||
if (!replyReadAll.isEmpty()) { | ||||
tempFile->write(replyReadAll); | ||||
} | ||||
tempFile->close(); | ||||
|
r380 | |||
r388 | // Parse results file | |||
if (auto dataSeries = AmdaResultParser::readTxt(tempFile->fileName())) { | ||||
|
r408 | emit dataProvided(impl->m_Token, dataSeries, impl->m_DateTime); | ||
r388 | } | |||
else { | ||||
/// @todo ALX : debug | ||||
} | ||||
|
r380 | } | ||
r388 | // Deletes reply | |||
reply->deleteLater(); | ||||
reply = nullptr; | ||||
}; | ||||
auto httpFinishedLambda = [this, httpDownloadFinished, tempFile](QNetworkReply *reply, | ||||
QUuid dataId) noexcept { | ||||
|
r379 | |||
r388 | auto downloadFileUrl = QUrl{QString{reply->readAll()}}; | |||
// Deletes old reply | ||||
reply->deleteLater(); | ||||
|
r379 | |||
r388 | // Executes request for downloading file // | |||
// Creates destination file | ||||
if (tempFile->open()) { | ||||
// Executes request | ||||
emit requestConstructed(QNetworkRequest{downloadFileUrl}, dataId, httpDownloadFinished); | ||||
} | ||||
}; | ||||
// //////////////// // | ||||
// Executes request // | ||||
// //////////////// // | ||||
impl->m_Token = token; | ||||
|
r408 | impl->m_DateTime = dateTime; | ||
r388 | emit requestConstructed(QNetworkRequest{url}, token, httpFinishedLambda); | |||
|
r377 | } | ||