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:
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

View file

@ -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(); }
};

View file

@ -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 &regist_info, QWidget *parent = nullptr);
explicit RegistExecuteDialog(Settings *settings, const ChiakiRegistInfo &regist_info, QWidget *parent = nullptr);
~RegistExecuteDialog();
};

View file

@ -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

View file

@ -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);

View file

@ -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));

View file

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

View file

@ -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);
}

View file

@ -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 &regist_info, QWidget *parent)
RegistExecuteDialog::RegistExecuteDialog(Settings *settings, const ChiakiRegistInfo &regist_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 &regist_info, QW
chiaki_log_init(&log, CHIAKI_LOG_ALL/* & ~CHIAKI_LOG_VERBOSE*/, RegistExecuteDialogLogCb, this);
chiaki_regist_start(&regist, &log, &regist_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()

View file

@ -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
{

View file

@ -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();
}

View file

@ -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);
}