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"