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"