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 }