File indexing completed on 2024-05-05 16:49:23
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 #include "weatherforecastsource.h" 0008 #include "geotimezone.h" 0009 #include "kweathercore_p.h" 0010 #include "pendingweatherforecast_p.h" 0011 #include "weatherforecast.h" 0012 #include <QCoreApplication> 0013 #include <QNetworkAccessManager> 0014 #include <QNetworkReply> 0015 #include <QUrlQuery> 0016 namespace KWeatherCore 0017 { 0018 class WeatherForecastSourcePrivate : public QObject 0019 { 0020 Q_OBJECT 0021 public: 0022 WeatherForecastSourcePrivate(QObject *parent = nullptr); 0023 PendingWeatherForecast * 0024 requestData(double latitude, 0025 double longitude, 0026 QString timezone = QString(), 0027 const std::vector<Sunrise> &sunrise = std::vector<Sunrise>()); 0028 0029 private: 0030 QNetworkAccessManager *manager = nullptr; 0031 }; 0032 WeatherForecastSourcePrivate::WeatherForecastSourcePrivate(QObject *parent) 0033 : QObject(parent) 0034 { 0035 manager = new QNetworkAccessManager(this); 0036 } 0037 PendingWeatherForecast * 0038 WeatherForecastSourcePrivate::requestData(double latitude, 0039 double longitude, 0040 QString timezone, 0041 const std::vector<Sunrise> &sunrise) 0042 { 0043 // query weather api 0044 QUrl url(QStringLiteral( 0045 "https://api.met.no/weatherapi/locationforecast/2.0/complete")); 0046 QUrlQuery query; 0047 query.addQueryItem(QStringLiteral("lat"), 0048 toFixedString(latitude)); 0049 query.addQueryItem(QStringLiteral("lon"), 0050 toFixedString(longitude)); 0051 0052 url.setQuery(query); 0053 0054 QNetworkRequest req(url); 0055 req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, 0056 QNetworkRequest::NoLessSafeRedirectPolicy); 0057 0058 // see §Identification on https://api.met.no/conditions_service.html 0059 req.setHeader(QNetworkRequest::UserAgentHeader, 0060 QString(QStringLiteral("KWeatherCore/") + 0061 VERSION_NUMBER + 0062 QStringLiteral(" kde-frameworks-devel@kde.org"))); 0063 0064 auto reply = manager->get(req); 0065 return new PendingWeatherForecast( 0066 latitude, longitude, reply, timezone, sunrise); 0067 } 0068 WeatherForecastSource::WeatherForecastSource(QObject *parent) 0069 : QObject(parent) 0070 , d(new WeatherForecastSourcePrivate(this)) 0071 { 0072 } 0073 PendingWeatherForecast * 0074 WeatherForecastSource::requestData(double latitude, 0075 double longitude, 0076 QString timezone, 0077 const std::vector<Sunrise> &sunrise) 0078 { 0079 return d->requestData(latitude, longitude, std::move(timezone), sunrise); 0080 } 0081 PendingWeatherForecast *WeatherForecastSource::requestData( 0082 const KWeatherCore::LocationQueryResult &result) 0083 { 0084 return requestData(result.latitude(), result.longitude()); 0085 } 0086 } 0087 #include "weatherforecastsource.moc"