File indexing completed on 2024-04-28 04:42:42
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 "reply_p.h" 0010 0011 #include <QJsonDocument> 0012 #include <QNetworkAccessManager> 0013 #include <QNetworkReply> 0014 #include <QNetworkRequest> 0015 #include <QUrlQuery> 0016 0017 namespace KWeatherCore 0018 { 0019 class GeoTimezonePrivate : public ReplyPrivate 0020 { 0021 public: 0022 QString m_timezone; 0023 }; 0024 0025 GeoTimezone::GeoTimezone(QNetworkAccessManager *nam, double lat, double lon, QObject *parent) 0026 : Reply(new GeoTimezonePrivate, parent) 0027 { 0028 Q_D(GeoTimezone); 0029 QUrl url(QStringLiteral("http://api.geonames.org/timezoneJSON")); 0030 QUrlQuery query; 0031 query.addQueryItem(QStringLiteral("lat"), QString::number(lat)); 0032 query.addQueryItem(QStringLiteral("lng"), QString::number(lon)); 0033 query.addQueryItem(QStringLiteral("username"), QStringLiteral("kweatherdev")); 0034 url.setQuery(query); 0035 0036 QNetworkRequest req(url); 0037 auto reply = nam->get(req); 0038 connect(reply, &QNetworkReply::finished, this, [reply, this]() { 0039 Q_D(GeoTimezone); 0040 reply->deleteLater(); 0041 if (reply->error() != QNetworkReply::NoError) { 0042 d->setError(Reply::NetworkError, reply->errorString()); 0043 } else { 0044 const QJsonDocument doc = QJsonDocument::fromJson(reply->readAll()); 0045 // if our api calls reached daily limit 0046 if (doc[QLatin1String("status")][QLatin1String("value")].toInt() == 18) { 0047 d->setError(Reply::RateLimitExceeded); 0048 qWarning() << "api calls reached daily limit"; 0049 } else { 0050 d->m_timezone = doc[QLatin1String("timezoneId")].toString(); 0051 } 0052 } 0053 Q_EMIT finished(); 0054 }); 0055 } 0056 0057 QString GeoTimezone::timezone() const 0058 { 0059 Q_D(const GeoTimezone); 0060 return d->m_timezone; 0061 } 0062 } 0063 0064 #include "moc_geotimezone.cpp"