Display Registered Hosts in SettingsDialog

This commit is contained in:
Florian Märkl 2019-08-16 14:39:54 +02:00
parent d435a9d368
commit c993ca611e
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
12 changed files with 192 additions and 16 deletions

View file

@ -32,12 +32,23 @@ class HostMAC
public: public:
HostMAC() { memset(mac, 0, sizeof(mac)); } 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)); } explicit HostMAC(const uint8_t mac[6]) { memcpy(this->mac, mac, sizeof(this->mac)); }
const uint8_t *GetMAC() const { return mac; } const uint8_t *GetMAC() const { return mac; }
QString ToString() const { return QByteArray((const char *)mac, sizeof(mac)).toHex(); } 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 class RegisteredHost
{ {
@ -54,14 +65,18 @@ class RegisteredHost
public: public:
RegisteredHost(); RegisteredHost();
RegisteredHost(const RegisteredHost &o);
RegisteredHost(const ChiakiRegisteredHost &chiaki_host); RegisteredHost(const ChiakiRegisteredHost &chiaki_host);
const HostMAC &GetPS4MAC() const { return ps4_mac; }
const QString &GetPS4Nickname() const { return ps4_nickname; } const QString &GetPS4Nickname() const { return ps4_nickname; }
void SaveToSettings(QSettings *settings); void SaveToSettings(QSettings *settings) const;
static RegisteredHost LoadFromSettings(QSettings *settings); static RegisteredHost LoadFromSettings(QSettings *settings);
}; };
Q_DECLARE_METATYPE(RegisteredHost) Q_DECLARE_METATYPE(RegisteredHost)
Q_DECLARE_METATYPE(HostMAC)
#endif //CHIAKI_HOST_H #endif //CHIAKI_HOST_H

View file

@ -21,6 +21,7 @@
#include <QMainWindow> #include <QMainWindow>
#include "discoverymanager.h" #include "discoverymanager.h"
#include "host.h"
class DynamicGridWidget; class DynamicGridWidget;
class ServerItemWidget; class ServerItemWidget;
@ -31,6 +32,9 @@ struct DisplayServer
DiscoveryHost discovery_host; DiscoveryHost discovery_host;
bool discovered; bool discovered;
RegisteredHost registered_host;
bool registered;
QString GetHostAddr() const { return discovered ? discovery_host.host_addr : QString(); } QString GetHostAddr() const { return discovered ? discovery_host.host_addr : QString(); }
}; };

View file

@ -61,6 +61,8 @@ class RegistExecuteDialog: public QDialog
friend class RegistExecuteDialogPrivate; friend class RegistExecuteDialogPrivate;
private: private:
Settings *settings;
ChiakiLog log; ChiakiLog log;
ChiakiRegist regist; ChiakiRegist regist;
@ -75,7 +77,7 @@ class RegistExecuteDialog: public QDialog
void Failed(); void Failed();
public: public:
explicit RegistExecuteDialog(const ChiakiRegistInfo &regist_info, QWidget *parent = nullptr); explicit RegistExecuteDialog(Settings *settings, const ChiakiRegistInfo &regist_info, QWidget *parent = nullptr);
~RegistExecuteDialog(); ~RegistExecuteDialog();
}; };

View file

