Add RegistExecuteDialog

This commit is contained in:
Florian Märkl 2019-08-15 14:37:05 +02:00
commit 2a20ac4246
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
7 changed files with 211 additions and 23 deletions

View file

@ -30,6 +30,8 @@ struct DisplayServer
{
DiscoveryHost discovery_host;
bool discovered;
QString GetHostAddr() const { return discovered ? discovery_host.host_addr : QString(); }
};
class MainWindow : public QMainWindow

View file

@ -25,6 +25,8 @@
class Settings;
class QLineEdit;
class QPlainTextEdit;
class QDialogButtonBox;
class RegistDialog : public QDialog
{
@ -33,16 +35,48 @@ class RegistDialog : public QDialog
private:
Settings *settings;
ChiakiRegist regist;
bool regist_active;
QLineEdit *host_edit;
QLineEdit *psn_id_edit;
QLineEdit *pin_edit;
QDialogButtonBox *button_box;
QPushButton *register_button;
private slots:
void ValidateInput();
public:
explicit RegistDialog(Settings *settings, QWidget *parent = nullptr);
explicit RegistDialog(Settings *settings, QString host = QString(), QWidget *parent = nullptr);
~RegistDialog();
public slots:
void accept() override;
};
class RegistExecuteDialog: public QDialog
{
Q_OBJECT
friend class RegistExecuteDialogPrivate;
private:
ChiakiLog log;
ChiakiRegist regist;
QPlainTextEdit *log_edit;
QDialogButtonBox *button_box;
void Finished();
private slots:
void Log(ChiakiLogLevel level, QString msg);
void Success();
void Failed();
public:
explicit RegistExecuteDialog(const ChiakiRegistInfo &regist_info, QWidget *parent = nullptr);
~RegistExecuteDialog();
};
Q_DECLARE_METATYPE(ChiakiRegistEventType)
#endif // CHIAKI_REGISTDIALOG_H

View file

