From b452ef347d5e03790f140710e7d194de23099dbd Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 26 Jan 2026 18:47:57 +0300 Subject: [PATCH 1/5] CFIController 0 --- LibServer/CMakeLists.txt | 5 + LibServer/Systems/docsupdater.cpp | 3 +- LibServer/Systems/processingsystem.cpp | 3 +- LibServer/Systems/processingsystem.h | 5 +- LibServer/Systems/tools.h | 1 + LibServer/cficontroller/cficontroller.cpp | 148 ++++++++++++++++++++++ LibServer/cficontroller/cficontroller.h | 35 +++++ LibServer/cficontroller/cfiobject.cpp | 76 +++++++++++ LibServer/cficontroller/cfiobject.h | 78 ++++++++++++ LibServer/serverlmswidget.cpp | 24 +++- LibServer/serverlmswidget.h | 8 +- ProgramServerMTD/CMakeLists.txt | 1 + 12 files changed, 380 insertions(+), 7 deletions(-) create mode 100644 LibServer/cficontroller/cficontroller.cpp create mode 100644 LibServer/cficontroller/cficontroller.h create mode 100644 LibServer/cficontroller/cfiobject.cpp create mode 100644 LibServer/cficontroller/cfiobject.h diff --git a/LibServer/CMakeLists.txt b/LibServer/CMakeLists.txt index f95621d..070c4f3 100644 --- a/LibServer/CMakeLists.txt +++ b/LibServer/CMakeLists.txt @@ -58,6 +58,10 @@ add_library(Server SHARED Systems/docsupdater.h providerdblms/providerdblms.cpp providerdblms/providerdblms.h + cficontroller/cficontroller.cpp + cficontroller/cficontroller.h + cficontroller/cfiobject.cpp + cficontroller/cfiobject.h Server.qrc ) @@ -74,6 +78,7 @@ target_include_directories(Server PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/settings) target_include_directories(Server PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Data) target_include_directories(Server PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Systems) target_include_directories(Server PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Systems/Parsers) +target_include_directories(Server PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/cficontroller) target_include_directories(Server PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../LibDataBaseInterface) if(PROJECT_TYPE_DEBUG) diff --git a/LibServer/Systems/docsupdater.cpp b/LibServer/Systems/docsupdater.cpp index 8dc166c..b991a9f 100644 --- a/LibServer/Systems/docsupdater.cpp +++ b/LibServer/Systems/docsupdater.cpp @@ -41,8 +41,7 @@ bool DocsUpdater::updateDocsXML() { QMutexLocker locker(&mtxAccess); - QString nameDocsFile = tasksAMMfileName; //кручу верчу запутать хочу! - QString pathDocsFile = updateController->getPathAdditionalFile(nameDocsFile); + QString pathDocsFile = updateController->getPathAdditionalFile(tasksAMMfileName); QDomDocument docTasksDOM; if(! Tools::loadXMLtoDOM(pathDocsFile, &docTasksDOM)) diff --git a/LibServer/Systems/processingsystem.cpp b/LibServer/Systems/processingsystem.cpp index dfcf289..154af0f 100644 --- a/LibServer/Systems/processingsystem.cpp +++ b/LibServer/Systems/processingsystem.cpp @@ -3,10 +3,11 @@ #include -ProcessingSystem::ProcessingSystem(ProviderDBLMS* providerDBLMS, UpdateController* updateController, DocsUpdater* docsUpdater, QObject *parent): +ProcessingSystem::ProcessingSystem(ProviderDBLMS* providerDBLMS, UpdateController* updateController, DocsUpdater* docsUpdater, CfiController* cfiController, QObject *parent): QObject(parent), updateController(nullptr), docsUpdater(nullptr), + cfiController(cfiController), providerDBLMS(nullptr) { this->providerDBLMS = providerDBLMS; diff --git a/LibServer/Systems/processingsystem.h b/LibServer/Systems/processingsystem.h index 9da41a9..d63148c 100644 --- a/LibServer/Systems/processingsystem.h +++ b/LibServer/Systems/processingsystem.h @@ -11,6 +11,7 @@ #include "chatsystem.h" #include "providerdblms.h" #include "docsupdater.h" +#include "cficontroller.h" class SendSystem; class ServerLMSWidget; @@ -20,12 +21,13 @@ class DataParser; class ClientHandler; class CommonClientHandler; class MultiThreadServer; +class CfiController; class ProcessingSystem : public QObject { Q_OBJECT public: - explicit ProcessingSystem(ProviderDBLMS* providerDBLMS, UpdateController* updateController, DocsUpdater* docsUpdater, QObject *parent = nullptr); + explicit ProcessingSystem(ProviderDBLMS* providerDBLMS, UpdateController* updateController, DocsUpdater* docsUpdater, CfiController* cfiController, QObject *parent = nullptr); void initialize(MultiThreadServer *server, DataParser* dataParser, @@ -73,6 +75,7 @@ private: DataParser *dataParser; UpdateController *updateController; DocsUpdater* docsUpdater; + CfiController* cfiController; ProviderDBLMS* providerDBLMS; ChatSystem *chatSystem; void sendTaskListToUnity(ClientHandler *client); diff --git a/LibServer/Systems/tools.h b/LibServer/Systems/tools.h index 572661c..12e6d68 100644 --- a/LibServer/Systems/tools.h +++ b/LibServer/Systems/tools.h @@ -29,6 +29,7 @@ static const QString buildHashName = staticDataFolderName + "/buildHash.xml"; static const QString buildDataPath = "/Application/" + projectFolderName + "/RRJ_Data/"; static const QString tasksAMMfileName = "/docs.xml"; //"/tasksAmm.xml"; static const QString tasksFIMfileName = "/tasksFIM.xml"; +static const QString cfiListFileName = "/CfiList.xml"; //static const QString clientHash = staticDataFolderName + "/clientHash.xml"; static const QString logFolderPath = "log"; diff --git a/LibServer/cficontroller/cficontroller.cpp b/LibServer/cficontroller/cficontroller.cpp new file mode 100644 index 0000000..3d0e6ee --- /dev/null +++ b/LibServer/cficontroller/cficontroller.cpp @@ -0,0 +1,148 @@ +#include "cficontroller.h" + +CfiController::CfiController(UpdateController* updateController, QObject *parent) : + QObject(parent), + updateController(updateController) +{ + +} + +CfiController::~CfiController() +{ + +} + +void CfiController::lockAccessToCfiXML() +{ + mtxAccess.lock(); +} + +void CfiController::unLockAccessToCfiXML() +{ + mtxAccess.unlock(); +} + +bool CfiController::parsingCfiXML() +{ + QMutexLocker locker(&mtxAccess); + + if(!updateController) + return false; + + QString pathCfiListFile = updateController->getPathAdditionalFile(cfiListFileName); + + QDomDocument docCfiListDOM; + if(! Tools::loadXMLtoDOM(pathCfiListFile, &docCfiListDOM)) + return false; + + QDomElement CFIObjectsElement = docCfiListDOM.firstChildElement("CFIObjects"); + if(CFIObjectsElement.isNull()) + return false; + + listCfiObjects.clear(); + + //Parsing + QDomElement oneCFIObjectElement = CFIObjectsElement.firstChildElement(); + if(oneCFIObjectElement.isNull()) + return true; + + QString name; + + do + { + name = oneCFIObjectElement.nodeName(); + + if(name == "CFIObject") + { + CfiObject cfiObj; + + //атрибуты CFIObject + QDomNamedNodeMap nodeMapOneCFIObject = oneCFIObjectElement.attributes(); + cfiObj.setId(nodeMapOneCFIObject.namedItem("id").nodeValue().toInt()); + cfiObj.setIsChanged(nodeMapOneCFIObject.namedItem("isChanged").nodeValue() == "True" ? true : false); + + //childs CFIObject + QDomElement cfiName_Element = oneCFIObjectElement.elementsByTagName("cfiName").at(0).toElement(); + cfiObj.setCfiName(cfiName_Element.text()); + QDomElement cfi_Element = oneCFIObjectElement.elementsByTagName("cfi").at(0).toElement(); + cfiObj.setCfi(cfi_Element.text()); + QDomElement zoneName_Element = oneCFIObjectElement.elementsByTagName("zoneName").at(0).toElement(); + cfiObj.setZoneName(zoneName_Element.text()); + QDomElement goName_Element = oneCFIObjectElement.elementsByTagName("goName").at(0).toElement(); + cfiObj.setGoName(goName_Element.text()); + + //child CFIObject : SetCameraPos + SetCameraPos setCamPos; + QDomElement setcamerapos_Element = oneCFIObjectElement.elementsByTagName("setcamerapos").at(0).toElement(); + //атрибуты setcamerapos + QDomNamedNodeMap nodeMapSetcamerapos = setcamerapos_Element.attributes(); + setCamPos.set = nodeMapSetcamerapos.namedItem("set").nodeValue() == "True" ? true : false; + setCamPos.fast = nodeMapSetcamerapos.namedItem("fast").nodeValue() == "True" ? true : false; + setCamPos.specialPanel = nodeMapSetcamerapos.namedItem("specialPanel").nodeValue() == "True" ? true : false; + + setCamPos.cameraMode = nodeMapSetcamerapos.namedItem("cameraMode").nodeValue(); + setCamPos.state = nodeMapSetcamerapos.namedItem("state").nodeValue(); + setCamPos.panelName = nodeMapSetcamerapos.namedItem("panelName").nodeValue(); + + setCamPos.prevCamOffsetMARposY = nodeMapSetcamerapos.namedItem("prevCamOffsetMARposY").nodeValue().toFloat(); + setCamPos.camOffsetMARposY = nodeMapSetcamerapos.namedItem("camOffsetMARposY").nodeValue().toFloat(); + setCamPos.prevCharControlerHeight = nodeMapSetcamerapos.namedItem("prevCharControlerHeight").nodeValue().toFloat(); + setCamPos.charControlerHeight = nodeMapSetcamerapos.namedItem("charControlerHeight").nodeValue().toFloat(); + setCamPos.FOV = nodeMapSetcamerapos.namedItem("FOV").nodeValue().toFloat(); + setCamPos.moveSpeed = nodeMapSetcamerapos.namedItem("moveSpeed").nodeValue().toFloat(); + setCamPos.projectionSize = nodeMapSetcamerapos.namedItem("projectionSize").nodeValue().toFloat(); + setCamPos.offset = nodeMapSetcamerapos.namedItem("offset").nodeValue().toFloat(); + setCamPos.prevPlayerRot = nodeMapSetcamerapos.namedItem("prevPlayerRot").nodeValue().toFloat(); + + //childs setcamerapos + QDomElement loc_Element; + loc_Element = setcamerapos_Element.elementsByTagName("axesClamp").at(0).toElement(); + setCamPos.axesClamp = getXYfromElement(loc_Element); + loc_Element = setcamerapos_Element.elementsByTagName("prevPlayerPos").at(0).toElement(); + setCamPos.prevPlayerPos = getXYZfromElement(loc_Element); + loc_Element = setcamerapos_Element.elementsByTagName("playerPos").at(0).toElement(); + setCamPos.playerPos = getXYZfromElement(loc_Element); + loc_Element = setcamerapos_Element.elementsByTagName("playerRot").at(0).toElement(); + setCamPos.playerRot = getXYZfromElement(loc_Element); + loc_Element = setcamerapos_Element.elementsByTagName("prevCamRot").at(0).toElement(); + setCamPos.prevCamRot = getXYZfromElement(loc_Element); + loc_Element = setcamerapos_Element.elementsByTagName("camRot").at(0).toElement(); + setCamPos.camRot = getXYZfromElement(loc_Element); + loc_Element = setcamerapos_Element.elementsByTagName("goCenter").at(0).toElement(); + setCamPos.goCenter = getXYZfromElement(loc_Element); + loc_Element = setcamerapos_Element.elementsByTagName("playerMARpos").at(0).toElement(); + setCamPos.playerMARpos = getXYZfromElement(loc_Element); + loc_Element = setcamerapos_Element.elementsByTagName("playerMARrot").at(0).toElement(); + setCamPos.playerMARrot = getXYZfromElement(loc_Element); + loc_Element = setcamerapos_Element.elementsByTagName("camMARrot").at(0).toElement(); + setCamPos.camMARrot = getXYZfromElement(loc_Element); + loc_Element = setcamerapos_Element.elementsByTagName("playerPosRelativeToThePanel").at(0).toElement(); + setCamPos.playerPosRelativeToThePanel = getXYZfromElement(loc_Element); + + cfiObj.setSetCameraPos(setCamPos); + + listCfiObjects.append(cfiObj); + } + }while (! (oneCFIObjectElement = oneCFIObjectElement.nextSiblingElement()).isNull()); + + return true; +} + +QVector3D CfiController::getXYZfromElement(QDomElement element) +{ + QVector3D vector3D; + QDomNamedNodeMap nodeMap = element.attributes(); + vector3D.setX(nodeMap.namedItem("x").nodeValue().toFloat()); + vector3D.setY(nodeMap.namedItem("y").nodeValue().toFloat()); + vector3D.setZ(nodeMap.namedItem("z").nodeValue().toFloat()); + return vector3D; +} + +QVector2D CfiController::getXYfromElement(QDomElement element) +{ + QVector2D vector2D; + QDomNamedNodeMap nodeMap = element.attributes(); + vector2D.setX(nodeMap.namedItem("x").nodeValue().toFloat()); + vector2D.setY(nodeMap.namedItem("y").nodeValue().toFloat()); + return vector2D; +} diff --git a/LibServer/cficontroller/cficontroller.h b/LibServer/cficontroller/cficontroller.h new file mode 100644 index 0000000..9c08fd0 --- /dev/null +++ b/LibServer/cficontroller/cficontroller.h @@ -0,0 +1,35 @@ +#ifndef CFICONTROLLER_H +#define CFICONTROLLER_H + +#include +#include +#include "updatecontroller.h" +#include "cfiobject.h" + +class CfiController : public QObject +{ + Q_OBJECT +public: + explicit CfiController(UpdateController* updateController, QObject *parent = nullptr); + ~CfiController(); +public: + void lockAccessToCfiXML(); + void unLockAccessToCfiXML(); + + bool parsingCfiXML(); + +signals: + +private: + QVector3D getXYZfromElement(QDomElement element); + QVector2D getXYfromElement(QDomElement element); + +private: + UpdateController* updateController; + + QMutex mtxAccess; + + QList listCfiObjects; +}; + +#endif // CFICONTROLLER_H diff --git a/LibServer/cficontroller/cfiobject.cpp b/LibServer/cficontroller/cfiobject.cpp new file mode 100644 index 0000000..69038fa --- /dev/null +++ b/LibServer/cficontroller/cfiobject.cpp @@ -0,0 +1,76 @@ +#include "cfiobject.h" + +CfiObject::CfiObject() +{ + +} + +int CfiObject::getId() const +{ + return id; +} + +void CfiObject::setId(int value) +{ + id = value; +} + +QString CfiObject::getCfiName() const +{ + return cfiName; +} + +void CfiObject::setCfiName(const QString &value) +{ + cfiName = value; +} + +QString CfiObject::getCfi() const +{ + return cfi; +} + +void CfiObject::setCfi(const QString &value) +{ + cfi = value; +} + +QString CfiObject::getZoneName() const +{ + return zoneName; +} + +void CfiObject::setZoneName(const QString &value) +{ + zoneName = value; +} + +QString CfiObject::getGoName() const +{ + return goName; +} + +void CfiObject::setGoName(const QString &value) +{ + goName = value; +} + +SetCameraPos CfiObject::getSetCameraPos() const +{ + return setCameraPos; +} + +void CfiObject::setSetCameraPos(const SetCameraPos &value) +{ + setCameraPos = value; +} + +bool CfiObject::getIsChanged() const +{ + return isChanged; +} + +void CfiObject::setIsChanged(bool value) +{ + isChanged = value; +} diff --git a/LibServer/cficontroller/cfiobject.h b/LibServer/cficontroller/cfiobject.h new file mode 100644 index 0000000..46a5827 --- /dev/null +++ b/LibServer/cficontroller/cfiobject.h @@ -0,0 +1,78 @@ +#ifndef CFIOBJECT_H +#define CFIOBJECT_H + +#include +#include +#include +#include + +struct SetCameraPos +{ + bool set; + bool fast; + bool specialPanel; + QString cameraMode; + QString state; + QString panelName; + float prevCamOffsetMARposY; + float camOffsetMARposY; + float prevCharControlerHeight; + float charControlerHeight; + float FOV; + float moveSpeed; + float projectionSize; + float offset; + float prevPlayerRot; + + QVector2D axesClamp; + + QVector3D prevPlayerPos; + QVector3D playerPos; + QVector3D playerRot; + QVector3D prevCamRot; + QVector3D camRot; + QVector3D goCenter; + QVector3D playerMARpos; + QVector3D playerMARrot; + QVector3D camMARrot; + QVector3D playerPosRelativeToThePanel; +}; + +class CfiObject +{ +public: + CfiObject(); + + int getId() const; + void setId(int value); + + QString getCfiName() const; + void setCfiName(const QString &value); + + QString getCfi() const; + void setCfi(const QString &value); + + QString getZoneName() const; + void setZoneName(const QString &value); + + QString getGoName() const; + void setGoName(const QString &value); + + SetCameraPos getSetCameraPos() const; + void setSetCameraPos(const SetCameraPos &value); + + bool getIsChanged() const; + void setIsChanged(bool value); + +private: + int id; + bool isChanged; + QString cfiName; + QString cfi; + QString zoneName; + QString goName; + + SetCameraPos setCameraPos; +}; + +#endif // CFIOBJECT_H diff --git a/LibServer/serverlmswidget.cpp b/LibServer/serverlmswidget.cpp index 2790b4e..e033920 100644 --- a/LibServer/serverlmswidget.cpp +++ b/LibServer/serverlmswidget.cpp @@ -28,7 +28,8 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) : commonClientHandler(nullptr), chatSystem(nullptr), docsUpdater(nullptr), - providerDBLMS(nullptr), + cfiController(nullptr), + providerDBLMS(nullptr), first (true), language(languageENG), errorCode(0), @@ -75,6 +76,7 @@ ServerLMSWidget::~ServerLMSWidget() delete dataParser; delete processingSystem; delete updateController; + delete cfiController; delete docsUpdater; delete assetsManager; delete chatSystem; @@ -151,6 +153,21 @@ void ServerLMSWidget::slot_UpdateDocs() emit signal_DocsChanged(); QApplication::restoreOverrideCursor(); + + //TODO для теста + slot_ParsingCfiXML(); +} + +void ServerLMSWidget::slot_ParsingCfiXML() +{ + QApplication::setOverrideCursor(Qt::WaitCursor); + + if(cfiController->parsingCfiXML()) + { + //TODO...что-то, наверное, должно происходить? + } + + QApplication::restoreOverrideCursor(); } void ServerLMSWidget::slot_startInitialization_step1() @@ -374,7 +391,10 @@ void ServerLMSWidget::startInitialization_step0() docsUpdater = new DocsUpdater(updateController/*, this*/); docsUpdater->moveToThread(updateThread); - processingSystem = new ProcessingSystem(providerDBLMS, updateController, docsUpdater); + cfiController = new CfiController(updateController/*, this*/); + cfiController->moveToThread(updateThread); + + processingSystem = new ProcessingSystem(providerDBLMS, updateController, docsUpdater, cfiController); dataParser = new DataParser(assetsManager, processingSystem); diff --git a/LibServer/serverlmswidget.h b/LibServer/serverlmswidget.h index 9e16997..8687407 100644 --- a/LibServer/serverlmswidget.h +++ b/LibServer/serverlmswidget.h @@ -31,6 +31,8 @@ #include "waitanimationwidget.h" #include "specialmessagebox.h" +#include "cficontroller.h" + namespace Ui { class ServerLMSWidget; @@ -47,6 +49,7 @@ class MultiThreadServer; class AssetsManager; class ChatSystem; class DocsUpdater; +class CfiController; class SERVERLMS_EXPORT ServerLMSWidget : public QWidget { @@ -98,6 +101,8 @@ public slots: void slot_UpdateDocs(); + void slot_ParsingCfiXML(); + void slot_startInitialization_step1(); void slot_setVersion(QString versionStr); @@ -176,7 +181,8 @@ private: ChatSystem *chatSystem; DocsUpdater* docsUpdater; - ProviderDBLMS* providerDBLMS; + CfiController* cfiController; + ProviderDBLMS* providerDBLMS; bool first = true; // для тестов Unity diff --git a/ProgramServerMTD/CMakeLists.txt b/ProgramServerMTD/CMakeLists.txt index 7e966fe..a8c2a74 100644 --- a/ProgramServerMTD/CMakeLists.txt +++ b/ProgramServerMTD/CMakeLists.txt @@ -39,6 +39,7 @@ target_include_directories(ServerMTD PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../LibSe target_include_directories(ServerMTD PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../LibServer/multithreadserver) target_include_directories(ServerMTD PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../LibServer/providerdblms) target_include_directories(ServerMTD PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../LibServer/Systems) +target_include_directories(ServerMTD PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../LibServer/cficontroller) if(PROJECT_TYPE_DEBUG) target_link_directories(ServerMTD PUBLIC ${REPO_PATH}/BUILDS/Debug64/LibServer) else() From 4ce3f53171bb6ea539c97bdeed6d38532ec4779d Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 27 Jan 2026 12:34:20 +0300 Subject: [PATCH 2/5] cfiController 1 + fix bug BUSY FREE not for Unity --- LibServer/Systems/commonclienthandler.cpp | 13 ++++++-- LibServer/Systems/commonclienthandler.h | 2 +- LibServer/Systems/processingsystem.cpp | 4 +-- LibServer/Systems/updatecontroller.cpp | 6 ++-- LibServer/cficontroller/cficontroller.cpp | 33 ++++++++++--------- LibServer/cficontroller/cficontroller.h | 3 ++ .../multithreadserver/multithreadserver.cpp | 6 ++-- .../multithreadserver/multithreadserver.h | 2 +- LibServer/serverlmswidget.cpp | 2 +- 9 files changed, 43 insertions(+), 28 deletions(-) diff --git a/LibServer/Systems/commonclienthandler.cpp b/LibServer/Systems/commonclienthandler.cpp index 7e3bb5d..80b372a 100644 --- a/LibServer/Systems/commonclienthandler.cpp +++ b/LibServer/Systems/commonclienthandler.cpp @@ -105,17 +105,26 @@ void CommonClientHandler::slot_StatusTasksFIMofTraineeChanged(int trainee_id) }*/ } -void CommonClientHandler::slot_sendPacketToAllClients(PacketType packetType) +void CommonClientHandler::slot_sendPacketToAllClients(PacketType packetType, bool flOnlyGUI) { foreach(int idSocket, clientsMap->keys()) { ClientHandler *handler = clientsMap->value(idSocket); + if(flOnlyGUI) + { + if(handler->getClient()->getTypeClient() != TypeClientAutorization::TYPE_GUI) + continue; + } + //if(packetType != PacketType::BUSY && packetType != PacketType::FREE) if (!handler->getClient()->getIsLoggedIn()) continue; handler->sendPacketType(packetType); - Logger::instance().log("AllSending " + handler->getClient()->getLogin() + " " + enumToString(packetType)); + if(flOnlyGUI) + Logger::instance().log("All GUI Sending " + handler->getClient()->getLogin() + " " + enumToString(packetType)); + else + Logger::instance().log("All Sending " + handler->getClient()->getLogin() + " " + enumToString(packetType)); } //emit sigSetServerState(packetType); diff --git a/LibServer/Systems/commonclienthandler.h b/LibServer/Systems/commonclienthandler.h index 763668c..f2dddb7 100644 --- a/LibServer/Systems/commonclienthandler.h +++ b/LibServer/Systems/commonclienthandler.h @@ -29,7 +29,7 @@ public: void slot_DocsChanged(); public slots: - void slot_sendPacketToAllClients(PacketType packetType); + void slot_sendPacketToAllClients(PacketType packetType, bool flOnlyGUI); signals: //void sigSetServerState(PacketType packetType); diff --git a/LibServer/Systems/processingsystem.cpp b/LibServer/Systems/processingsystem.cpp index 154af0f..28d15a5 100644 --- a/LibServer/Systems/processingsystem.cpp +++ b/LibServer/Systems/processingsystem.cpp @@ -98,12 +98,12 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien client->sendVersion(); //Отправляем состояние блокировки - /**/ + /* if(server->getStateBlockAutorization() == EStateBlockAutorization::blocked) client->sendPacketType(PacketType::BUSY); else client->sendPacketType(PacketType::FREE); - +*/ //client->sendPacketType(PacketType::BUSY); //client->sendPacketType(PacketType::FREE); diff --git a/LibServer/Systems/updatecontroller.cpp b/LibServer/Systems/updatecontroller.cpp index aeb0394..5d921fa 100644 --- a/LibServer/Systems/updatecontroller.cpp +++ b/LibServer/Systems/updatecontroller.cpp @@ -50,7 +50,7 @@ void UpdateController::changeAssetVersion(QString versionName) currentStreamingPath = assetManager->setVersion(versionName); setUpCurrentServerHash(); emit sigUpdateDocs(); - commonClientHandler->slot_sendPacketToAllClients(PacketType::HASH_READY); + commonClientHandler->slot_sendPacketToAllClients(PacketType::HASH_READY, false); commonClientHandler->sendCurrentVersionToAllClient(); //commonClientHandler->slot_sendPacketToAllClients(PacketType::FREE); @@ -118,10 +118,10 @@ void UpdateController::calculateFullHash() void UpdateController::calculateFullHashWithSetup() { bool res = emit signal_BlockAutorization(true, "SERVER", "CalculateFullHashWithSetup"); - commonClientHandler->slot_sendPacketToAllClients(PacketType::RECALCULATE_HASH); + commonClientHandler->slot_sendPacketToAllClients(PacketType::RECALCULATE_HASH, false); calculateCurrentSharedHash(); setUpCurrentServerHash(); - commonClientHandler->slot_sendPacketToAllClients(PacketType::HASH_READY); + commonClientHandler->slot_sendPacketToAllClients(PacketType::HASH_READY, false); res = emit signal_BlockAutorization(false, "SERVER", "CalculateFullHashWithSetup"); } diff --git a/LibServer/cficontroller/cficontroller.cpp b/LibServer/cficontroller/cficontroller.cpp index 3d0e6ee..21a2490 100644 --- a/LibServer/cficontroller/cficontroller.cpp +++ b/LibServer/cficontroller/cficontroller.cpp @@ -2,9 +2,10 @@ CfiController::CfiController(UpdateController* updateController, QObject *parent) : QObject(parent), - updateController(updateController) + updateController(updateController), + germanLocale(nullptr) { - + germanLocale = new QLocale(QLocale::German); } CfiController::~CfiController() @@ -84,15 +85,15 @@ bool CfiController::parsingCfiXML() setCamPos.state = nodeMapSetcamerapos.namedItem("state").nodeValue(); setCamPos.panelName = nodeMapSetcamerapos.namedItem("panelName").nodeValue(); - setCamPos.prevCamOffsetMARposY = nodeMapSetcamerapos.namedItem("prevCamOffsetMARposY").nodeValue().toFloat(); - setCamPos.camOffsetMARposY = nodeMapSetcamerapos.namedItem("camOffsetMARposY").nodeValue().toFloat(); - setCamPos.prevCharControlerHeight = nodeMapSetcamerapos.namedItem("prevCharControlerHeight").nodeValue().toFloat(); - setCamPos.charControlerHeight = nodeMapSetcamerapos.namedItem("charControlerHeight").nodeValue().toFloat(); - setCamPos.FOV = nodeMapSetcamerapos.namedItem("FOV").nodeValue().toFloat(); - setCamPos.moveSpeed = nodeMapSetcamerapos.namedItem("moveSpeed").nodeValue().toFloat(); - setCamPos.projectionSize = nodeMapSetcamerapos.namedItem("projectionSize").nodeValue().toFloat(); - setCamPos.offset = nodeMapSetcamerapos.namedItem("offset").nodeValue().toFloat(); - setCamPos.prevPlayerRot = nodeMapSetcamerapos.namedItem("prevPlayerRot").nodeValue().toFloat(); + setCamPos.prevCamOffsetMARposY = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("prevCamOffsetMARposY").nodeValue()); + setCamPos.camOffsetMARposY = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("camOffsetMARposY").nodeValue()); + setCamPos.prevCharControlerHeight = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("prevCharControlerHeight").nodeValue()); + setCamPos.charControlerHeight = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("charControlerHeight").nodeValue()); + setCamPos.FOV = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("FOV").nodeValue()); + setCamPos.moveSpeed = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("moveSpeed").nodeValue()); + setCamPos.projectionSize = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("projectionSize").nodeValue()); + setCamPos.offset = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("offset").nodeValue()); + setCamPos.prevPlayerRot = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("prevPlayerRot").nodeValue()); //childs setcamerapos QDomElement loc_Element; @@ -132,9 +133,9 @@ QVector3D CfiController::getXYZfromElement(QDomElement element) { QVector3D vector3D; QDomNamedNodeMap nodeMap = element.attributes(); - vector3D.setX(nodeMap.namedItem("x").nodeValue().toFloat()); - vector3D.setY(nodeMap.namedItem("y").nodeValue().toFloat()); - vector3D.setZ(nodeMap.namedItem("z").nodeValue().toFloat()); + vector3D.setX(germanLocale->toFloat(nodeMap.namedItem("x").nodeValue())); + vector3D.setY(germanLocale->toFloat(nodeMap.namedItem("y").nodeValue())); + vector3D.setZ(germanLocale->toFloat(nodeMap.namedItem("z").nodeValue())); return vector3D; } @@ -142,7 +143,7 @@ QVector2D CfiController::getXYfromElement(QDomElement element) { QVector2D vector2D; QDomNamedNodeMap nodeMap = element.attributes(); - vector2D.setX(nodeMap.namedItem("x").nodeValue().toFloat()); - vector2D.setY(nodeMap.namedItem("y").nodeValue().toFloat()); + vector2D.setX(germanLocale->toFloat(nodeMap.namedItem("x").nodeValue())); + vector2D.setY(germanLocale->toFloat(nodeMap.namedItem("y").nodeValue())); return vector2D; } diff --git a/LibServer/cficontroller/cficontroller.h b/LibServer/cficontroller/cficontroller.h index 9c08fd0..f5ac475 100644 --- a/LibServer/cficontroller/cficontroller.h +++ b/LibServer/cficontroller/cficontroller.h @@ -3,6 +3,7 @@ #include #include +#include #include "updatecontroller.h" #include "cfiobject.h" @@ -30,6 +31,8 @@ private: QMutex mtxAccess; QList listCfiObjects; + + QLocale* germanLocale; }; #endif // CFICONTROLLER_H diff --git a/LibServer/multithreadserver/multithreadserver.cpp b/LibServer/multithreadserver/multithreadserver.cpp index bb4fb18..ed9cf31 100644 --- a/LibServer/multithreadserver/multithreadserver.cpp +++ b/LibServer/multithreadserver/multithreadserver.cpp @@ -239,10 +239,12 @@ bool MultiThreadServer::slot_BlockAutorization(bool block, QString whoFullName, if(res) { + /**/ if(blockRes) - emit signal_sendPacketToAllClients(PacketType::BUSY); + emit signal_sendPacketToAllClients(PacketType::BUSY, true); else - emit signal_sendPacketToAllClients(PacketType::FREE); + emit signal_sendPacketToAllClients(PacketType::FREE, true); + for(QString keyLocal : blockersMap.keys()) { diff --git a/LibServer/multithreadserver/multithreadserver.h b/LibServer/multithreadserver/multithreadserver.h index 1dabd79..ca206c8 100644 --- a/LibServer/multithreadserver/multithreadserver.h +++ b/LibServer/multithreadserver/multithreadserver.h @@ -47,7 +47,7 @@ signals: void signalStopSendFile(); void signal_BlockAutorizationIndicate(bool block, QString blocker, QString types); - void signal_sendPacketToAllClients(PacketType packetType); + void signal_sendPacketToAllClients(PacketType packetType, bool flOnlyGUI); public slots: void slotDisconnectClient(QString peerAddress, QString peerPort); diff --git a/LibServer/serverlmswidget.cpp b/LibServer/serverlmswidget.cpp index e033920..7b66404 100644 --- a/LibServer/serverlmswidget.cpp +++ b/LibServer/serverlmswidget.cpp @@ -155,7 +155,7 @@ void ServerLMSWidget::slot_UpdateDocs() QApplication::restoreOverrideCursor(); //TODO для теста - slot_ParsingCfiXML(); + //slot_ParsingCfiXML(); } void ServerLMSWidget::slot_ParsingCfiXML() From 01b665d82c08aadab1e369dddd5e8ce19126aade Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 27 Jan 2026 12:43:16 +0300 Subject: [PATCH 3/5] delete DirectConnection --- LibServer/serverlmswidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LibServer/serverlmswidget.cpp b/LibServer/serverlmswidget.cpp index 7b66404..6467b12 100644 --- a/LibServer/serverlmswidget.cpp +++ b/LibServer/serverlmswidget.cpp @@ -404,8 +404,8 @@ void ServerLMSWidget::startInitialization_step0() server = new MultiThreadServer(this, updateController, processingSystem, dataParser, 6000); connect(server, &MultiThreadServer::signal_BlockAutorizationIndicate, this, &ServerLMSWidget::slot_BlockAutorizationIndicate); - connect(providerDBLMS, &ProviderDBLMS::signal_BlockAutorization, server, &MultiThreadServer::slot_BlockAutorization, Qt::DirectConnection); - connect(updateController, &UpdateController::signal_BlockAutorization, server, &MultiThreadServer::slot_BlockAutorization, Qt::DirectConnection); + connect(providerDBLMS, &ProviderDBLMS::signal_BlockAutorization, server, &MultiThreadServer::slot_BlockAutorization/*, Qt::DirectConnection*/); + connect(updateController, &UpdateController::signal_BlockAutorization, server, &MultiThreadServer::slot_BlockAutorization/*, Qt::DirectConnection*/); connect(server, &MultiThreadServer::signal_sendPacketToAllClients, commonClientHandler, &CommonClientHandler::slot_sendPacketToAllClients); loggerThread->start(); From 952e7ae65dd4d1df514fe48b850f32efb5de96f2 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 27 Jan 2026 13:16:10 +0300 Subject: [PATCH 4/5] All GUI Sending --- LibServer/Systems/commonclienthandler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LibServer/Systems/commonclienthandler.cpp b/LibServer/Systems/commonclienthandler.cpp index 80b372a..79435c7 100644 --- a/LibServer/Systems/commonclienthandler.cpp +++ b/LibServer/Systems/commonclienthandler.cpp @@ -122,9 +122,9 @@ void CommonClientHandler::slot_sendPacketToAllClients(PacketType packetType, boo handler->sendPacketType(packetType); if(flOnlyGUI) - Logger::instance().log("All GUI Sending " + handler->getClient()->getLogin() + " " + enumToString(packetType)); + Logger::instance().log("All GUI Sending " + handler->getClient()->getLogin() + " " + enumToString(packetType), LogLevel::DEBUG); else - Logger::instance().log("All Sending " + handler->getClient()->getLogin() + " " + enumToString(packetType)); + Logger::instance().log("All Sending " + handler->getClient()->getLogin() + " " + enumToString(packetType), LogLevel::DEBUG); } //emit sigSetServerState(packetType); From 0c5509a426fd4f00f21ff23db5c4a557a39cf898 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 28 Jan 2026 13:19:52 +0300 Subject: [PATCH 5/5] cfiController --- LibServer/CMakeLists.txt | 2 + LibServer/Server.qrc | 1 + LibServer/Systems/Parsers/dbanswerparser.cpp | 20 +-- .../Systems/Parsers/docsanswerparser.cpp | 4 +- LibServer/Systems/docsupdater.cpp | 6 +- LibServer/Systems/processingsystem.cpp | 3 +- LibServer/Systems/tools.cpp | 26 ++- LibServer/Systems/tools.h | 6 +- LibServer/cficontroller/cficontroller.cpp | 162 +++++++++++++++--- LibServer/cficontroller/cficontroller.h | 23 ++- LibServer/cficontroller/cfiobject.cpp | 15 ++ LibServer/cficontroller/cfiobject.h | 34 ++-- LibServer/cficontroller/vectordouble.cpp | 66 +++++++ LibServer/cficontroller/vectordouble.h | 42 +++++ LibServer/resources/blankXML/ListCFI.xml | 3 + LibServer/serverlmswidget.cpp | 14 +- LibServer/serverlmswidget.h | 2 - 17 files changed, 348 insertions(+), 81 deletions(-) create mode 100644 LibServer/cficontroller/vectordouble.cpp create mode 100644 LibServer/cficontroller/vectordouble.h create mode 100644 LibServer/resources/blankXML/ListCFI.xml diff --git a/LibServer/CMakeLists.txt b/LibServer/CMakeLists.txt index 070c4f3..1a8cdf2 100644 --- a/LibServer/CMakeLists.txt +++ b/LibServer/CMakeLists.txt @@ -62,6 +62,8 @@ add_library(Server SHARED cficontroller/cficontroller.h cficontroller/cfiobject.cpp cficontroller/cfiobject.h + cficontroller/vectordouble.cpp + cficontroller/vectordouble.h Server.qrc ) diff --git a/LibServer/Server.qrc b/LibServer/Server.qrc index 09da0c9..26a6445 100644 --- a/LibServer/Server.qrc +++ b/LibServer/Server.qrc @@ -18,5 +18,6 @@ resources/icons/reparation.png resources/icons/save.png resources/icons/stoped.png + resources/blankXML/ListCFI.xml diff --git a/LibServer/Systems/Parsers/dbanswerparser.cpp b/LibServer/Systems/Parsers/dbanswerparser.cpp index 49d2bdf..f730150 100644 --- a/LibServer/Systems/Parsers/dbanswerparser.cpp +++ b/LibServer/Systems/Parsers/dbanswerparser.cpp @@ -15,7 +15,7 @@ void DBAnswerParser::initialize(DataParser *dataParser) QByteArray DBAnswerParser::listInstructors(bool result, QList *listInstructors) { QDomDocument commonDOM; - if(! Tools::loadXMLtoDOM(":/resources/blankXML/ListInstructors.xml", &commonDOM)) + if(! Tools::loadFileXMLtoDOM(":/resources/blankXML/ListInstructors.xml", &commonDOM)) return QByteArray(); QDomNode listNode = commonDOM.namedItem("ListInstructors"); @@ -34,7 +34,7 @@ QByteArray DBAnswerParser::listInstructors(bool result, QList *listI instructorNode.toElement().setAttribute("logged_in", instructor.getLoggedIn()); } - Tools::saveDOMtoXML("ListInstructors.xml", &commonDOM); + Tools::saveDOMtoFileXML("ListInstructors.xml", &commonDOM); return commonDOM.toByteArray(); } @@ -42,7 +42,7 @@ QByteArray DBAnswerParser::listInstructors(bool result, QList *listI QByteArray DBAnswerParser::listGroups(bool result, QList *listGroups) { QDomDocument commonDOM; - if(! Tools::loadXMLtoDOM(":/resources/blankXML/ListGroups.xml", &commonDOM)) + if(! Tools::loadFileXMLtoDOM(":/resources/blankXML/ListGroups.xml", &commonDOM)) return QByteArray(); QDomNode listNode = commonDOM.namedItem("ListGroups"); @@ -56,7 +56,7 @@ QByteArray DBAnswerParser::listGroups(bool result, QList *listGroups) groupNode.toElement().setAttribute("name", group.getName()); } - Tools::saveDOMtoXML("ListGroups.xml", &commonDOM); + Tools::saveDOMtoFileXML("ListGroups.xml", &commonDOM); return commonDOM.toByteArray(); } @@ -64,7 +64,7 @@ QByteArray DBAnswerParser::listGroups(bool result, QList *listGroups) QByteArray DBAnswerParser::listTrainees(bool result, QList *listTrainees) { QDomDocument commonDOM; - if(! Tools::loadXMLtoDOM(":/resources/blankXML/ListTrainees.xml", &commonDOM)) + if(! Tools::loadFileXMLtoDOM(":/resources/blankXML/ListTrainees.xml", &commonDOM)) return QByteArray(); QDomNode listNode = commonDOM.namedItem("ListTrainees"); @@ -95,7 +95,7 @@ QByteArray DBAnswerParser::listTrainees(bool result, QList *listTrainee timingNode.toElement().setAttribute("operatingTime", timing.getOperatingTimeS()); } - Tools::saveDOMtoXML("ListTrainees.xml", &commonDOM); + Tools::saveDOMtoFileXML("ListTrainees.xml", &commonDOM); return commonDOM.toByteArray(); } @@ -142,7 +142,7 @@ QByteArray DBAnswerParser::listContacts(bool result, QList *listCo QByteArray DBAnswerParser::listTasksAMMofTrainee(bool result, QList *listTasks, int trainee_id, bool full_list) { QDomDocument commonDOM; - if(! Tools::loadXMLtoDOM(":/resources/blankXML/ListTasksAMM.xml", &commonDOM)) + if(! Tools::loadFileXMLtoDOM(":/resources/blankXML/ListTasksAMM.xml", &commonDOM)) return QByteArray(); QDomNode listNode = commonDOM.namedItem("ListTasksAMM"); @@ -173,7 +173,7 @@ QByteArray DBAnswerParser::listTasksAMMofTrainee(bool result, QList } } - Tools::saveDOMtoXML("ListTasksAMM.xml", &commonDOM); + Tools::saveDOMtoFileXML("ListTasksAMM.xml", &commonDOM); return commonDOM.toByteArray(); } @@ -181,7 +181,7 @@ QByteArray DBAnswerParser::listTasksAMMofTrainee(bool result, QList QByteArray DBAnswerParser::listTasksFIMofTrainee(bool result, QList *listTasks, int trainee_id, bool full_list) { QDomDocument commonDOM; - if(! Tools::loadXMLtoDOM(":/resources/blankXML/ListTasksFIM.xml", &commonDOM)) + if(! Tools::loadFileXMLtoDOM(":/resources/blankXML/ListTasksFIM.xml", &commonDOM)) return QByteArray(); QDomNode listNode = commonDOM.namedItem("ListTasksFIM"); @@ -257,7 +257,7 @@ QByteArray DBAnswerParser::listTasksFIMofTrainee(bool result, QList } } - Tools::saveDOMtoXML("ListTasksFIM.xml", &commonDOM); + Tools::saveDOMtoFileXML("ListTasksFIM.xml", &commonDOM); return commonDOM.toByteArray(); } diff --git a/LibServer/Systems/Parsers/docsanswerparser.cpp b/LibServer/Systems/Parsers/docsanswerparser.cpp index 371ff37..a28f7ce 100644 --- a/LibServer/Systems/Parsers/docsanswerparser.cpp +++ b/LibServer/Systems/Parsers/docsanswerparser.cpp @@ -9,7 +9,7 @@ DocsAnswerParser::DocsAnswerParser(QObject *parent) : QObject(parent) QByteArray DocsAnswerParser::listSubProc(QList list, QString dmCode) { QDomDocument commonDOM; - if(! Tools::loadXMLtoDOM(":/resources/blankXML/ListSubProc.xml", &commonDOM)) + if(! Tools::loadFileXMLtoDOM(":/resources/blankXML/ListSubProc.xml", &commonDOM)) return QByteArray(); QDomNode listNode = commonDOM.namedItem("ListSubProc"); @@ -24,7 +24,7 @@ QByteArray DocsAnswerParser::listSubProc(QList list, QString dmCode) subProcNode.toElement().setAttribute("canplay", subProc.getModeListStr()); } - Tools::saveDOMtoXML("ListSubProc.xml", &commonDOM); + Tools::saveDOMtoFileXML("ListSubProc.xml", &commonDOM); return commonDOM.toByteArray(); } diff --git a/LibServer/Systems/docsupdater.cpp b/LibServer/Systems/docsupdater.cpp index b991a9f..d3b002a 100644 --- a/LibServer/Systems/docsupdater.cpp +++ b/LibServer/Systems/docsupdater.cpp @@ -44,7 +44,7 @@ bool DocsUpdater::updateDocsXML() QString pathDocsFile = updateController->getPathAdditionalFile(tasksAMMfileName); QDomDocument docTasksDOM; - if(! Tools::loadXMLtoDOM(pathDocsFile, &docTasksDOM)) + if(! Tools::loadFileXMLtoDOM(pathDocsFile, &docTasksDOM)) return false; QDomElement manifestElement = docTasksDOM.firstChildElement("manifest"); @@ -59,7 +59,7 @@ bool DocsUpdater::updateDocsXML() domElementParserAMM(manifestElement, nullptr); - if(! Tools::saveDOMtoXML(pathDocsFile, &docTasksDOM)) + if(! Tools::saveDOMtoFileXML(pathDocsFile, &docTasksDOM)) { deleteAllModulsAMM(); listTasksAMM.clear(); @@ -271,7 +271,7 @@ bool DocsUpdater::processingScenXML(const QString dmCode, QString &canplay, QLis QDomDocument docScenDOM; - if(! Tools::loadXMLtoDOM(pathScenXMLFile, &docScenDOM)) + if(! Tools::loadFileXMLtoDOM(pathScenXMLFile, &docScenDOM)) return false; QDomElement scenarioElement = docScenDOM.firstChildElement("scenario"); diff --git a/LibServer/Systems/processingsystem.cpp b/LibServer/Systems/processingsystem.cpp index 28d15a5..76858ce 100644 --- a/LibServer/Systems/processingsystem.cpp +++ b/LibServer/Systems/processingsystem.cpp @@ -7,12 +7,13 @@ ProcessingSystem::ProcessingSystem(ProviderDBLMS* providerDBLMS, UpdateControlle QObject(parent), updateController(nullptr), docsUpdater(nullptr), - cfiController(cfiController), + cfiController(nullptr), providerDBLMS(nullptr) { this->providerDBLMS = providerDBLMS; this->updateController = updateController; this->docsUpdater = docsUpdater; + this->cfiController = cfiController; } void ProcessingSystem::initialize(MultiThreadServer *server, DataParser *dataParser, diff --git a/LibServer/Systems/tools.cpp b/LibServer/Systems/tools.cpp index 8545641..c3aaee6 100644 --- a/LibServer/Systems/tools.cpp +++ b/LibServer/Systems/tools.cpp @@ -105,9 +105,15 @@ bool Tools::checkNonStaticData(QString path) return false; } +bool Tools::loadByteArrayXMLtoDOM(const QByteArray &array, QDomDocument *commonDOM) +{ + commonDOM->setContent(array); + return true; +} -bool Tools::loadXMLtoDOM(QString pathNameFile, QDomDocument *commonDOM) + +bool Tools::loadFileXMLtoDOM(QString pathNameFile, QDomDocument *commonDOM) { QFile xmlInFile(pathNameFile); @@ -122,7 +128,23 @@ bool Tools::loadXMLtoDOM(QString pathNameFile, QDomDocument *commonDOM) return true; } -bool Tools::saveDOMtoXML(QString pathNameFile, QDomDocument *commonDOM) +bool Tools::loadFileXMLtoByteArray(QString pathNameFile, QByteArray &array) +{ + QFile xmlInFile(pathNameFile); + + if (! xmlInFile.open(QFile::ReadOnly | QFile::Text)) { + qDebug() << "loadXMLtoDOM: Couldn't read the file: " + pathNameFile; + return false; + } + + array = xmlInFile.readAll(); + + xmlInFile.close(); + + return true; +} + +bool Tools::saveDOMtoFileXML(QString pathNameFile, QDomDocument *commonDOM) { QFile xmlOutFile(pathNameFile); if (!xmlOutFile.open(QFile::WriteOnly | QFile::Text)) diff --git a/LibServer/Systems/tools.h b/LibServer/Systems/tools.h index 12e6d68..faf611b 100644 --- a/LibServer/Systems/tools.h +++ b/LibServer/Systems/tools.h @@ -76,8 +76,10 @@ public: static QString createFullPath(QString path); static bool checkNonStaticData(QString path); - static bool loadXMLtoDOM(QString pathNameFile, QDomDocument* commonDOM); - static bool saveDOMtoXML(QString pathNameFile, QDomDocument* commonDOM); + static bool loadByteArrayXMLtoDOM(const QByteArray& array, QDomDocument* commonDOM); + static bool loadFileXMLtoDOM(QString pathNameFile, QDomDocument* commonDOM); + static bool loadFileXMLtoByteArray(QString pathNameFile, QByteArray& array); + static bool saveDOMtoFileXML(QString pathNameFile, QDomDocument* commonDOM); }; diff --git a/LibServer/cficontroller/cficontroller.cpp b/LibServer/cficontroller/cficontroller.cpp index 21a2490..b001005 100644 --- a/LibServer/cficontroller/cficontroller.cpp +++ b/LibServer/cficontroller/cficontroller.cpp @@ -23,7 +23,8 @@ void CfiController::unLockAccessToCfiXML() mtxAccess.unlock(); } -bool CfiController::parsingCfiXML() + +bool CfiController::parsingCfiXML(QMap& mapCfiObjects) { QMutexLocker locker(&mtxAccess); @@ -32,15 +33,91 @@ bool CfiController::parsingCfiXML() QString pathCfiListFile = updateController->getPathAdditionalFile(cfiListFileName); - QDomDocument docCfiListDOM; - if(! Tools::loadXMLtoDOM(pathCfiListFile, &docCfiListDOM)) + QDomDocument docCfiListDOM_Orig; + if(! Tools::loadFileXMLtoDOM(pathCfiListFile, &docCfiListDOM_Orig)) return false; - QDomElement CFIObjectsElement = docCfiListDOM.firstChildElement("CFIObjects"); + if(!parsingCfiXML_DOM(docCfiListDOM_Orig, mapCfiObjects)) + return false; + + return true; +} + + +bool CfiController::updateCfiXML(const QByteArray &array) +{ + QMutexLocker locker(&mtxAccess); + + if(!updateController) + return false; + + //Исходный файл (на Сервере) + QString pathCfiListFile = updateController->getPathAdditionalFile(cfiListFileName); + QDomDocument docCfiListDOM_Orig; + if(! Tools::loadFileXMLtoDOM(pathCfiListFile, &docCfiListDOM_Orig)) + return false; + + //Новый файл с изменениями (поступивший от клиента) в формате массива + QDomDocument docCfiListDOM_New; + if(! Tools::loadByteArrayXMLtoDOM(array, &docCfiListDOM_New)) + return false; + + QMap mapCfiObjects_Orig; + QMap mapCfiObjects_New; + + if(!parsingCfiXML_DOM(docCfiListDOM_Orig, mapCfiObjects_Orig)) + return false; + + if(!parsingCfiXML_DOM(docCfiListDOM_New, mapCfiObjects_New)) + return false; + + if(!merge2map(mapCfiObjects_Orig, mapCfiObjects_New)) + return false; + + return saveNewCfiListFile(mapCfiObjects_Orig); +} + +/* +void CfiController::test() +{ + QString pathCfiListFile = updateController->getPathAdditionalFile("/new_CfiList.xml"); + QByteArray array; + Tools::loadFileXMLtoByteArray(pathCfiListFile, array); + updateCfiXML(array); +} +*/ + +Vector3dDouble CfiController::getXYZfromElement(QDomElement element) +{ + Vector3dDouble vector3D; + QDomNamedNodeMap nodeMap = element.attributes(); + vector3D.setX(germanLocale->toDouble(nodeMap.namedItem("x").nodeValue())); + vector3D.setY(germanLocale->toDouble(nodeMap.namedItem("y").nodeValue())); + vector3D.setZ(germanLocale->toDouble(nodeMap.namedItem("z").nodeValue())); + return vector3D; +} + +Vector2dDouble CfiController::getXYfromElement(QDomElement element) +{ + Vector2dDouble vector2D; + QDomNamedNodeMap nodeMap = element.attributes(); + vector2D.setX(germanLocale->toDouble(nodeMap.namedItem("x").nodeValue())); + vector2D.setY(germanLocale->toDouble(nodeMap.namedItem("y").nodeValue())); + return vector2D; +} + +double CfiController::roundDoubleVal(double value, int cntNumAfterPoint) +{ + return round(value * pow(10, cntNumAfterPoint)) / pow(10, cntNumAfterPoint); +} + +bool CfiController::parsingCfiXML_DOM(QDomDocument &domDoc, QMap& mapCfiObjects) +{ + QDomElement CFIObjectsElement = domDoc.firstChildElement("CFIObjects"); if(CFIObjectsElement.isNull()) return false; - listCfiObjects.clear(); + mapCfiObjects.clear(); //Parsing QDomElement oneCFIObjectElement = CFIObjectsElement.firstChildElement(); @@ -57,6 +134,8 @@ bool CfiController::parsingCfiXML() { CfiObject cfiObj; + cfiObj.setDomElement(oneCFIObjectElement); + //атрибуты CFIObject QDomNamedNodeMap nodeMapOneCFIObject = oneCFIObjectElement.attributes(); cfiObj.setId(nodeMapOneCFIObject.namedItem("id").nodeValue().toInt()); @@ -85,15 +164,15 @@ bool CfiController::parsingCfiXML() setCamPos.state = nodeMapSetcamerapos.namedItem("state").nodeValue(); setCamPos.panelName = nodeMapSetcamerapos.namedItem("panelName").nodeValue(); - setCamPos.prevCamOffsetMARposY = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("prevCamOffsetMARposY").nodeValue()); - setCamPos.camOffsetMARposY = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("camOffsetMARposY").nodeValue()); - setCamPos.prevCharControlerHeight = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("prevCharControlerHeight").nodeValue()); - setCamPos.charControlerHeight = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("charControlerHeight").nodeValue()); - setCamPos.FOV = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("FOV").nodeValue()); - setCamPos.moveSpeed = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("moveSpeed").nodeValue()); - setCamPos.projectionSize = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("projectionSize").nodeValue()); - setCamPos.offset = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("offset").nodeValue()); - setCamPos.prevPlayerRot = germanLocale->toFloat(nodeMapSetcamerapos.namedItem("prevPlayerRot").nodeValue()); + setCamPos.prevCamOffsetMARposY = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("prevCamOffsetMARposY").nodeValue()); + setCamPos.camOffsetMARposY = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("camOffsetMARposY").nodeValue()); + setCamPos.prevCharControlerHeight = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("prevCharControlerHeight").nodeValue()); + setCamPos.charControlerHeight = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("charControlerHeight").nodeValue()); + setCamPos.FOV = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("FOV").nodeValue()); + setCamPos.moveSpeed = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("moveSpeed").nodeValue()); + setCamPos.projectionSize = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("projectionSize").nodeValue()); + setCamPos.offset = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("offset").nodeValue()); + setCamPos.prevPlayerRot = germanLocale->toDouble(nodeMapSetcamerapos.namedItem("prevPlayerRot").nodeValue()); //childs setcamerapos QDomElement loc_Element; @@ -122,28 +201,55 @@ bool CfiController::parsingCfiXML() cfiObj.setSetCameraPos(setCamPos); - listCfiObjects.append(cfiObj); + mapCfiObjects.insert(cfiObj.getId(), cfiObj); } }while (! (oneCFIObjectElement = oneCFIObjectElement.nextSiblingElement()).isNull()); return true; } -QVector3D CfiController::getXYZfromElement(QDomElement element) +bool CfiController::merge2map(QMap &mapCfiObjects_orig, QMap &mapCfiObjects_new) { - QVector3D vector3D; - QDomNamedNodeMap nodeMap = element.attributes(); - vector3D.setX(germanLocale->toFloat(nodeMap.namedItem("x").nodeValue())); - vector3D.setY(germanLocale->toFloat(nodeMap.namedItem("y").nodeValue())); - vector3D.setZ(germanLocale->toFloat(nodeMap.namedItem("z").nodeValue())); - return vector3D; + for(CfiObject cfiObj : mapCfiObjects_new) + { + int id = cfiObj.getId(); + + if(mapCfiObjects_orig.contains(id)) + {//Такой есть + if(cfiObj.getIsChanged()) + {//Заменяем + mapCfiObjects_orig.take(id); + + cfiObj.setIsChanged(false); + cfiObj.resetIsChangedInDomElement(); + mapCfiObjects_orig.insert(id, cfiObj); + } + } + else + {//Добавляем + cfiObj.setIsChanged(false); + cfiObj.resetIsChangedInDomElement(); + mapCfiObjects_orig.insert(id, cfiObj); + } + } + + return true; } -QVector2D CfiController::getXYfromElement(QDomElement element) +bool CfiController::saveNewCfiListFile(QMap &mapCfiObjects) { - QVector2D vector2D; - QDomNamedNodeMap nodeMap = element.attributes(); - vector2D.setX(germanLocale->toFloat(nodeMap.namedItem("x").nodeValue())); - vector2D.setY(germanLocale->toFloat(nodeMap.namedItem("y").nodeValue())); - return vector2D; + QDomDocument commonDOM; + if(! Tools::loadFileXMLtoDOM(":/resources/blankXML/ListCFI.xml", &commonDOM)) + return false; + + QDomNode listNode = commonDOM.namedItem("CFIObjects"); + + for(CfiObject cfiObj : mapCfiObjects) + { + listNode.appendChild(cfiObj.getDomElement()); + } + + QString pathCfiListFile = updateController->getPathAdditionalFile(cfiListFileName); + + return Tools::saveDOMtoFileXML(pathCfiListFile, &commonDOM); } diff --git a/LibServer/cficontroller/cficontroller.h b/LibServer/cficontroller/cficontroller.h index f5ac475..0272509 100644 --- a/LibServer/cficontroller/cficontroller.h +++ b/LibServer/cficontroller/cficontroller.h @@ -17,20 +17,35 @@ public: void lockAccessToCfiXML(); void unLockAccessToCfiXML(); - bool parsingCfiXML(); + //Распарсивание файла CfiList.xml + bool parsingCfiXML(QMap& mapCfiObjects); + + //Слияние (обновление) с новыми данными + bool updateCfiXML(const QByteArray& array); + + //Для теста + //void test(); signals: private: - QVector3D getXYZfromElement(QDomElement element); - QVector2D getXYfromElement(QDomElement element); + Vector3dDouble getXYZfromElement(QDomElement element); + Vector2dDouble getXYfromElement(QDomElement element); + + double roundDoubleVal(double value, int cntNumAfterPoint); + + bool parsingCfiXML_DOM(QDomDocument& domDoc, QMap& mapCfiObjects); + + bool merge2map(QMap& mapCfiObjects_orig, QMap& mapCfiObjects_new); + + bool saveNewCfiListFile(QMap& mapCfiObjects); private: UpdateController* updateController; QMutex mtxAccess; - QList listCfiObjects; + //QList listCfiObjects; QLocale* germanLocale; }; diff --git a/LibServer/cficontroller/cfiobject.cpp b/LibServer/cficontroller/cfiobject.cpp index 69038fa..6e0366d 100644 --- a/LibServer/cficontroller/cfiobject.cpp +++ b/LibServer/cficontroller/cfiobject.cpp @@ -74,3 +74,18 @@ void CfiObject::setIsChanged(bool value) { isChanged = value; } + +QDomElement CfiObject::getDomElement() const +{ + return domElement; +} + +void CfiObject::setDomElement(const QDomElement &value) +{ + domElement = value; +} + +void CfiObject::resetIsChangedInDomElement() +{ + domElement.setAttribute("isChanged", "False"); +} diff --git a/LibServer/cficontroller/cfiobject.h b/LibServer/cficontroller/cfiobject.h index 46a5827..ba1a4f0 100644 --- a/LibServer/cficontroller/cfiobject.h +++ b/LibServer/cficontroller/cfiobject.h @@ -1,10 +1,9 @@ #ifndef CFIOBJECT_H #define CFIOBJECT_H +#include "vectordouble.h" #include -#include -#include -#include +#include struct SetCameraPos { @@ -24,18 +23,18 @@ struct SetCameraPos float offset; float prevPlayerRot; - QVector2D axesClamp; + Vector2dDouble axesClamp; - QVector3D prevPlayerPos; - QVector3D playerPos; - QVector3D playerRot; - QVector3D prevCamRot; - QVector3D camRot; - QVector3D goCenter; - QVector3D playerMARpos; - QVector3D playerMARrot; - QVector3D camMARrot; - QVector3D playerPosRelativeToThePanel; + Vector3dDouble prevPlayerPos; + Vector3dDouble playerPos; + Vector3dDouble playerRot; + Vector3dDouble prevCamRot; + Vector3dDouble camRot; + Vector3dDouble goCenter; + Vector3dDouble playerMARpos; + Vector3dDouble playerMARrot; + Vector3dDouble camMARrot; + Vector3dDouble playerPosRelativeToThePanel; }; class CfiObject @@ -64,6 +63,11 @@ public: bool getIsChanged() const; void setIsChanged(bool value); + QDomElement getDomElement() const; + void setDomElement(const QDomElement &value); + + void resetIsChangedInDomElement(); + private: int id; bool isChanged; @@ -73,6 +77,8 @@ private: QString goName; SetCameraPos setCameraPos; + + QDomElement domElement; }; #endif // CFIOBJECT_H diff --git a/LibServer/cficontroller/vectordouble.cpp b/LibServer/cficontroller/vectordouble.cpp new file mode 100644 index 0000000..4032be2 --- /dev/null +++ b/LibServer/cficontroller/vectordouble.cpp @@ -0,0 +1,66 @@ +#include "vectordouble.h" + +Vector2dDouble::Vector2dDouble() : + x(0.0), + y(0.0) +{ + +} + +double Vector2dDouble::getX() const +{ + return x; +} + +void Vector2dDouble::setX(double value) +{ + x = value; +} + +double Vector2dDouble::getY() const +{ + return y; +} + +void Vector2dDouble::setY(double value) +{ + y = value; +} + +Vector3dDouble::Vector3dDouble() : + x(0.0), + y(0.0), + z(0.0) +{ + +} + +double Vector3dDouble::getX() const +{ + return x; +} + +void Vector3dDouble::setX(double value) +{ + x = value; +} + +double Vector3dDouble::getY() const +{ + return y; +} + +void Vector3dDouble::setY(double value) +{ + y = value; +} + +double Vector3dDouble::getZ() const +{ + return z; +} + +void Vector3dDouble::setZ(double value) +{ + z = value; +} diff --git a/LibServer/cficontroller/vectordouble.h b/LibServer/cficontroller/vectordouble.h new file mode 100644 index 0000000..33fae33 --- /dev/null +++ b/LibServer/cficontroller/vectordouble.h @@ -0,0 +1,42 @@ +#ifndef VECTORDOUBLE_H +#define VECTORDOUBLE_H + + +class Vector2dDouble +{ +public: + Vector2dDouble(); + + double getX() const; + void setX(double value); + + double getY() const; + void setY(double value); + +private: + double x; + double y; +}; + + +class Vector3dDouble +{ +public: + Vector3dDouble(); + + double getX() const; + void setX(double value); + + double getY() const; + void setY(double value); + + double getZ() const; + void setZ(double value); + +private: + double x; + double y; + double z; +}; + +#endif // VECTORDOUBLE_H diff --git a/LibServer/resources/blankXML/ListCFI.xml b/LibServer/resources/blankXML/ListCFI.xml new file mode 100644 index 0000000..20c5f5e --- /dev/null +++ b/LibServer/resources/blankXML/ListCFI.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/LibServer/serverlmswidget.cpp b/LibServer/serverlmswidget.cpp index 6467b12..1cc0851 100644 --- a/LibServer/serverlmswidget.cpp +++ b/LibServer/serverlmswidget.cpp @@ -155,19 +155,7 @@ void ServerLMSWidget::slot_UpdateDocs() QApplication::restoreOverrideCursor(); //TODO для теста - //slot_ParsingCfiXML(); -} - -void ServerLMSWidget::slot_ParsingCfiXML() -{ - QApplication::setOverrideCursor(Qt::WaitCursor); - - if(cfiController->parsingCfiXML()) - { - //TODO...что-то, наверное, должно происходить? - } - - QApplication::restoreOverrideCursor(); + //cfiController->test(); } void ServerLMSWidget::slot_startInitialization_step1() diff --git a/LibServer/serverlmswidget.h b/LibServer/serverlmswidget.h index 8687407..4ba16e2 100644 --- a/LibServer/serverlmswidget.h +++ b/LibServer/serverlmswidget.h @@ -101,8 +101,6 @@ public slots: void slot_UpdateDocs(); - void slot_ParsingCfiXML(); - void slot_startInitialization_step1(); void slot_setVersion(QString versionStr);