From c993ca611e6f73725bb5baf8dc872fc6ea3c8425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Fri, 16 Aug 2019 14:39:54 +0200 Subject: [PATCH] Display Registered Hosts in SettingsDialog --- gui/include/host.h | 19 +++++++++++++-- gui/include/mainwindow.h | 4 ++++ gui/include/registdialog.h | 4 +++- gui/include/settings.h | 22 +++++++++++++++-- gui/include/settingsdialog.h | 6 +++++ gui/src/host.cpp | 19 ++++++++++++++- gui/src/main.cpp | 1 + gui/src/mainwindow.cpp | 6 +++++ gui/src/registdialog.cpp | 32 ++++++++++++++++++++----- gui/src/serveritemwidget.cpp | 4 +++- gui/src/settings.cpp | 46 +++++++++++++++++++++++++++++++++++- gui/src/settingsdialog.cpp | 45 +++++++++++++++++++++++++++++++++-- 12 files changed, 192 insertions(+), 16 deletions(-) diff --git a/gui/include/host.h b/gui/include/host.h index 7ad9900..c69a67c 100644 --- a/gui/include/host.h +++ b/gui/include/host.h @@ -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 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 diff --git a/gui/include/mainwindow.h b/gui/include/mainwindow.h index 110a8a6..c4455bd 100644 --- a/gui/include/mainwindow.h +++ b/gui/include/mainwindow.h @@ -21,6 +21,7 @@ #include #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(); } }; diff --git a/gui/include/registdialog.h b/gui/include/registdialog.h index 3f10235..4666993 100644 --- a/gui/include/registdialog.h +++ b/gui/include/registdialog.h @@ -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(); }; diff --git a/gui/include/settings.h b/gui/include/settings.h index bc68fb1..f8c1d7f 100644 --- a/gui/include/settings.h +++ b/gui/include/settings.h @@ -18,18 +18,36 @@ #ifndef CHIAKI_SETTINGS_H #define CHIAKI_SETTINGS_H +#include "host.h" + #include -class Settings +class Settings : public QObject { + Q_OBJECT + private: QSettings settings; + QMap 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 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 diff --git a/gui/include/settingsdialog.h b/gui/include/settingsdialog.h index 7f2d255..09eb150 100644 --- a/gui/include/settingsdialog.h +++ b/gui/include/settingsdialog.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); diff --git a/gui/src/host.cpp b/gui/src/host.cpp index 894f67c..2ccb029 100644 --- a/gui/src/host.cpp +++ b/gui/src/host.cpp @@ -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)); diff --git a/gui/src/main.cpp b/gui/src/main.cpp index acbaef1..dd5fd83 100644 --- a/gui/src/main.cpp +++ b/gui/src/main.cpp @@ -40,6 +40,7 @@ int main(int argc, char *argv[]) { qRegisterMetaType(); qRegisterMetaType(); + qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); diff --git a/gui/src/mainwindow.cpp b/gui/src/mainwindow.cpp index 55caa1d..7387289 100644 --- a/gui/src/mainwindow.cpp +++ b/gui/src/mainwindow.cpp @@ -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); } diff --git a/gui/src/registdialog.cpp b/gui/src/registdialog.cpp index f1d23be..c352e0a 100644 --- a/gui/src/registdialog.cpp +++ b/gui/src/registdialog.cpp @@ -16,6 +16,7 @@ */ #include +#include #include #include @@ -24,6 +25,7 @@ #include #include #include +#include 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() diff --git a/gui/src/serveritemwidget.cpp b/gui/src/serveritemwidget.cpp index 9b8d8a6..8935486 100644 --- a/gui/src/serveritemwidget.cpp +++ b/gui/src/serveritemwidget.cpp @@ -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 { diff --git a/gui/src/settings.cpp b/gui/src/settings.cpp index 527abb5..7bb443d 100644 --- a/gui/src/settings.cpp +++ b/gui/src/settings.cpp @@ -17,6 +17,50 @@ #include -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 +#include #include #include #include #include #include +#include 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(); + + 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); } \ No newline at end of file