#include "clientapp.h" #include #include "../connectwindow/connectwindow.h" #include "../toolbar/toolbar.h" #include "../net/serverconnection.h" ClientApp::ClientApp(int& argc, char** argv) : QApplication(argc, argv), _connectionMode(ConnectionMode::None), _examMode(false), _connection(nullptr), _isManagerPc(false) { /* some values */ setOrganizationName("openslx"); setOrganizationDomain("openslx.org"); setApplicationName("pvsclient"); setQuitOnLastWindowClosed(false); /* configuration */ QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope, "/opt/"); /* parse parameters and keep the unparsed ones */ _arguments = parseParameters(); /* set translator */ // System strings QTranslator *qtTranslator = new QTranslator(this); qtTranslator->load(QLocale::system(), "qt", "_", QLibraryInfo::location(QLibraryInfo::TranslationsPath)); installTranslator(qtTranslator); // App specific QTranslator *translator = new QTranslator(this); translator->load(QLocale::system(), ":", "l_"); installTranslator(translator); readIsManagerPc(); _connectWindow = new ConnectWindow(nullptr); connect(_connectWindow, SIGNAL(connected(ServerConnection*)), this, SLOT(connected(ServerConnection*))); if (_connectionMode == ConnectionMode::Auto) { _toolbar = new Toolbar(true); // auto connect client without session ID. } else if (_connectionMode == ConnectionMode::Session) { _toolbar = new Toolbar(_sessionName.toUtf8()); // connect client with given session ID. } else { _toolbar = new Toolbar(); // create normal client. } _toolbar->setVisible(!_examMode); } /* parse arguments and return a list with the unused arguments */ QStringList ClientApp::parseParameters() { QStringList rest; for (QString a : QApplication::arguments()) { if (a == "--exam-mode") { _examMode = true; } else if (a == "--auto") { _connectionMode = ConnectionMode::Auto; } else if (a.startsWith("--session=")) { _connectionMode = ConnectionMode::Session; _sessionName = a.mid(10); } else if (a.startsWith("--config=")) { _iniPath = a.mid(9); } else { rest << a; } } return rest; } QStringList ClientApp::arguments() { return _arguments; } QSharedPointer ClientApp::getSettings() { QSharedPointer set; if (_iniPath == "") { /* default location (system scope) */ set = QSharedPointer(new QSettings(QSettings::IniFormat, QSettings::SystemScope, "openslx/pvs2", "pvs2")); } else { /* use _iniPath to find ini file */ set = QSharedPointer(new QSettings(_iniPath, QSettings::IniFormat)); } set->setIniCodec("UTF-8"); return set; } /* returns true when the pc of this client is also eligible to be a manager */ void ClientApp::readIsManagerPc() { QList myRooms; auto conf = clientApp->getSettings(); QStringList roomNames = conf->value("rooms").toStringList(); /* go through all rooms and check if this client is a manager of the room. */ for (auto roomName : roomNames) { conf->beginGroup(roomName); const QString mgrIP = conf->value("mgrIP").toString(); foreach (const QHostAddress & address, QNetworkInterface::allAddresses()) { if (address.toString() == mgrIP) { _isManagerPc = true; return; } } conf->endGroup(); } } void ClientApp::connected(ServerConnection* connection) { _connection = connection; connect(connection, SIGNAL(disconnected(ServerConnection*)), this, SLOT(disconnected(ServerConnection*))); } void ClientApp::disconnected(ServerConnection* connection) { if (connection != nullptr) connection->blockSignals(true); if (_connection == connection) { _connection = nullptr; } }