diff --git a/app/vpn/dragonrelaybackend.h b/app/vpn/dragonrelaybackend.h index afe4013..1666d19 100644 --- a/app/vpn/dragonrelaybackend.h +++ b/app/vpn/dragonrelaybackend.h @@ -3,7 +3,7 @@ // // DragonRelayBackend is the QObject that QML binds to via the context property // "dragonRelay". It owns a RelayClient and a TunnelManager, coordinates the -// login → VPN provision → tunnel-up → host-discovery workflow, and exposes +// login -> VPN provision -> tunnel-up -> host-discovery workflow, and exposes // everything QML needs through Q_PROPERTY / Q_INVOKABLE. // // Registration in main.cpp (or wherever the QML engine is created): @@ -17,10 +17,12 @@ // dragonRelay.disconnectRelay() // dragonRelay.streamHost(ip, app) // dragonRelay.streamHost(ip, app, displayIndex) -// dragonRelay.status // int — DragonRelayBackend::Status enum +// dragonRelay.status // int - DragonRelayBackend::Status enum // dragonRelay.statusText // QString // dragonRelay.hosts // QVariantList of {name, ip, port, online, source} -// dragonRelay.tunnelIP // QString — local WG address (e.g. "10.99.0.2") +// dragonRelay.tunnelIP // QString - local WG address (e.g. "10.99.0.2") +// dragonRelay.lastURL // QString - most recently used relay URL (for form pre-fill) +// dragonRelay.lastUsername // QString - most recently used username #ifndef DRAGONRELAYBACKEND_H #define DRAGONRELAYBACKEND_H @@ -40,20 +42,21 @@ class DragonRelayBackend : public QObject { Q_OBJECT - // ── Properties exposed to QML ───────────────────────────────────────────── + // Properties exposed to QML - Q_PROPERTY(int status READ status NOTIFY statusChanged) - Q_PROPERTY(QString statusText READ statusText NOTIFY statusChanged) - Q_PROPERTY(QVariantList hosts READ hosts NOTIFY hostsChanged) - Q_PROPERTY(QString tunnelIP READ tunnelIP NOTIFY tunnelIPChanged) + Q_PROPERTY(int status READ status NOTIFY statusChanged) + Q_PROPERTY(QString statusText READ statusText NOTIFY statusChanged) + Q_PROPERTY(QVariantList hosts READ hosts NOTIFY hostsChanged) + Q_PROPERTY(QString tunnelIP READ tunnelIP NOTIFY tunnelIPChanged) + Q_PROPERTY(QString lastURL READ lastURL CONSTANT) + Q_PROPERTY(QString lastUsername READ lastUsername CONSTANT) public: - // Status codes (exposed to QML as dragonRelay.StatusXxx or raw int) enum Status { Disconnected = 0, - Connecting = 1, // logging in / provisioning VPN peer - TunnelUp = 2, // WireGuard tunnel active, hosts loading - Ready = 3, // tunnel up + at least one host visible + Connecting = 1, + TunnelUp = 2, + Ready = 3, Error = 4, }; Q_ENUM(Status) @@ -61,36 +64,29 @@ public: explicit DragonRelayBackend(QObject *parent = nullptr); ~DragonRelayBackend() override; - // ── Property accessors ──────────────────────────────────────────────────── - - int status() const { return m_status; } - QString statusText() const { return m_statusText; } - QVariantList hosts() const { return m_hosts; } - QString tunnelIP() const { return m_tunnelIP; } + int status() const { return m_status; } + QString statusText() const { return m_statusText; } + QVariantList hosts() const { return m_hosts; } + QString tunnelIP() const { return m_tunnelIP; } + QString lastURL() const { return m_savedURL; } + QString lastUsername() const { return m_savedUser; } public slots: - // ── Invokable from QML ──────────────────────────────────────────────────── - - // Begin the full connect workflow: login → provision VPN → start tunnel → poll hosts. - // Idempotent if already connected. Q_INVOKABLE void connectRelay(const QString &url, const QString &username, const QString &password); - // Tear down tunnel, unregister peer, return to Disconnected state. Q_INVOKABLE void disconnectRelay(); - // Ask Moonlight to stream to a host discovered via the relay. - // displayIndex specifies which display to stream (0 = primary, 1+ = secondary displays). - Q_INVOKABLE void streamHost(const QString &ip, const QString &app = QStringLiteral("Desktop"), int displayIndex = 0); + // displayIndex: 0 = primary, 1+ = secondary displays. + Q_INVOKABLE void streamHost(const QString &ip, + const QString &app = QStringLiteral("Desktop"), + int displayIndex = 0); - // Get displays for a host by its IP. Q_INVOKABLE QVariantList displaysForHost(const QString &hostIP) const; - // Stream a specific display from a host. Q_INVOKABLE void streamHostDisplay(const QString &hostIP, int displayIndex); - // Refresh the host list immediately (called by QML pull-to-refresh). Q_INVOKABLE void refreshHosts(); signals: @@ -134,7 +130,7 @@ private: QMap m_hostDisplays; - QSettings m_settings; // persists last-used URL + username + QSettings m_settings; }; #endif // DRAGONRELAYBACKEND_H