diff --git a/LibServer/CMakeLists.txt b/LibServer/CMakeLists.txt index f95621d..1a8cdf2 100644 --- a/LibServer/CMakeLists.txt +++ b/LibServer/CMakeLists.txt @@ -58,6 +58,12 @@ 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 + cficontroller/vectordouble.cpp + cficontroller/vectordouble.h Server.qrc ) @@ -74,6 +80,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/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/commonclienthandler.cpp b/LibServer/Systems/commonclienthandler.cpp index 7e3bb5d..79435c7 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), LogLevel::DEBUG); + else + Logger::instance().log("All Sending " + handler->getClient()->getLogin() + " " + enumToString(packetType), LogLevel::DEBUG); } //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/docsupdater.cpp b/LibServer/Systems/docsupdater.cpp index 8dc166c..d3b002a 100644 --- a/LibServer/Systems/docsupdater.cpp +++ b/LibServer/Systems/docsupdater.cpp @@ -41,11 +41,10 @@ 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)) + if(! Tools::loadFileXMLtoDOM(pathDocsFile, &docTasksDOM)) return false; QDomElement manifestElement = docTasksDOM.firstChildElement("manifest"); @@ -60,7 +59,7 @@ bool DocsUpdater::updateDocsXML() domElementParserAMM(manifestElement, nullptr); - if(! Tools::saveDOMtoXML(pathDocsFile, &docTasksDOM)) + if(! Tools::saveDOMtoFileXML(pathDocsFile, &docTasksDOM)) { deleteAllModulsAMM(); listTasksAMM.clear(); @@ -272,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 69bdda2..d266fc8 100644 --- a/LibServer/Systems/processingsystem.cpp +++ b/LibServer/Systems/processingsystem.cpp @@ -3,15 +3,17 @@ #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(nullptr), providerDBLMS(nullptr) { this->providerDBLMS = providerDBLMS; this->updateController = updateController; this->docsUpdater = docsUpdater; + this->cfiController = cfiController; } void ProcessingSystem::initialize(MultiThreadServer *server, DataParser *dataParser, @@ -97,12 +99,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/processingsystem.h b/LibServer/Systems/processingsystem.h index 90a6392..a640089 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, @@ -75,6 +77,7 @@ private: DataParser *dataParser; UpdateController *updateController; DocsUpdater* docsUpdater; + CfiController* cfiController; ProviderDBLMS* providerDBLMS; ChatSystem *chatSystem; void sendTaskListToUnity(ClientHandler *client); 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 572661c..faf611b 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"; @@ -75,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/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 new file mode 100644 index 0000000..b001005 --- /dev/null +++ b/LibServer/cficontroller/cficontroller.cpp @@ -0,0 +1,255 @@ +#include "cficontroller.h" + +CfiController::CfiController(UpdateController* updateController, QObject *parent) : + QObject(parent), + updateController(updateController), + germanLocale(nullptr) +{ + germanLocale = new QLocale(QLocale::German); +} + +CfiController::~CfiController() +{ + +} + +void CfiController::lockAccessToCfiXML() +{ + mtxAccess.lock(); +} + +void CfiController::unLockAccessToCfiXML() +{ + mtxAccess.unlock(); +} + + +bool CfiController::parsingCfiXML(QMap& mapCfiObjects) +{ + QMutexLocker locker(&mtxAccess); + + if(!updateController) + return false; + + QString pathCfiListFile = updateController->getPathAdditionalFile(cfiListFileName); + + QDomDocument docCfiListDOM_Orig; + if(! Tools::loadFileXMLtoDOM(pathCfiListFile, &docCfiListDOM_Orig)) + return false; + + 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; + + mapCfiObjects.clear(); + + //Parsing + QDomElement oneCFIObjectElement = CFIObjectsElement.firstChildElement(); + if(oneCFIObjectElement.isNull()) + return true; + + QString name; + + do + { + name = oneCFIObjectElement.nodeName(); + + if(name == "CFIObject") + { + CfiObject cfiObj; + + cfiObj.setDomElement(oneCFIObjectElement); + + //атрибуты 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 = 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; + 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); + + mapCfiObjects.insert(cfiObj.getId(), cfiObj); + } + }while (! (oneCFIObjectElement = oneCFIObjectElement.nextSiblingElement()).isNull()); + + return true; +} + +bool CfiController::merge2map(QMap &mapCfiObjects_orig, QMap &mapCfiObjects_new) +{ + 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; +} + +bool CfiController::saveNewCfiListFile(QMap &mapCfiObjects) +{ + 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 new file mode 100644 index 0000000..0272509 --- /dev/null +++ b/LibServer/cficontroller/cficontroller.h @@ -0,0 +1,53 @@ +#ifndef CFICONTROLLER_H +#define CFICONTROLLER_H + +#include +#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(); + + //Распарсивание файла CfiList.xml + bool parsingCfiXML(QMap& mapCfiObjects); + + //Слияние (обновление) с новыми данными + bool updateCfiXML(const QByteArray& array); + + //Для теста + //void test(); + +signals: + +private: + 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; + + QLocale* germanLocale; +}; + +#endif // CFICONTROLLER_H diff --git a/LibServer/cficontroller/cfiobject.cpp b/LibServer/cficontroller/cfiobject.cpp new file mode 100644 index 0000000..6e0366d --- /dev/null +++ b/LibServer/cficontroller/cfiobject.cpp @@ -0,0 +1,91 @@ +#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; +} + +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 new file mode 100644 index 0000000..ba1a4f0 --- /dev/null +++ b/LibServer/cficontroller/cfiobject.h @@ -0,0 +1,84 @@ +#ifndef CFIOBJECT_H +#define CFIOBJECT_H + +#include "vectordouble.h" +#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; + + Vector2dDouble axesClamp; + + Vector3dDouble prevPlayerPos; + Vector3dDouble playerPos; + Vector3dDouble playerRot; + Vector3dDouble prevCamRot; + Vector3dDouble camRot; + Vector3dDouble goCenter; + Vector3dDouble playerMARpos; + Vector3dDouble playerMARrot; + Vector3dDouble camMARrot; + Vector3dDouble 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); + + QDomElement getDomElement() const; + void setDomElement(const QDomElement &value); + + void resetIsChangedInDomElement(); + +private: + int id; + bool isChanged; + QString cfiName; + QString cfi; + QString zoneName; + 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/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/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 d94a670..1cc0851 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,9 @@ void ServerLMSWidget::slot_UpdateDocs() emit signal_DocsChanged(); QApplication::restoreOverrideCursor(); + + //TODO для теста + //cfiController->test(); } void ServerLMSWidget::slot_startInitialization_step1() @@ -374,7 +379,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); @@ -384,8 +392,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::AutoConnection); - connect(updateController, &UpdateController::signal_BlockAutorization, server, &MultiThreadServer::slot_BlockAutorization, Qt::AutoConnection); + 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(); diff --git a/LibServer/serverlmswidget.h b/LibServer/serverlmswidget.h index 9e16997..4ba16e2 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 { @@ -176,7 +179,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()