@ -18,18 +18,36 @@
#ifndef CHIAKI_SETTINGS_H #ifndef CHIAKI_SETTINGS_H
#define CHIAKI_SETTINGS_H #define CHIAKI_SETTINGS_H
#include "host.h"
#include <QSettings> #include <QSettings>
class Settings class Settings : public QObject
{ {
Q_OBJECT
private: private:
QSettings settings; QSettings settings;
QMap<HostMAC, RegisteredHost> registered_hosts;
void LoadRegisteredHosts();
void SaveRegisteredHosts();
public: public:
Settings(); explicit Settings(QObject *parent = nullptr);
bool GetDiscoveryEnabled() { return settings.value("settings/auto_discovery", true).toBool(); } bool GetDiscoveryEnabled() { return settings.value("settings/auto_discovery", true).toBool(); }
void SetDiscoveryEnabled(bool enabled) { settings.setValue("settings/auto_discovery", enabled); } 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 #endif // CHIAKI_SETTINGS_H

View file

@ -31,6 +31,12 @@ class SettingsDialog : public QDialog
Settings *settings; Settings *settings;
QListWidget *registered_hosts_list_widget; QListWidget *registered_hosts_list_widget;
QPushButton *delete_registered_host_button;
private slots:
void UpdateRegisteredHosts();
void UpdateRegisteredHostsButtons();
void DeleteRegisteredHost();
public: public:
SettingsDialog(Settings *settings, QWidget *parent = nullptr); SettingsDialog(Settings *settings, QWidget *parent = nullptr);

View file

@ -25,6 +25,19 @@ RegisteredHost::RegisteredHost()
memset(rp_key, 0, sizeof(rp_key)); 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) RegisteredHost::RegisteredHost(const ChiakiRegisteredHost &chiaki_host)
: ps4_mac(chiaki_host.ps4_mac) : 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)); 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_ssid", ap_ssid);
settings->setValue("ap_bssid", ap_bssid); settings->setValue("ap_bssid", ap_bssid);
settings->setValue("ap_key", ap_key); settings->setValue("ap_key", ap_key);
settings->setValue("ap_name", ap_name); settings->setValue("ap_name", ap_name);
settings->setValue("ps4_nickname", ps4_nickname); 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_regist_key", QByteArray(rp_regist_key, sizeof(rp_regist_key)));
settings->setValue("rp_key_type", rp_key_type); settings->setValue("rp_key_type", rp_key_type);
settings->setValue("rp_key", QByteArray((const char *)rp_key, sizeof(rp_key))); 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_key = settings->value("ap_key").toString();
r.ap_name = settings->value("ap_name").toString(); r.ap_name = settings->value("ap_name").toString();
r.ps4_nickname = settings->value("ps4_nickname").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(); auto rp_regist_key = settings->value("rp_regist_key").toByteArray();
if(rp_regist_key.size() == sizeof(r.rp_regist_key)) if(rp_regist_key.size() == sizeof(r.rp_regist_key))
memcpy(r.rp_regist_key, rp_regist_key.constData(), sizeof(r.rp_regist_key)); memcpy(r.rp_regist_key, rp_regist_key.constData(), sizeof(r.rp_regist_key));

View file

@ -40,6 +40,7 @@ int main(int argc, char *argv[])
{ {
qRegisterMetaType<DiscoveryHost>(); qRegisterMetaType<DiscoveryHost>();
qRegisterMetaType<RegisteredHost>(); qRegisterMetaType<RegisteredHost>();
qRegisterMetaType<HostMAC>();
qRegisterMetaType<ChiakiQuitReason>(); qRegisterMetaType<ChiakiQuitReason>();
qRegisterMetaType<ChiakiRegistEventType>(); qRegisterMetaType<ChiakiRegistEventType>();
qRegisterMetaType<ChiakiLogLevel>(); qRegisterMetaType<ChiakiLogLevel>();

View file

@ -81,6 +81,7 @@ MainWindow::MainWindow(Settings *settings, QWidget *parent)
resize(800, 600); resize(800, 600);
connect(&discovery_manager, &DiscoveryManager::HostsUpdated, this, &MainWindow::UpdateDisplayServers); connect(&discovery_manager, &DiscoveryManager::HostsUpdated, this, &MainWindow::UpdateDisplayServers);
connect(settings, &Settings::RegisteredHostsUpdated, this, &MainWindow::UpdateDisplayServers);
UpdateDisplayServers(); UpdateDisplayServers();
UpdateDiscoveryEnabled(); UpdateDiscoveryEnabled();
@ -142,6 +143,11 @@ void MainWindow::UpdateDisplayServers()
DisplayServer server; DisplayServer server;
server.discovered = true; server.discovered = true;
server.discovery_host = host; server.discovery_host = host;
server.registered = settings->GetRegisteredHostRegistered(host.GetHostMAC());
if(server.registered)
server.registered_host = settings->GetRegisteredHost(host.GetHostMAC());
display_servers.append(server); display_servers.append(server);
} }

View file

