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

174 lines
4.5 KiB
C++
Executable File

/**
* @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<Interface::Dts> HandlerActiveApps::dts() const
{
return m_mainHandler->dds()->dts();
}
std::shared_ptr<Interface::Fts> HandlerActiveApps::fts() const
{
return m_mainHandler->dds()->fts();
}
} // namespace FilterManagement