a-la-karte/src/gamelauncher.h
Marco Allegretti fa9c86415f Launcher: use Game Center daemon
Route game launching and running-state tracking through the\nGame Center DBus daemon. This removes the in-process QProcess-based\ntracking in favor of daemon sessions and adds availability checks.
2026-02-06 14:02:24 +01:00

55 lines
1.6 KiB
C++

// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2024 A-La-Karte Contributors
#pragma once
#include <QHash>
#include <QObject>
#include <QQmlEngine>
#include <QVariantMap>
#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<QString, QString> m_daemonGameToSession;
QHash<QString, QString> m_daemonSessionToGame;
bool m_daemonAvailable = false;
void checkDaemonAvailability();
void syncDaemonSessions();
void applyRunningStateToLibrary();
};