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 }