From 2522f414883889653e9bdcebdc4979d0f56bf62a Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Thu, 7 Apr 2022 23:11:39 +0200 Subject: [PATCH 1/2] DateTime: Fix time parsing for some time zones --- datetime/integrationplugindatetime.cpp | 25 ++++++------------------- datetime/integrationplugindatetime.h | 2 -- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/datetime/integrationplugindatetime.cpp b/datetime/integrationplugindatetime.cpp index b99c614f..b0c073ae 100644 --- a/datetime/integrationplugindatetime.cpp +++ b/datetime/integrationplugindatetime.cpp @@ -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()), @@ -288,12 +288,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,18 +304,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(sender()); diff --git a/datetime/integrationplugindatetime.h b/datetime/integrationplugindatetime.h index 29542d17..99d77dab 100644 --- a/datetime/integrationplugindatetime.h +++ b/datetime/integrationplugindatetime.h @@ -83,8 +83,6 @@ private: void getTimes(const QString &latitude, const QString &longitude); void processTimesData(const QByteArray &data); - QTime parseTime(const QString &timeString) const; - signals: void dusk(); void sunset(); From 0aaad3fba89e8785ecdd95d36d08082fd6c09d6f Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Tue, 19 Apr 2022 15:19:01 +0200 Subject: [PATCH 2/2] Update URL and fix it to not break on redirects any more --- datetime/integrationplugindatetime.cpp | 47 ++++++++++---------------- datetime/integrationplugindatetime.h | 4 --- 2 files changed, 18 insertions(+), 33 deletions(-) diff --git a/datetime/integrationplugindatetime.cpp b/datetime/integrationplugindatetime.cpp index b0c073ae..99bb6470 100644 --- a/datetime/integrationplugindatetime.cpp +++ b/datetime/integrationplugindatetime.cpp @@ -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) @@ -304,30 +317,6 @@ void IntegrationPluginDateTime::processTimesData(const QByteArray &data) updateTimes(); } -void IntegrationPluginDateTime::onNetworkReplayFinished() -{ - QNetworkReply *reply = static_cast(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(sender()); diff --git a/datetime/integrationplugindatetime.h b/datetime/integrationplugindatetime.h index 99d77dab..e5998e71 100644 --- a/datetime/integrationplugindatetime.h +++ b/datetime/integrationplugindatetime.h @@ -74,9 +74,6 @@ private: QDateTime m_sunset; QDateTime m_dawn; - QList m_locationReplies; - QList m_timeReplies; - void searchGeoLocation(); void processGeoLocationData(const QByteArray &data); @@ -91,7 +88,6 @@ signals: void dawn(); private slots: - void onNetworkReplayFinished(); void onAlarm(); void onCountdownTimeout(); void onCountdownRunningChanged(const bool &running);