- NGL_ADD_LIBRARY2: 87 CMakeLists.txt konvertiert für Export-Header Generierung - 44 Export-Header Include-Pfade korrigiert (_export.h) - 81 DDS-Stub-Header generiert (*_dtc.h, *_fts.h, *_dts.h, *_ftc.h) - INGLLogger: Duplikat gelöscht, m_logger Member entfernt, variadische Makros - Q_FUNC_INFO Redefinition behoben (Qt6 definiert bereits) - FATAL_LOG Makro hinzugefügt - InfrastructureManagement DDS-Stubs (ism.hpp, ism_enums.hpp, ism_ftc.h) - FilterManagement DDS-Stubs (flt_ftc.h, flt_dts.h) - AreaEffectSimulation DDS-Stubs (aes.hpp, aes_enums.hpp) - SymbolAppearance Klasse vollständig definiert mit content() Methode - BuildingComponentFilter Klasse definiert mit Copy-Konstruktor - Ftc Factory: nullptr Return (abstract class) - AesFilter Klasse in aes.hpp hinzugefügt - Dtc Klasse in ppm.hpp mit participantChanged Signal - AesType Enum: alle 15 At* Werte definiert - AesEffectState_def: EsReceived hinzugefügt - DataModification Enum: eAdded/eModified/eRemoved - function_reply_object.h → core_types.h Include-Pfad (72 Dateien) - Enum-Class-Streaming Template-Operator in INGLLogger.h - ism_mounting_point.h: QImage → QtGui/QImage, QGuiApplication/QScreen - ism_data_plugin_interface.h: QSet Include, Include-Reihenfolge - QRegExp → QRegularExpression in tpm_js_parser.cpp - .underlying() Aufrufe zu direktem Enum-Vergleich korrigiert - Include-Pfade: aes.hpp in symbol_appearance_settings_impl.h und aes_display_filter_impl.h Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
291 lines
6.7 KiB
C++
Executable File
291 lines
6.7 KiB
C++
Executable File
#include "lts_session_lock_handler.h"
|
|
|
|
#include <LtsWidgets/lts_message_dialog.h>
|
|
#include <LtsSession/lts_session_data.h>
|
|
|
|
#include <QDebug>
|
|
|
|
#include <sstream>
|
|
|
|
|
|
namespace LtsSession
|
|
{
|
|
|
|
TopicLockHandler::TopicLockHandler()
|
|
: QObject()
|
|
, m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("LtsSession.TopicLockHandler"))
|
|
{
|
|
TRACE_LOG() << Q_FUNC_INFO << " START";
|
|
TRACE_LOG() << Q_FUNC_INFO << " END";
|
|
}
|
|
|
|
TopicLockHandler::~TopicLockHandler()
|
|
{
|
|
TRACE_LOG() << Q_FUNC_INFO << " START";
|
|
TRACE_LOG() << Q_FUNC_INFO << " END";
|
|
}
|
|
|
|
bool TopicLockHandler::init(const std::shared_ptr<Core::Interface::Ftc> &coreFtc,
|
|
int exerciseId)
|
|
{
|
|
TRACE_LOG() << Q_FUNC_INFO << " START";
|
|
if (coreFtc == nullptr)
|
|
return false;
|
|
coreFtc->enableAll();
|
|
m_exerciseId = exerciseId;
|
|
m_coreFtc = coreFtc;
|
|
|
|
TRACE_LOG() << Q_FUNC_INFO << " END";
|
|
return true;
|
|
}
|
|
|
|
|
|
bool TopicLockHandler::lock()
|
|
{
|
|
INFO_LOG() << "LOCK " << m_topicInfo.topicName();
|
|
TRACE_LOG() << Q_FUNC_INFO << objStateAsString();
|
|
|
|
if (m_coreFtc == nullptr)
|
|
return false;
|
|
|
|
if (m_locked)
|
|
{
|
|
ERROR_LOG() << Q_FUNC_INFO << ": called lock while still locked! " << m_lockEntityId;
|
|
Q_ASSERT(false);
|
|
return false;
|
|
}
|
|
|
|
const auto *sessionData = LtsSessionData::LtsSessionData::getInstance();
|
|
|
|
Core::TryLockEntityRequest req;
|
|
req.id(m_lockEntityId);
|
|
|
|
req.entityTypeName(m_topicInfo.topicName().toStdString());
|
|
req.entityId(m_topicInfo.entityId());
|
|
req.exerciseId(m_exerciseId);
|
|
|
|
req.operatorId(sessionData->getOperatorId());
|
|
req.workstationId(sessionData->getWorkstationId());
|
|
|
|
try
|
|
{
|
|
const Core::TryLockEntityReply reply(m_coreFtc->tryLockEntityRequest(req));
|
|
|
|
TRACE_LOG() << Q_FUNC_INFO << ": Reply received - state=" << objStateAsString()
|
|
<< " - reply=" << reply;
|
|
|
|
if (reply.alreadyLocked().is_set())
|
|
{
|
|
const Core::LockEntityError &alreadyLocked = reply.alreadyLocked().get();
|
|
INFO_LOG() << Q_FUNC_INFO << ": Topic already locked by ws " << alreadyLocked.workstationName() << " and op " << alreadyLocked.operatorName();
|
|
|
|
|
|
|
|
|
|
const auto lockedBy(QStringLiteral("%2/%1").arg(QString::fromStdString(alreadyLocked.operatorName()), QString::fromStdString(alreadyLocked.workstationName())));
|
|
|
|
emit signalLockDialog(lockedBy);
|
|
}
|
|
else
|
|
{
|
|
DEBUG_LOG() << Q_FUNC_INFO << ": Topic NOT already locked";
|
|
|
|
Q_ASSERT(reply.id() > 0);
|
|
m_locked = true;
|
|
m_lockEntityId = reply.id();
|
|
}
|
|
}
|
|
catch (const std::runtime_error &err)
|
|
{
|
|
ERROR_LOG() << Q_FUNC_INFO << ": Failed to lock topic! " << err.what();
|
|
Q_ASSERT(false);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool TopicLockHandler::unlock()
|
|
{
|
|
INFO_LOG() << "UNLOCK " << m_topicInfo.topicName() << " - " << m_lockEntityId;
|
|
TRACE_LOG() << Q_FUNC_INFO << objStateAsString();
|
|
|
|
if (m_coreFtc == nullptr)
|
|
return false;
|
|
|
|
if (!m_locked)
|
|
{
|
|
ERROR_LOG() << Q_FUNC_INFO << ": Tried to unlock while unlocked.. " << objStateAsString();
|
|
Q_ASSERT(false);
|
|
return false;
|
|
}
|
|
|
|
Q_ASSERT(m_lockEntityId > 0);
|
|
|
|
const Core::TryUnlockEntityRequest req(m_lockEntityId);
|
|
|
|
|
|
m_locked = false;
|
|
m_lockEntityId = 0;
|
|
|
|
try
|
|
{
|
|
const auto reply(m_coreFtc->tryUnlockEntityRequest(req));
|
|
|
|
TRACE_LOG() << Q_FUNC_INFO << ": Reply received - state=" << objStateAsString()
|
|
<< " - reply=" << reply;
|
|
|
|
DEBUG_LOG() << Q_FUNC_INFO << ": Topic unlocked!";
|
|
}
|
|
catch (const std::runtime_error &err)
|
|
{
|
|
ERROR_LOG() << Q_FUNC_INFO << ": Failed to unlock topic! " << err.what();
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
emit signalUnlockDialog();
|
|
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
std::string TopicLockHandler::objStateAsString() const
|
|
{
|
|
std::ostringstream o;
|
|
o << " m_topicInfoId=" << m_lockEntityId
|
|
<< ", entityId=" << m_topicInfo.entityId()
|
|
<< ", exId=" << m_exerciseId
|
|
<< ", lckd=" << m_locked
|
|
<< ", asked=" << m_askedForLock
|
|
<< ", delftrAnwr=" << m_deleteAfterAnswer;
|
|
return o.str();
|
|
}
|
|
|
|
|
|
bool TopicLockHandler::slotUnlock()
|
|
{
|
|
TRACE_LOG() << Q_FUNC_INFO << " slotUnlock" << objStateAsString();
|
|
return unlock();
|
|
}
|
|
|
|
|
|
void TopicLockHandler::slotTryLock(const LtsWidgets::TopicInfo &topicInfo)
|
|
{
|
|
TRACE_LOG() << Q_FUNC_INFO << " START " << objStateAsString();
|
|
|
|
m_topicInfo = topicInfo;
|
|
|
|
if (m_topicInfo.topicName().isEmpty() || !topicInfo.isValid())
|
|
{
|
|
DEBUG_LOG() << Q_FUNC_INFO << " no lockable topic, that's okay";
|
|
return;
|
|
}
|
|
|
|
lock();
|
|
TRACE_LOG() << Q_FUNC_INFO << " END " << objStateAsString();
|
|
}
|
|
|
|
|
|
void TopicLockHandler::slotFinalize()
|
|
{
|
|
TRACE_LOG() << Q_FUNC_INFO << " START " << objStateAsString();
|
|
|
|
if (m_locked)
|
|
{
|
|
slotUnlock();
|
|
}
|
|
|
|
deleteLater();
|
|
|
|
TRACE_LOG() << Q_FUNC_INFO << " END " << objStateAsString();
|
|
}
|
|
|
|
|
|
|
|
|
|
TopicLockHanderData::TopicLockHanderData()
|
|
: QObject()
|
|
{
|
|
}
|
|
|
|
void TopicLockHanderData::init(const std::shared_ptr<Core::Interface::Ftc> &coreFtc, int exerciseId)
|
|
{
|
|
m_topicLockHandler = new TopicLockHandler();
|
|
m_topicLockHandler->init(coreFtc, exerciseId);
|
|
|
|
connect(m_topicLockHandler.data(), &TopicLockHandler::signalLockDialog,
|
|
this, &TopicLockHanderData::slotLock, Qt::UniqueConnection);
|
|
connect(m_topicLockHandler.data(), &TopicLockHandler::signalUnlockDialog,
|
|
this, &TopicLockHanderData::slotUnlock, Qt::UniqueConnection);
|
|
}
|
|
|
|
TopicLockHanderData::~TopicLockHanderData()
|
|
{
|
|
|
|
if (m_topicLockHandler)
|
|
m_topicLockHandler->slotFinalize();
|
|
}
|
|
|
|
void TopicLockHanderData::unlock()
|
|
{
|
|
qDebug() << "Debugname=" << m_debugName << ": "
|
|
<< " slotUnlock";
|
|
if (m_topicLockHandler)
|
|
m_topicLockHandler->slotUnlock();
|
|
}
|
|
|
|
bool TopicLockHanderData::isLocked() const
|
|
{
|
|
if (!m_topicLockHandler)
|
|
{
|
|
qDebug() << "Debugname=" << m_debugName << ": "
|
|
<< " isLocked -> no handler";
|
|
return false;
|
|
}
|
|
qDebug() << "Debugname=" << m_debugName << ": "
|
|
<< " isLocked = " << m_topicLockHandler->isLocked();
|
|
return m_topicLockHandler->isLocked();
|
|
}
|
|
|
|
LtsWidgets::TopicInfo TopicLockHanderData::getTopicInfo() const
|
|
{
|
|
if (m_topicLockHandler)
|
|
return m_topicLockHandler->getTopicInfo();
|
|
return {};
|
|
}
|
|
|
|
void TopicLockHanderData::slotTryLock(const LtsWidgets::TopicInfo &topicInfo)
|
|
{
|
|
qDebug() << "Debugname=" << m_debugName << ": "
|
|
<< "slotTryLock " << m_topicLockHandler;
|
|
if (!m_topicLockHandler)
|
|
return;
|
|
m_topicLockHandler->slotTryLock(topicInfo);
|
|
}
|
|
|
|
|
|
void TopicLockHanderData::slotLock(const QString &lockedBy)
|
|
{
|
|
|
|
|
|
qDebug() << "Debugname=" << m_debugName << ": "
|
|
<< "slotLock";
|
|
m_lockedBy = lockedBy;
|
|
emit lockDataChanged();
|
|
}
|
|
|
|
void TopicLockHanderData::slotUnlock()
|
|
{
|
|
qDebug() << "Debugname=" << m_debugName << ": "
|
|
<< "slotUnlock";
|
|
m_lockedBy.clear();
|
|
emit lockDataChanged();
|
|
}
|
|
|
|
|
|
}
|