/** * 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