mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-07-16 10:03:35 -07:00
Display Registered Hosts in SettingsDialog
This commit is contained in:
parent
d435a9d368
commit
c993ca611e
12 changed files with 192 additions and 16 deletions
|
@ -32,12 +32,23 @@ class HostMAC
|
|||
|
||||
public:
|
||||
HostMAC() { memset(mac, 0, sizeof(mac)); }
|
||||
HostMAC(const HostMAC &o) { memcpy(mac, o.GetMAC(), sizeof(mac)); }
|
||||
explicit HostMAC(const uint8_t mac[6]) { memcpy(this->mac, mac, sizeof(this->mac)); }
|
||||
const uint8_t *GetMAC() const { return mac; }
|
||||
QString ToString() const { return QByteArray((const char *)mac, sizeof(mac)).toHex(); }
|
||||
uint64_t GetValue() const
|
||||
{
|
||||
return ((uint64_t)mac[0] << 0x28)
|
||||
| ((uint64_t)mac[1] << 0x20)
|
||||
| ((uint64_t)mac[2] << 0x18)
|
||||
| ((uint64_t)mac[3] << 0x10)
|
||||
| ((uint64_t)mac[4] << 0x8)
|
||||
| mac[5];
|
||||
}
|
||||
};
|
||||
|
||||
static bool operator==(const HostMAC &a, const HostMAC &b) { return memcmp(a.GetMAC(), b.GetMAC(), 6) == 0; }
|
||||
static bool operator<(const HostMAC &a, const HostMAC &b) { return a.GetValue() < b.GetValue(); }
|
||||
|
||||
class RegisteredHost
|
||||
{
|
||||
|
@ -54,14 +65,18 @@ class RegisteredHost
|
|||
|
||||
public:
|
||||
RegisteredHost();
|
||||
RegisteredHost(const RegisteredHost &o);
|
||||
|
||||
RegisteredHost(const ChiakiRegisteredHost &chiaki_host);
|
||||
|
||||
const HostMAC &GetPS4MAC() const { return ps4_mac; }
|
||||
const QString &GetPS4Nickname() const { return ps4_nickname; }
|
||||
|
||||
void SaveToSettings(QSettings *settings);
|
||||
void SaveToSettings(QSettings *settings) const;
|
||||
static RegisteredHost LoadFromSettings(QSettings *settings);
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(RegisteredHost)
|
||||
Q_DECLARE_METATYPE(HostMAC)
|
||||
|
||||
#endif //CHIAKI_HOST_H
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <QMainWindow>
|
||||
|
||||
#include "discoverymanager.h"
|
||||
#include "host.h"
|
||||
|
||||
class DynamicGridWidget;
|
||||
class ServerItemWidget;
|
||||
|
@ -31,6 +32,9 @@ struct DisplayServer
|
|||
DiscoveryHost discovery_host;
|
||||
bool discovered;
|
||||
|
||||
RegisteredHost registered_host;
|
||||
bool registered;
|
||||
|
||||
QString GetHostAddr() const { return discovered ? discovery_host.host_addr : QString(); }
|
||||
};
|
||||
|
||||
|
|
|
@ -61,6 +61,8 @@ class RegistExecuteDialog: public QDialog
|
|||
friend class RegistExecuteDialogPrivate;
|
||||
|
||||
private:
|
||||
Settings *settings;
|
||||
|
||||
ChiakiLog log;
|
||||
ChiakiRegist regist;
|
||||
|
||||
|
@ -75,7 +77,7 @@ class RegistExecuteDialog: public QDialog
|
|||
void Failed();
|
||||
|
||||
public:
|
||||
explicit RegistExecuteDialog(const ChiakiRegistInfo ®ist_info, QWidget *parent = nullptr);
|
||||
explicit RegistExecuteDialog(Settings *settings, const ChiakiRegistInfo ®ist_info, QWidget *parent = nullptr);
|
||||
~RegistExecuteDialog();
|
||||
};
|
||||
|
||||
|
|
|
@ -18,18 +18,36 @@
|
|||
#ifndef CHIAKI_SETTINGS_H
|
||||
#define CHIAKI_SETTINGS_H
|
||||
|
||||
#include "host.h"
|
||||
|
||||
#include <QSettings>
|
||||
|
||||
class Settings
|
||||
class Settings : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private:
|
||||
QSettings settings;
|
||||
|
||||
QMap<HostMAC, RegisteredHost> registered_hosts;
|
||||
|
||||
void LoadRegisteredHosts();
|
||||
void SaveRegisteredHosts();
|
||||
|
||||
public:
|
||||
Settings();
|
||||
explicit Settings(QObject *parent = nullptr);
|
||||
|
||||
bool GetDiscoveryEnabled() { return settings.value("settings/auto_discovery", true).toBool(); }
|
||||
void SetDiscoveryEnabled(bool enabled) { settings.setValue("settings/auto_discovery", enabled); }
|
||||
|
||||
QList<RegisteredHost> GetRegisteredHosts() const { return registered_hosts.values(); }
|
||||
void AddRegisteredHost(const RegisteredHost &host);
|
||||
void RemoveRegisteredHost(const HostMAC &mac);
|
||||
bool GetRegisteredHostRegistered(const HostMAC &mac) const { return registered_hosts.contains(mac); }
|
||||
RegisteredHost GetRegisteredHost(const HostMAC &mac) const { return registered_hosts[mac]; }
|
||||
|
||||
signals:
|
||||
void RegisteredHostsUpdated();
|
||||
};
|
||||
|
||||
#endif // CHIAKI_SETTINGS_H
|
||||
|
|
|
@ -31,6 +31,12 @@ class SettingsDialog : public QDialog
|
|||
Settings *settings;
|
||||
|
||||
QListWidget *registered_hosts_list_widget;
|
||||
QPushButton *delete_registered_host_button;
|
||||
|
||||
private slots:
|
||||
void UpdateRegisteredHosts();
|
||||
void UpdateRegisteredHostsButtons();
|
||||
void DeleteRegisteredHost();
|
||||
|
||||
public:
|
||||
SettingsDialog(Settings *settings, QWidget *parent = nullptr);
|
||||
|
|
|
@ -25,6 +25,19 @@ RegisteredHost::RegisteredHost()
|
|||
memset(rp_key, 0, sizeof(rp_key));
|
||||
}
|
||||
|
||||
RegisteredHost::RegisteredHost(const RegisteredHost &o)
|
||||
: ap_ssid(o.ap_ssid),
|
||||
ap_bssid(o.ap_bssid),
|
||||
ap_key(o.ap_key),
|
||||
ap_name(o.ap_name),
|
||||
ps4_mac(o.ps4_mac),
|
||||
ps4_nickname(o.ps4_nickname),
|
||||
rp_key_type(o.rp_key_type)
|
||||
{
|
||||
memcpy(rp_regist_key, o.rp_regist_key, sizeof(rp_regist_key));
|
||||
memcpy(rp_key, o.rp_key, sizeof(rp_key));
|
||||
}
|
||||
|
||||
RegisteredHost::RegisteredHost(const ChiakiRegisteredHost &chiaki_host)
|
||||
: ps4_mac(chiaki_host.ps4_mac)
|
||||
{
|
||||
|
@ -38,13 +51,14 @@ RegisteredHost::RegisteredHost(const ChiakiRegisteredHost &chiaki_host)
|
|||
memcpy(rp_key, chiaki_host.rp_key, sizeof(rp_key));
|
||||
}
|
||||
|
||||
void RegisteredHost::SaveToSettings(QSettings *settings)
|
||||
void RegisteredHost::SaveToSettings(QSettings *settings) const
|
||||
{
|
||||
settings->setValue("ap_ssid", ap_ssid);
|
||||
settings->setValue("ap_bssid", ap_bssid);
|
||||
settings->setValue("ap_key", ap_key);
|
||||
settings->setValue("ap_name", ap_name);
|
||||
settings->setValue("ps4_nickname", ps4_nickname);
|
||||
settings->setValue("ps4_mac", QByteArray((const char *)ps4_mac.GetMAC(), 6));
|
||||
settings->setValue("rp_regist_key", QByteArray(rp_regist_key, sizeof(rp_regist_key)));
|
||||
settings->setValue("rp_key_type", rp_key_type);
|
||||
settings->setValue("rp_key", QByteArray((const char *)rp_key, sizeof(rp_key)));
|
||||
|
@ -58,6 +72,9 @@ RegisteredHost RegisteredHost::LoadFromSettings(QSettings *settings)
|
|||
r.ap_key = settings->value("ap_key").toString();
|
||||
r.ap_name = settings->value("ap_name").toString();
|
||||
r.ps4_nickname = settings->value("ps4_nickname").toString();
|
||||
auto ps4_mac = settings->value("ps4_mac").toByteArray();
|
||||
if(ps4_mac.size() == 6)
|
||||
r.ps4_mac = HostMAC((const uint8_t *)ps4_mac.constData());
|
||||
auto rp_regist_key = settings->value("rp_regist_key").toByteArray();
|
||||
if(rp_regist_key.size() == sizeof(r.rp_regist_key))
|
||||
memcpy(r.rp_regist_key, rp_regist_key.constData(), sizeof(r.rp_regist_key));
|
||||
|
|
|
@ -40,6 +40,7 @@ int main(int argc, char *argv[])
|
|||
{
|
||||
qRegisterMetaType<DiscoveryHost>();
|
||||
qRegisterMetaType<RegisteredHost>();
|
||||
qRegisterMetaType<HostMAC>();
|
||||
qRegisterMetaType<ChiakiQuitReason>();
|
||||
qRegisterMetaType<ChiakiRegistEventType>();
|
||||
qRegisterMetaType<ChiakiLogLevel>();
|
||||
|
|
|
@ -81,6 +81,7 @@ MainWindow::MainWindow(Settings *settings, QWidget *parent)
|
|||
resize(800, 600);
|
||||
|
||||
connect(&discovery_manager, &DiscoveryManager::HostsUpdated, this, &MainWindow::UpdateDisplayServers);
|
||||
connect(settings, &Settings::RegisteredHostsUpdated, this, &MainWindow::UpdateDisplayServers);
|
||||
|
||||
UpdateDisplayServers();
|
||||
UpdateDiscoveryEnabled();
|
||||
|
@ -142,6 +143,11 @@ void MainWindow::UpdateDisplayServers()
|
|||
DisplayServer server;
|
||||
server.discovered = true;
|
||||
server.discovery_host = host;
|
||||
|
||||
server.registered = settings->GetRegisteredHostRegistered(host.GetHostMAC());
|
||||
if(server.registered)
|
||||
server.registered_host = settings->GetRegisteredHost(host.GetHostMAC());
|
||||
|
||||
display_servers.append(server);
|
||||
}
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
*/
|
||||
|
||||
#include <registdialog.h>
|
||||
#include <settings.h>
|
||||
|
||||
#include <QFormLayout>
|
||||
#include <QLineEdit>
|
||||
|
@ -24,6 +25,7 @@
|
|||
#include <QPushButton>
|
||||
#include <QPlainTextEdit>
|
||||
#include <QScrollBar>
|
||||
#include <QMessageBox>
|
||||
|
||||
Q_DECLARE_METATYPE(ChiakiLogLevel)
|
||||
|
||||
|
@ -87,19 +89,19 @@ void RegistDialog::accept()
|
|||
info.host = host.data();
|
||||
info.pin = (uint32_t)pin_edit->text().toULong();
|
||||
|
||||
RegistExecuteDialog execute_dialog(info, this);
|
||||
RegistExecuteDialog execute_dialog(settings, info, this);
|
||||
int r = execute_dialog.exec();
|
||||
// TODO: check r
|
||||
//close();
|
||||
if(r == QDialog::Accepted)
|
||||
close();
|
||||
}
|
||||
|
||||
static void RegistExecuteDialogLogCb(ChiakiLogLevel level, const char *msg, void *user);
|
||||
static void RegistExecuteDialogRegistCb(ChiakiRegistEvent *event, void *user);
|
||||
|
||||
RegistExecuteDialog::RegistExecuteDialog(const ChiakiRegistInfo ®ist_info, QWidget *parent)
|
||||
RegistExecuteDialog::RegistExecuteDialog(Settings *settings, const ChiakiRegistInfo ®ist_info, QWidget *parent)
|
||||
: QDialog(parent)
|
||||
{
|
||||
setWindowTitle(tr("Register Console"));
|
||||
this->settings = settings;
|
||||
|
||||
auto layout = new QVBoxLayout(this);
|
||||
setLayout(layout);
|
||||
|
@ -117,6 +119,7 @@ RegistExecuteDialog::RegistExecuteDialog(const ChiakiRegistInfo ®ist_info, QW
|
|||
chiaki_log_init(&log, CHIAKI_LOG_ALL/* & ~CHIAKI_LOG_VERBOSE*/, RegistExecuteDialogLogCb, this);
|
||||
chiaki_regist_start(®ist, &log, ®ist_info, RegistExecuteDialogRegistCb, this);
|
||||
|
||||
setWindowTitle(tr("Register Console"));
|
||||
resize(600, 400);
|
||||
}
|
||||
|
||||
|
@ -144,7 +147,24 @@ void RegistExecuteDialog::Finished()
|
|||
void RegistExecuteDialog::Success(RegisteredHost host)
|
||||
{
|
||||
CHIAKI_LOGI(&log, "Successfully registered %s", host.GetPS4Nickname().toLocal8Bit().constData());
|
||||
Finished();
|
||||
|
||||
if(settings->GetRegisteredHostRegistered(host.GetPS4MAC()))
|
||||
{
|
||||
int r = QMessageBox::question(this,
|
||||
tr("Console already registered"),
|
||||
tr("The console with ID %1 has already been registered. Should the previous record be overwritten?").arg(host.GetPS4MAC().ToString()));
|
||||
if(r == QMessageBox::No)
|
||||
{
|
||||
accept();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
settings->AddRegisteredHost(host);
|
||||
|
||||
QMessageBox::information(this, tr("Console registered"), tr("The Console %1 with ID %2 has been successfully registered!").arg(host.GetPS4Nickname(), host.GetPS4MAC().ToString()));
|
||||
|
||||
accept();
|
||||
}
|
||||
|
||||
void RegistExecuteDialog::Failed()
|
||||
|
|
|
@ -74,7 +74,9 @@ void ServerItemWidget::Update(const DisplayServer &display_server)
|
|||
display_server.discovery_host.host_name,
|
||||
display_server.discovery_host.GetHostMAC().ToString(),
|
||||
display_server.discovery_host.host_addr));
|
||||
bottom_label->setText(tr("State: %1").arg(chiaki_discovery_host_state_string(display_server.discovery_host.state)));
|
||||
bottom_label->setText(tr("State: %1\n%2").arg(
|
||||
chiaki_discovery_host_state_string(display_server.discovery_host.state),
|
||||
display_server.registered ? tr("registered") : tr("unregistered")));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -17,6 +17,50 @@
|
|||
|
||||
#include <settings.h>
|
||||
|
||||
Settings::Settings()
|
||||
Settings::Settings(QObject *parent) : QObject(parent)
|
||||
{
|
||||
LoadRegisteredHosts();
|
||||
}
|
||||
|
||||
void Settings::LoadRegisteredHosts()
|
||||
{
|
||||
registered_hosts.clear();
|
||||
|
||||
int count = settings.beginReadArray("registered_hosts");
|
||||
for(int i=0; i<count; i++)
|
||||
{
|
||||
settings.setArrayIndex(i);
|
||||
RegisteredHost host = RegisteredHost::LoadFromSettings(&settings);
|
||||
registered_hosts[host.GetPS4MAC()] = host;
|
||||
}
|
||||
settings.endArray();
|
||||
}
|
||||
|
||||
void Settings::SaveRegisteredHosts()
|
||||
{
|
||||
settings.beginWriteArray("registered_hosts");
|
||||
int i=0;
|
||||
for(const auto &host : registered_hosts)
|
||||
{
|
||||
settings.setArrayIndex(i);
|
||||
host.SaveToSettings(&settings);
|
||||
i++;
|
||||
}
|
||||
settings.endArray();
|
||||
}
|
||||
|
||||
void Settings::AddRegisteredHost(const RegisteredHost &host)
|
||||
{
|
||||
registered_hosts[host.GetPS4MAC()] = host;
|
||||
SaveRegisteredHosts();
|
||||
emit RegisteredHostsUpdated();
|
||||
}
|
||||
|
||||
void Settings::RemoveRegisteredHost(const HostMAC &mac)
|
||||
{
|
||||
if(!registered_hosts.contains(mac))
|
||||
return;
|
||||
registered_hosts.remove(mac);
|
||||
SaveRegisteredHosts();
|
||||
emit RegisteredHostsUpdated();
|
||||
}
|
||||
|
|
|
@ -16,12 +16,14 @@
|
|||
*/
|
||||
|
||||
#include <settingsdialog.h>
|
||||
#include <settings.h>
|
||||
|
||||
#include <QVBoxLayout>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QListWidget>
|
||||
#include <QPushButton>
|
||||
#include <QGroupBox>
|
||||
#include <QMessageBox>
|
||||
|
||||
SettingsDialog::SettingsDialog(Settings *settings, QWidget *parent) : QDialog(parent)
|
||||
{
|
||||
|
@ -45,12 +47,51 @@ SettingsDialog::SettingsDialog(Settings *settings, QWidget *parent) : QDialog(pa
|
|||
auto register_new_button = new QPushButton(tr("Register New"), this);
|
||||
registered_hosts_buttons_layout->addWidget(register_new_button);
|
||||
|
||||
auto delete_host_button = new QPushButton(tr("Delete"), this);
|
||||
registered_hosts_buttons_layout->addWidget(delete_host_button);
|
||||
delete_registered_host_button = new QPushButton(tr("Delete"), this);
|
||||
registered_hosts_buttons_layout->addWidget(delete_registered_host_button);
|
||||
connect(delete_registered_host_button, &QPushButton::clicked, this, &SettingsDialog::DeleteRegisteredHost);
|
||||
|
||||
registered_hosts_buttons_layout->addStretch();
|
||||
|
||||
auto button_box = new QDialogButtonBox(QDialogButtonBox::Close, this);
|
||||
layout->addWidget(button_box);
|
||||
connect(button_box, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||||
|
||||
UpdateRegisteredHosts();
|
||||
UpdateRegisteredHostsButtons();
|
||||
|
||||
connect(settings, &Settings::RegisteredHostsUpdated, this, &SettingsDialog::UpdateRegisteredHosts);
|
||||
connect(registered_hosts_list_widget, &QListWidget::itemSelectionChanged, this, &SettingsDialog::UpdateRegisteredHostsButtons);
|
||||
}
|
||||
|
||||
void SettingsDialog::UpdateRegisteredHosts()
|
||||
{
|
||||
registered_hosts_list_widget->clear();
|
||||
auto hosts = settings->GetRegisteredHosts();
|
||||
for(const auto &host : hosts)
|
||||
{
|
||||
auto item = new QListWidgetItem(QString("%1 (%2)").arg(host.GetPS4MAC().ToString(), host.GetPS4Nickname()));
|
||||
item->setData(Qt::UserRole, QVariant::fromValue(host.GetPS4MAC()));
|
||||
registered_hosts_list_widget->addItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
void SettingsDialog::UpdateRegisteredHostsButtons()
|
||||
{
|
||||
delete_registered_host_button->setEnabled(registered_hosts_list_widget->currentIndex().isValid());
|
||||
}
|
||||
|
||||
void SettingsDialog::DeleteRegisteredHost()
|
||||
{
|
||||
auto item = registered_hosts_list_widget->currentItem();
|
||||
if(!item)
|
||||
return;
|
||||
auto mac = item->data(Qt::UserRole).value<HostMAC>();
|
||||
|
||||
int r = QMessageBox::question(this, tr("Delete registered Console"),
|
||||
tr("Are you sure you want to delete the registered console with ID %1?").arg(mac.ToString()));
|
||||
if(r != QMessageBox::Yes)
|
||||
return;
|
||||
|
||||
settings->RemoveRegisteredHost(mac);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue