File indexing completed on 2024-05-12 04:42:42
0001 /* 0002 SPDX-FileCopyrightText: 2024 Jonah BrĂ¼chert <jbb@kaidan.im> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include <QObject> 0010 #include <QPointer> 0011 0012 #include <unordered_map> 0013 0014 #include "backends/abstractbackend.h" 0015 #include "datatypes/journey.h" 0016 0017 0018 namespace KPublicTransport { 0019 0020 namespace ZPCG { 0021 struct Station { 0022 QString name; 0023 QString idName; 0024 0025 float latitude; 0026 float longitude; 0027 }; 0028 } 0029 0030 class ZPCGBackend : public QObject, public AbstractBackend 0031 { 0032 Q_OBJECT 0033 0034 public: 0035 static inline constexpr const char* type() { return "zpcg"; } 0036 0037 Capabilities capabilities() const override; 0038 0039 bool needsLocationQuery(const Location &loc, QueryType type) const override; 0040 0041 bool queryJourney(const JourneyRequest &request, JourneyReply *reply, QNetworkAccessManager *nam) const override; 0042 0043 bool queryLocation(const LocationRequest &request, LocationReply *reply, QNetworkAccessManager *nam) const override; 0044 0045 QDateTime parseDateTime(const QString &timeString, const QDate &date, const QDateTime &knownPreviousTime = {}) const; 0046 0047 private: 0048 std::unordered_map<QString, std::shared_ptr<ZPCG::Station>> loadAuxStationData(); 0049 0050 /// Download the official station data, and use it to filter the local data. 0051 AsyncTask<void> *downloadStationData(Reply *reply, QNetworkAccessManager *nam); 0052 0053 Location stationToLocation(const QString &searchableName) const; 0054 0055 static Line::Mode matchTrainType(QStringView trainType); 0056 0057 QUrl baseUrl() const; 0058 QString identifierName() const; 0059 0060 std::unordered_map<QString, std::shared_ptr<ZPCG::Station>> m_stations; 0061 QPointer<AsyncTask<void>> m_fetchStationsTask = nullptr; 0062 }; 0063 0064 }