File indexing completed on 2024-05-05 16:49:21

0001 /*
0002  * SPDX-FileCopyrightText: 2020-2021 Han Young <hanyoung@protonmail.com>
0003  * SPDX-FileCopyrightText: 2020 Devin Lin <espidev@gmail.com>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.0-or-later
0006  */
0007 
0008 #include "geotimezone.h"
0009 #include <QJsonDocument>
0010 #include <QNetworkAccessManager>
0011 #include <QNetworkReply>
0012 #include <QNetworkRequest>
0013 #include <QUrlQuery>
0014 namespace KWeatherCore
0015 {
0016 class GeoTimezonePrivate : public QObject
0017 {
0018     Q_OBJECT
0019 public:
0020     GeoTimezonePrivate(double lat, double lon, GeoTimezone *parent);
0021 Q_SIGNALS:
0022     void finished(const QString &timezone);
0023     void networkErrorOccured();
0024 private Q_SLOTS:
0025     void downloadFinished(QNetworkReply *reply);
0026 
0027 private:
0028     QNetworkAccessManager *m_manager = nullptr;
0029 };
0030 GeoTimezonePrivate::GeoTimezonePrivate(double lat,
0031                                        double lon,
0032                                        GeoTimezone *parent)
0033     : QObject(parent)
0034 {
0035     m_manager = new QNetworkAccessManager(this);
0036 
0037     m_manager->setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy);
0038     m_manager->setStrictTransportSecurityEnabled(true);
0039     m_manager->enableStrictTransportSecurityStore(true);
0040 
0041     QUrl url(QStringLiteral("http://api.geonames.org/timezoneJSON"));
0042     QUrlQuery query;
0043     query.addQueryItem(QStringLiteral("lat"), QString::number(lat));
0044     query.addQueryItem(QStringLiteral("lng"), QString::number(lon));
0045     query.addQueryItem(QStringLiteral("username"),
0046                        QStringLiteral("kweatherdev"));
0047     url.setQuery(query);
0048     QNetworkRequest req(url);
0049 
0050     connect(m_manager,
0051             &QNetworkAccessManager::finished,
0052             this,
0053             &GeoTimezonePrivate::downloadFinished);
0054     connect(
0055         this, &GeoTimezonePrivate::finished, parent, &GeoTimezone::finished);
0056     connect(this,
0057             &GeoTimezonePrivate::networkErrorOccured,
0058             parent,
0059             &GeoTimezone::networkErrorOccured);
0060     m_manager->get(req);
0061 }
0062 GeoTimezone::GeoTimezone(double lat, double lon, QObject *parent)
0063     : QObject(parent)
0064     , d(new GeoTimezonePrivate(lat, lon, this))
0065 {
0066 }
0067 void GeoTimezonePrivate::downloadFinished(QNetworkReply *reply)
0068 {
0069     reply->deleteLater();
0070     if (reply->error()) {
0071         Q_EMIT networkErrorOccured();
0072         return;
0073     }
0074 
0075     QJsonDocument doc = QJsonDocument::fromJson(reply->readAll());
0076     // if our api calls reached daily limit
0077     if (doc[QStringLiteral("status")][QStringLiteral("value")].toInt() == 18) {
0078         qWarning() << "api calls reached daily limit";
0079         return;
0080     }
0081     Q_EMIT finished(doc[QStringLiteral("timezoneId")].toString());
0082 }
0083 }
0084 #include "geotimezone.moc"