mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-27 08:10:27 -06:00
Backport LAN (#2131)
backport the old LAN feature to the modern melonDS codebase.
This commit is contained in:
181
src/frontend/qt_sdl/NetplayDialog.cpp
Normal file
181
src/frontend/qt_sdl/NetplayDialog.cpp
Normal file
@ -0,0 +1,181 @@
|
||||
/*
|
||||
Copyright 2016-2024 melonDS team
|
||||
|
||||
This file is part of melonDS.
|
||||
|
||||
melonDS is free software: you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation, either version 3 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
melonDS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with melonDS. If not, see http://www.gnu.org/licenses/.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <queue>
|
||||
|
||||
#include <enet/enet.h>
|
||||
|
||||
#include <QStandardItemModel>
|
||||
#include <QProcess>
|
||||
|
||||
#include "NDS.h"
|
||||
#include "NDSCart.h"
|
||||
#include "main.h"
|
||||
//#include "IPC.h"
|
||||
#include "NetplayDialog.h"
|
||||
//#include "Input.h"
|
||||
//#include "ROMManager.h"
|
||||
#include "Config.h"
|
||||
#include "Savestate.h"
|
||||
#include "Platform.h"
|
||||
|
||||
#include "ui_NetplayStartHostDialog.h"
|
||||
#include "ui_NetplayStartClientDialog.h"
|
||||
#include "ui_NetplayDialog.h"
|
||||
|
||||
using namespace melonDS;
|
||||
|
||||
|
||||
extern EmuThread* emuThread;
|
||||
NetplayDialog* netplayDlg;
|
||||
|
||||
|
||||
NetplayStartHostDialog::NetplayStartHostDialog(QWidget* parent) : QDialog(parent), ui(new Ui::NetplayStartHostDialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
|
||||
ui->txtPort->setText("8064");
|
||||
}
|
||||
|
||||
NetplayStartHostDialog::~NetplayStartHostDialog()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void NetplayStartHostDialog::done(int r)
|
||||
{
|
||||
if (r == QDialog::Accepted)
|
||||
{
|
||||
std::string player = ui->txtPlayerName->text().toStdString();
|
||||
int port = ui->txtPort->text().toInt();
|
||||
|
||||
// TODO validate input!!
|
||||
|
||||
netplayDlg = NetplayDialog::openDlg(parentWidget());
|
||||
|
||||
Netplay::StartHost(player.c_str(), port);
|
||||
}
|
||||
|
||||
QDialog::done(r);
|
||||
}
|
||||
|
||||
|
||||
NetplayStartClientDialog::NetplayStartClientDialog(QWidget* parent) : QDialog(parent), ui(new Ui::NetplayStartClientDialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
|
||||
ui->txtPort->setText("8064");
|
||||
}
|
||||
|
||||
NetplayStartClientDialog::~NetplayStartClientDialog()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void NetplayStartClientDialog::done(int r)
|
||||
{
|
||||
if (r == QDialog::Accepted)
|
||||
{
|
||||
std::string player = ui->txtPlayerName->text().toStdString();
|
||||
std::string host = ui->txtIPAddress->text().toStdString();
|
||||
int port = ui->txtPort->text().toInt();
|
||||
|
||||
// TODO validate input!!
|
||||
|
||||
netplayDlg = NetplayDialog::openDlg(parentWidget());
|
||||
|
||||
Netplay::StartClient(player.c_str(), host.c_str(), port);
|
||||
}
|
||||
|
||||
QDialog::done(r);
|
||||
}
|
||||
|
||||
|
||||
NetplayDialog::NetplayDialog(QWidget* parent) : QDialog(parent), ui(new Ui::NetplayDialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
|
||||
QStandardItemModel* model = new QStandardItemModel();
|
||||
ui->tvPlayerList->setModel(model);
|
||||
|
||||
connect(this, &NetplayDialog::sgUpdatePlayerList, this, &NetplayDialog::doUpdatePlayerList);
|
||||
}
|
||||
|
||||
NetplayDialog::~NetplayDialog()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void NetplayDialog::done(int r)
|
||||
{
|
||||
// ???
|
||||
|
||||
QDialog::done(r);
|
||||
}
|
||||
|
||||
void NetplayDialog::updatePlayerList(Netplay::Player* players, int num)
|
||||
{
|
||||
emit sgUpdatePlayerList(players, num);
|
||||
}
|
||||
|
||||
void NetplayDialog::doUpdatePlayerList(Netplay::Player* players, int num)
|
||||
{
|
||||
QStandardItemModel* model = (QStandardItemModel*)ui->tvPlayerList->model();
|
||||
|
||||
model->clear();
|
||||
model->setRowCount(num);
|
||||
|
||||
// TODO: remove IP column in final product
|
||||
|
||||
const QStringList header = {"#", "Player", "Status", "Ping", "IP"};
|
||||
model->setHorizontalHeaderLabels(header);
|
||||
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
Netplay::Player* player = &players[i];
|
||||
|
||||
QString id = QString("%0").arg(player->ID+1);
|
||||
model->setItem(i, 0, new QStandardItem(id));
|
||||
|
||||
QString name = player->Name;
|
||||
model->setItem(i, 1, new QStandardItem(name));
|
||||
|
||||
QString status;
|
||||
switch (player->Status)
|
||||
{
|
||||
case 1: status = ""; break;
|
||||
case 2: status = "Host"; break;
|
||||
default: status = "ded"; break;
|
||||
}
|
||||
model->setItem(i, 2, new QStandardItem(status));
|
||||
|
||||
// TODO: ping
|
||||
model->setItem(i, 3, new QStandardItem("x"));
|
||||
|
||||
char ip[32];
|
||||
u32 addr = player->Address;
|
||||
sprintf(ip, "%d.%d.%d.%d", addr&0xFF, (addr>>8)&0xFF, (addr>>16)&0xFF, addr>>24);
|
||||
model->setItem(i, 4, new QStandardItem(ip));
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user