File indexing completed on 2024-05-12 04:42:41
0001 /* 0002 SPDX-FileCopyrightText: 2023 Jonah BrĂ¼chert <jbb@kaidan.im> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include <QPointer> 0010 0011 #include "abstractbackend.h" 0012 #include "datatypes/stopover.h" 0013 #include "datatypes/journey.h" 0014 0015 namespace KPublicTransport { 0016 0017 namespace PV { 0018 struct Station { 0019 qint64 id; 0020 QString name; 0021 QString searchableName; 0022 float latitude; 0023 float longitude; 0024 }; 0025 } 0026 0027 using PendingQuery = AsyncTask<std::vector<Journey>>; 0028 0029 0030 class PasazieruVilciensBackend : public QObject, public AbstractBackend { 0031 Q_OBJECT 0032 0033 public: 0034 PasazieruVilciensBackend(); 0035 0036 static inline constexpr const char* type() { return "pv"; } 0037 Capabilities capabilities() const override; 0038 bool needsLocationQuery(const Location &loc, AbstractBackend::QueryType type) const override; 0039 bool queryJourney(const JourneyRequest &req, JourneyReply *reply, QNetworkAccessManager *nam) const override; 0040 bool queryLocation(const LocationRequest &req, LocationReply *reply, QNetworkAccessManager *nam) const override; 0041 0042 private: 0043 AsyncTask<void> *downloadStationData(Reply *reply, QNetworkAccessManager *nam); 0044 0045 /// Single-line trips 0046 std::shared_ptr<PendingQuery> fetchTrip(const JourneyRequest &req, JourneyReply *reply, QNetworkAccessManager *nam) const; 0047 0048 /// trips containing transfers 0049 std::shared_ptr<PendingQuery> fetchJoinedTrip(const JourneyRequest &req, JourneyReply *reply, QNetworkAccessManager *nam) const; 0050 0051 static Location stationToLocation(const PV::Station &station); 0052 Location lookupStation(int pvint) const; 0053 0054 /// parses stopovers from json objects 0055 std::vector<Stopover> parseStopovers(std::vector<QJsonObject> &&stops, const QDateTime &startTime) const; 0056 0057 /// filters unsupported objects and drops stops that are 0058 /// before the departure station or after the destination 0059 std::vector<QJsonObject> prepareStops(QJsonArray &&data) const; 0060 0061 /// Splits the list of json stops at the transfer point 0062 std::tuple<std::vector<QJsonObject>, std::vector<QJsonObject>> splitJoinedSections(QJsonArray &&data) const; 0063 0064 /// Parses a time from "12:30" into a QDateTime, given a date. 0065 /// If the resulting QDateTime is smaller than a given known previous date / time, 0066 /// it assumes the next day started in the meantime. 0067 QDateTime parseDateTime(const QString &time, const QDate &date, const QDateTime &knownPreviousDateTime = {}) const; 0068 0069 std::map<int, PV::Station> m_stations; 0070 QPointer<AsyncTask<void>> m_stationDataTask = nullptr; 0071 }; 0072 0073 }