diff --git a/.gitignore b/.gitignore index eefcdf9..88c83df 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,5 @@ # Qt Creator User Project Files /*.pro.user* +/src/helpmessagesender/HelpMessageSender.pro.user* *.eccba64 diff --git a/src/helpmessagesender/helpmessagewindow.cpp b/src/helpmessagesender/helpmessagewindow.cpp index fc11fa4..ffa80cb 100644 --- a/src/helpmessagesender/helpmessagewindow.cpp +++ b/src/helpmessagesender/helpmessagewindow.cpp @@ -1,107 +1,171 @@ +/* + * Copyright 2014-2020 Markus Prasser + * + * This file is part of Labcontrol. + * + * Labcontrol is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Labcontrol is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Labcontrol. If not, see . + */ + #include "helpmessagewindow.h" +#include "ui_helpmessagewindow.h" + +#include +#include +#include +#include #include -lcHelpMessageWindow::lcHelpMessageWindow( const QString &argServerIP, const unsigned short int &argServerPort, QWidget *argParent ) : - QMainWindow{ argParent }, - helpMessageSocket { new QTcpSocket{ this } }, - serverPort{ argServerPort }, - serverAddress{ argServerIP }, - ui{ new Ui::HelpMessageWindow } -{ - ui->setupUi( this ); - connect( ui->PBAskForHelp, &QPushButton::clicked, this, &lcHelpMessageWindow::RequestHelp ); - connect( helpMessageSocket, &QTcpSocket::readyRead, this, &lcHelpMessageWindow::ReadHelpReply ); - connect( helpMessageSocket, SIGNAL( error( QAbstractSocket::SocketError ) ), - this, SLOT( DisplayError( QAbstractSocket::SocketError ) ) ); - - QNetworkConfigurationManager manager; - if ( manager.capabilities() & QNetworkConfigurationManager::NetworkSessionRequired ) { - // Get saved network configuration - QSettings settings{ QSettings::UserScope, QLatin1String{ "QtProject" } }; - settings.beginGroup( QLatin1String{ "QtNetwork" } ); - const QString id = settings.value( QLatin1String{ "DefaultNetworkConfiguration" } ).toString(); - settings.endGroup(); - - // If the saved network configuration is not currently discovered use the system default - QNetworkConfiguration config = manager.configurationFromIdentifier( id ); - if ( ( config.state() & QNetworkConfiguration::Discovered ) != QNetworkConfiguration::Discovered ) { - config = manager.defaultConfiguration(); - } - - networkSession = new QNetworkSession{ config, this }; - connect( networkSession, &QNetworkSession::opened, this, &lcHelpMessageWindow::OpenedSession ); - - networkSession->open(); +lc::HelpMessageWindow::HelpMessageWindow(const QString &argServerIP, + const uint16_t argServerPort, + QWidget *argParent) + : QMainWindow{argParent}, helpMessageSocket{new QTcpSocket{this}}, + + serverAddress{argServerIP}, + serverPort{argServerPort}, ui{new Ui::HelpMessageWindow} { + ui->setupUi(this); + + connect(ui->PBAskForHelp, &QPushButton::clicked, this, + &lc::HelpMessageWindow::RequestHelp); + connect(helpMessageSocket, &QTcpSocket::readyRead, this, + &lc::HelpMessageWindow::ReadHelpReply); + connect(helpMessageSocket, + static_cast( + &QAbstractSocket::error), + this, &HelpMessageWindow::DisplayError); + + QNetworkConfigurationManager manager; + if (manager.capabilities() & + QNetworkConfigurationManager::NetworkSessionRequired) { + // Get saved network configuration + QSettings settings{QSettings::UserScope, QLatin1String{"QtProject"}}; + settings.beginGroup(QLatin1String{"QtNetwork"}); + const QString id = + settings.value(QLatin1String{"DefaultNetworkConfiguration"}).toString(); + settings.endGroup(); + + // If the saved network configuration is not currently discovered use the + // system default + QNetworkConfiguration config = manager.configurationFromIdentifier(id); + if ((config.state() & QNetworkConfiguration::Discovered) != + QNetworkConfiguration::Discovered) { + config = manager.defaultConfiguration(); } -} -lcHelpMessageWindow::~lcHelpMessageWindow() { - delete ui; -} + networkSession = new QNetworkSession{config, this}; + connect(networkSession, &QNetworkSession::opened, this, + &lc::HelpMessageWindow::OpenedSession); -void lcHelpMessageWindow::DisplayError( QAbstractSocket::SocketError socketError ) { - QString errorMessage; - switch ( socketError ) { - case QAbstractSocket::RemoteHostClosedError: - return; - case QAbstractSocket::HostNotFoundError: - errorMessage = tr( "An error occurred: The server could not be found for error reporting:\n" ); - break; - case QAbstractSocket::ConnectionRefusedError: - errorMessage = tr( "An error occurred: The connection was refused by the laboratory server:\n" ); - break; - default: - errorMessage = tr( "The following error occured:\n" ); - } - errorMessage.append( tr("%1").arg( helpMessageSocket->errorString() ) ); - errorMessage.append( "\n\nPlease raise your hand to notify the experimenters." ); - ui->LSendingSuccess->setText( errorMessage ); + networkSession->open(); + } } -void lcHelpMessageWindow::OpenedSession() { - // Save the used configuration - QNetworkConfiguration config = networkSession->configuration(); - QString id; - if ( config.type() == QNetworkConfiguration::UserChoice ) - id = networkSession->sessionProperty( QLatin1String{ "UserChoiceConfiguration" } ).toString(); - else - id = config.identifier(); - - QSettings settings{ QSettings::UserScope, QLatin1String{ "QtProject" } }; - settings.beginGroup( QLatin1String{ "QtNetwork" } ); - settings.setValue( QLatin1String{ "DefaultNetworkConfiguration" }, id ); - settings.endGroup(); +/*! + * \brief Destroy the HelpMessageWindow instance + */ +lc::HelpMessageWindow::~HelpMessageWindow() { delete ui; } + +/*! + * \brief Display an error message to the user if requesting help failed + * + * \param socketError The error that occurred upon requesting help + */ +void lc::HelpMessageWindow::DisplayError( + const QAbstractSocket::SocketError socketError) { + QString errorMessage; + + switch (socketError) { + case QAbstractSocket::RemoteHostClosedError: + return; + case QAbstractSocket::HostNotFoundError: + errorMessage = tr("An error occurred: The server could not be found for " + "error reporting:\n"); + break; + case QAbstractSocket::ConnectionRefusedError: + errorMessage = tr("An error occurred: The connection was refused by the " + "laboratory server:\n"); + break; + default: + errorMessage = tr("The following error occured:\n"); + } + errorMessage.append(tr("%1").arg(helpMessageSocket->errorString())); + errorMessage.append( + "\n\nPlease raise your hand to notify the experimenters."); + + ui->LSendingSuccess->setText(errorMessage); } -void lcHelpMessageWindow::ReadHelpReply() { - QDataStream in( helpMessageSocket ); - in.setVersion( QDataStream::Qt_5_2 ); - - if ( blockSize == 0 ) { - if ( helpMessageSocket->bytesAvailable() < ( int )sizeof( quint16 ) ) - return; - - in >> blockSize; - } +/*! + * \brief Handle the opening of a new QNetworkSession session + */ +void lc::HelpMessageWindow::OpenedSession() { + // Save the used configuration + QNetworkConfiguration config = networkSession->configuration(); + QString id; + if (config.type() == QNetworkConfiguration::UserChoice) + id = networkSession + ->sessionProperty(QLatin1String{"UserChoiceConfiguration"}) + .toString(); + else + id = config.identifier(); + + QSettings settings{QSettings::UserScope, QLatin1String{"QtProject"}}; + settings.beginGroup(QLatin1String{"QtNetwork"}); + settings.setValue(QLatin1String{"DefaultNetworkConfiguration"}, id); + settings.endGroup(); +} - if ( helpMessageSocket->bytesAvailable() < blockSize ) { - return; +/*! + * \brief Read help request reply from laboratory server and notify user + */ +void lc::HelpMessageWindow::ReadHelpReply() { + QDataStream in{helpMessageSocket}; + in.setVersion(QDataStream::Qt_5_2); + + if (blockSize == 0) { + if (helpMessageSocket->bytesAvailable() < + static_cast(sizeof(quint16))) { + return; } - QString serverAnswer; - in >> serverAnswer; - - if ( serverAnswer == "Help demand retrieved." ) { - ui->LSendingSuccess->setText( tr( "Help message successfully sent.\nPlease wait for the experimenter to show up at your booth." ) ); - ui->PBAskForHelp->setEnabled( false ); - } else { - ui->LSendingSuccess->setText( tr( "An error occurred sending the help message. Please raise your arm.\n\n'%1'" ).arg( serverAnswer ) ); - } + in >> blockSize; + } + + if (helpMessageSocket->bytesAvailable() < blockSize) { + return; + } + + QString serverAnswer; + in >> serverAnswer; + + if (serverAnswer == "Help demand retrieved.") { + ui->LSendingSuccess->setText( + tr("Help message successfully sent.\nPlease wait for the experimenter " + "to show up at your booth.")); + ui->PBAskForHelp->setEnabled(false); + } else { + ui->LSendingSuccess->setText(tr("An error occurred sending the help " + "message. Please raise your arm.\n\n'%1'") + .arg(serverAnswer)); + } } -void lcHelpMessageWindow::RequestHelp() { - blockSize = 0; - helpMessageSocket->abort(); - helpMessageSocket->connectToHost( serverAddress, serverPort ); +/*! + * \brief Request help from the laboratory server just by connecting to it + */ +void lc::HelpMessageWindow::RequestHelp() { + blockSize = 0; + helpMessageSocket->abort(); + helpMessageSocket->connectToHost(serverAddress, serverPort); } diff --git a/src/helpmessagesender/helpmessagewindow.h b/src/helpmessagesender/helpmessagewindow.h index 41cdc9d..cd0172a 100644 --- a/src/helpmessagesender/helpmessagewindow.h +++ b/src/helpmessagesender/helpmessagewindow.h @@ -1,37 +1,60 @@ +/* + * Copyright 2014-2020 Markus Prasser + * + * This file is part of Labcontrol. + * + * Labcontrol is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Labcontrol is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Labcontrol. If not, see . + */ + #ifndef HELPMESSAGEWINDOW_H #define HELPMESSAGEWINDOW_H -#include "ui_helpmessagewindow.h" - +#include #include -#include -#include + +class QNetworkSession; +class QTcpSocket; namespace Ui { class HelpMessageWindow; -} +} // namespace Ui -class lcHelpMessageWindow : public QMainWindow -{ - Q_OBJECT +namespace lc { + +class HelpMessageWindow : public QMainWindow { + Q_OBJECT public: - explicit lcHelpMessageWindow( const QString &argServerIP, const unsigned short int &argServerPort, QWidget *argParent = nullptr ); - ~lcHelpMessageWindow(); + explicit HelpMessageWindow(const QString &argServerIP, uint16_t argServerPort, + QWidget *argParent = nullptr); + ~HelpMessageWindow() override; private: - quint16 blockSize = 0; - QTcpSocket *helpMessageSocket = nullptr; - QNetworkSession *networkSession = nullptr; - const quint16 serverPort = 0; - const QHostAddress serverAddress; - Ui::HelpMessageWindow *ui; + quint16 blockSize = 0; + QTcpSocket *const helpMessageSocket = nullptr; + QNetworkSession *networkSession = nullptr; + const QString serverAddress; + const quint16 serverPort = 0; + Ui::HelpMessageWindow *const ui = nullptr; private slots: - void RequestHelp(); - void ReadHelpReply(); - void DisplayError( QAbstractSocket::SocketError socketError ); - void OpenedSession(); + void DisplayError(QAbstractSocket::SocketError socketError); + void OpenedSession(); + void ReadHelpReply(); + void RequestHelp(); }; +} // namespace lc + #endif // HELPMESSAGEWINDOW_H diff --git a/src/helpmessagesender/helpmessagewindow.ui b/src/helpmessagesender/helpmessagewindow.ui index 734ec84..52384c0 100644 --- a/src/helpmessagesender/helpmessagewindow.ui +++ b/src/helpmessagesender/helpmessagewindow.ui @@ -2,14 +2,6 @@ HelpMessageWindow - - - 0 - 0 - 512 - 192 - - 512 @@ -58,15 +50,15 @@ PBQuit clicked() HelpMessageWindow - deleteLater() + close() 191 105 - 191 - 63 + 255 + 95 diff --git a/src/helpmessagesender/main.cpp b/src/helpmessagesender/main.cpp index a0991dd..791241e 100644 --- a/src/helpmessagesender/main.cpp +++ b/src/helpmessagesender/main.cpp @@ -1,12 +1,49 @@ +/* + * Copyright 2014-2020 Markus Prasser + * + * This file is part of Labcontrol. + * + * Labcontrol is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Labcontrol is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Labcontrol. If not, see . + */ + #include "helpmessagewindow.h" + #include +#include +#include + +int main(int argc, char *argv[]) { + QApplication a{argc, argv}; + QSettings labSettings{"Labcontrol", "Labclient"}; + + const auto serverIP{labSettings.value("server_ip").toString()}; + if (serverIP.isEmpty()) { + qDebug() << "Invalid laboratory server ip \"" + serverIP + "\" given"; + return 1; + } + + const auto serverPortStr{labSettings.value("server_port").toString()}; + bool convSuccess = false; + const auto serverPort = serverPortStr.toUInt(&convSuccess); + if ((false == convSuccess) || ((serverPort < 1) || (serverPort > 65535))) { + qDebug() << "Invalid laboratory server port \"" + serverPortStr + + "\" given"; + return 2; + } -int main( int argc, char *argv[] ) -{ - QApplication a( argc, argv ); - QSettings labSettings{ "Economic Laboratory", "Labcontrol" }; - lcHelpMessageWindow w{ labSettings.value( "server_ip", "127.0.0.1" ).toString(), labSettings.value( "client_help_server_port", "0" ).toUInt() }; - w.show(); + lc::HelpMessageWindow w{serverIP, static_cast(serverPort)}; + w.show(); - return a.exec(); + return a.exec(); }