File indexing completed on 2024-05-12 04:42:41

0001 /*
0002     SPDX-FileCopyrightText: 2024 Jonah BrĂ¼chert <jbb@kaidan.im>
0003     SPDX-FileCopyrightText: 2024 Stefan Vesovic <asphyxia@spline.de>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #pragma once
0009 
0010 #include "backends/abstractbackend.h"
0011 
0012 #include <QPointer>
0013 
0014 #include <unordered_map>
0015 
0016 namespace KPublicTransport {
0017 
0018 
0019 struct SrbStation {
0020     QString name;
0021     float longitude = NAN;
0022     float latitude = NAN;
0023     int id;
0024 };
0025 
0026 class SrbijavozBackend : public KPublicTransport::AbstractBackend
0027 {
0028 public:
0029     SrbijavozBackend();
0030 
0031     static inline constexpr const char* type() { return "srbijavoz"; }
0032 
0033     Capabilities capabilities() const override;
0034 
0035     /** Returns whether or not a location query has to be performed for the given
0036      *  Location before doing departure or journey queries for it.
0037      */
0038     bool needsLocationQuery(const Location &loc, QueryType type) const override;
0039 
0040     /** Perform a journey query.
0041      *  @return @c true if performing an async operation, @c false otherwise.
0042      */
0043     bool queryJourney(const JourneyRequest &request, JourneyReply *reply, QNetworkAccessManager *nam) const override;
0044 
0045     /** Perform a location query.
0046      *  @return @c true if performing an async operation, @c false otherwise.
0047      */
0048     bool queryLocation(const LocationRequest &request, LocationReply *reply, QNetworkAccessManager *nam) const override;
0049 
0050 private:
0051     void loadAuxData();
0052     void applyStationQuirks();
0053 
0054     AsyncTask<void> *downloadStationData(Reply *reply, QNetworkAccessManager *nam);
0055 
0056     QDateTime parseDateTime(const QString &timeString, const QDate &date, const QDateTime &knownPreviousTime = {}) const;
0057 
0058     Location stationToLocation(const KPublicTransport::SrbStation &station) const;
0059 
0060     QString makeSearchableName(QString name) const;
0061 
0062     QString identifierName() const;
0063 
0064     std::unordered_map<int, std::shared_ptr<SrbStation>> m_stationsById;
0065     std::unordered_map<QString, std::shared_ptr<SrbStation>> m_stationsBySearchName;
0066 
0067     QPointer<AsyncTask<void>> m_fetchStationsTask = nullptr;
0068 };
0069 
0070 }