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() : IntegrationPluginDateTime::IntegrationPluginDateTime() :
m_timer(nullptr), m_timer(nullptr),
m_todayDevice(nullptr), m_todayDevice(nullptr),
m_timeZone(QTimeZone(QTimeZone::systemTimeZoneId())), m_timeZone(QTimeZone::systemTimeZoneId()),
m_dusk(QDateTime()), m_dusk(QDateTime()),
m_sunrise(QDateTime()), m_sunrise(QDateTime()),
m_noon(QDateTime()), m_noon(QDateTime()),
@ -203,8 +203,15 @@ void IntegrationPluginDateTime::searchGeoLocation()
qCDebug(dcDateTime()) << "Requesting geo location."; qCDebug(dcDateTime()) << "Requesting geo location.";
QNetworkReply *reply = hardwareManager()->networkManager()->get(request); QNetworkReply *reply = hardwareManager()->networkManager()->get(request);
connect(reply, &QNetworkReply::finished, this, &IntegrationPluginDateTime::onNetworkReplayFinished); connect(reply, &QNetworkReply::finished, this, [reply, this](){
m_locationReplies.append(reply); 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) void IntegrationPluginDateTime::processGeoLocationData(const QByteArray &data)
@ -250,16 +257,22 @@ void IntegrationPluginDateTime::getTimes(const QString &latitude, const QString
urlQuery.addQueryItem("lng", longitude); urlQuery.addQueryItem("lng", longitude);
urlQuery.addQueryItem("date", "today"); 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()); url.setQuery(urlQuery.toString());
QNetworkRequest request; QNetworkRequest request;
request.setUrl(url); request.setUrl(url);
QNetworkReply *reply = hardwareManager()->networkManager()->get(request); 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) void IntegrationPluginDateTime::processTimesData(const QByteArray &data)
@ -288,12 +301,11 @@ void IntegrationPluginDateTime::processTimesData(const QByteArray &data)
QString duskString = result.value("civil_twilight_end").toString(); QString duskString = result.value("civil_twilight_end").toString();
// calculate the times in each alarm // calculate the times in each alarm
m_dawn = QDateTime(QDate::currentDate(), QTime::fromString(dawnString, "h:mm:ss AP"), Qt::UTC).toTimeZone(m_timeZone);
m_dawn = QDateTime(QDate::currentDate(), parseTime(dawnString), Qt::UTC).toTimeZone(m_timeZone); m_sunrise = QDateTime(QDate::currentDate(), QTime::fromString(sunriseString, "h:mm:ss AP"), Qt::UTC).toTimeZone(m_timeZone);
m_sunrise = QDateTime(QDate::currentDate(), parseTime(sunriseString), Qt::UTC).toTimeZone(m_timeZone); m_noon = QDateTime(QDate::currentDate(), QTime::fromString(noonString, "h:mm:ss AP"), Qt::UTC).toTimeZone(m_timeZone);
m_noon = QDateTime(QDate::currentDate(), parseTime(noonString), Qt::UTC).toTimeZone(m_timeZone); m_sunset = QDateTime(QDate::currentDate(), QTime::fromString(sunsetString, "h:mm:ss AP"), Qt::UTC).toTimeZone(m_timeZone);
m_sunset = QDateTime(QDate::currentDate(), parseTime(sunsetString), Qt::UTC).toTimeZone(m_timeZone); m_dusk = QDateTime(QDate::currentDate(), QTime::fromString(duskString, "h:mm:ss AP"), Qt::UTC).toTimeZone(m_timeZone);
m_dusk = QDateTime(QDate::currentDate(), parseTime(duskString), Qt::UTC).toTimeZone(m_timeZone);
qCDebug(dcDateTime) << " dawn :" << m_dawn.toString() << dawnString; qCDebug(dcDateTime) << " dawn :" << m_dawn.toString() << dawnString;
qCDebug(dcDateTime) << " sunrise :" << m_sunrise.toString() << sunriseString; qCDebug(dcDateTime) << " sunrise :" << m_sunrise.toString() << sunriseString;
@ -305,42 +317,6 @@ void IntegrationPluginDateTime::processTimesData(const QByteArray &data)
updateTimes(); 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() void IntegrationPluginDateTime::onAlarm()
{ {
Alarm *alarm = static_cast<Alarm *>(sender()); Alarm *alarm = static_cast<Alarm *>(sender());

View File

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