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