/** * @RDE_HEADER@ * Handler for all request journal objects * $Id$ * $HeadURL$ * $Author$ * Created by Hanna E. Rathje, SLSE, 2015-01-13 */ #include "get_participants.h" #include "main_handler.h" #include #include namespace ParticipantManagement { GetParticipants::GetParticipants(MainHandler *mainHandler) : Interface::Fts::GetParticipantsRequestHandler(mainHandler->fts()) , m_mainHandler(mainHandler) , m_logger(getLogger("GetParticipants")) {} GetParticipants::~GetParticipants() { } void GetParticipants::onGetParticipantsRequest(const rti::core::SampleIdentity &cookie, const GetParticipantsRequest &request) { DEBUG_LOG(m_logger) << "onGetParticipantsRequest" << request; // Initialize RecordReplay to get initial participants RecordReplayPlugin recordReplay; // no ddsconnector - we don't want to publish data here recordReplay.initDtc(nullptr, m_mainHandler->exerciseId()); NSqlQuery q(m_mainHandler->db()->database()); recordReplay.readParticipantAt(q, request.timeStamp()); // key is sampleTime -> multiMap auto participantsMmap = recordReplay.getParticipantMap(); QMap participants; // only take the newest entries (participantsMmap may contain more than one entry per participantId for (auto it = participantsMmap.begin(); it != participantsMmap.end(); ++it) { Participant &p = it.value(); if (p.isDeleted()) participants.remove(p.id()); else participants[p.id()] = std::move(p); } DEBUG_LOG(m_logger) << "Starting to read participant from record replay. Size: " << participants.size(); GetParticipantsReply reply; reply.requestId(request.requestId()); auto &vecPart = reply.participants(); vecPart.reserve(participants.size()); for (auto it = participants.begin(); it != participants.end(); ++it) { if (request.partyId() >= 0 && it.value().partyId() != request.partyId()) continue; vecPart.push_back(it.value()); } m_mainHandler->fts()->getParticipantsReply(cookie, reply); } } // Namespace ParticipantManagement