Files
RRJServer/LibServer/cficontroller/cficontroller.cpp
2026-02-10 16:28:28 +03:00

329 lines
12 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "cficontroller.h"
CfiController::CfiController(UpdateController* updateController, QObject *parent) :
QObject(parent),
updateController(updateController),
germanLocale(nullptr)
{
qDebug() << "CfiController init thread ID " << QThread::currentThreadId();
germanLocale = new QLocale(QLocale::German);
}
CfiController::~CfiController()
{
}
void CfiController::lockAccessToCfiXML()
{
mtxAccess.lock();
}
void CfiController::unLockAccessToCfiXML()
{
mtxAccess.unlock();
}
bool CfiController::parsingCfiXML(QMap<QString, CfiObject>& 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<QString, CfiObject> mapCfiObjects_Orig;
QMap<QString, CfiObject> mapCfiObjects_New;
if(!parsingCfiXML_DOM(docCfiListDOM_Orig, mapCfiObjects_Orig))
return false;
if(!parsingCfiXML_DOM(docCfiListDOM_New, mapCfiObjects_New))
return false;
if(!merge2map_single(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<QString, CfiObject>& 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.setGuid(nodeMapOneCFIObject.namedItem("guid").nodeValue());
cfiObj.setIsChanged(nodeMapOneCFIObject.namedItem("isChanged").nodeValue() == "True" ? true : false);
cfiObj.setStatus(nodeMapOneCFIObject.namedItem("status").nodeValue());
//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.getGuid(), cfiObj);
}
}while (! (oneCFIObjectElement = oneCFIObjectElement.nextSiblingElement()).isNull());
return true;
}
bool CfiController::merge2map_commonList(QMap<QString, CfiObject> &mapCfiObjects_orig, QMap<QString, CfiObject> &mapCfiObjects_new)
{
//Проверка на удаление
for(CfiObject cfiObj : mapCfiObjects_orig)
{
QString guid = cfiObj.getGuid();
if(!mapCfiObjects_new.contains(guid))
{//Удаляем
mapCfiObjects_orig.take(guid);
}
}
//Замена, Добавление
for(CfiObject cfiObj : mapCfiObjects_new)
{
QString guid = cfiObj.getGuid();
if(mapCfiObjects_orig.contains(guid))
{//Такой есть
if(cfiObj.getIsChanged())
{//Заменяем
mapCfiObjects_orig.take(guid);
cfiObj.setIsChanged(false);
cfiObj.resetIsChangedInDomElement();
mapCfiObjects_orig.insert(guid, cfiObj);
}
}
else
{//Добавляем
cfiObj.setIsChanged(false);
cfiObj.resetIsChangedInDomElement();
mapCfiObjects_orig.insert(guid, cfiObj);
}
}
return true;
}
bool CfiController::merge2map_single(QMap<QString, CfiObject> &mapCfiObjects_orig, QMap<QString, CfiObject> &mapCfiObjects_new)
{
//Замена, Добавление, Удаление
for(CfiObject cfiObj : mapCfiObjects_new)
{
QString status = cfiObj.getStatus();
QString guid = cfiObj.getGuid();
if(status == "new")
{
if(mapCfiObjects_orig.contains(guid))
{//Такой есть!
QString msg = "CfiController: [status - new] guid cfiObj already exists!";
qDebug() << msg;
Logger::instance().log(msg, LogLevel::DEBUG);
}
else
{
cfiObj.setStatus("accepted");
cfiObj.resetStatusInDomElement();
mapCfiObjects_orig.insert(guid, cfiObj);
}
}
else if(status == "deleted")
{
if(mapCfiObjects_orig.contains(guid))
{
mapCfiObjects_orig.take(guid);
}
else
{
QString msg = "CfiController: [status - deleted] guid cfiObj does not exist!";
qDebug() << msg;
Logger::instance().log(msg, LogLevel::DEBUG);
}
}
else if(status == "edited")
{
if(mapCfiObjects_orig.contains(guid))
{
mapCfiObjects_orig.take(guid);
cfiObj.setStatus("accepted");
cfiObj.resetStatusInDomElement();
mapCfiObjects_orig.insert(guid, cfiObj);
}
else
{
QString msg = "CfiController: [status - edited] guid cfiObj does not exist!";
qDebug() << msg;
Logger::instance().log(msg, LogLevel::DEBUG);
}
}
}
return true;
}
bool CfiController::saveNewCfiListFile(QMap<QString, CfiObject> &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);
}