174 lines
4.5 KiB
C++
Executable File
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
|