mirror of
https://gitea.msk.dinamika-avia.ru/Constanta-Design/RRJServer.git
synced 2026-03-28 19:55:48 +03:00
Переделано под один мега-проект LMS с общим CMakeLists.txt
This commit is contained in:
273
ServerLMS/serverlmswidget.cpp
Normal file
273
ServerLMS/serverlmswidget.cpp
Normal file
@@ -0,0 +1,273 @@
|
||||
#include <QXmlStreamWriter>
|
||||
#include <QXmlStreamReader>
|
||||
#include <QXmlStreamAttribute>
|
||||
#include <QFile>
|
||||
#include <QMessageBox>
|
||||
#include <QThread>
|
||||
#include "serverlmswidget.h"
|
||||
#include "ui_serverlmswidget.h"
|
||||
|
||||
|
||||
ServerLMSWidget::ServerLMSWidget(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::ServerLMSWidget),
|
||||
tcpServer(nullptr),
|
||||
hostPort(6000),
|
||||
stateServer(stoped),
|
||||
stateBlockAutorization(blocked),
|
||||
updateThread(nullptr),
|
||||
loggerThread(nullptr),
|
||||
dataParser(nullptr),
|
||||
processingSystem(nullptr),
|
||||
updateController(nullptr),
|
||||
logger(nullptr),
|
||||
providerDBLMS(nullptr)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
qRegisterMetaType<PacketType>("PacketType");
|
||||
|
||||
ui->comboTasks->addItem("Задача 1");
|
||||
ui->comboTasks->addItem("Задача 2");
|
||||
ui->comboTasks->addItem("Задача 3");
|
||||
ui->comboTasks->addItem("Задача 4");
|
||||
ui->comboTasks->addItem("Задача 5");
|
||||
|
||||
ui->btnStopServer->setEnabled(false);
|
||||
ui->btnStartServer->setEnabled(true);
|
||||
|
||||
// Сделаем первоначальную инициализацию перевода для окна виджета
|
||||
qtLanguageTranslator.load(QString("translations/ServerLMS_") + QString("ru_RU"), ".");
|
||||
qApp->installTranslator(&qtLanguageTranslator);
|
||||
|
||||
updateThread = new QThread;
|
||||
loggerThread = new QThread;
|
||||
|
||||
providerDBLMS = new ProviderDBLMS(this);
|
||||
connect(providerDBLMS, &ProviderDBLMS::signal_BlockAutorization, this, &ServerLMSWidget::slot_BlockAutorization);
|
||||
providerDBLMS->ConnectionToDB();
|
||||
|
||||
logger = new Logger(ui->listWidgetLogger);
|
||||
connect(logger,&Logger::sigSendTextToLogger,this,&ServerLMSWidget::slotAddToLog,Qt::QueuedConnection);
|
||||
logger->moveToThread(loggerThread);
|
||||
|
||||
assetsManager = new AssetsManager;
|
||||
assetsManager->moveToThread(updateThread);
|
||||
|
||||
processingSystem = new ProcessingSystem(providerDBLMS);
|
||||
processingSystem->moveToThread(updateThread);
|
||||
|
||||
dataParser = new DataParser(assetsManager,processingSystem);
|
||||
|
||||
updateController = new UpdateController;
|
||||
updateController->moveToThread(updateThread);
|
||||
|
||||
commonClientHandler = new CommonClientHandler;
|
||||
|
||||
loggerThread->start();
|
||||
updateThread->start();
|
||||
|
||||
commonClientHandler->initialize(&clientsMap,processingSystem,dataParser,logger);
|
||||
processingSystem->initialize(this,dataParser,commonClientHandler,logger);
|
||||
|
||||
logger->setTypeLog("widget");
|
||||
|
||||
|
||||
connect(dataParser,&DataParser::sigLogMessage,logger,&Logger::addTextToLogger);
|
||||
|
||||
connect(this,&ServerLMSWidget::sigUpdateController,updateController,&UpdateController::initialize,Qt::DirectConnection);
|
||||
connect(this,&ServerLMSWidget::sigLog,logger,&Logger::addTextToLogger,Qt::AutoConnection);
|
||||
connect(this,&ServerLMSWidget::sigCalculateFullHash,updateController,&UpdateController::calculateFullHash,Qt::AutoConnection);
|
||||
|
||||
emit sigUpdateController(commonClientHandler,dataParser,assetsManager,logger);
|
||||
on_btnStartServer_clicked();
|
||||
|
||||
first = true;
|
||||
qDebug() << "MAIN THREAD: " << QThread::currentThreadId();
|
||||
}
|
||||
|
||||
void ServerLMSWidget::autorizationHandler(QString login)
|
||||
{
|
||||
//Отмена авторизации в БД
|
||||
|
||||
if(providerDBLMS->deAuthorizationTrainee(login))
|
||||
{//Деавторизовался обучаемый
|
||||
|
||||
}
|
||||
else if(providerDBLMS->deAuthorizationInstructor(login))
|
||||
{//Деавторизовался инструктор
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
ServerLMSWidget::~ServerLMSWidget()
|
||||
{
|
||||
stopServer();
|
||||
updateThread->exit();
|
||||
loggerThread->exit();
|
||||
delete ui;
|
||||
}
|
||||
|
||||
bool ServerLMSWidget::startServer()
|
||||
{
|
||||
if(stateServer == stoped)
|
||||
{
|
||||
tcpServer = new MultiThreadServer(this,updateController,dataParser,logger);
|
||||
|
||||
//connect(tcpServer, &QTcpServer::newConnection, this, &ServerLMSWidget::slotNewConnection,Qt::AutoConnection);
|
||||
|
||||
if(!tcpServer->listen(QHostAddress::Any, hostPort))
|
||||
{
|
||||
logger->addTextToLogger("SERVER: start ERROR");
|
||||
stateServer = stoped;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
logger->addTextToLogger("SERVER: start OK");
|
||||
stateServer = started;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ServerLMSWidget::stopServer()
|
||||
{
|
||||
if(stateServer == started)
|
||||
{
|
||||
QByteArray arrayAnswer = dataParser->ClientAnswer()->notify(NOTIFY_SERVER_END);
|
||||
|
||||
//Закрываем все открытые сокеты
|
||||
foreach(int idSocket, clientsMap.keys())
|
||||
{
|
||||
clientsMap[idSocket]->sigSocketWrite(arrayAnswer);
|
||||
//while (!clientsMap[idSocket]->sigSocketFlush()) {}
|
||||
|
||||
QString str = QString(arrayAnswer);
|
||||
emit sigLog("To Client: " + str);
|
||||
|
||||
//slotDisconnectClient(clientsMap[idSocket]->get, QString peerPort)
|
||||
autorizationHandler(clientsMap[idSocket]->getClient()->getLogin());
|
||||
|
||||
clientsMap[idSocket]->sigSocketClose();
|
||||
//clientsMap.remove(idSocket);
|
||||
removeClient(idSocket);
|
||||
}
|
||||
|
||||
//Закрываем сервер
|
||||
tcpServer->close();
|
||||
stateServer = stoped;
|
||||
delete tcpServer;
|
||||
emit sigLog("Server is stopped");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
Logger *ServerLMSWidget::getLogger() const
|
||||
{
|
||||
return logger;
|
||||
}
|
||||
|
||||
QMap<int, ClientHandler *> ServerLMSWidget::getClientsMap() const
|
||||
{
|
||||
return clientsMap;
|
||||
}
|
||||
|
||||
void ServerLMSWidget::slotUpdateListClients()
|
||||
{
|
||||
//Очищаем список
|
||||
ui->listWidget_Clients->clear();
|
||||
|
||||
//Проходим все открытые сокеты
|
||||
foreach(int idSocket, clientsMap.keys())
|
||||
{
|
||||
//Добавляем в список Клиентов
|
||||
QString strClient = clientsMap[idSocket]->getClient()->getFullName();
|
||||
|
||||
ui->listWidget_Clients->addItem(strClient);
|
||||
ui->listWidget_Clients->scrollToBottom();
|
||||
ui->listWidget_Clients->setCurrentRow(ui->listWidget_Clients->count() - 1);
|
||||
}
|
||||
|
||||
int countClients = clientsMap.count();
|
||||
logger->addTextToLogger("SERVER: countClients = " + QString::number(countClients));
|
||||
}
|
||||
|
||||
void ServerLMSWidget::slot_BlockAutorization(bool block)
|
||||
{
|
||||
if(block)
|
||||
blockAutorization();
|
||||
else
|
||||
unBlockAutorization();
|
||||
}
|
||||
|
||||
void ServerLMSWidget::removeClient(int idSocket)
|
||||
{
|
||||
clientsMap.remove(idSocket);
|
||||
slotUpdateListClients();
|
||||
}
|
||||
|
||||
void ServerLMSWidget::addClient(qintptr descriptor, ClientHandler *client)
|
||||
{
|
||||
clientsMap[descriptor] = client;
|
||||
slotUpdateListClients();
|
||||
}
|
||||
|
||||
void ServerLMSWidget::slot_LanguageChanged(QString language)
|
||||
{
|
||||
qtLanguageTranslator.load(QString("translations/ServerLMS_") + language, ".");
|
||||
qApp->installTranslator(&qtLanguageTranslator);
|
||||
}
|
||||
|
||||
|
||||
void ServerLMSWidget::on_btnTaskSet_clicked()
|
||||
{
|
||||
QString fullNameClient = ui->listWidget_Clients->currentItem()->text();
|
||||
QString textTask = ui->comboTasks->currentText();
|
||||
|
||||
commonClientHandler->slot_sendTaskToClient(fullNameClient,textTask);
|
||||
}
|
||||
|
||||
void ServerLMSWidget::slotAddToLog(QString msg)
|
||||
{
|
||||
ui->listWidgetLogger->addItem(msg);
|
||||
ui->listWidgetLogger->scrollToBottom();
|
||||
}
|
||||
|
||||
|
||||
void ServerLMSWidget::on_btnStartServer_clicked()
|
||||
{
|
||||
if(startServer())
|
||||
{
|
||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||
emit sigCalculateFullHash();
|
||||
QApplication::restoreOverrideCursor();
|
||||
|
||||
ui->btnStartServer->setEnabled(false);
|
||||
ui->btnStopServer->setEnabled(true);
|
||||
ui->lblOnOff->setPixmap(QPixmap(QStringLiteral(":/resources/icons/switchOn.png")));
|
||||
}
|
||||
}
|
||||
|
||||
void ServerLMSWidget::on_btnStopServer_clicked()
|
||||
{
|
||||
if(stopServer())
|
||||
{
|
||||
ui->btnStopServer->setEnabled(false);
|
||||
ui->btnStartServer->setEnabled(true);
|
||||
ui->lblOnOff->setPixmap(QPixmap(QStringLiteral(":/resources/icons/switchOff.png")));
|
||||
}
|
||||
}
|
||||
|
||||
void ServerLMSWidget::changeEvent(QEvent *event)
|
||||
{
|
||||
// В случае получения события изменения языка приложения
|
||||
if (event->type() == QEvent::LanguageChange)
|
||||
{
|
||||
ui->retranslateUi(this); // переведём окно заново
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user