/** * @RDE_HEADER@ * Handle aes filter data * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2017-06-16 */ #include "handler_active_apps.h" #include "dds_handler.h" #include "main_handler.h" namespace OperatorManagement { HandlerActiveApps::HandlerActiveApps(MainHandler *mainHandler) : Interface::Fts::ActiveAppUpdateRequestHandler(mainHandler->dds()->fts()) , Interface::Fts::ActiveAppRemoveRequestHandler(mainHandler->dds()->fts()) , m_mainHandler(mainHandler) , m_logger(getLogger("HandlerActiveApps")) { } HandlerActiveApps::~HandlerActiveApps() { cleanup(); } bool HandlerActiveApps::init() { // cleanup(); // broadcast startUpRequest // (all apps should re-register) ActiveApp startUpRequest(0, -1, -1, -1, -1, -1, 0); activeAppUpdateRequest(startUpRequest); return true; } void HandlerActiveApps::cleanupOperator(int operatorId) { INFO_LOG(m_logger) << "cleanupOperator operatorId: " << operatorId << ", m_activeApps.size = " << m_activeApps.size(); // Operator has logged in or out or WS is not alive anymore: auto dtsPtr = dts(); auto it = m_activeApps.begin(); while (it != m_activeApps.end()) { const ActiveApp &item = it.value(); if (item.operatorId() == operatorId) { INFO_LOG(m_logger) << "cleanupOperator operatorId: " << operatorId << " ActiveApp=" << item; dtsPtr->removeActiveAppByKey(item.id()); it = m_activeApps.erase(it); } else { ++it; } } // while } void HandlerActiveApps::cleanup() { auto dtsPtr = dts(); for (const ActiveApp &item : qAsConst(m_activeApps)) dtsPtr->removeActiveAppByKey(item.id()); m_activeApps.clear(); } void HandlerActiveApps::removeZombieEntry(const ActiveApp &request) { for (auto it = m_activeApps.begin(); it != m_activeApps.end(); ++it) { const ActiveApp &item = it.value(); if ((item.operatorId() == request.operatorId()) && (item.screenId() == request.screenId())) { dts()->removeActiveAppByKey(item.id()); m_activeApps.erase(it); break; } } // while } void HandlerActiveApps::onActiveAppUpdateRequest(const rti::core::SampleIdentity &cookie, const ActiveApp &request) { DEBUG_LOG(m_logger) << "onActiveAppUpdateRequest: " << request; auto ret = activeAppUpdateRequest(request); if (ret.error()) WARNING_LOG(m_logger) << ret(); DEBUG_LOG(m_logger) << "onActiveAppUpdateRequest - returned id: " << ret.id(); fts()->activeAppUpdateReply(cookie, ret); } Core::FunctionReplyObject HandlerActiveApps::activeAppUpdateRequest(const ActiveApp &request) { const int reqId = request.id(); // handle 'remove' : if (request.appId() < 0) // LtsSession::App::Login is -1 but ok { Core::RemoveElementRequest removeRequest; removeRequest.id(reqId); return activeAppRemoveRequest(removeRequest); } // : handle 'remove' auto it = m_activeApps.find(reqId); if (it == m_activeApps.end()) { static int s_idCounter = 99; // new entry removeZombieEntry(request); it = m_activeApps.insert(++s_idCounter, request); it.value().id(s_idCounter); } else { // already exists if (it.value() == request) { // identical value, already registered: return Core::FunctionReplyObject(reqId); } // copy data it.value() = request; } DEBUG_LOG(m_logger) << "onActiveAppUpdateRequest - publish new data: " << it.value(); dts()->publish(it.value()); return Core::FunctionReplyObject(it.value().id()); } void HandlerActiveApps::onActiveAppRemoveRequest(const rti::core::SampleIdentity &cookie, const Core::RemoveElementRequest &request) { DEBUG_LOG(m_logger) << "onActiveAppRemoveRequest: " << request; auto ret = activeAppRemoveRequest(request); if (ret.error()) WARNING_LOG(m_logger) << ret(); fts()->activeAppRemoveReply(cookie, ret); } Core::FunctionReplyObject HandlerActiveApps::activeAppRemoveRequest(const Core::RemoveElementRequest &request) { const int reqId = request.id(); if (m_activeApps.remove(reqId) <= 0) return Core::FunctionReplyObject(reqId, tr_lts("dds", "ActiveApp with id %1 not found")).arg(reqId); dts()->removeActiveAppByKey(reqId); return Core::FunctionReplyObject(reqId); } std::shared_ptr HandlerActiveApps::dts() const { return m_mainHandler->dds()->dts(); } std::shared_ptr HandlerActiveApps::fts() const { return m_mainHandler->dds()->fts(); } } // namespace FilterManagement