@ -16,6 +16,7 @@
*/ */
#include <registdialog.h> #include <registdialog.h>
#include <settings.h>
#include <QFormLayout> #include <QFormLayout>
#include <QLineEdit> #include <QLineEdit>
@ -24,6 +25,7 @@
#include <QPushButton> #include <QPushButton>
#include <QPlainTextEdit> #include <QPlainTextEdit>
#include <QScrollBar> #include <QScrollBar>
#include <QMessageBox>
Q_DECLARE_METATYPE(ChiakiLogLevel) Q_DECLARE_METATYPE(ChiakiLogLevel)
@ -87,19 +89,19 @@ void RegistDialog::accept()
info.host = host.data(); info.host = host.data();
info.pin = (uint32_t)pin_edit->text().toULong(); info.pin = (uint32_t)pin_edit->text().toULong();
RegistExecuteDialog execute_dialog(info, this); RegistExecuteDialog execute_dialog(settings, info, this);
int r = execute_dialog.exec(); int r = execute_dialog.exec();
// TODO: check r if(r == QDialog::Accepted)
//close(); close();
} }
static void RegistExecuteDialogLogCb(ChiakiLogLevel level, const char *msg, void *user); static void RegistExecuteDialogLogCb(ChiakiLogLevel level, const char *msg, void *user);
static void RegistExecuteDialogRegistCb(ChiakiRegistEvent *event, void *user); static void RegistExecuteDialogRegistCb(ChiakiRegistEvent *event, void *user);
RegistExecuteDialog::RegistExecuteDialog(const ChiakiRegistInfo &regist_info, QWidget *parent) RegistExecuteDialog::RegistExecuteDialog(Settings *settings, const ChiakiRegistInfo &regist_info, QWidget *parent)
: QDialog(parent) : QDialog(parent)
{ {
setWindowTitle(tr("Register Console")); this->settings = settings;
auto layout = new QVBoxLayout(this); auto layout = new QVBoxLayout(this);
setLayout(layout); setLayout(layout);
@ -117,6 +119,7 @@ RegistExecuteDialog::RegistExecuteDialog(const ChiakiRegistInfo &regist_info, QW
chiaki_log_init(&log, CHIAKI_LOG_ALL/* & ~CHIAKI_LOG_VERBOSE*/, RegistExecuteDialogLogCb, this); chiaki_log_init(&log, CHIAKI_LOG_ALL/* & ~CHIAKI_LOG_VERBOSE*/, RegistExecuteDialogLogCb, this);
chiaki_regist_start(&regist, &log, &regist_info, RegistExecuteDialogRegistCb, this); chiaki_regist_start(&regist, &log, &regist_info, RegistExecuteDialogRegistCb, this);
setWindowTitle(tr("Register Console"));
resize(600, 400); resize(600, 400);
} }
@ -144,7 +147,24 @@ void RegistExecuteDialog::Finished()
void RegistExecuteDialog::Success(RegisteredHost host) void RegistExecuteDialog::Success(RegisteredHost host)
{ {
CHIAKI_LOGI(&log, "Successfully registered %s", host.GetPS4Nickname().toLocal8Bit().constData()); 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() void RegistExecuteDialog::Failed()

View file

@ -74,7 +74,9 @@ void ServerItemWidget::Update(const DisplayServer &display_server)
display_server.discovery_host.host_name, display_server.discovery_host.host_name,
display_server.discovery_host.GetHostMAC().ToString(), display_server.discovery_host.GetHostMAC().ToString(),
display_server.discovery_host.host_addr)); 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 else
{ {

View file

@ -17,6 +17,50 @@
#include <settings.h> #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();
} }

View file

@ -16,12 +16,14 @@
*/ */
#include <settingsdialog.h> #include <settingsdialog.h>
#include <settings.h>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QListWidget> #include <QListWidget>
#include <QPushButton> #include <QPushButton>
#include <QGroupBox> #include <QGroupBox>
#include <QMessageBox>
SettingsDialog::SettingsDialog(Settings *settings, QWidget *parent) : QDialog(parent) 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); auto register_new_button = new QPushButton(tr("Register New"), this);
registered_hosts_buttons_layout->addWidget(register_new_button); registered_hosts_buttons_layout->addWidget(register_new_button);
auto delete_host_button = new QPushButton(tr("Delete"), this); delete_registered_host_button = new QPushButton(tr("Delete"), this);
registered_hosts_buttons_layout->addWidget(delete_host_button); registered_hosts_buttons_layout->addWidget(delete_registered_host_button);
connect(delete_registered_host_button, &QPushButton::clicked, this, &SettingsDialog::DeleteRegisteredHost);
registered_hosts_buttons_layout->addStretch(); registered_hosts_buttons_layout->addStretch();
auto button_box = new QDialogButtonBox(QDialogButtonBox::Close, this); auto button_box = new QDialogButtonBox(QDialogButtonBox::Close, this);
layout->addWidget(button_box); layout->addWidget(button_box);
connect(button_box, &QDialogButtonBox::rejected, this, &QDialog::reject); 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);
} }