#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); }