diff --git a/src/Lib/lablib.cpp b/src/Lib/lablib.cpp old mode 100755 new mode 100644 index 78fa67a..c4a2d54 --- a/src/Lib/lablib.cpp +++ b/src/Lib/lablib.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2014-2016 Markus Prasser + * Copyright 2014-2018 Markus Prasser, Tobias Weiss * * This file is part of Labcontrol. * @@ -24,39 +24,41 @@ #include "lablib.h" -lc::Lablib::Lablib( QObject *argParent ) : - QObject{ argParent }, - labSettings{ "Labcontrol", "Labcontrol", this }, - sessionsModel{ new SessionsModel{ this } } +lc::Lablib::Lablib(QObject *argParent) : + QObject{argParent}, + labSettings{"Labcontrol", "Labcontrol", this}, + sessionsModel{new SessionsModel{this}} { - for ( const auto &s : settings->GetClients() ) { - connect( this, &Lablib::ZLEAF_RUNNING, - s, &Client::SetStateToZLEAF_RUNNING ); + for (const auto &s : settings->GetClients()) { + connect(this, &Lablib::ZLEAF_RUNNING, + s, &Client::SetStateToZLEAF_RUNNING); } DetectInstalledZTreeVersionsAndLaTeXHeaders(); // Initialize all 'netstat' query mechanisms - if ( !settings->netstatCmd.isEmpty() ) { - netstatAgent = new NetstatAgent{ settings->netstatCmd }; - netstatAgent->moveToThread( &netstatThread ); - connect( &netstatThread, &QThread::finished, netstatAgent, &QObject::deleteLater ); - connect( netstatAgent, &NetstatAgent::QueryFinished, - this, &Lablib::GotNetstatQueryResult ); + if (!settings->netstatCmd.isEmpty()) { + netstatAgent = new NetstatAgent{settings->netstatCmd}; + netstatAgent->moveToThread(&netstatThread); + connect(&netstatThread, &QThread::finished, netstatAgent, &QObject::deleteLater); + connect(netstatAgent, &NetstatAgent::QueryFinished, + this, &Lablib::GotNetstatQueryResult); netstatThread.start(); - netstatTimer = new QTimer{ this }; - connect( netstatTimer, &QTimer::timeout, - netstatAgent, &NetstatAgent::QueryClientConnections ); - netstatTimer->start( 500 ); + netstatTimer = new QTimer{this}; + connect(netstatTimer, &QTimer::timeout, + netstatAgent, &NetstatAgent::QueryClientConnections); + netstatTimer->start(500); } // Initialize the server for client help requests retrieval - if ( settings->clientHelpNotificationServerPort && !settings->serverIP.isEmpty() ) { - clientHelpNotificationServer = new ClientHelpNotificationServer{ this }; + if (settings->clientHelpNotificationServerPort + && !settings->serverIP.isEmpty()) { + clientHelpNotificationServer = new ClientHelpNotificationServer{this}; } } -lc::Lablib::~Lablib () { - if ( netstatTimer ) { +lc::Lablib::~Lablib () +{ + if (netstatTimer) { netstatTimer->stop(); delete netstatTimer; } @@ -64,122 +66,127 @@ lc::Lablib::~Lablib () { netstatThread.wait(); } -bool lc::Lablib::CheckIfUserIsAdmin() const { - for ( const auto &s : settings->adminUsers ) { - if ( s == settings->localUserName ) { - qDebug() << "User" << settings->localUserName << "has administrative rights."; +bool lc::Lablib::CheckIfUserIsAdmin() const +{ + for (const auto &s : settings->adminUsers) { + if (s == settings->localUserName) { + qDebug() << "User" << settings->localUserName + << "has administrative rights."; return true; } } return false; } -void lc::Lablib::DetectInstalledZTreeVersionsAndLaTeXHeaders() { +void lc::Lablib::DetectInstalledZTreeVersionsAndLaTeXHeaders() +{ } -void lc::Lablib::GotNetstatQueryResult( QStringList *argActiveZLeafConnections ) { - if ( argActiveZLeafConnections != nullptr ) { - for ( auto s: *argActiveZLeafConnections ) { +void lc::Lablib::GotNetstatQueryResult(QStringList *argActiveZLeafConnections) +{ + if (argActiveZLeafConnections != nullptr) { + for (auto s : *argActiveZLeafConnections) { // Set all given clients' statuses to 'ZLEAF_RUNNING' emit ZLEAF_RUNNING( s ); } - } - else + } else qDebug() << "Netstat status query failed."; delete argActiveZLeafConnections; } -void lc::Lablib::ShowOrsee() { +void lc::Lablib::ShowOrsee() +{ QProcess showOrseeProcess; - QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); - showOrseeProcess.setProcessEnvironment( env ); - QString program{ settings->browserCmd }; - QStringList arguments{ QStringList{} << settings->orseeUrl }; - showOrseeProcess.startDetached( program, arguments ); + showOrseeProcess.setProcessEnvironment(QProcessEnvironment::systemEnvironment()); + QString program{settings->browserCmd}; + const QStringList arguments{settings->orseeUrl}; + showOrseeProcess.startDetached(program, arguments); // Output message via the debug messages tab - qDebug() << program << arguments.join( " " ); + qDebug() << program << arguments.join(" "); } -void lc::Lablib::ShowPreprints() { +void lc::Lablib::ShowPreprints() +{ // Start the process QProcess showPreprintsProcess; - QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); - showPreprintsProcess.setProcessEnvironment( env ); - QString program{ settings->fileMngr }; - QStringList arguments{ QStringList{} << settings->lcDataDir + "/preprints" }; - showPreprintsProcess.startDetached( program, arguments ); + showPreprintsProcess.setProcessEnvironment(QProcessEnvironment::systemEnvironment()); + const QString program{settings->fileMngr}; + const QStringList arguments{settings->lcDataDir + "/preprints"}; + showPreprintsProcess.startDetached(program, arguments); // Output message via the debug messages tab - qDebug() << program << arguments.join( " " ); + qDebug() << program << arguments.join(" "); } -void lc::Lablib::StartNewSession( QVector< Client* > argAssocCl, - QString argParticipNameReplacement, - bool argPrintLocalReceipts, QString argReceiptsHeader, - QString argzTreeDataTargetPath, quint16 argzTreePort, - QString argzTreeVersion ) { - if ( !QDir( argzTreeDataTargetPath ).exists() ) { - QMessageBox messageBox{ QMessageBox::Critical, tr( "Data target path does not exist" ), - tr( "Your chosen data target path does not exist." - " Do you want it to be created automatically?" ), - QMessageBox::Yes | QMessageBox::No }; +void lc::Lablib::StartNewSession(QVector argAssocCl, + QString argParticipNameReplacement, + bool argPrintLocalReceipts, QString argReceiptsHeader, + QString argzTreeDataTargetPath, quint16 argzTreePort, + QString argzTreeVersion) +{ + if (!QDir(argzTreeDataTargetPath).exists()) { + QMessageBox messageBox{QMessageBox::Critical, tr("Data target path does not exist"), + tr("Your chosen data target path does not exist." + " Do you want it to be created automatically?"), + QMessageBox::Yes | QMessageBox::No}; messageBox.exec(); - if ( messageBox.clickedButton() == messageBox.button( QMessageBox::No ) ) { - QMessageBox messageBox{ QMessageBox::Critical, tr( "Data target directory will not" - " be created" ), - tr( "Your chosen data target directory does not exist and" - " will not be created. Please choose another one." ), - QMessageBox::Ok }; + if (messageBox.clickedButton() == messageBox.button(QMessageBox::No)) { + QMessageBox messageBox{QMessageBox::Critical, + tr("Data target directory will not be created"), + tr("Your chosen data target directory does not exist and" + " will not be created. Please choose another one."), + QMessageBox::Ok}; messageBox.exec(); return; } else { - if ( !QDir().mkpath( argzTreeDataTargetPath ) ) { - QMessageBox messageBox{ QMessageBox::Critical, tr( "Data target directory could" - " not be created" ), - tr( "Your chosen data target directory does not exist" - " and could not be created. Please choose another" - " one." ), QMessageBox::Ok }; + if (!QDir().mkpath(argzTreeDataTargetPath)) { + QMessageBox messageBox{QMessageBox::Critical, + tr("Data target directory could not be created"), + tr("Your chosen data target directory does not exist" + " and could not be created. Please choose another" + " one."), QMessageBox::Ok}; messageBox.exec(); return; } } } try { - sessionsModel->push_back( new Session{ std::move( argAssocCl ), - argzTreeDataTargetPath, - argzTreePort, argzTreeVersion, - argPrintLocalReceipts, - argParticipNameReplacement, - argReceiptsHeader } ); - occupiedPorts.append( sessionsModel->back()->zTreePort ); - } - catch ( Session::lcDataTargetPathCreationFailed ) { - QMessageBox::information( nullptr, tr( "Chosen data target path could not be created" ), - tr( "The path specified by your chosen data target path '%1'" - " could not be created. Please check if it is a valid" - " location and you have all needed permissions." ) - .arg( argzTreeDataTargetPath ) ); + sessionsModel->push_back(new Session{std::move(argAssocCl), + argzTreeDataTargetPath, + argzTreePort, argzTreeVersion, + argPrintLocalReceipts, + argParticipNameReplacement, + argReceiptsHeader}); + occupiedPorts.append(sessionsModel->back()->zTreePort); + } catch (Session::lcDataTargetPathCreationFailed) { + QMessageBox::information(nullptr, tr("Chosen data target path could not be created"), + tr("The path specified by your chosen data target path '%1'" + " could not be created. Please check if it is a valid" + " location and you have all needed permissions.") + .arg(argzTreeDataTargetPath)); } } -void lc::Lablib::SetLocalZLeafDefaultName( const QString &argName ) { - settings->SetLocalzLeafName( argName ); - labSettings.setValue( "local_zLeaf_name", argName ); +void lc::Lablib::SetLocalZLeafDefaultName(const QString &argName) +{ + settings->SetLocalzLeafName(argName); + labSettings.setValue("local_zLeaf_name", argName); } //Returns the commandline that is issued on the client when zleaf is started -QStringList lc::Lablib::getzLeafArgs( int sessionPort, QString zleafVersion ){ +QStringList lc::Lablib::getzLeafArgs(int sessionPort, QString zleafVersion) +{ QStringList arguments; - if ( sessionPort == 7000 ) { + if (sessionPort == 7000) { arguments << "DISPLAY=:0.0" << settings->tasksetCmd << "0x00000001" << settings->wineCmd - << QString{ settings->zTreeInstDir + "/zTree_" + zleafVersion + "/zleaf.exe" } + << QString{settings->zTreeInstDir + "/zTree_" + zleafVersion + "/zleaf.exe"} << "/server" << settings->serverIP; } else { arguments << "DISPLAY=:0.0" << settings->tasksetCmd << "0x00000001" << settings->wineCmd - << QString{ settings->zTreeInstDir + "/zTree_" + zleafVersion + "/zleaf.exe" } + << QString{settings->zTreeInstDir + "/zTree_" + zleafVersion + "/zleaf.exe"} << "/server" << settings->serverIP << "/channel" - << QString::number( sessionPort- 7000 ); + << QString::number(sessionPort - 7000); } //Return the crafted QStringList diff --git a/src/Lib/lablib.h b/src/Lib/lablib.h old mode 100755 new mode 100644 index 68764aa..d7530bf --- a/src/Lib/lablib.h +++ b/src/Lib/lablib.h @@ -1,5 +1,5 @@ /* - * Copyright 2014-2016 Markus Prasser + * Copyright 2014-2018 Markus Prasser, Tobias Weiss * * This file is part of Labcontrol. * @@ -45,7 +45,7 @@ #include "sessionsmodel.h" #include "settings.h" -extern std::unique_ptr< lc::Settings > settings; +extern std::unique_ptr settings; namespace lc { @@ -56,15 +56,16 @@ namespace lc { class Lablib : public QObject { Q_OBJECT + public: /*! * \brief Lablib's constructor * \param[in] argParent This 'lcLablib' instance's parent QObject */ - Lablib( QObject *argParent = nullptr ); + Lablib(QObject *argParent = nullptr); /** Lablib's destructor */ - ~Lablib(); + ~Lablib() override; /*! * \brief CheckIfUserIsAdmin checks if the account with the passed user name has administrative rights * \param argUserName The account name which shall checked for administrative rights @@ -75,40 +76,46 @@ public: * * @return A pointer to a QVector containing all occupied ports */ - const QVector< quint16 > &GetOccupiedPorts () const { return occupiedPorts; } + const QVector &GetOccupiedPorts () const + { + return occupiedPorts; + } /** Returns a pointer to the QAbstractTableModel storing the Session instances * * @return A pointer to the QAbstractTableModel storing the Session instances */ - SessionsModel *GetSessionsModel () const { return sessionsModel; } + SessionsModel *GetSessionsModel () const + { + return sessionsModel; + } //! Sets the default name of local zLeaf instances /** * @param argName The default name local zLeaf instances shall have */ - void SetLocalZLeafDefaultName( const QString &argName ); + void SetLocalZLeafDefaultName(const QString &argName); void ShowOrsee(); void ShowPreprints(); - void StartNewSession( QVector< Client* > argAssocCl, QString argParticipNameReplacement, - bool argPrintLocalReceipts, QString argReceiptsHeader, - QString argzTreeDataTargetPath, quint16 argzTreePort, - QString argzTreeVersion ); + void StartNewSession(QVector argAssocCl, QString argParticipNameReplacement, + bool argPrintLocalReceipts, QString argReceiptsHeader, + QString argzTreeDataTargetPath, quint16 argzTreePort, + QString argzTreeVersion); /*! * \brief Returns the commandline to issue on the client(s) in order to start zLeaf * @param sessionPort The port zLeaf shall connect to * @param zLeafVersion zLeaf Version to start */ - QStringList getzLeafArgs( int sessionPort, QString zleafVersion ); + QStringList getzLeafArgs(int sessionPort, QString zleafVersion); public slots: signals: - void ZLEAF_RUNNING( QString argClientIP ); + void ZLEAF_RUNNING(QString argClientIP); private slots: //! Gets the output from NetstatAgent - void GotNetstatQueryResult( QStringList *argActiveZLeafConnections ); + void GotNetstatQueryResult(QStringList *argActiveZLeafConnections); private: //! Detects installed zTree version and LaTeX headers @@ -117,15 +124,19 @@ private: */ void ReadSettings(); - ClientHelpNotificationServer *clientHelpNotificationServer = nullptr; //! A server to retrieve help requests from the clients + //! A server to retrieve help requests from the clients + ClientHelpNotificationServer *clientHelpNotificationServer = nullptr; QSettings labSettings; - NetstatAgent *netstatAgent = nullptr; //! Tries to detect active zLeaf connections from the clients + //! Tries to detect active zLeaf connections from the clients + NetstatAgent *netstatAgent = nullptr; QThread netstatThread; - QTimer *netstatTimer = nullptr; //! A timer for regular execution of the NetstatAgent instance's request mechanism + //! A timer for regular execution of the NetstatAgent instance's request mechanism + QTimer *netstatTimer = nullptr; QVector< quint16 > occupiedPorts; - SessionsModel *sessionsModel = nullptr; //! A derivation from QAbstractTableModel used to store the single Session instances + //! A derivation from QAbstractTableModel used to store the single Session instances + SessionsModel *sessionsModel = nullptr; }; -} +} // namespace lc #endif // LABLIB_H