File indexing completed on 2024-05-12 04:42:35
0001 /* 0002 SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #ifndef KPUBLICTRANSPORT_HAFASMGATEBACKEND_H 0008 #define KPUBLICTRANSPORT_HAFASMGATEBACKEND_H 0009 0010 #include "kpublictransport_export.h" 0011 0012 #include "hafasbackend.h" 0013 #include "hafasconfiguration.h" 0014 #include "hafasmgateparser.h" 0015 0016 #include <KPublicTransport/IndividualTransport> 0017 0018 #include <QString> 0019 #include <QStringList> 0020 0021 class QJsonArray; 0022 class QJsonObject; 0023 0024 namespace KPublicTransport { 0025 0026 class LocationRequest; 0027 0028 /** Backend for the Hafas mgate.exe interface. 0029 * @internal exported for tooling only 0030 */ 0031 class KPUBLICTRANSPORT_EXPORT HafasMgateBackend : public HafasBackend 0032 { 0033 Q_GADGET 0034 /** The auth data block in every request. */ 0035 Q_PROPERTY(QJsonObject auth MEMBER m_auth) 0036 /** The client data sent in every request. */ 0037 Q_PROPERTY(QJsonObject client MEMBER m_client) 0038 Q_PROPERTY(QString ext MEMBER m_extParam) 0039 Q_PROPERTY(QString ver MEMBER m_version) 0040 /** Salt for request mic/mac parameters, hex-encoded. */ 0041 Q_PROPERTY(QString micMacSalt WRITE setMicMacSalt) 0042 /** Salt for the request checksum parameter, hex-encoded. */ 0043 Q_PROPERTY(QString checksumSalt WRITE setChecksumSalt) 0044 0045 /** Supported journey filter conGroup arguments and their corresponding mapping to 0046 * our transport modes. 0047 */ 0048 Q_PROPERTY(QJsonArray conGroups WRITE setConGroups) 0049 0050 /** Custom product name mappings. 0051 * An array of objects with the following values: 0052 * - cls: the numerical product class (from the product bitmask) 0053 * - lineName: a string or array of strings, with JSON key names referring to the 0054 * corresponding entry in the `prodL` product list of the Hafas response. The first 0055 * one resulting in an non-empty value is used for Line::name. 0056 * - routeName: same as above for Route::name. Leaving this empty will not set a route name. 0057 * 0058 * If no product name mapping is found for a product class the default ('name'/none) is used. 0059 */ 0060 Q_PROPERTY(QJsonArray productNameMappings WRITE setProductNameMappings) 0061 0062 public: 0063 HafasMgateBackend(); 0064 ~HafasMgateBackend() override; 0065 0066 void init() override; 0067 static inline constexpr const char* type() { return "hafasMgate"; } 0068 Capabilities capabilities() const override; 0069 bool needsLocationQuery(const Location &loc, AbstractBackend::QueryType type) const override; 0070 bool queryJourney(const JourneyRequest &request, JourneyReply *reply, QNetworkAccessManager *nam) const override; 0071 bool queryStopover(const StopoverRequest &request, StopoverReply *reply, QNetworkAccessManager *nam) const override; 0072 bool queryLocation(const LocationRequest &req, LocationReply *reply, QNetworkAccessManager *nam) const override; 0073 0074 QNetworkRequest makePostRequest(const QJsonObject &svcReq, QByteArray &postData) const; 0075 0076 private: 0077 bool queryJourney(JourneyReply *reply, const QString &fromId, QNetworkAccessManager *nam) const; 0078 bool queryJourney(JourneyReply *reply, const QString &fromId, const QString &toId, QNetworkAccessManager *nam) const; 0079 void setMicMacSalt(const QString &salt); 0080 void setChecksumSalt(const QString &salt); 0081 void setConGroups(const QJsonArray &conGroups); 0082 void setProductNameMappings(const QJsonArray &productNameMappings); 0083 QJsonObject locationToJson(const Location &loc) const; 0084 void addLineModeJourneyFilter(const std::vector<Line::Mode> &lineModes, QJsonArray &jnyFltrL) const; 0085 0086 mutable HafasMgateParser m_parser; 0087 0088 QJsonObject m_auth; 0089 QJsonObject m_client; 0090 QString m_extParam; 0091 QString m_version; 0092 QByteArray m_micMacSalt; 0093 QByteArray m_checksumSalt; 0094 0095 struct ConGroup { 0096 IndividualTransport access; 0097 IndividualTransport egress; 0098 QString group; 0099 }; 0100 std::vector<ConGroup> m_conGroups; 0101 std::vector<HafasMgateProductNameMapping> m_productNameMappings; 0102 }; 0103 0104 } 0105 0106 #endif // KPUBLICTRANSPORT_HAFASMGATEBACKEND_H