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

0001 /*
0002     SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #ifndef KPUBLICTRANSPORT_SCRIPTEDRESTONBOARDBACKEND_H
0007 #define KPUBLICTRANSPORT_SCRIPTEDRESTONBOARDBACKEND_H
0008 
0009 #include "restonboardbackend_p.h"
0010 
0011 #include <QThread>
0012 #include <QUrl>
0013 
0014 #include <memory>
0015 
0016 class QJSEngine;
0017 class QJSValue;
0018 class QTimer;
0019 
0020 namespace KPublicTransport {
0021 
0022 /** REST onboard API backend with response parsing done in JS. */
0023 class ScriptedRestOnboardBackend : public RestOnboardBackend
0024 {
0025     Q_OBJECT
0026     Q_PROPERTY(QUrl positionEndpoint MEMBER m_positionEndpoint)
0027     Q_PROPERTY(QUrl journeyEndpoint MEMBER m_journeyEndpoint)
0028     Q_PROPERTY(QString script MEMBER m_scriptName)
0029     Q_PROPERTY(QString positionFunction MEMBER m_positionFunction)
0030     Q_PROPERTY(QString journeyFunction MEMBER m_journeyFunction)
0031 
0032 public:
0033     explicit ScriptedRestOnboardBackend(QObject *parent = nullptr);
0034     ~ScriptedRestOnboardBackend();
0035 
0036     bool supportsPosition() const override final;
0037     bool supportsJourney() const override final;
0038 
0039     QNetworkRequest createPositionRequest() const override final;
0040     QNetworkRequest createJourneyRequest() const override final;
0041 
0042     Journey parseJourneyData(const QJsonValue &response) const override final;
0043     PositionData parsePositionData(const QJsonValue &response) const override final;
0044 
0045 private:
0046     void setupEngine() const;
0047     void printScriptError(const QJSValue &error) const;
0048 
0049     QUrl m_positionEndpoint;
0050     QUrl m_journeyEndpoint;
0051 
0052     QString m_scriptName;
0053     QString m_positionFunction;
0054     QString m_journeyFunction;
0055 
0056     mutable std::unique_ptr<QJSEngine> m_engine;
0057 
0058     mutable QThread m_watchdogThread;
0059     mutable QTimer *m_watchdogTimer = nullptr;
0060 };
0061 
0062 }
0063 
0064 #endif // KPUBLICTRANSPORT_SCRIPTEDRESTONBOARDBACKEND_H