// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2024 A-La-Karte Contributors #pragma once #include #include #include #include #include "game.h" class GameLauncher : public QObject { Q_OBJECT QML_ELEMENT Q_PROPERTY(bool hasRunningGames READ hasRunningGames NOTIFY runningGamesChanged) Q_PROPERTY(bool daemonAvailable READ daemonAvailable NOTIFY daemonAvailableChanged) public: explicit GameLauncher(QObject *parent = nullptr); ~GameLauncher(); bool hasRunningGames() const; bool daemonAvailable() const; Q_INVOKABLE void launchGame(Game *game); Q_INVOKABLE QVariantMap resolveLaunchInfo(Game *game) const; Q_INVOKABLE void stopGame(Game *game); Q_INVOKABLE bool isGameRunning(Game *game) const; Q_INVOKABLE void retryDaemonConnection(); Q_SIGNALS: void gameStarted(Game *game); void gameStopped(Game *game, int exitCode); void gameError(Game *game, const QString &error); void runningGamesChanged(); void daemonAvailableChanged(); private Q_SLOTS: void onDaemonSessionAdded(const QVariantMap &session); void onDaemonSessionChanged(const QVariantMap &session); void onDaemonSessionRemoved(const QString &sessionId, const QVariantMap &finalState); void onDaemonLaunchFailed(const QVariantMap &error); private: QHash m_daemonGameToSession; QHash m_daemonSessionToGame; bool m_daemonAvailable = false; void checkDaemonAvailability(); void syncDaemonSessions(); void applyRunningStateToLibrary(); };