/** * Handler for all exercise objects * $Id$ * $HeadURL$ * $Author$ * Created by Hanna E. Rathje, SLSE, 2015-09-03 */ #include "handler_danger_area.h" #include "object_danger_area.h" #include #include #include namespace AreaEffectSimulation { HandlerDangerArea::HandlerDangerArea(MainHandler *mainHandler) : HandlerBase(mainHandler, QStringLiteral("DangerArea")) , Interface::Fts::DangerAreaModifyRequestHandler(mainHandler->dds()->fts()) , Interface::Fts::DangerAreaRemoveRequestHandler(mainHandler->dds()->fts()) {} bool HandlerDangerArea::init() { QVector areaVec; // read all DangerAreas from database if (!m_mainHandler->db()->select(areaVec)) { ERROR_LOG(m_logger) << "Error reading data from database!"; return false; } QVector segmentVec; // read all Danger Segments from database if (!m_mainHandler->db()->select(segmentVec)) { ERROR_LOG(m_logger) << "Error reading data from database!"; return false; } // create area mine objects QVector mySegments; for (const Database::AesDangerArea &area : qAsConst(areaVec)) { // Gather segments mySegments.clear(); for (const Database::AesDangerSegment &mas : qAsConst(segmentVec)) { if (mas.dangerAreaId == area.privDangerAreaId) mySegments << mas; } // Create and init Object ObjectDangerArea *ifs(new ObjectDangerArea(m_mainHandler, this)); Core::FunctionReplyObject ret = ifs->createObject(area, {}, mySegments); if (ret.error()) { delete ifs; ERROR_LOG(m_logger) << ret(); return false; } // Push into Map m_dangerAreaObjMap.insert(ifs->id(), ifs); connect(ifs, &ObjectDangerArea::newAiv, this, &HandlerDangerArea::newAiv); connect(ifs, &ObjectDangerArea::removeAiv, this, &HandlerDangerArea::removeAiv); } DEBUG_LOG(m_logger) << "m_dangerAreaObjMap.size() = " << m_dangerAreaObjMap.size(); return true; } void HandlerDangerArea::onDangerAreaModifyRequest(const rti::core::SampleIdentity &cookie, const DangerAreaModifyRequest &request) { DEBUG_LOG(m_logger) << "onDangerAreaModifyRequest: " << request; Core::FunctionReplyObject ret = dangerAreaModifyRequest(request); if (ret.error()) WARNING_LOG(m_logger) << ret(); m_mainHandler->dds()->fts()->dangerAreaModifyReply(cookie, ret); } Core::FunctionReplyObject HandlerDangerArea::dangerAreaCreateRequest(const DangerAreaModifyRequest &request) { Database::AesDangerArea newData; if (request.id() < 0) // is the id given as negative? set id -> used by OC-Laptop newData.id = request.id(); newData.name = QString::fromStdString(request.name()); newData.effectStart = request.effectStart().is_set() && request.effectStart().get() > 0 ? QDateTime::fromMSecsSinceEpoch(request.effectStart().get()) : QDateTime(); newData.chargeTypeId = request.chargeTypeId(); newData.effectDuration = request.effectDuration(); newData.partyId = request.partyId().is_set() ? request.partyId().get() : 0; newData.participantId = request.participantId().is_set() ? request.participantId().get() : 0; newData.associatedAesId = request.associatedAesId().is_set() ? request.associatedAesId().get() : 0; ObjectDangerArea *ifs(new ObjectDangerArea(m_mainHandler, this)); Core::FunctionReplyObject ret = ifs->createObject(newData, request.segments(), QVector()); if (ret.error()) { delete ifs; return ret; } m_dangerAreaObjMap.insert(ifs->id(), ifs); connect(ifs, &ObjectDangerArea::newAiv, this, &HandlerDangerArea::newAiv); connect(ifs, &ObjectDangerArea::removeAiv, this, &HandlerDangerArea::removeAiv); return ret; } bool HandlerDangerArea::dangerAreaRemoveRequest(const Core::RemoveElementRequest request) { DEBUG_LOG(m_logger) << "onDangerAreaRemoveRequest dangerArea id: " << request.id(); Core::FunctionReplyObject ret; const rti::core::SampleIdentity cookie; ObjectDangerArea *ifs = getObjectFromMap(m_dangerAreaObjMap, request.id(), ret); if (!ifs) { return m_mainHandler->dds()->fts()->dangerAreaRemoveReply(cookie, ret); } ret = ifs->removeObject(); if (ret.error()) WARNING_LOG(m_logger) << ret(); return m_mainHandler->dds()->fts()->dangerAreaRemoveReply(cookie, ret); } bool HandlerDangerArea::getDangerAreaByAssociatedAesId(const int &id, Database::AesDangerArea *dangerArea) { DEBUG_LOG(m_logger)<<" [Handler getDangerAreaByAssociatedAesId] dangerArea Size: "<data().associatedAesId == id && obj.second->data().effectStateId != AesEffectState::EsRemoved) { DEBUG_LOG(m_logger)<<"[HandlerDangerArea] found ! dangerArea name: "<data().name<<" aesId: "<data().associatedAesId; *dangerArea = obj.second->data(); return true; } } return false; } Core::FunctionReplyObject HandlerDangerArea::dangerAreaModifyRequest(const DangerAreaModifyRequest &request) { Core::FunctionReplyObject ret; if (request.id() == 0 || ((request.id() < 0) && !getObjectFromMap(m_dangerAreaObjMap, std::abs(request.id()), ret))) return dangerAreaCreateRequest(request); ObjectDangerArea *ifs = getObjectFromMap(m_dangerAreaObjMap, std::abs(request.id()), ret); if (!ifs) return ret; Database::AesDangerArea newData(ifs->data()); if (request.id() < 0) // is the id given as negative? set id -> used by OC-Laptop newData.id = request.id(); newData.name = QString::fromStdString(request.name()); newData.effectStart = request.effectStart().is_set() && request.effectStart().get() > 0 ? QDateTime::fromMSecsSinceEpoch(request.effectStart().get()) : QDateTime(); newData.chargeTypeId = request.chargeTypeId(); newData.effectDuration = request.effectDuration(); newData.partyId = request.partyId().is_set() ? request.partyId().get() : 0; newData.participantId = request.participantId().is_set() ? request.participantId().get() : 0; newData.associatedAesId = request.associatedAesId().is_set() ? request.associatedAesId().get() : 0; return ifs->updateObject(newData, request.segments()); } void HandlerDangerArea::onDangerAreaRemoveRequest(const rti::core::SampleIdentity &cookie, const Core::RemoveElementRequest &request) { DEBUG_LOG(m_logger) << "onDangerAreaRemoveRequest" << request; Core::FunctionReplyObject ret; ObjectDangerArea *ifs = getObjectFromMap(m_dangerAreaObjMap, request.id(), ret); if (!ifs) { m_mainHandler->dds()->fts()->dangerAreaRemoveReply(cookie, ret); return; } ret = ifs->removeObject(); if (ret.error()) WARNING_LOG(m_logger) << ret(); m_mainHandler->dds()->fts()->dangerAreaRemoveReply(cookie, ret); } } // Namespace AreaEffectSimulation