Files
qt5-legatus-legacy/Lts/Services/ParticipantManagement/ParticipantHandling/participant_for_exercise.cpp
T
2026-08-13 18:33:10 +02:00

142 lines
4.6 KiB
C++
Executable File

/**
* The Participant class is the base class for either Buildings or ExerciseParticipants.
* $Id$
* $HeadURL$
* $Author$
* Created by Hannes Baeuerle, SLSE, 2016-05-23
*/
#include "participant_for_exercise.h"
#include "main_handler.h"
#include "convert_db_to_dds.h"
namespace ParticipantManagement
{
namespace ParticipantHandling
{
//
// ParticipantForExercise
//
ParticipantForExercise::ParticipantForExercise(MainHandler *mainHandler,
ParticipantHandler *particpantHandler,
UnitPositionCalculator *unitPosCalculator,
const Database::PpmParticipant &data)
: Participant(particpantHandler, unitPosCalculator, data, "Participant")
, m_mainHandler(mainHandler)
{}
ParticipantForExercise::~ParticipantForExercise()
{
removeFromDds();
}
bool ParticipantForExercise::applyEquipmentExerciseMapping(int newEqId)
{
if (!newEqId)
return true;
if (m_equipmentExerciseMappingPublished.equipmentNumber == newEqId &&
m_equipmentExerciseMappingPublished.participantId == id() &&
m_equipmentExerciseMappingPublished.exerciseId == m_mainHandler->exerciseId())
return true;
Database::EquipmentExerciseMapping dbEem;
dbEem.equipmentNumber = newEqId;
dbEem.participantId = id();
dbEem.exerciseId = m_mainHandler->exerciseId();
DEBUG_LOG(m_logger) << "Inserting EquipmentExerciseMapping into db: " << dbEem.equipmentNumber
<< ", " << dbEem.participantId
<< ", " << dbEem.exerciseId;
if (!m_mainHandler->dbEx0()->insert(dbEem))
{
m_participantData.equipmentNumber().reset();
m_participantData.assignState(ParticipantAssignState::NotAssigned);
publishParticipant();
return false;
}
m_participantHandler->setEquipmentNumberForParticipant(m_equipmentExerciseMappingPublished.equipmentNumber,
dbEem.equipmentNumber,
id());
m_equipmentExerciseMappingPublished = dbEem;
return true;
}
void ParticipantForExercise::removeEquipmentExerciseMapping(int oldEqId, bool bIsShutdown)
{
if (!oldEqId)
return;
m_equipmentExerciseMappingPublished = Database::EquipmentExerciseMapping();
if (!bIsShutdown)
{
Database::EquipmentExerciseMapping dbEem;
dbEem.equipmentNumber = oldEqId;
dbEem.participantId = id();
dbEem.exerciseId = m_mainHandler->exerciseId();
m_mainHandler->dbEx0()->removeEquipmentExerciseMapping(dbEem);
m_participantHandler->setEquipmentNumberForParticipant(oldEqId, 0, id());
}
}
bool ParticipantForExercise::updateEquipmentExerciseMapping(int oldEqId, int newEqId)
{
DEBUG_LOG(m_logger) << "updateEquipmentExerciseMapping from " << oldEqId << " to " << newEqId;
if (oldEqId == newEqId)
return true;
removeEquipmentExerciseMapping(oldEqId, false);
return applyEquipmentExerciseMapping(newEqId);
}
bool ParticipantForExercise::publishParticipant()
{
return Participant::publishParticipant();
}
void ParticipantForExercise::removeFromDds() // only called on shutdown
{
removeEquipmentExerciseMapping(equipmentNumber(), true);
Participant::removeFromDds();
}
void ParticipantForExercise::registerInfoFromFt(const RegisterParticipantRequest &request)
{
m_participantData.info(request.info());
m_participantData.identification(request.identification());
}
bool ParticipantForExercise::registerFromFt(const RegisterParticipantRequest &request)
{
int newEquipmentNumber = request.equipmentNumber();
// just to be sure ...
if (request.assignState() == ParticipantAssignState::NotAssigned)
newEquipmentNumber = 0;
if (!updateEquipmentExerciseMapping(equipmentNumber(), newEquipmentNumber))
return false;
particpantHandler()->setEquipmentNumberForParticipant(equipmentNumber(),
newEquipmentNumber,
id());
INFO_LOG(m_logger) << "Set assign state for participant " << id() << " from "
<< assignState() << " to " << request.assignState()
<< ", old eqid: " << equipmentNumber() << ", new eqid: "
<< newEquipmentNumber;
if (newEquipmentNumber)
m_participantData.equipmentNumber(newEquipmentNumber);
else
m_participantData.equipmentNumber().reset();
m_participantData.assignState(request.assignState());
m_participantData.info(request.info());
m_participantData.identification(request.identification());
return true;
}
} // namespace ParticipantHandling
} // namespace ParticipantManagement