##// END OF EJS Templates
Creates constructor for ScalarSeries that directly takes vectors...
Creates constructor for ScalarSeries that directly takes vectors It is used in Amda result parser to avoid an extra loop

File last commit:

r388:83c2495f8eaf
r392:cae900f78dff
Show More
AmdaProvider.cpp
128 lines | 4.0 KiB | text/x-c | CppLexer
Alexandre Leroux
Inits Amda provider
r377 #include "AmdaProvider.h"
Alexandre Leroux
Amda provider (3)...
r380 #include "AmdaResultParser.h"
Alexandre Leroux
Amda provider (1)...
r378 #include <Data/DataProviderParameters.h>
Modify the AmdaProvider to remove from it all network controller...
r388 #include <Network/NetworkController.h>
#include <SqpApplication.h>
#include <Variable/Variable.h>
Alexandre Leroux
Amda provider (1)...
r378
#include <QNetworkAccessManager>
#include <QNetworkReply>
Alexandre Leroux
Amda provider (2)...
r379 #include <QTemporaryFile>
Modify the AmdaProvider to remove from it all network controller...
r388 #include <QThread>
Alexandre Leroux
Inits Amda provider
r377
Q_LOGGING_CATEGORY(LOG_AmdaProvider, "AmdaProvider")
Alexandre Leroux
Amda provider (1)...
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&parameterID=%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);
}
Modify the AmdaProvider to remove from it all network controller...
r388
Alexandre Leroux
Amda provider (1)...
r378 } // namespace
Alexandre Leroux
Inits Amda provider
r377 struct AmdaProvider::AmdaProviderPrivate {
Alexandre Leroux
Amda provider (1)...
r378 DataProviderParameters m_Params{};
std::unique_ptr<QNetworkAccessManager> m_AccessManager{nullptr};
QNetworkReply *m_Reply{nullptr};
Modify the AmdaProvider to remove from it all network controller...
r388 // std::unique_ptr<QTemporaryFile> m_File{nullptr};
Alexandre Leroux
Amda provider (1)...
r378 QUuid m_Token;
Alexandre Leroux
Inits Amda provider
r377 };
AmdaProvider::AmdaProvider() : impl{spimpl::make_unique_impl<AmdaProviderPrivate>()}
{
Modify the AmdaProvider to remove from it all network controller...
r388 qCDebug(LOG_NetworkController()) << tr("AmdaProvider::AmdaProvider")
<< QThread::currentThread();
if (auto app = sqpApp) {
auto &networkController = app->networkController();
connect(this, &AmdaProvider::requestConstructed, &networkController,
&NetworkController::onProcessRequested);
}
Alexandre Leroux
Inits Amda provider
r377 }
void AmdaProvider::requestDataLoading(QUuid token, const QVector<SqpDateTime> &dateTimeList)
{
// NOTE: Try to use multithread if possible
for (const auto &dateTime : dateTimeList) {
retrieveData(token, DataProviderParameters{dateTime});
}
}
Modify the AmdaProvider to remove from it all network controller...
r388 void AmdaProvider::retrieveData(QUuid token, const DataProviderParameters &parameters)
Alexandre Leroux
Amda provider (1)...
r378 {
// /////////// //
// Creates URL //
// /////////// //
auto startDate = dateFormat(parameters.m_Time.m_TStart);
auto endDate = dateFormat(parameters.m_Time.m_TEnd);
auto productId = QStringLiteral("imf(0)");
auto url = QUrl{QString{AMDA_URL_FORMAT}.arg(startDate, endDate, productId)};
Modify the AmdaProvider to remove from it all network controller...
r388 auto tempFile = std::make_shared<QTemporaryFile>();
Alexandre Leroux
Amda provider (1)...
r378
Modify the AmdaProvider to remove from it all network controller...
r388 // LAMBDA
auto httpDownloadFinished = [this, tempFile](QNetworkReply *reply, QUuid dataId) noexcept {
Alexandre Leroux
Amda provider (2)...
r379
Modify the AmdaProvider to remove from it all network controller...
r388 if (tempFile) {
auto replyReadAll = reply->readAll();
if (!replyReadAll.isEmpty()) {
tempFile->write(replyReadAll);
}
tempFile->close();
Alexandre Leroux
Amda provider (3)...
r380
Modify the AmdaProvider to remove from it all network controller...
r388 // Parse results file
if (auto dataSeries = AmdaResultParser::readTxt(tempFile->fileName())) {
emit dataProvided(impl->m_Token, dataSeries, impl->m_Params.m_Time);
}
else {
/// @todo ALX : debug
}
Alexandre Leroux
Amda provider (3)...
r380 }
Modify the AmdaProvider to remove from it all network controller...
r388 // Deletes reply
reply->deleteLater();
reply = nullptr;
};
auto httpFinishedLambda = [this, httpDownloadFinished, tempFile](QNetworkReply *reply,
QUuid dataId) noexcept {
Alexandre Leroux
Amda provider (2)...
r379
Modify the AmdaProvider to remove from it all network controller...
r388 auto downloadFileUrl = QUrl{QString{reply->readAll()}};
// Deletes old reply
reply->deleteLater();
Alexandre Leroux
Amda provider (2)...
r379
Modify the AmdaProvider to remove from it all network controller...
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;
impl->m_Params = parameters;
emit requestConstructed(QNetworkRequest{url}, token, httpFinishedLambda);
Alexandre Leroux
Inits Amda provider
r377 }