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