@ -4,10 +4,12 @@
#include <mainwindow.h>
#include <streamsession.h>
#include <settings.h>
#include <registdialog.h>
#include <chiaki-cli.h>
#include <chiaki/session.h>
#include <chiaki/regist.h>
#include <chiaki/base64.h>
#include <stdio.h>
@ -19,6 +21,8 @@
#include <QCommandLineParser>
#include <QMap>
Q_DECLARE_METATYPE(ChiakiLogLevel)
struct CLICommand
{
int (*cmd)(ChiakiLog *log, int argc, char *argv[]);
@ -35,6 +39,8 @@ int main(int argc, char *argv[])
{
qRegisterMetaType<DiscoveryHost>();
qRegisterMetaType<ChiakiQuitReason>();
qRegisterMetaType<ChiakiRegistEventType>();
qRegisterMetaType<ChiakiLogLevel>();
QApplication::setOrganizationName("Chiaki");
QApplication::setApplicationName("Chiaki");

View file

@ -54,7 +54,7 @@ MainWindow::MainWindow(Settings *settings, QWidget *parent)
auto regist_action = new QAction(tr("Register"), this);
tool_bar->addAction(regist_action);
connect(regist_action, &QAction::triggered, this, [this]() {
RegistDialog dialog(this->settings, this);
RegistDialog dialog(this->settings, QString(), this);
dialog.exec();
});
@ -108,8 +108,15 @@ void MainWindow::ServerItemWidgetTriggered()
auto server_item_widget = qobject_cast<ServerItemWidget *>(sender());
if(!server_item_widget)
return;
int index = server_item_widgets.indexOf(server_item_widget);
if(index < 0 || index >= display_servers.count())
return;
const auto &server = display_servers[index];
// TODO: connect
// TODO: check if already registered and connect
RegistDialog regist_dialog(settings, server.GetHostAddr(), this);
regist_dialog.exec();
}
void MainWindow::UpdateDiscoveryEnabled()

View file

@ -20,31 +20,169 @@
#include <QFormLayout>
#include <QLineEdit>
#include <QRegularExpressionValidator>
#include <QDialogButtonBox>
#include <QPushButton>
#include <QPlainTextEdit>
#include <QScrollBar>
static const QRegularExpression pin_re("[0-9][0-9][0-9][0-9][0-9][0-9]");
Q_DECLARE_METATYPE(ChiakiLogLevel)
RegistDialog::RegistDialog(Settings *settings, QWidget *parent)
#define PIN_LENGTH 8
static const QRegularExpression pin_re(QString("[0-9]").repeated(PIN_LENGTH));
RegistDialog::RegistDialog(Settings *settings, QString host, QWidget *parent)
: QDialog(parent),
settings(settings)
{
regist_active = false;
setWindowTitle(tr("Register Console"));
auto layout = new QFormLayout(this);
auto layout = new QVBoxLayout(this);
setLayout(layout);
auto form_layout = new QFormLayout();
layout->addLayout(form_layout);
host_edit = new QLineEdit(this);
layout->addRow(tr("Host:"), host_edit);
form_layout->addRow(tr("Host:"), host_edit);
host_edit->setText(host);
psn_id_edit = new QLineEdit(this);
layout->addRow(tr("PSN ID (username):"), psn_id_edit);
form_layout->addRow(tr("PSN ID (username):"), psn_id_edit);
pin_edit = new QLineEdit(this);
pin_edit->setValidator(new QRegularExpressionValidator(pin_re, pin_edit));
layout->addRow(tr("PIN:"), pin_edit);
form_layout->addRow(tr("PIN:"), pin_edit);
button_box = new QDialogButtonBox(QDialogButtonBox::Cancel, this);
register_button = button_box->addButton(tr("Register"), QDialogButtonBox::AcceptRole);
layout->addWidget(button_box);
connect(button_box, &QDialogButtonBox::accepted, this, &QDialog::accept);
connect(button_box, &QDialogButtonBox::rejected, this, &QDialog::reject);
connect(host_edit, &QLineEdit::textChanged, this, &RegistDialog::ValidateInput);
connect(psn_id_edit, &QLineEdit::textChanged, this, &RegistDialog::ValidateInput);
connect(pin_edit, &QLineEdit::textChanged, this, &RegistDialog::ValidateInput);
ValidateInput();
}
RegistDialog::~RegistDialog()
{
if(regist_active)
}
void RegistDialog::ValidateInput()
{
bool valid = !host_edit->text().trimmed().isEmpty()
&& !psn_id_edit->text().trimmed().isEmpty()
&& pin_edit->text().length() == PIN_LENGTH;
register_button->setEnabled(valid);
}
void RegistDialog::accept()
{
ChiakiRegistInfo info = {};
QByteArray psn_id = psn_id_edit->text().toUtf8();
QByteArray host = host_edit->text().toUtf8();
info.psn_id = psn_id.data();
info.host = host.data();
info.pin = (uint32_t)pin_edit->text().toULong();
RegistExecuteDialog execute_dialog(info, this);
int r = execute_dialog.exec();
// TODO: check r
//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)
: QDialog(parent)
{
setWindowTitle(tr("Register Console"));
auto layout = new QVBoxLayout(this);
setLayout(layout);
log_edit = new QPlainTextEdit(this);
log_edit->setReadOnly(true);
log_edit->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
layout->addWidget(log_edit);
button_box = new QDialogButtonBox(QDialogButtonBox::Cancel, this);
layout->addWidget(button_box);
connect(button_box, &QDialogButtonBox::rejected, this, &QDialog::reject);
chiaki_log_init(&log, CHIAKI_LOG_ALL & ~CHIAKI_LOG_VERBOSE, RegistExecuteDialogLogCb, this);
chiaki_regist_start(&regist, &log, &regist_info, RegistExecuteDialogRegistCb, this);
resize(600, 400);
}
RegistExecuteDialog::~RegistExecuteDialog()
{
chiaki_regist_stop(&regist);
chiaki_regist_fini(&regist);
}
void RegistExecuteDialog::Log(ChiakiLogLevel level, QString msg)
{
log_edit->appendPlainText(QString("[%1] %2").arg(chiaki_log_level_char(level)).arg(msg));
log_edit->verticalScrollBar()->setValue(log_edit->verticalScrollBar()->maximum());
}
void RegistExecuteDialog::Finished()
{
auto cancel_button = button_box->button(QDialogButtonBox::Cancel);
if(!cancel_button)
return;
button_box->removeButton(cancel_button);
button_box->addButton(QDialogButtonBox::Close);
}
void RegistExecuteDialog::Success()
{
printf("finished\n");
Finished();
}
void RegistExecuteDialog::Failed()
{
Finished();
}
class RegistExecuteDialogPrivate
{
public:
static void Log(RegistExecuteDialog *dialog, ChiakiLogLevel level, QString msg)
{ QMetaObject::invokeMethod(dialog, "Log", Qt::ConnectionType::QueuedConnection, Q_ARG(ChiakiLogLevel, level), Q_ARG(QString, msg)); }
static void RegistEvent(RegistExecuteDialog *dialog, ChiakiRegistEvent *event)
{
switch(event->type)
{
case CHIAKI_REGIST_EVENT_TYPE_FINISHED_SUCCESS:
QMetaObject::invokeMethod(dialog, "Success", Qt::ConnectionType::QueuedConnection);
break;
case CHIAKI_REGIST_EVENT_TYPE_FINISHED_FAILED:
QMetaObject::invokeMethod(dialog, "Failed", Qt::ConnectionType::QueuedConnection);
break;
default:
break;
}
}
};
static void RegistExecuteDialogLogCb(ChiakiLogLevel level, const char *msg, void *user)
{
chiaki_log_cb_print(level, msg, nullptr);
auto dialog = reinterpret_cast<RegistExecuteDialog *>(user);
RegistExecuteDialogPrivate::Log(dialog, level, msg);
}
static void RegistExecuteDialogRegistCb(ChiakiRegistEvent *event, void *user)
{
auto dialog = reinterpret_cast<RegistExecuteDialog *>(user);
RegistExecuteDialogPrivate::RegistEvent(dialog, event);
}

View file

@ -58,7 +58,7 @@ typedef struct chiaki_regist_t
ChiakiStopPipe stop_pipe;
} ChiakiRegist;
CHIAKI_EXPORT ChiakiErrorCode chiaki_regist_start(ChiakiRegist *regist, ChiakiLog *log, ChiakiRegistInfo *info, ChiakiRegistCb cb, void *cb_user);
CHIAKI_EXPORT ChiakiErrorCode chiaki_regist_start(ChiakiRegist *regist, ChiakiLog *log, const ChiakiRegistInfo *info, ChiakiRegistCb cb, void *cb_user);
CHIAKI_EXPORT void chiaki_regist_fini(ChiakiRegist *regist);
CHIAKI_EXPORT void chiaki_regist_stop(ChiakiRegist *regist);

View file

@ -32,7 +32,7 @@
static void *regist_thread_func(void *user);
static int regist_connect(ChiakiRegist *regist);
CHIAKI_EXPORT ChiakiErrorCode chiaki_regist_start(ChiakiRegist *regist, ChiakiLog *log, ChiakiRegistInfo *info, ChiakiRegistCb cb, void *cb_user)
CHIAKI_EXPORT ChiakiErrorCode chiaki_regist_start(ChiakiRegist *regist, ChiakiLog *log, const ChiakiRegistInfo *info, ChiakiRegistCb cb, void *cb_user)
{
regist->log = log;
regist->info = *info;
@ -138,17 +138,19 @@ static void *regist_thread_func(void *user)
goto fail;
}
CHIAKI_LOGI(regist->log, "Regist connected to %s", regist->info.host);
int s = send(sock, request_header, request_header_size, 0);
if(s < 0)
{
CHIAKI_LOGE(regist->log, "Regist failed to send request header");
CHIAKI_LOGE(regist->log, "Regist failed to send request header: %s", strerror(errno));
goto fail_socket;
}
s = send(s, payload, payload_size, 0);
s = send(sock, payload, payload_size, 0);
if(s < 0)
{
CHIAKI_LOGE(regist->log, "Regist failed to send payload");
CHIAKI_LOGE(regist->log, "Regist failed to send payload: %s", strerror(errno));
goto fail_socket;
}
@ -158,7 +160,7 @@ rerecv:
received = recv(sock, recv_buf, sizeof(recv_buf) - 1, 0);
if(received < 0)
CHIAKI_LOGE(regist->log, "Failed");
else
else if(received > 0)
{
chiaki_log_hexdump(regist->log, CHIAKI_LOG_DEBUG, (uint8_t *)recv_buf, received);
goto rerecv;
@ -183,7 +185,6 @@ static int regist_connect(ChiakiRegist *regist)
if(r != 0)
{
CHIAKI_LOGE(regist->log, "Regist failed to getaddrinfo on %s", regist->info.host);
regist_event_simple(regist, CHIAKI_REGIST_EVENT_TYPE_FINISHED_FAILED);
return -1;
}