moonlight-qt/app/backend/computermanager.h

109 lines
2.6 KiB
C
Raw Normal View History

2018-06-24 22:13:37 +00:00
#pragma once
#include "nvcomputer.h"
2018-07-06 06:12:55 +00:00
#include "nvpairingmanager.h"
2018-06-24 22:13:37 +00:00
2018-07-01 06:07:31 +00:00
#include <qmdnsengine/server.h>
#include <qmdnsengine/cache.h>
#include <qmdnsengine/browser.h>
#include <qmdnsengine/service.h>
#include <qmdnsengine/resolver.h>
2018-06-27 04:47:01 +00:00
#include <QThread>
#include <QReadWriteLock>
#include <QSettings>
2018-07-06 06:12:55 +00:00
#include <QRunnable>
2018-06-24 22:13:37 +00:00
2018-07-01 06:07:31 +00:00
class MdnsPendingComputer : public QObject
{
Q_OBJECT
public:
explicit MdnsPendingComputer(QMdnsEngine::Server* server,
QMdnsEngine::Cache* cache,
const QMdnsEngine::Service& service)
: m_Hostname(service.hostname()),
m_Resolver(server, m_Hostname, cache)
{
connect(&m_Resolver, SIGNAL(resolved(QHostAddress)),
this, SLOT(handleResolved(QHostAddress)));
}
QString hostname()
{
return m_Hostname;
}
private slots:
void handleResolved(const QHostAddress& address)
{
if (address.protocol() == QAbstractSocket::IPv4Protocol) {
m_Resolver.disconnect();
emit resolvedv4(this, address);
}
}
signals:
void resolvedv4(MdnsPendingComputer*, const QHostAddress&);
private:
QByteArray m_Hostname;
QMdnsEngine::Resolver m_Resolver;
};
2018-06-27 04:47:01 +00:00
class ComputerManager : public QObject
{
Q_OBJECT
2018-07-06 06:12:55 +00:00
friend class DeferredHostDeletionTask;
2018-07-06 07:34:16 +00:00
friend class PendingAddTask;
2018-07-06 06:12:55 +00:00
2018-06-27 04:47:01 +00:00
public:
2018-06-28 02:55:44 +00:00
explicit ComputerManager(QObject *parent = nullptr);
2018-06-27 04:47:01 +00:00
virtual ~ComputerManager();
Q_INVOKABLE void startPolling();
2018-06-27 04:47:01 +00:00
Q_INVOKABLE void stopPollingAsync();
2018-06-27 04:47:01 +00:00
2018-07-06 07:34:16 +00:00
Q_INVOKABLE void addNewHost(QString address, bool mdns);
2018-06-27 04:47:01 +00:00
2018-07-06 06:12:55 +00:00
void pairHost(NvComputer* computer, QString pin);
void quitRunningApp(NvComputer* computer);
QVector<NvComputer*> getComputers();
// computer is deleted inside this call
void deleteHost(NvComputer* computer);
2018-06-27 04:47:01 +00:00
signals:
void computerStateChanged(NvComputer* computer);
2018-07-06 06:12:55 +00:00
void pairingCompleted(NvComputer* computer, QString error);
2018-07-06 07:34:16 +00:00
void computerAddCompleted(QVariant success);
2018-08-02 05:32:21 +00:00
void quitAppCompleted(QVariant error);
2018-06-27 04:47:01 +00:00
private slots:
void handleComputerStateChanged(NvComputer* computer);
2018-07-01 06:07:31 +00:00
void handleMdnsServiceResolved(MdnsPendingComputer* computer, const QHostAddress& address);
2018-06-27 04:47:01 +00:00
private:
void saveHosts();
2018-06-27 04:47:01 +00:00
void startPollingComputer(NvComputer* computer);
int m_PollingRef;
2018-06-27 04:47:01 +00:00
QReadWriteLock m_Lock;
QMap<QString, NvComputer*> m_KnownHosts;
QMap<QString, QThread*> m_PollThreads;
2018-07-01 06:07:31 +00:00
QMdnsEngine::Server m_MdnsServer;
QMdnsEngine::Browser* m_MdnsBrowser;
QMdnsEngine::Cache m_MdnsCache;
QVector<MdnsPendingComputer*> m_PendingResolution;
2018-06-24 22:13:37 +00:00
};