diff --git a/app/gui/mainwindow.cpp b/app/gui/mainwindow.cpp index 93716d3f..a4cb20de 100644 --- a/app/gui/mainwindow.cpp +++ b/app/gui/mainwindow.cpp @@ -4,20 +4,23 @@ #include "http/identitymanager.h" #include "http/nvpairingmanager.h" #include "http/nvhttp.h" +#include "streaming/streaming.h" +#include "http/computermanager.h" +#include "http/boxartmanager.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), - ui(new Ui::MainWindow) + ui(new Ui::MainWindow), + m_BoxArtManager(this), + m_ComputerManager(this) { ui->setupUi(this); - -// sample code for an iconized button performing an action -// will be useful to implement the game grid UI later -// myButton = new QPushButton(this); -// myButton->setIcon(QIcon(":/res/icon128.png")); -// myButton->setIconSize(QSize(128, 128)); -// myButton->resize(QSize(128, 128)); -// connect(myButton, &QAbstractButton::clicked, this, &MainWindow::on_actionExit_triggered); + connect(&m_BoxArtManager, SIGNAL(boxArtLoadComplete(NvComputer*,NvApp,QImage)), + this, SLOT(boxArtLoadComplete(NvComputer*,NvApp,QImage))); + connect(&m_ComputerManager, SIGNAL(computerStateChanged(NvComputer*)), + this, SLOT(computerStateChanged(NvComputer*))); + m_ComputerManager.startPolling(); + qDebug() << "Cached computers: " << m_ComputerManager.getComputers().count(); } MainWindow::~MainWindow() @@ -25,20 +28,76 @@ MainWindow::~MainWindow() delete ui; } +void MainWindow::boxArtLoadComplete(NvComputer* computer, NvApp app, QImage image) +{ + qDebug() << "Loaded image"; +} + void MainWindow::on_actionExit_triggered() { exit(EXIT_SUCCESS); } +void MainWindow::computerStateChanged(NvComputer* computer) +{ + QReadLocker lock(&computer->lock); + + NvHTTP http(computer->activeAddress); + + if (computer->pairState == NvComputer::PS_NOT_PAIRED) { + NvPairingManager pm(computer->activeAddress); + QString pin = pm.generatePinString(); + pm.pair(http.getServerInfo(), pin); + } + else { + QImage im = m_BoxArtManager.loadBoxArt(computer, computer->appList[0]); + +#if 0 + STREAM_CONFIGURATION sc; + LiInitializeStreamConfiguration(&sc); + sc.width = 1280; + sc.height = 720; + sc.fps = 60; + sc.packetSize = 1024; + sc.bitrate = 10000; + sc.audioConfiguration = AUDIO_CONFIGURATION_51_SURROUND; + + QMessageBox* box = new QMessageBox(nullptr); + box->setAttribute(Qt::WA_DeleteOnClose); //makes sure the msgbox is deleted automatically when closed + box->setStandardButtons(QMessageBox::Cancel); + box->setText("Launching game..."); + box->open(); + + if (computer->currentGameId != 0) { + http.resumeApp(&sc); + } + else { + http.launchApp(999999, &sc, true, false, SdlGetAttachedGamepadMask()); + } + + SERVER_INFORMATION si; + QString serverInfo = http.getServerInfo(); + + QByteArray hostnameStr = computer->activeAddress.toLatin1(); + QByteArray siAppVersion = http.getXmlString(serverInfo, "appversion").toLatin1(); + QByteArray siGfeVersion = http.getXmlString(serverInfo, "GfeVersion").toLatin1(); + + si.address = hostnameStr.data(); + si.serverInfoAppVersion = siAppVersion.data(); + si.serverInfoGfeVersion = siGfeVersion.data(); + + StartConnection(&si, &sc, box); +#endif + } +} + void MainWindow::on_newHostBtn_clicked() { QString hostname = popupmanager::getHostnameDialog(this); if (!hostname.isEmpty()) { - - NvPairingManager pm(hostname); - - QString pin = pm.generatePinString(); - pm.pair(http.getServerInfo(), pin); + m_ComputerManager.addNewHost(hostname, false); + QThread::sleep(10); + m_ComputerManager.stopPollingAsync(); } } diff --git a/app/http/computermanager.cpp b/app/http/computermanager.cpp index 50057b3c..ecbbf7fb 100644 --- a/app/http/computermanager.cpp +++ b/app/http/computermanager.cpp @@ -189,6 +189,32 @@ void ComputerManager::startPolling() } } +QVector ComputerManager::getComputers() +{ + QReadLocker lock(&m_Lock); + + return QVector::fromList(m_KnownHosts.values()); +} + +void ComputerManager::deleteHost(NvComputer* computer) +{ + QWriteLocker lock(&m_Lock); + + QThread* pollingThread = m_PollThreads[computer->uuid]; + if (pollingThread != nullptr) { + pollingThread->requestInterruption(); + + // We must wait here because we're going to delete computer + // and we can't do that out from underneath the poller. + pollingThread->wait(); + } + + m_PollThreads.remove(computer->uuid); + m_KnownHosts.remove(computer->uuid); + + delete computer; +} + void ComputerManager::stopPollingAsync() { QWriteLocker lock(&m_Lock); diff --git a/app/http/computermanager.h b/app/http/computermanager.h index fe66ccb6..9acf07b5 100644 --- a/app/http/computermanager.h +++ b/app/http/computermanager.h @@ -222,6 +222,11 @@ public: bool addNewHost(QString address, bool mdns); + QVector getComputers(); + + // computer is deleted inside this call + void deleteHost(NvComputer* computer); + signals: void computerStateChanged(NvComputer* computer);