##// END OF EJS Templates
Add implementation for the range rescale. Variable is ignored here...
Add implementation for the range rescale. Variable is ignored here Add variable for tolerance Remove unused code

File last commit:

r397:716a6a462efc
r404:4113f5669532
Show More
AmdaProvider.cpp
145 lines | 4.9 KiB | text/x-c | CppLexer
Alexandre Leroux
Inits Amda provider
r348 #include "AmdaProvider.h"
Alexandre Leroux
Amda provider update (2)...
r380 #include "AmdaDefs.h"
Alexandre Leroux
Amda provider (3)...
r351 #include "AmdaResultParser.h"
Alexandre Leroux
Amda provider (1)...
r349 #include <Data/DataProviderParameters.h>
Modify the AmdaProvider to remove from it all network controller...
r358 #include <Network/NetworkController.h>
#include <SqpApplication.h>
#include <Variable/Variable.h>
Alexandre Leroux
Amda provider (1)...
r349
#include <QNetworkAccessManager>
#include <QNetworkReply>
Alexandre Leroux
Amda provider (2)...
r350 #include <QTemporaryFile>
Modify the AmdaProvider to remove from it all network controller...
r358 #include <QThread>
Alexandre Leroux
Inits Amda provider
r348
Q_LOGGING_CATEGORY(LOG_AmdaProvider, "AmdaProvider")
Alexandre Leroux
Amda provider (1)...
r349 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);
}
} // namespace
Alexandre Leroux
Amda provider cleaning...
r376 AmdaProvider::AmdaProvider()
Alexandre Leroux
Inits Amda provider
r348 {
Modify the AmdaProvider to remove from it all network controller...
r358 qCDebug(LOG_NetworkController()) << tr("AmdaProvider::AmdaProvider")
<< QThread::currentThread();
if (auto app = sqpApp) {
auto &networkController = app->networkController();
Alexandre Leroux
Updates signal to be valid on Windows
r383 connect(this, SIGNAL(requestConstructed(QNetworkRequest, QUuid,
std::function<void(QNetworkReply *, QUuid)>)),
&networkController,
SLOT(onProcessRequested(QNetworkRequest, QUuid,
std::function<void(QNetworkReply *, QUuid)>)));
Remove connection for progress from NC -> VC to NC -> Provider.
r391
connect(&sqpApp->networkController(), SIGNAL(replyDownloadProgress(QUuid, double)), this,
SIGNAL(dataProvidedProgress(QUuid, double)));
Modify the AmdaProvider to remove from it all network controller...
r358 }
Alexandre Leroux
Inits Amda provider
r348 }
Alexandre Leroux
Updates IDataProvider::requestDataLoading() method's signature...
r375 void AmdaProvider::requestDataLoading(QUuid token, const DataProviderParameters &parameters)
Alexandre Leroux
Inits Amda provider
r348 {
// NOTE: Try to use multithread if possible
Alexandre Leroux
Updates IDataProvider::requestDataLoading() method's signature...
r375 const auto times = parameters.m_Times;
Alexandre Leroux
Amda provider update (2)...
r380 const auto data = parameters.m_Data;
Alexandre Leroux
Updates IDataProvider::requestDataLoading() method's signature...
r375 for (const auto &dateTime : qAsConst(times)) {
Alexandre Leroux
Amda provider update (2)...
r380 retrieveData(token, dateTime, data);
Alexandre Leroux
Inits Amda provider
r348 }
}
Implement of the abort download process
r388 void AmdaProvider::requestDataAborting(QUuid identifier)
{
if (auto app = sqpApp) {
auto &networkController = app->networkController();
networkController.onReplyCanceled(identifier);
}
}
Alexandre Leroux
Amda provider update (2)...
r380 void AmdaProvider::retrieveData(QUuid token, const SqpDateTime &dateTime, const QVariantHash &data)
Alexandre Leroux
Amda provider (1)...
r349 {
Alexandre Leroux
Amda provider update (2)...
r380 // Retrieves product ID from data: if the value is invalid, no request is made
auto productId = data.value(AMDA_XML_ID_KEY).toString();
if (productId.isNull()) {
qCCritical(LOG_AmdaProvider()) << tr("Can't retrieve data: unknown product id");
return;
}
Alexandre Leroux
Amda provider (1)...
r349 // /////////// //
// Creates URL //
// /////////// //
Alexandre Leroux
Updates IDataProvider::requestDataLoading() method's signature...
r375 auto startDate = dateFormat(dateTime.m_TStart);
auto endDate = dateFormat(dateTime.m_TEnd);
Alexandre Leroux
Amda provider (1)...
r349
auto url = QUrl{QString{AMDA_URL_FORMAT}.arg(startDate, endDate, productId)};
Modify the AmdaProvider to remove from it all network controller...
r358 auto tempFile = std::make_shared<QTemporaryFile>();
Alexandre Leroux
Amda provider (1)...
r349
Modify the AmdaProvider to remove from it all network controller...
r358 // LAMBDA
Alexandre Leroux
Amda provider cleaning...
r376 auto httpDownloadFinished
= [this, dateTime, tempFile, token](QNetworkReply *reply, QUuid dataId) noexcept {
Q_UNUSED(dataId);
Add implementation of abort impact on Amda plugin
r397 // Don't do anything if the reply was abort
if (reply->error() != QNetworkReply::OperationCanceledError) {
if (tempFile) {
auto replyReadAll = reply->readAll();
if (!replyReadAll.isEmpty()) {
tempFile->write(replyReadAll);
}
tempFile->close();
// Parse results file
if (auto dataSeries = AmdaResultParser::readTxt(tempFile->fileName())) {
emit dataProvided(token, dataSeries, dateTime);
}
else {
/// @todo ALX : debug
}
Alexandre Leroux
Amda provider cleaning...
r376 }
}
};
Add implementation of abort impact on Amda plugin
r397 auto httpFinishedLambda
= [this, httpDownloadFinished, tempFile](QNetworkReply *reply, QUuid dataId) noexcept {
Alexandre Leroux
Amda provider (2)...
r350
Add implementation of abort impact on Amda plugin
r397 // Don't do anything if the reply was abort
if (reply->error() != QNetworkReply::OperationCanceledError) {
auto downloadFileUrl = QUrl{QString{reply->readAll()}};
Implement of the abort download process
r388
Alexandre Leroux
Amda provider (2)...
r350
Add implementation of abort impact on Amda plugin
r397 // Executes request for downloading file //
Modify the AmdaProvider to remove from it all network controller...
r358
Add implementation of abort impact on Amda plugin
r397 // Creates destination file
if (tempFile->open()) {
// Executes request
emit requestConstructed(QNetworkRequest{downloadFileUrl}, dataId,
httpDownloadFinished);
}
}
};
Modify the AmdaProvider to remove from it all network controller...
r358
// //////////////// //
// Executes request //
// //////////////// //
emit requestConstructed(QNetworkRequest{url}, token, httpFinishedLambda);
Alexandre Leroux
Inits Amda provider
r348 }