1 /* 2 SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org> 3 4 SPDX-License-Identifier: LGPL-2.0-or-later 5 */ 6 7 #ifndef KPUBLICTRANSPORT_HAFASMGATEBACKEND_H 8 #define KPUBLICTRANSPORT_HAFASMGATEBACKEND_H 9 10 #include "kpublictransport_export.h" 11 12 #include "hafasbackend.h" 13 #include "hafasmgateparser.h" 14 15 #include <KPublicTransport/IndividualTransport> 16 17 #include <QString> 18 19 class QJsonArray; 20 class QJsonObject; 21 class QNetworkReply; 22 23 namespace KPublicTransport { 24 25 class LocationRequest; 26 27 /** Backend for the Hafas mgate.exe interface. 28 * @internal exported for tooling only 29 */ 30 class KPUBLICTRANSPORT_EXPORT HafasMgateBackend : public HafasBackend 31 { 32 Q_GADGET 33 /** The auth data block in every request. */ 34 Q_PROPERTY(QJsonObject auth MEMBER m_auth) 35 /** The client data sent in every request. */ 36 Q_PROPERTY(QJsonObject client MEMBER m_client) 37 Q_PROPERTY(QString ext MEMBER m_extParam) 38 Q_PROPERTY(QString ver MEMBER m_version) 39 /** Salt for request mic/mac parameters, hex-encoded. */ 40 Q_PROPERTY(QString micMacSalt WRITE setMicMacSalt) 41 /** Salt for the request checksum parameter, hex-encoded. */ 42 Q_PROPERTY(QString checksumSalt WRITE setChecksumSalt) 43 44 /** Supported journey filter conGroup arguments and their corresponding mapping to 45 * our transport modes. 46 */ 47 Q_PROPERTY(QJsonArray conGroups WRITE setConGroups) 48 49 /** Products (as numerical Hafas ids) for which we should prefer the line number over the line name. 50 * This is useful to strip non-canonical prefixes. 51 */ 52 Q_PROPERTY(QJsonArray preferLineNumberProducts WRITE setPreferLineNumberProducts) 53 54 public: 55 HafasMgateBackend(); 56 ~HafasMgateBackend() override; 57 58 void init() override; type()59 static inline constexpr const char* type() { return "hafasMgate"; } 60 Capabilities capabilities() const override; 61 bool needsLocationQuery(const Location &loc, AbstractBackend::QueryType type) const override; 62 bool queryJourney(const JourneyRequest &request, JourneyReply *reply, QNetworkAccessManager *nam) const override; 63 bool queryStopover(const StopoverRequest &request, StopoverReply *reply, QNetworkAccessManager *nam) const override; 64 bool queryLocation(const LocationRequest &req, LocationReply *reply, QNetworkAccessManager *nam) const override; 65 66 QNetworkRequest makePostRequest(const QJsonObject &svcReq, QByteArray &postData) const; 67 68 private: 69 bool queryJourney(JourneyReply *reply, const QString &fromId, QNetworkAccessManager *nam) const; 70 bool queryJourney(JourneyReply *reply, const QString &fromId, const QString &toId, QNetworkAccessManager *nam) const; 71 void setMicMacSalt(const QString &salt); 72 void setChecksumSalt(const QString &salt); 73 void setConGroups(const QJsonArray &conGroups); 74 void setPreferLineNumberProducts(const QJsonArray &lineNumberProduducts); 75 QJsonObject locationToJson(const Location &loc) const; 76 77 mutable HafasMgateParser m_parser; 78 79 QJsonObject m_auth; 80 QJsonObject m_client; 81 QString m_extParam; 82 QString m_version; 83 QByteArray m_micMacSalt; 84 QByteArray m_checksumSalt; 85 86 struct ConGroup { 87 IndividualTransport access; 88 IndividualTransport egress; 89 QString group; 90 }; 91 std::vector<ConGroup> m_conGroups; 92 std::vector<int> m_lineNumberProducts; 93 }; 94 95 } 96 97 #endif // KPUBLICTRANSPORT_HAFASMGATEBACKEND_H 98