Merge PR #551: DateTime: Fix time parsing and HTTP redirects

This commit is contained in:
jenkins 2022-05-08 19:14:31 +02:00
commit e0b2199611
2 changed files with 24 additions and 54 deletions

View File

@ -41,7 +41,7 @@
IntegrationPluginDateTime::IntegrationPluginDateTime() :
m_timer(nullptr),
m_todayDevice(nullptr),
m_timeZone(QTimeZone(QTimeZone::systemTimeZoneId())),
m_timeZone(QTimeZone::systemTimeZoneId()),
m_dusk(QDateTime()),
m_sunrise(QDateTime()),
m_noon(QDateTime()),
@ -203,8 +203,15 @@ void IntegrationPluginDateTime::searchGeoLocation()
qCDebug(dcDateTime()) << "Requesting geo location.";
QNetworkReply *reply = hardwareManager()->networkManager()->get(request);
connect(reply, &QNetworkReply::finished, this, &IntegrationPluginDateTime::onNetworkReplayFinished);
m_locationReplies.append(reply);
connect(reply, &QNetworkReply::finished, this, [reply, this](){
reply->deleteLater();
if (reply->error() != QNetworkReply::NoError) {
qCWarning(dcDateTime) << "Http error status for location request:" << reply->error();
return;
}
processGeoLocationData(reply->readAll());
});
}
void IntegrationPluginDateTime::processGeoLocationData(const QByteArray &data)
@ -250,16 +257,22 @@ void IntegrationPluginDateTime::getTimes(const QString &latitude, const QString
urlQuery.addQueryItem("lng", longitude);
urlQuery.addQueryItem("date", "today");
QUrl url = QUrl("http://api.sunrise-sunset.org/json");
QUrl url = QUrl("https://api.sunrise-sunset.org/json");
url.setQuery(urlQuery.toString());
QNetworkRequest request;
request.setUrl(url);
QNetworkReply *reply = hardwareManager()->networkManager()->get(request);
connect(reply, &QNetworkReply::finished, this, &IntegrationPluginDateTime::onNetworkReplayFinished);
connect(reply, &QNetworkReply::finished, this, [reply, this](){
reply->deleteLater();
m_timeReplies.append(reply);
if (reply->error() != QNetworkReply::NoError) {
qCWarning(dcDateTime) << "Http error status for time request:" << reply->error();
return;
}
processTimesData(reply->readAll());
});
}
void IntegrationPluginDateTime::processTimesData(const QByteArray &data)
@ -288,12 +301,11 @@ void IntegrationPluginDateTime::processTimesData(const QByteArray &data)
QString duskString = result.value("civil_twilight_end").toString();
// calculate the times in each alarm
m_dawn = QDateTime(QDate::currentDate(), parseTime(dawnString), Qt::UTC).toTimeZone(m_timeZone);
m_sunrise = QDateTime(QDate::currentDate(), parseTime(sunriseString), Qt::UTC).toTimeZone(m_timeZone);
m_noon = QDateTime(QDate::currentDate(), parseTime(noonString), Qt::UTC).toTimeZone(m_timeZone);
m_sunset = QDateTime(QDate::currentDate(), parseTime(sunsetString), Qt::UTC).toTimeZone(m_timeZone);
m_dusk = QDateTime(QDate::currentDate(), parseTime(duskString), Qt::UTC).toTimeZone(m_timeZone);
m_dawn = QDateTime(QDate::currentDate(), QTime::fromString(dawnString, "h:mm:ss AP"), Qt::UTC).toTimeZone(m_timeZone);
m_sunrise = QDateTime(QDate::currentDate(), QTime::fromString(sunriseString, "h:mm:ss AP"), Qt::UTC).toTimeZone(m_timeZone);
m_noon = QDateTime(QDate::currentDate(), QTime::fromString(noonString, "h:mm:ss AP"), Qt::UTC).toTimeZone(m_timeZone);
m_sunset = QDateTime(QDate::currentDate(), QTime::fromString(sunsetString, "h:mm:ss AP"), Qt::UTC).toTimeZone(m_timeZone);
m_dusk = QDateTime(QDate::currentDate(), QTime::fromString(duskString, "h:mm:ss AP"), Qt::UTC).toTimeZone(m_timeZone);
qCDebug(dcDateTime) << " dawn :" << m_dawn.toString() << dawnString;
qCDebug(dcDateTime) << " sunrise :" << m_sunrise.toString() << sunriseString;
@ -305,42 +317,6 @@ void IntegrationPluginDateTime::processTimesData(const QByteArray &data)
updateTimes();
}
QTime IntegrationPluginDateTime::parseTime(const QString &timeString) const
{
bool isPm = timeString.endsWith(" PM");
QString tmp = QString(timeString).remove(QRegExp("[ APM]*"));
QStringList parts = tmp.split(":");
if (parts.count() != 3) {
qCWarning(dcDateTime()) << "Error parsing timeString:" << timeString;
return QTime();
}
return QTime(parts.first().toInt(), parts.at(1).toInt(), parts.last().toInt()).addSecs(isPm ? 60 * 60 * 12 : 0);
}
void IntegrationPluginDateTime::onNetworkReplayFinished()
{
QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (m_locationReplies.contains(reply)) {
m_locationReplies.removeAll(reply);
if (status != 200) {
qCWarning(dcDateTime) << "Http error status for location request:" << status << reply->error();
} else {
processGeoLocationData(reply->readAll());
}
} else if (m_timeReplies.contains(reply)) {
m_timeReplies.removeAll(reply);
if (status != 200) {
qCWarning(dcDateTime) << "Http error status for time request:" << status << reply->error();
} else {
processTimesData(reply->readAll());
}
}
reply->deleteLater();
}
void IntegrationPluginDateTime::onAlarm()
{
Alarm *alarm = static_cast<Alarm *>(sender());

View File

@ -74,17 +74,12 @@ private:
QDateTime m_sunset;
QDateTime m_dawn;
QList<QNetworkReply *> m_locationReplies;
QList<QNetworkReply *> m_timeReplies;
void searchGeoLocation();
void processGeoLocationData(const QByteArray &data);
void getTimes(const QString &latitude, const QString &longitude);
void processTimesData(const QByteArray &data);
QTime parseTime(const QString &timeString) const;
signals:
void dusk();
void sunset();
@ -93,7 +88,6 @@ signals:
void dawn();
private slots:
void onNetworkReplayFinished();
void onAlarm();
void onCountdownTimeout();
void onCountdownRunningChanged(const bool &running);