File indexing completed on 2024-05-12 04:42:32
0001 /* 0002 SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "accessibilitycloudbackend.h" 0008 #include "accessibilitycloudparser.h" 0009 #include "cache.h" 0010 0011 #include <KPublicTransport/Location> 0012 #include <KPublicTransport/LocationRequest> 0013 #include <KPublicTransport/LocationReply> 0014 0015 #include <QDebug> 0016 #include <QNetworkRequest> 0017 #include <QNetworkReply> 0018 #include <QNetworkAccessManager> 0019 #include <QUrl> 0020 #include <QUrlQuery> 0021 0022 using namespace KPublicTransport; 0023 0024 AccessibilityCloudBackend::AccessibilityCloudBackend() = default; 0025 AccessibilityCloudBackend::~AccessibilityCloudBackend() = default; 0026 0027 AbstractBackend::Capabilities AccessibilityCloudBackend::capabilities() const 0028 { 0029 return AbstractBackend::Secure; // hardcoded below 0030 } 0031 0032 bool AccessibilityCloudBackend::queryLocation(const LocationRequest &req, LocationReply *reply, QNetworkAccessManager *nam) const 0033 { 0034 if ((req.types() & Location::Equipment) == 0 || !req.hasCoordinate()) { 0035 return false; 0036 } 0037 0038 QUrl url; 0039 url.setScheme(QStringLiteral("https")); 0040 url.setHost(QStringLiteral("accessibility-cloud.freetls.fastly.net")); 0041 url.setPath(QStringLiteral("/equipment-infos")); 0042 QUrlQuery query; 0043 query.addQueryItem(QStringLiteral("latitude"), QString::number(req.latitude())); 0044 query.addQueryItem(QStringLiteral("longitude"), QString::number(req.longitude())); 0045 query.addQueryItem(QStringLiteral("accuracy"), QString::number(req.maximumDistance())); 0046 query.addQueryItem(QStringLiteral("appToken"), m_token); 0047 url.setQuery(query); 0048 0049 QNetworkRequest netReq(url); 0050 netReq.setRawHeader("Accept", "application/json"); 0051 logRequest(req, netReq); 0052 0053 auto netReply = nam->get(netReq); 0054 netReply->setParent(reply); 0055 QObject::connect(netReply, &QNetworkReply::finished, reply, [this, netReply, reply] { 0056 netReply->deleteLater(); 0057 const auto data = netReply->readAll(); 0058 logReply(reply, netReply, data); 0059 if (netReply->error()) { 0060 addError(reply, Reply::NetworkError, netReply->errorString()); 0061 return; 0062 } 0063 0064 AccessibilityCloudParser parser; 0065 if (parser.parseLocations(data)) { 0066 if (parser.locations.empty()) { 0067 addError(reply, Reply::NotFoundError, {}); 0068 } else { 0069 Cache::addLocationCacheEntry(backendId(), reply->request().cacheKey(), parser.locations, parser.attributions, std::chrono::minutes(5)); 0070 addAttributions(reply, std::move(parser.attributions)); 0071 addResult(reply, std::move(parser.locations)); 0072 } 0073 } else { 0074 addError(reply, Reply::UnknownError, {}); 0075 } 0076 }); 0077 0078 return true; 0079 }