diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsElevation/CMakeLists.txt b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsElevation/CMakeLists.txt index 74bbdb4b7..87d62dc6e 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsElevation/CMakeLists.txt +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsElevation/CMakeLists.txt @@ -13,18 +13,23 @@ NGL_ADD_LIBRARY2(WS SV HLA LtsElevation SHARED NGL_TARGET_INCLUDE_DIRECTORIES(LtsElevation INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/../ + ${CMAKE_CURRENT_SOURCE_DIR}/../../Lts/Viewer/SituationMap ) NGL_TARGET_LINK_LIBRARIES(LtsElevation PRIVATE NGLLogger ## LtsSessionDataDds - AsmDataPluginInterface ExmDataPluginInterface situationMapCommon situationMapElevationMap PUBLIC LtsUtilsCoreHeaderOnly Qt6::Core + Qt6::Gui ) +if(BUILD_RTI) + target_link_libraries(LtsElevation PRIVATE AsmDataPluginInterface) +endif() + ADD_SUBDIRECTORY(UnitTest_Elevation) diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsElevation/lts_elevation_manager.cpp b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsElevation/lts_elevation_manager.cpp index 2f4e13e01..da01e1a3b 100644 --- a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsElevation/lts_elevation_manager.cpp +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsElevation/lts_elevation_manager.cpp @@ -2,13 +2,15 @@ #include "lts_elevation_manager.h" +#ifdef BUILD_RTI #include #include +#endif #include #include #include #include -#include +#include #include #include @@ -64,7 +66,9 @@ class LtsElevationManager::Private } std::shared_ptr m_exmDtc; +#ifdef BUILD_RTI std::shared_ptr m_asmDtc; +#endif QStringList m_filePaths_rough_to_fine; SituationMap::ElevationMapManager* m_elevationManager{nullptr}; @@ -87,7 +91,12 @@ LtsElevationManager::~LtsElevationManager() LTS_ELEVATION_MANAGER_TYPE LtsElevationManager::createInstance(int exerciseId, const std::shared_ptr& exmDtc, - const std::shared_ptr& asmDtc) +#ifdef BUILD_RTI + const std::shared_ptr& asmDtc +#else + const std::shared_ptr& asmDtc +#endif +) { LOGGER_T logger = getLogger("LtsElevationManager"); TRACE_LOG(logger) << Q_FUNC_INFO << " START, exerciseId=" << exerciseId; @@ -105,12 +114,11 @@ LtsElevationManager::createInstance(int exerciseId, const std::shared_ptr& exmDtc, const std::shared_ptr& asmDtc) { @@ -259,6 +290,20 @@ void LtsElevationManager::initDDS(const std::shared_ptr& exmDtc, + const std::shared_ptr& asmDtc) +{ + Q_UNUSED(asmDtc); + TRACE_LOG(m_logger) << Q_FUNC_INFO << " START (BUILD_RTI=OFF, no DDS init)"; + + d->m_exmDtc = exmDtc; + if (d->m_exmDtc) + d->m_exmDtc->waitForHistoricalDataExercise(1000); + + TRACE_LOG(m_logger) << Q_FUNC_INFO << " END"; +} +#endif QStringList LtsElevationManager::getFilenamesForExercise(int exerciseId) { diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsElevation/lts_elevation_manager.h b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsElevation/lts_elevation_manager.h index c5315d739..262b2a5e0 100644 --- a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsElevation/lts_elevation_manager.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsElevation/lts_elevation_manager.h @@ -26,6 +26,7 @@ class Dtc; } } // namespace ExerciseManagement +#ifdef BUILD_RTI namespace AssetManagement { namespace Interface @@ -33,6 +34,7 @@ namespace Interface class Dtc; } } // namespace AssetManagement +#endif namespace LtsElevation { @@ -47,13 +49,20 @@ class LTSELEVATION_EXPORT LtsElevationManager : public QObject public: static LTS_ELEVATION_MANAGER_TYPE createInstance(int exerciseId, const std::shared_ptr& exmDtc = {}, - const std::shared_ptr& asmDtc = {}); +#ifdef BUILD_RTI + const std::shared_ptr& asmDtc = {} +#else + const std::shared_ptr& asmDtc = {} +#endif + ); static LTS_ELEVATION_MANAGER_TYPE getInstance(int exerciseId); +#ifdef BUILD_RTI static LTS_ELEVATION_MANAGER_TYPE createInstanceForTrainingAreaId(int trainingAreaId, const std::shared_ptr& asmDtc = nullptr); +#endif static void cleanupAll(); virtual ~LtsElevationManager(); @@ -74,7 +83,12 @@ class LTSELEVATION_EXPORT LtsElevationManager : public QObject explicit LtsElevationManager(); void initDDS(const std::shared_ptr& exmDtc, - const std::shared_ptr& asmDtc); +#ifdef BUILD_RTI + const std::shared_ptr& asmDtc +#else + const std::shared_ptr& asmDtc +#endif + ); bool init(const QStringList& filePaths_rough_to_fine); static int exerciseIdToTrainingAreaId(int exerciseId, const std::shared_ptr& exmDtc); diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsLicence/aes_crypt.cpp b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsLicence/aes_crypt.cpp index 9c0f5d444..b3fc1e98c 100644 --- a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsLicence/aes_crypt.cpp +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsLicence/aes_crypt.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -15,7 +16,6 @@ struct AesCryptPrivate : passPhrase(QLatin1String("LTS " LTS_VERSION_MAJOR "." LTS_VERSION_MINOR)), logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("LtsLicenceLib.AesCrypt")) { - qsrand(time(nullptr)); #if OPENSSL_VERSION_NUMBER < 0x1010000fL ERR_load_crypto_strings(); #endif @@ -134,7 +134,7 @@ QByteArray encryptData(const QByteArray& dataToEncrypt, const QString& pw, bool* QByteArray baSalt(EVP_MAX_IV_LENGTH, 0); for (int i = 0; i < EVP_MAX_IV_LENGTH; ++i) - baSalt[i] = qrand(); + baSalt[i] = static_cast(QRandomGenerator::global()->bounded(256)); const unsigned char* salt = reinterpret_cast(baSalt.data()); EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsProjectionWorkstation/logger.h b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsProjectionWorkstation/logger.h index 9987a8b39..ade1b4979 100644 --- a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsProjectionWorkstation/logger.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsProjectionWorkstation/logger.h @@ -2,7 +2,7 @@ #pragma once -#include "ltsprojectionworkstation_export.h" +#include #include diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/CMakeLists.txt b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/CMakeLists.txt index 2b24d321d..d6d1564f1 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/CMakeLists.txt +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/CMakeLists.txt @@ -26,6 +26,22 @@ IF(BUILD_RTI) NGLLogger Qt6::Core ) +ELSE() + # Stub version for BUILD_RTI=OFF + SET(LtsSessionDataDds_SRCS + lts_session_data_dds_stub.cpp + lts_session_data_dds_stub.h + ) + NGL_ADD_LIBRARY2(WS LtsSessionDataDds SHARED ${LtsSessionDataDds_SRCS}) + NGL_TARGET_INCLUDE_DIRECTORIES(LtsSessionDataDds + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/../ + ${CMAKE_CURRENT_BINARY_DIR}/../ + ) + NGL_TARGET_LINK_LIBRARIES(LtsSessionDataDds + PUBLIC + Qt6::Core + ) ENDIF() @@ -35,11 +51,13 @@ SET(ltssession_SRCS lts_session.h lts_session.cpp lts_session_lock_handler.h - lts_session_manager.h - lts_session_manager.cpp - lts_session_lock_handler.cpp ) +# lts_session_manager and lts_session_lock_handler.cpp only needed when BUILD_RTI=ON +IF(BUILD_RTI) + LIST(APPEND ltssession_SRCS lts_session_manager.h lts_session_manager.cpp lts_session_lock_handler.cpp) +ENDIF() + NGL_ADD_LIBRARY2(WS LtsSession SHARED ${ltssession_SRCS}) NGL_TARGET_INCLUDE_DIRECTORIES(LtsSession PUBLIC @@ -48,16 +66,28 @@ NGL_TARGET_INCLUDE_DIRECTORIES(LtsSession ${CMAKE_CURRENT_SOURCE_DIR}/../LtsUtils/LtsUtilsGui ) -NGL_TARGET_LINK_LIBRARIES(LtsSession - PRIVATE +# Optional external dependencies +FIND_LIBRARY(SVCCORECLIENT_LIBRARY NAMES svcCoreClient PATHS /usr/local/lib /usr/lib NO_DEFAULT_PATH) +FIND_LIBRARY(OHPONLINEHELP_LIBRARY NAMES OhpOnlineHelpViewerGuiPluginInterface PATHS /usr/local/lib /usr/lib NO_DEFAULT_PATH) + +SET(LtsSession_PRIVATE_LIBS Qt6::Network LtsMultiMonitor LtsSessionData LtsUtilsGuiDds # ReqHelpr & for Debug Menu ! TODO: rm on release! LtsNotification - svcCoreClient # Core Ftc - for TLH - OhpOnlineHelpViewerGuiPluginInterface Qt6::Svg +) +IF(SVCCORECLIENT_LIBRARY) + LIST(APPEND LtsSession_PRIVATE_LIBS ${SVCCORECLIENT_LIBRARY}) +ENDIF() +IF(OHPONLINEHELP_LIBRARY) + LIST(APPEND LtsSession_PRIVATE_LIBS ${OHPONLINEHELP_LIBRARY}) +ENDIF() + +NGL_TARGET_LINK_LIBRARIES(LtsSession + PRIVATE + ${LtsSession_PRIVATE_LIBS} PUBLIC LtsWidgets Qt6::Core diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session.cpp b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session.cpp index 6600b4583..f0d4e146e 100644 --- a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session.cpp +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session.cpp @@ -10,8 +10,20 @@ #include "lts_session.h" +#ifdef BUILD_RTI #include "lts_session_data_dds.h" #include "lts_session_lock_handler.h" +#endif +// Stub logging macros when BUILD_RTI=OFF +#ifndef BUILD_RTI +// Logging deaktivieren - qDebug() wird verwendet weil es operator<< für QString unterstützt +#define DEBUG_LOG(logger) if (false) qDebug() +#define WARNING_LOG(logger) if (false) qDebug() +#define ERROR_LOG(logger) if (false) qDebug() +#define INFO_LOG(logger) if (false) qDebug() +#define TRACE_LOG(logger) if (false) qDebug() +#define LOGFUNCTION "" +#endif #include "lts_session_manager.h" #include @@ -28,9 +40,10 @@ #include #include #include -#include // XXX: grrr.. +#ifdef BUILD_FILTERMANAGEMENT +#include // XXX: grrr.. +#endif #include -#include #include #include #include @@ -50,12 +63,21 @@ namespace LtsSession bool LtsSession::s_valgrind = false; int LtsSession::s_nextSessionId = 0; +#ifdef BUILD_RTI LtsSession::LtsSession(LtsSessionManager* sessionManager) : m_sessionManager(sessionManager), m_mainBackground(nullptr), m_hasBaseLayout(false), m_baseLayout(nullptr), m_markedForDeletion(false), m_payloads(false), m_initDone(false), m_menuVisible(true), m_firstActionsFetch(true), - m_exerciseData(new LtsWidgets::ExerciseData), m_currentInitIfc(nullptr), m_slotPluginInitDoneMutex(false), - m_pluginInitDone(false), m_hidden(false), m_loadedFromSavegame(false), m_foreverInvisible(false), + m_exerciseData(new LtsWidgets::ExerciseData), + m_currentInitIfc(nullptr), m_slotPluginInitDoneMutex(false), m_pluginInitDone(false), + m_hidden(false), m_loadedFromSavegame(false), m_foreverInvisible(false), m_id(s_nextSessionId++) +#else +LtsSession::LtsSession() + : m_mainBackground(nullptr), m_hasBaseLayout(false), m_baseLayout(nullptr), + m_markedForDeletion(false), m_payloads(false), m_initDone(false), m_menuVisible(true), m_firstActionsFetch(true), + m_exerciseData(nullptr), m_hidden(false), m_loadedFromSavegame(false), m_foreverInvisible(false), + m_id(s_nextSessionId++) +#endif { LtsWidgets::LtsGlobalWaitDialog::getInstance()->wait(); @@ -81,17 +103,23 @@ LtsSession::LtsSession(LtsSessionManager* sessionManager) // [Qatar MNQ-474] Crash open Script Editor application Hack if (strcmp(PROJECTBUILD, "qatarmout") == 0 || strcmp(PROJECTBUILD, "qatar") == 0) { +#ifdef BUILD_RTI DEBUG_LOG(m_logger) << "qatarmout Timer = 4000"; +#endif m_scriptEditorTimer->setInterval(4000); } else { +#ifdef BUILD_RTI DEBUG_LOG(m_logger) << "qatarmout Timer = 0"; +#endif m_scriptEditorTimer->setInterval(0); } m_scriptEditorTimer->setSingleShot(true); +#ifdef BUILD_RTI connect(m_scriptEditorTimer, &QTimer::timeout, this, &LtsSession::delayScriptEditorStart); +#endif } LtsSession::~LtsSession() @@ -99,63 +127,70 @@ LtsSession::~LtsSession() // qCritical() << "~LtsSession"; // delete m_mainBackground; parented on hiddenWidget! +#ifdef BUILD_RTI delete m_baseLayout; // TODO: deleteLater? problem: clear interfaces! // qWarning() << this << "deleted" << m_baseLayout; +#endif // Don't: qDeleteAll(m_notiCtlList); // make sure to unref the data plugins, as they carry this LtsSession, and the erase method would not delete the // Session (avoid circular dependencies) +#ifdef BUILD_RTI clearGuiPluginInterfaces(); clearDataPluginInterfaces(); +#endif +#ifdef BUILD_RTI delete m_exerciseData; +#endif } QString LtsSession::toString() const { - std::ostringstream stream; - stream << "LtsSession:" - << " this=" << this << ", domainId=" << this->domainId() << ", partitionId=" << this->partitionId() - << ", partitionType=" << this->partitionType() << ", exerciseId='" << this->exerciseId() << "'" - << ", workspaceId='" << this->workspaceId() << "'" - << ", appToString='" << this->appToString(this->app()) << "'" - << ", LtsSessionDataDds=" << LtsSessionDataDds::toString(); - return QString::fromStdString(stream.str()); - - // QString str; - // str.append(QStringLiteral(" domainId='%1'").arg())); - // str.append(QStringLiteral(", ='%1'").arg(this->partitionId())); - // str.append(QStringLiteral(", partitionType='%1'").arg(this->partitionType())); - // str.append(QStringLiteral(", exerciseId='%1'").arg(this->exerciseId())); - // str.append(QStringLiteral(", workspaceId='%1'").arg(this->workspaceId())); - // return str; + QString str; + str.append(QStringLiteral("LtsSession: this=%1").arg(QString::number(reinterpret_cast(this)))); +#ifdef BUILD_RTI + str.append(QStringLiteral(", domainId=%1, partitionId=%2").arg(domainId()).arg(partitionId())); +#endif + str.append(QStringLiteral(", workspaceId='%1'").arg(workspaceId())); +#ifdef BUILD_RTI + str.append(QStringLiteral(", appToString='%1'").arg(appToString(app()))); + str.append(QStringLiteral(", partitionType=%1, exerciseId='%2'").arg(partitionType()).arg(exerciseId())); + str.append(QStringLiteral(", LtsSessionDataDds=%1").arg(LtsSessionDataDds::toString())); +#else + str.append(QStringLiteral(", app=Login (stub)")); +#endif + return str; } +#ifdef BUILD_RTI QWidget* LtsSession::baseLayoutWidget() { // qWarning() << "baseLayoutWidget" << m_baseLayout; // qWarning() << "baseLayoutWidget (widget)" << static_cast(m_baseLayout); return static_cast(m_baseLayout); } +#else +QWidget* LtsSession::baseLayoutWidget() +{ + return nullptr; +} +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::aboutToCloseTab(LayoutArea area) { m_baseLayout->getTabFromLayoutArea(area)->aboutToClose(); } - -void LtsSession::setDependency(LtsSession* session) +#else +void LtsSession::aboutToCloseTab(LayoutArea /*area*/) { - if (session == this) - { - Q_ASSERT(session != this); - ERROR_LOG(m_logger) << "Tried to set session dependency on self"; - return; - } - - m_dependency = session; + // no-op in non-RTI build } +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::aboutToClose() { emit sessionAboutToBeDestroyed(this); @@ -168,11 +203,20 @@ void LtsSession::aboutToClose() aboutToCloseTab(LayoutArea::eSpecialTab); aboutToCloseTab(LayoutArea::eMainTab); } +#else +void LtsSession::aboutToClose() +{ + emit sessionAboutToBeDestroyed(this); + // no-op in non-RTI build +} +#endif // BUILD_RTI void LtsSession::slotStopWaitDialog() { +#ifdef BUILD_RTI disconnect(this, &LtsSession::signalDoneInitializingSession, this, &LtsSession::slotStopWaitDialog); disconnect(this, &LtsSession::signalInitializationAborted, this, &LtsSession::slotStopWaitDialog); +#endif LtsWidgets::LtsGlobalWaitDialog::getInstance()->done(); } @@ -284,13 +328,16 @@ QIcon LtsSession::appToIcon(LtsAppDescriptor::App app) return LtsUtils::iconFromSvg(appIconFilename(app)); } +#ifdef BUILD_RTI bool LtsSession::removeMenuAction(LtsWidgets::LtsDragIcon* icon) { if (!m_baseLayout) return false; return m_baseLayout->removeMenuAction(icon); } +#endif +#ifdef BUILD_RTI void LtsSession::setMenuVisible(bool visible) { m_menuVisible = visible; @@ -300,7 +347,14 @@ void LtsSession::setMenuVisible(bool visible) m_baseLayout->getMenu()->setVisible(visible); } +#else +void LtsSession::setMenuVisible(bool /*visible*/) +{ + // no-op in non-RTI build +} +#endif // BUILD_RTI +#ifdef BUILD_RTI LtsDragIcon* LtsSession::addAction(const LtsWidgets::PluginData& plData, bool isFirstRun) { if (!m_baseLayout) @@ -327,7 +381,21 @@ LtsNotification::LtsNotification* LtsSession::createNotification(const QString& return n; } +#else +LtsDragIcon* LtsSession::addAction(const LtsWidgets::PluginData& /*plData*/, bool /*isFirstRun*/) +{ + // no-op in non-RTI build + return nullptr; +} +LtsNotification::LtsNotification* LtsSession::createNotification(const QString& /*identifier*/) +{ + // no-op in non-RTI build + return nullptr; +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI bool LtsSession::init(const DdsConnectionParams& connParams, const QVector& dataPluginList, const QVector& guiPluginList, bool hidden) @@ -348,7 +416,9 @@ bool LtsSession::init(const dds::domain::DomainParticipant& dp, const DdsConnect initializePlugins(dataPluginList, guiPluginList); return true; } +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::initializePlugins(const QVector& dataPluginList, const QVector& guiPluginList) { @@ -410,7 +480,9 @@ void LtsSession::initializeDataPlugins(const QVector& guiPluginList) { m_failedFetches.clear(); @@ -526,7 +598,9 @@ void LtsSession::initializeGuiPlugins(const QVectorsetEnabled(on); } } +#else +void LtsSession::enableBaseLayoutMenu(bool /*on*/) +{ + // no-op in non-RTI build +} + +void LtsSession::enableBaseLayoutArea(LtsWidgets::LayoutArea /*area*/, bool /*on*/) +{ + // no-op in non-RTI build +} +#endif // BUILD_RTI int LtsSession::workstationIp() { @@ -610,30 +702,41 @@ QString LtsSession::workstationName() const QString LtsSession::workspaceId() const { +#ifdef BUILD_RTI if (isReplayPartition()) return QStringLiteral("replay_%1").arg(QString::number(partitionId())); +#endif return m_workspaceId; // sessionManager->workspaceId(); } void LtsSession::setWorkspaceId(const QString &newWorkspaceId /* <= MW: that's why I like "get" in getter names (needed to prepend "new" because of already existing method with the name "workspaceId") */) { +#ifdef BUILD_RTI DEBUG_LOG(m_logger) << LOGFUNCTION << " change workspaceId: cur = '" << m_workspaceId << "' for app '" << appToString(app()) << "'"; DEBUG_LOG(m_logger) << LOGFUNCTION << " change workspaceId: new = '" << newWorkspaceId << "' for app '" << appToString(app()) << "'"; +#else + Q_UNUSED(newWorkspaceId) +#endif m_workspaceId = newWorkspaceId; // m_sessionManager->setWorkspaceId(workspaceId); +#ifdef BUILD_RTI if (m_baseLayout) m_baseLayout->setWorkspaceId(workspaceId() /* use getter instead of member var, as replay partition strings can only be retrieved with the getter */); +#endif // BUILD_RTI emit workspaceIdChanged(newWorkspaceId); } +#ifdef BUILD_RTI ExcState LtsSession::exerciseState() const { return m_exerciseData ? m_exerciseData->exState : ExerciseState::eUnknown; } +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::connectOnlineHelpButton(LtsWidgets::LtsDialog* widget) { // FIXME: HACK: also connect show online help here !! @@ -649,7 +752,6 @@ void LtsSession::slotStapleTopicLockHandler(LtsWidgets::LtsDialog* widget) } widget->setProperty("topicLockStapled", true); -#ifdef BUILD_RTI connectOnlineHelpButton(widget); if (m_coreFtc == nullptr) { @@ -684,12 +786,22 @@ void LtsSession::slotStapleTopicLockHandler(LtsWidgets::LtsDialog* widget) // qWarning() << "added tlh to" << widget->windowTitle(); connectOnlineHelpButton(widget); +} #else +void LtsSession::connectOnlineHelpButton(LtsWidgets::LtsDialog* widget) +{ Q_UNUSED(widget) - DEBUG_LOG(m_logger) << "BUILD_RTI=OFF, skipping TopicLockHandler setup"; -#endif + // no-op in non-RTI build } +void LtsSession::slotStapleTopicLockHandler(LtsWidgets::LtsDialog* widget) +{ + Q_UNUSED(widget) + // no-op in non-RTI build +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI bool LtsSession::focusTab(const QString& menuGroup, const QString& identifier, LtsWidgets::LayoutArea area) { if (!m_baseLayout) @@ -700,7 +812,17 @@ bool LtsSession::focusTab(const QString& menuGroup, const QString& identifier, L return m_baseLayout->focusTab(menuGroup, identifier, area); } +#else +bool LtsSession::focusTab(const QString& menuGroup, const QString& identifier, LtsWidgets::LayoutArea area) +{ + Q_UNUSED(menuGroup) + Q_UNUSED(identifier) + Q_UNUSED(area) + return false; +} +#endif +#ifdef BUILD_RTI LtsWidgets::LtsDialog* LtsSession::getWidget(const QString& menuGroup, const QString& identifier, LtsWidgets::LayoutArea area) { @@ -713,7 +835,18 @@ LtsWidgets::LtsDialog* LtsSession::getWidget(const QString& menuGroup, const QSt return m_baseLayout->getWidget(menuGroup, identifier, area); } +#else +LtsWidgets::LtsDialog* LtsSession::getWidget(const QString& menuGroup, const QString& identifier, + LtsWidgets::LayoutArea area) +{ + Q_UNUSED(menuGroup) + Q_UNUSED(identifier) + Q_UNUSED(area) + return nullptr; +} +#endif +#ifdef BUILD_RTI bool LtsSession::widgetExists(const QString& menuGroup, const QString& identifier, LayoutArea area) const { if (!m_baseLayout) @@ -724,7 +857,14 @@ bool LtsSession::widgetExists(const QString& menuGroup, const QString& identifie QWidget* existingWidget = tab->getWidget(menuGroup, identifier); return existingWidget != nullptr; } +#else +bool LtsSession::widgetExists(const QString& /*menuGroup*/, const QString& /*identifier*/, LayoutArea /*area*/) const +{ + return false; +} +#endif // BUILD_RTI +#ifdef BUILD_RTI bool LtsSession::addWidget(LtsDialog* widget, const QString& menuGroup, const QString& identifier, LayoutArea area, bool setClosable) { @@ -739,12 +879,25 @@ bool LtsSession::addWidget(LtsDialog* widget, const QString& menuGroup, const QS // slotStapleTopicLockHandler(widget); => already done in blw's addWidget (below!) // FIXMe: connect(widget, &LtsDialog::signalShowOnlineHelp, // this, &LtsSession::slotShowOnlineHelp, - // Qt::UniqueConnection); done in slotStaple.. because using LtsDialog::addDialog does NOT reach this + // Qt::UniqueConnection) done in slotStaple.. because using LtsDialog::addDialog does NOT reach this // code here ! return m_baseLayout->addWidget(widget, menuGroup, identifier, area, setClosable); } +#else +bool LtsSession::addWidget(LtsDialog* widget, const QString& menuGroup, const QString& identifier, LayoutArea area, + bool setClosable) +{ + Q_UNUSED(widget) + Q_UNUSED(menuGroup) + Q_UNUSED(identifier) + Q_UNUSED(area) + Q_UNUSED(setClosable) + return false; +} +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::setExerciseData(const LtsWidgets::ExerciseData& exerciseData) { // avoid mutiple calls (and signal to emitted multiple times) @@ -759,11 +912,6 @@ void LtsSession::setExerciseData(const LtsWidgets::ExerciseData& exerciseData) emit signalExerciseDataChanged(); } -const LtsWidgets::ExerciseData* LtsSession::exerciseData() const -{ - return m_exerciseData; -} - void LtsSession::setProfilePicture(const QPixmap& pixmap) { // partitionType(); ?!? @@ -771,7 +919,9 @@ void LtsSession::setProfilePicture(const QPixmap& pixmap) return; m_baseLayout->setProfilePicture(pixmap); } +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::makeVisible() { Q_ASSERT(m_baseLayout == nullptr); @@ -783,7 +933,14 @@ void LtsSession::makeVisible() createBaseLayout(); } +#else +void LtsSession::makeVisible() +{ + // BUILD_RTI=OFF: No base layout to create +} +#endif +#ifdef BUILD_RTI void LtsSession::refetchActions() { // get actions @@ -853,12 +1010,27 @@ void LtsSession::refetchActions() m_firstActionsFetch = false; } +#else +void LtsSession::refetchActions() +{ + // BUILD_RTI=OFF: No actions to fetch + m_firstActionsFetch = false; +} +#endif +#ifdef BUILD_RTI void LtsSession::slotSwap() { LtsMultiMonitor::LtsMultiMonitor::getInstance()->selectAndSwap(m_baseLayout); } +#else +void LtsSession::slotSwap() +{ + // BUILD_RTI=OFF: No base layout to swap +} +#endif // BUILD_RTI +#ifdef BUILD_RTI int LtsSession::screenId() const { if (m_baseLayout == nullptr) @@ -872,7 +1044,14 @@ int LtsSession::screenId() const return screen->screenId(); } +#else +int LtsSession::screenId() const +{ + return -1; +} +#endif // BUILD_RTI +#ifdef BUILD_RTI int LtsSession::screenContainerId() const { if (m_baseLayout == nullptr) @@ -894,7 +1073,14 @@ int LtsSession::screenContainerId() const return -3; } +#else +int LtsSession::screenContainerId() const +{ + return -1; +} +#endif // BUILD_RTI +#ifdef BUILD_RTI int LtsSession::screenTypeId() const { if (m_baseLayout == nullptr) @@ -908,12 +1094,26 @@ int LtsSession::screenTypeId() const return screen->screenType(); } +#else +int LtsSession::screenTypeId() const +{ + return -1; +} +#endif // BUILD_RTI +#ifdef BUILD_RTI LtsAppDescriptor::App LtsSession::app() const { return m_sessionManager ? m_sessionManager->appId() : LtsAppDescriptor::App::Login; } +#else +LtsAppDescriptor::App LtsSession::app() const +{ + return LtsAppDescriptor::App::Login; +} +#endif +#ifdef BUILD_RTI bool LtsSession::event(QEvent* e) { if (e->type() == QEvent::LanguageChange) @@ -921,7 +1121,15 @@ bool LtsSession::event(QEvent* e) return LtsSessionDataDds::event(e); } +#else +bool LtsSession::event(QEvent* e) +{ + Q_UNUSED(e) + return LtsSessionDataDds::event(e); +} +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::addDeveloperActions() { // DEVELOPER / DEBUG MENU @@ -992,7 +1200,9 @@ void LtsSession::addDeveloperActions() } // END DEVELOPER / DEBUG MENU } +#endif +#ifdef BUILD_RTI bool LtsSession::notifyUnsavedChanges() { if (m_baseLayout == nullptr) @@ -1000,7 +1210,14 @@ bool LtsSession::notifyUnsavedChanges() return m_baseLayout->notifyUnsavedChanges(); } +#else +bool LtsSession::notifyUnsavedChanges() +{ + return true; +} +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::createBaseLayout() { // qWarning() << "mep" << @@ -1154,7 +1371,9 @@ void LtsSession::createBaseLayout() emit hideAllOtherBLWs(this); } +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::slotMonitorSelected() { auto mmm = LtsMultiMonitor::LtsMultiMonitor::getInstance(); @@ -1182,7 +1401,9 @@ void LtsSession::slotMonitorSelected() emit signalScreenIdChanged(m_screenId, m_screenContainerId, screen->screenType()); } } +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::delayScriptEditorStart() { DEBUG_LOG(m_logger) << "LtsSession::delayScriptEditorStart "; @@ -1195,7 +1416,9 @@ void LtsSession::delayScriptEditorStart() // TRUE, it was not emitted before } } +#endif // BUILD_RTI +#ifdef BUILD_RTI bool LtsSession::isChildOfSession(QWidget* child) { if (!child) @@ -1204,6 +1427,12 @@ bool LtsSession::isChildOfSession(QWidget* child) } return baseLayout()->isAncestorOf(child); } +#else +bool LtsSession::isChildOfSession(QWidget* /*child*/) +{ + return false; +} +#endif // BUILD_RTI void LtsSession::doneInitializingSession() { @@ -1219,6 +1448,7 @@ void LtsSession::doneInitializingSession() return; } +#ifdef BUILD_RTI if (!m_sessionManager->isHeadless()) // disallow base layout creation if app is headless { int sessionCount = m_sessionManager->sessionCount(); @@ -1234,7 +1464,9 @@ void LtsSession::doneInitializingSession() // return; // } } +#endif +#ifdef BUILD_RTI // qWarning() << "emit signalDoneInitializingSession();"; if (!createTopicClient(m_coreFtc)) @@ -1258,10 +1490,15 @@ void LtsSession::doneInitializingSession() } // qWarning() << "not headless !"; +#else + // Non-RTI build: always emit signal after initialization + emit _signalDoneInitializingSession(); +#endif // BUILD_RTI } void LtsSession::slotShowOnlineHelp(const QString& fileName) { +#ifdef BUILD_RTI if (m_ohvIfc == nullptr) { LtsWidgets::LtsMessageDialog::showMessage(baseLayout() /* can be 0ptr */, tr("Online Help not available.")); @@ -1269,8 +1506,13 @@ void LtsSession::slotShowOnlineHelp(const QString& fileName) } m_ohvIfc->showHelp(fileName); +#else + Q_UNUSED(fileName) + // no-op in non-RTI build +#endif } +#ifdef BUILD_RTI void LtsSession::slotShowOperatorSettings() { const QMap& mapButtons = m_baseLayout->mapButtons(); @@ -1297,7 +1539,9 @@ void LtsSession::slotShowOperatorSettings() WARNING_LOG(m_logger) << "action for showing operator settings not found !!"; } +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::slotStartPluginInit() { m_initializeThesePlugins = m_guiPluginInterfaces; // copy @@ -1377,7 +1621,9 @@ void LtsSession::slotPluginInitDone() // NEVER call this directly, queue a signa m_slotPluginInitDoneMutex = false; // unlock } +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::slotExecuteNextPayload() { LtsWidgets::LtsGlobalWaitDialog::getInstance()->wait(); // show wait dialog again @@ -1481,7 +1727,9 @@ void LtsSession::slotExecuteNextPayload() // m_ignoreSignalInLoop = false; // executing payload is done, clear the ignore-flag } +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::executePayloads() { // look for gui plugins (needed to get execution priority and run payloads) @@ -1511,7 +1759,9 @@ void LtsSession::executePayloads() doneInitializingSession(); } } +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::clearDataPluginInterfaces() { QMap> weakDataPluginInterfaces; @@ -1540,7 +1790,9 @@ void LtsSession::clearDataPluginInterfaces() } #endif } +#endif // BUILD_RTI +#ifdef BUILD_RTI void LtsSession::clearGuiPluginInterfaces() { bool bInClearPluginInterfaces = true; @@ -1581,10 +1833,13 @@ void LtsSession::clearGuiPluginInterfaces() } #endif } +#endif // BUILD_RTI +#ifdef BUILD_RTI LtsSessionManager* LtsSession::getSessionManager() { return m_sessionManager; } +#endif } // namespace LtsSession diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session.cpp.backup_session_1172 b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session.cpp.backup_session_1172 new file mode 100644 index 000000000..d6f833221 --- /dev/null +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session.cpp.backup_session_1172 @@ -0,0 +1,1822 @@ +/** + * @RDE_HEADER@ + * Keeps the DDS Connector and common data about the session + * $Id$ + * $HeadURL$ + * $Author$ + * + * Created by Mike Wille, SLSE, 2016-05-15 + */ + +#include "lts_session.h" + +#ifdef BUILD_RTI +#include "lts_session_data_dds.h" +#include "lts_session_lock_handler.h" +#endif +// Stub logging macros when BUILD_RTI=OFF +#ifndef BUILD_RTI +// Logging deaktivieren - qDebug() wird verwendet weil es operator<< für QString unterstützt +#define DEBUG_LOG(logger) if (false) qDebug() +#define WARNING_LOG(logger) if (false) qDebug() +#define ERROR_LOG(logger) if (false) qDebug() +#define INFO_LOG(logger) if (false) qDebug() +#define TRACE_LOG(logger) if (false) qDebug() +#define LOGFUNCTION "" +#endif +#include "lts_session_manager.h" + +#include +#include +#include +#include +#include +#include +#include // app icons +#include // TODO: rm on release ! +#include +#include +#include +#include +#include +#include +#ifdef BUILD_FILTERMANAGEMENT +#include // XXX: grrr.. +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// #include + +using namespace LtsWidgets; + +namespace LtsSession +{ +bool LtsSession::s_valgrind = false; +int LtsSession::s_nextSessionId = 0; + +LtsSession::LtsSession(LtsSessionManager* sessionManager) + : m_sessionManager(sessionManager), m_mainBackground(nullptr), m_hasBaseLayout(false), m_baseLayout(nullptr), + m_markedForDeletion(false), m_payloads(false), m_initDone(false), m_menuVisible(true), m_firstActionsFetch(true), +#ifdef BUILD_RTI + m_exerciseData(new LtsWidgets::ExerciseData), + m_currentInitIfc(nullptr), m_slotPluginInitDoneMutex(false), m_pluginInitDone(false), +#else + m_exerciseData(nullptr), +#endif + m_hidden(false), m_loadedFromSavegame(false), m_foreverInvisible(false), + m_id(s_nextSessionId++) +{ + LtsWidgets::LtsGlobalWaitDialog::getInstance()->wait(); + + connect(this, &LtsSession::signalDoneInitializingSession, this, &LtsSession::slotStopWaitDialog); + connect(this, &LtsSession::signalInitializationAborted, this, &LtsSession::slotStopWaitDialog); + + // preparations for stack connect + connect(this, &LtsSession::_signalDoneInitializingSession, this, [this]() { + // if (m_initDone) + // qWarning() << "blub"; + disconnect(this, &LtsSession::_signalDoneInitializingSession, this, nullptr); + // qWarning() << "mep" << + // QStringLiteral("%1:%2").arg(QString::fromUtf8(__FILE__).split(QStringLiteral("/")).last()).arg(__LINE__); + m_initDone = true; + emit signalDoneInitializingSession(); + }); + + QTimer* t = new QTimer(this); + t->setInterval(1000); + connect(t, &QTimer::timeout, this, &LtsSession::signalStillAlive); + t->start(); + m_scriptEditorTimer = new QTimer(this); + // [Qatar MNQ-474] Crash open Script Editor application Hack + if (strcmp(PROJECTBUILD, "qatarmout") == 0 || strcmp(PROJECTBUILD, "qatar") == 0) + { +#ifdef BUILD_RTI + DEBUG_LOG(m_logger) << "qatarmout Timer = 4000"; +#endif + m_scriptEditorTimer->setInterval(4000); + } + else + { +#ifdef BUILD_RTI + DEBUG_LOG(m_logger) << "qatarmout Timer = 0"; +#endif + m_scriptEditorTimer->setInterval(0); + } + + m_scriptEditorTimer->setSingleShot(true); +#ifdef BUILD_RTI + connect(m_scriptEditorTimer, &QTimer::timeout, this, &LtsSession::delayScriptEditorStart); +#endif +} + +LtsSession::~LtsSession() +{ + // qCritical() << "~LtsSession"; + + // delete m_mainBackground; parented on hiddenWidget! +#ifdef BUILD_RTI + delete m_baseLayout; // TODO: deleteLater? problem: clear interfaces! + // qWarning() << this << "deleted" << m_baseLayout; +#endif + + // Don't: qDeleteAll(m_notiCtlList); + + // make sure to unref the data plugins, as they carry this LtsSession, and the erase method would not delete the + // Session (avoid circular dependencies) +#ifdef BUILD_RTI + clearGuiPluginInterfaces(); + clearDataPluginInterfaces(); +#endif + +#ifdef BUILD_RTI + delete m_exerciseData; +#endif +} + +QString LtsSession::toString() const +{ + QString str; + str.append(QStringLiteral("LtsSession: this=%1").arg(QString::number(reinterpret_cast(this)))); +#ifdef BUILD_RTI + str.append(QStringLiteral(", domainId=%1, partitionId=%2").arg(domainId()).arg(partitionId())); +#endif + str.append(QStringLiteral(", workspaceId='%1'").arg(workspaceId())); + str.append(QStringLiteral(", appToString='%1'").arg(appToString(app()))); +#ifdef BUILD_RTI + str.append(QStringLiteral(", partitionType=%1, exerciseId='%2'").arg(partitionType()).arg(exerciseId())); + str.append(QStringLiteral(", LtsSessionDataDds=%1").arg(LtsSessionDataDds::toString())); +#endif + return str; +} + +#ifdef BUILD_RTI +QWidget* LtsSession::baseLayoutWidget() +{ + // qWarning() << "baseLayoutWidget" << m_baseLayout; + // qWarning() << "baseLayoutWidget (widget)" << static_cast(m_baseLayout); + return static_cast(m_baseLayout); +} +#else +QWidget* LtsSession::baseLayoutWidget() +{ + return nullptr; +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::aboutToCloseTab(LayoutArea area) +{ + m_baseLayout->getTabFromLayoutArea(area)->aboutToClose(); +} +#else +void LtsSession::aboutToCloseTab(LayoutArea /*area*/) +{ + // no-op in non-RTI build +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::aboutToClose() +{ + emit sessionAboutToBeDestroyed(this); + + if (m_baseLayout == nullptr) + return; + + aboutToCloseTab(LayoutArea::eDialogTab); + aboutToCloseTab(LayoutArea::eInfoTab); + aboutToCloseTab(LayoutArea::eSpecialTab); + aboutToCloseTab(LayoutArea::eMainTab); +} +#else +void LtsSession::aboutToClose() +{ + emit sessionAboutToBeDestroyed(this); + // no-op in non-RTI build +} +#endif // BUILD_RTI + +void LtsSession::slotStopWaitDialog() +{ + disconnect(this, &LtsSession::signalDoneInitializingSession, this, &LtsSession::slotStopWaitDialog); + disconnect(this, &LtsSession::signalInitializationAborted, this, &LtsSession::slotStopWaitDialog); + + LtsWidgets::LtsGlobalWaitDialog::getInstance()->done(); +} + +QString LtsSession::appToString(LtsAppDescriptor::App app) +{ + using namespace LtsAppDescriptor; + switch (app) + { + case App::Situation: + return tr("Situation"); + case App::ResourceManager: + return tr("Resource Manager"); + case App::PlanEditor: + return tr("Plan Editor"); + case App::BuildingViewer: + return tr("Building Viewer"); + case App::OC: + return tr("O/C"); + case App::OrgChart: + return tr("Organisation Chart"); + case App::Scripts: + return tr("Scripts"); + case App::Snapshot: + return tr("Snapshot"); + case App::SystemMonitor: + return tr("System Monitor"); + case App::Timeline: + return tr("Timeline"); + case App::SymbolEditor: + return tr("Symbol Editor"); + case App::ScriptEditorEssentialsView: + return tr("Scripts Essentials View"); + case App::BaseDownloader: + return tr("Base Downloader"); + case App::OnlineHelp: + return tr("Online Help"); + case App::ThpSituationReplay: + return tr("THP Situation Replay"); + case App::SituationTablet: + return tr("Situation (Tablet)"); + case App::SilhouetteEditor: + return tr("Silhouette Editor"); + case App::Shootback: + return tr("Shootback"); + case App::Login: + return tr("Login"); + break; + case App::SAAs: + return tr("SAAs"); + break; + } + + return tr("Unknown"); +} + +QString LtsSession::appIconFilename(LtsAppDescriptor::App app) +{ + using namespace LtsAppDescriptor; + switch (app) + { + case App::Situation: + return QStringLiteral("icon:situation.svg"); + case App::ResourceManager: + return QStringLiteral("icon:player_equipment.svg"); + case App::PlanEditor: + return QStringLiteral("icon:plan_editor.svg"); + case App::BuildingViewer: + return QStringLiteral("icon:3d_viewer.svg"); + case App::OC: + return QStringLiteral("icon:display_oc_evaluations.svg"); + case App::OrgChart: + return QStringLiteral("icon:org_chart.svg"); + case App::Scripts: + return QStringLiteral("icon:insert_script.svg"); + case App::Snapshot: + return QStringLiteral("icon:snapshots.svg"); + case App::SystemMonitor: + return QStringLiteral("icon:system_status.svg"); + case App::Timeline: + return QStringLiteral("icon:timeline.svg"); + case App::SymbolEditor: + return QStringLiteral("icon:define_tactical_symbols.svg"); + case App::ScriptEditorEssentialsView: + return QStringLiteral("icon:evaluation_elements.svg"); + case App::BaseDownloader: + return QStringLiteral("icon:download.svg"); + case App::OnlineHelp: + return QStringLiteral("icon:help.svg"); + case App::ThpSituationReplay: + return QStringLiteral("icon:restart.svg"); + case App::SituationTablet: + return QStringLiteral("icon:situation.svg"); + case App::SilhouetteEditor: + return QStringLiteral("icon:situation.svg"); + case App::Shootback: + return QStringLiteral("icon:target.svg"); + case App::SAAs: + return QStringLiteral("icon:saa_remote_desktop.svg"); + case App::Login: + break; + } + + return {}; +} + +QIcon LtsSession::appToIcon(LtsAppDescriptor::App app) +{ + return LtsUtils::iconFromSvg(appIconFilename(app)); +} + +#ifdef BUILD_RTI +bool LtsSession::removeMenuAction(LtsWidgets::LtsDragIcon* icon) +{ + if (!m_baseLayout) + return false; + return m_baseLayout->removeMenuAction(icon); +} +#endif + +#ifdef BUILD_RTI +void LtsSession::setMenuVisible(bool visible) +{ + m_menuVisible = visible; + + if (m_baseLayout == nullptr) + return; + + m_baseLayout->getMenu()->setVisible(visible); +} +#else +void LtsSession::setMenuVisible(bool /*visible*/) +{ + // no-op in non-RTI build +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +LtsDragIcon* LtsSession::addAction(const LtsWidgets::PluginData& plData, bool isFirstRun) +{ + if (!m_baseLayout) + { + ERROR_LOG(m_logger) << "No BaseLayout available atm, cannot add action!"; + return nullptr; + } + + return m_baseLayout->addMenuAction(plData, isFirstRun); +} + +LtsNotification::LtsNotification* LtsSession::createNotification(const QString& identifier) +{ + LtsNotification::LtsNotificationController* c = new LtsNotification::LtsNotificationController(identifier); + LtsNotification::LtsNotification* n = new LtsNotification::LtsNotification(c); + + if (m_baseLayout) + m_baseLayout->addNotification(c->createWidget()); + + m_notiCtlList.append(c); + // Wenn die notification getötet wird, auch wieder austragen... + connect(c, &LtsNotification::LtsNotificationController::destroyed, this, + [this, c]() { m_notiCtlList.removeAll(c); }); + + return n; +} +#else +LtsDragIcon* LtsSession::addAction(const LtsWidgets::PluginData& /*plData*/, bool /*isFirstRun*/) +{ + // no-op in non-RTI build + return nullptr; +} + +LtsNotification::LtsNotification* LtsSession::createNotification(const QString& /*identifier*/) +{ + // no-op in non-RTI build + return nullptr; +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +bool LtsSession::init(const DdsConnectionParams& connParams, + const QVector& dataPluginList, + const QVector& guiPluginList, bool hidden) +{ + m_foreverInvisible = hidden; + if (!LtsSessionDataDds::init(connParams)) + return false; + initializePlugins(dataPluginList, guiPluginList); + return true; +} + +bool LtsSession::init(const dds::domain::DomainParticipant& dp, const DdsConnectionParams& connParams, + const QVector& dataPluginList, + const QVector& guiPluginList) +{ + if (!LtsSessionDataDds::init(dp, connParams)) + return false; + initializePlugins(dataPluginList, guiPluginList); + return true; +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::initializePlugins(const QVector& dataPluginList, + const QVector& guiPluginList) +{ + initializeDataPlugins(dataPluginList); + initializeGuiPlugins(guiPluginList); +} + +void LtsSession::initializeDataPlugins(const QVector& + dataPluginList) // TODO: DOC: no gui ifcs in data ifcs ! (as + // fetchInterfaces() is done before gui ifcs are loaded) +{ + QMap> newDataPluginInterfaces; + + for (const LtsPluginManager::AppPluginInstance& api : dataPluginList) + { + DataPluginBase::Plugin* plugin = qobject_cast(api.pluginInstance.plugin); + + if (!plugin) + { + WARNING_LOG(m_logger) << "Session: invalid data plugin (" + << api.pluginInstance.plugin->metaObject()->className() << ")" + << api.pluginInstance.fileName; + continue; + } + + // super heavy hardcore hack to speed up login -> we need to check what plugins are needed for an app! + if (app() == LtsAppDescriptor::App::Login && + (!plugin->pluginName().contains(QStringLiteral("AssetManagement")) && + !plugin->pluginName().contains(QStringLiteral("OperatorManagement")) && + !plugin->pluginName().contains(QStringLiteral("ExerciseManagement")))) + continue; + + // check if plugin has to be loaded in this session type + if (!plugin->availableInPartition(partitionType())) + { + DEBUG_LOG(m_logger) << "Data plugin " << api.pluginInstance.pluginName + << " is not available in this partition type " << partitionType(); + continue; + } + + // super heavy hardcore hack to speed up login + if ((!plugin->pluginName().contains(QStringLiteral("AssetManagement")) && + !plugin->pluginName().contains(QStringLiteral("OperatorManagement")) && + !plugin->pluginName().contains(QStringLiteral("ExerciseManagement"))) && + app() == LtsAppDescriptor::App::Login) + continue; + std::shared_ptr ifc = plugin->createDataInterface(this); + if (!ifc) + { + WARNING_LOG(m_logger) << "Create data interface failed for '" << api.pluginInstance.pluginName << "' !"; + continue; + } + + m_dataPluginInterfaces[plugin->pluginName()] = ifc; + newDataPluginInterfaces[plugin->pluginName()] = ifc; + DEBUG_LOG(m_logger) << "Adding data plugin " << plugin->pluginName() << " for " << partitionType() << " - " + << this; + } + + addAvailablaeDataPluginInterfaces(newDataPluginInterfaces); +} +#endif + +#ifdef BUILD_RTI +void LtsSession::initializeGuiPlugins(const QVector& guiPluginList) +{ + m_failedFetches.clear(); + + /* important to create gui interfaces even if they are not available in a session, + * but foreign plugins can still use their ForeignGuiInterface to use + * their windows */ + + for (auto i = guiPluginList.constBegin(); i != guiPluginList.constEnd(); ++i) + { + const LtsPluginManager::AppPluginInstance& api = *i; + + GuiPluginBase::Plugin* plugin = qobject_cast(api.pluginInstance.plugin); + + if (!plugin) + { + WARNING_LOG(m_logger) << "Session: invalid gui plugin (" + << api.pluginInstance.plugin->metaObject()->className() << ")" + << api.pluginInstance.fileName; + continue; + } + + // check if plugin has to be loaded in this session type + if (!plugin->availableInPartition(partitionType())) + { + DEBUG_LOG(m_logger) << "Gui plugin " << api.pluginInstance.pluginName + << " is not available in this partition type " << partitionType(); + continue; + } + + std::shared_ptr ifc = plugin->createGuiInterface(this); + + if (!ifc) + { + WARNING_LOG(m_logger) << "Create gui interface failed for '" << api.pluginInstance.pluginName << "' (" + << api.pluginInstance.plugin->metaObject()->className() << ") !"; + continue; + } + + QFlags flags = api.m_flags; // copy flags + + if (api.pluginInstance.pluginName == QStringLiteral("dev")) + flags |= LtsAppDescriptor::PluginInfo::Flag::ACTIONS; + + ifc->setFlags(flags); // durchreichen.. raw plugin => plugin instance + ifc->setOptions(api.m_options); // s.a.a. + ifc->setAppId(api.m_appId); // s.a.a. + m_guiPluginInterfaces[plugin->pluginName()] = ifc; + DEBUG_LOG(m_logger) << "Adding gui plugin " << plugin->pluginName() << " for " << partitionType() << " - " + << this; + } + + /*/ + * there are all plugin instances in this list + * if fetchInterface of a single plugin failes, that plugin instance will be removed (does not find his obligatory + plugin(s) in this list) + * a refetch has to be done, in case some other plugin(s) used that plugin which is now deleted + /*/ + QMutableMapIterator> it( + m_guiPluginInterfaces); // modify a list while iterating through it + while (it.hasNext()) + { + const auto val = it.next(); + const QString& guiPluginKey = val.key(); + std::shared_ptr guiPlugin = val.value(); + + if (!guiPlugin->fetchInterfaces()) + { + DEBUG_LOG(m_logger) << "Fetching interfaces failed for Gui Plugin '" << guiPluginKey + << "' - removing and refetching !"; + m_failedFetches.append(guiPluginKey); + it.remove(); + it.toFront(); // rewind! + + // remove from payloads list if failed, because payload might already be added before refetching, but we + // don't want payloads of plugins that failed fetching interfaces.. + for (auto i = m_payloadPriorityMap.begin(); i != m_payloadPriorityMap.end(); ++i) + { + std::shared_ptr payloadIfc = *i; + + if (payloadIfc == guiPlugin) + break; + } + + m_payloadList.removeAll(guiPlugin); + } + else + { + // ERROR_LOG(m_logger) << "GUI FETCH INTERFACE OKAY!"; + + int executionPriority = guiPlugin->executionPriority(); + + if (executionPriority > -1) + { + if (m_payloads && guiPlugin->getFlags().testFlag(LtsAppDescriptor::PluginInfo::Flag::PAYLOAD)) + { + if (executionPriority == 9999) + { + if (!m_payloadList.contains(guiPlugin)) + m_payloadList.append(guiPlugin); + } + else + m_payloadPriorityMap.insert(executionPriority, + guiPlugin); // addPayload(executionPriority, guiPlugin); + // DEBUG_LOG(m_logger) << " > has payloads, adding payload request to session"; + } + } + + // DEBUG_LOG(m_logger) << " > done"; + } + } + + QTimer::singleShot(100, this, &LtsSession::slotStartPluginInit); + // executePayloads(); // does not execute when there are no payloads, but is needed to be called here ! +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +LtsTabWidget* LtsSession::locateWidget(QWidget* widgetToLocate, LayoutArea area) +{ + if (!m_baseLayout) + return nullptr; + + LtsTabWidget* tabWidget = m_baseLayout->getTabFromLayoutArea(area); + + if (tabWidget->indexOf(widgetToLocate) >= 0) + return tabWidget; + + return nullptr; // not found! +} +#else +LtsTabWidget* LtsSession::locateWidget(QWidget* /*widgetToLocate*/, LayoutArea /*area*/) +{ + return nullptr; +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::enableBaseLayoutMenu(bool on) +{ + if (m_baseLayout) + { + QWidget* ltsMenu = m_baseLayout->getMenu(); + + if (ltsMenu) + ltsMenu->setEnabled(on); + } +} + +void LtsSession::enableBaseLayoutArea(LtsWidgets::LayoutArea area, bool on) +{ + if (m_baseLayout) + { + QWidget* ltsWidget = m_baseLayout->getTabFromLayoutArea(area); + if (ltsWidget) + ltsWidget->setEnabled(on); + } +} +#else +void LtsSession::enableBaseLayoutMenu(bool /*on*/) +{ + // no-op in non-RTI build +} + +void LtsSession::enableBaseLayoutArea(LtsWidgets::LayoutArea /*area*/, bool /*on*/) +{ + // no-op in non-RTI build +} +#endif // BUILD_RTI + +int LtsSession::workstationIp() +{ + static int wsId = -1; + if (wsId == -1) + { +#if QT_VERSION < QT_VERSION_CHECK(5, 11, 0) + const QString hostname = workstationName(); + const auto addreses = QHostInfo::fromName(hostname).addresses(); + for (const QHostAddress& ha : addreses) + { + if (ha.isLoopback()) + continue; + if (ha.protocol() != QAbstractSocket::NetworkLayerProtocol::IPv4Protocol) + continue; + wsId = static_cast(ha.toIPv4Address()); + break; + } +#else + const QList interfaces = QNetworkInterface::allInterfaces(); + for (const QNetworkInterface& ninterface : interfaces) + { + if (ninterface.type() == QNetworkInterface::InterfaceType::Wifi) + continue; + const auto addreseEntry = ninterface.addressEntries(); + for (const QNetworkAddressEntry& ent : addreseEntry) + { + const QHostAddress ha = ent.ip(); + if (ha.isLoopback()) + continue; + if (ha.protocol() != QAbstractSocket::NetworkLayerProtocol::IPv4Protocol) + continue; + wsId = static_cast(ha.toIPv4Address()); + break; + } + if (wsId != -1) + break; + } +#endif + } + return wsId; +} + +QString LtsSession::workstationName() +{ + return QHostInfo::localHostName().toUpper(); +} + +const QString LtsSession::workspaceId() const +{ +#ifdef BUILD_RTI + if (isReplayPartition()) + return QStringLiteral("replay_%1").arg(QString::number(partitionId())); +#endif + return m_workspaceId; // sessionManager->workspaceId(); +} + +void LtsSession::setWorkspaceId(const QString &newWorkspaceId /* <= MW: that's why I like "get" in getter names (needed to prepend "new" because of already existing method with the name "workspaceId") */) +{ + DEBUG_LOG(m_logger) << LOGFUNCTION << " change workspaceId: cur = '" << m_workspaceId << "' for app '" + << appToString(app()) << "'"; + DEBUG_LOG(m_logger) << LOGFUNCTION << " change workspaceId: new = '" << newWorkspaceId << "' for app '" + << appToString(app()) << "'"; + m_workspaceId = newWorkspaceId; // m_sessionManager->setWorkspaceId(workspaceId); + +#ifdef BUILD_RTI + if (m_baseLayout) + m_baseLayout->setWorkspaceId(workspaceId() /* use getter instead of member var, as replay partition strings can only be retrieved with the getter */); +#endif // BUILD_RTI + + emit workspaceIdChanged(newWorkspaceId); +} + +#ifdef BUILD_RTI +ExcState LtsSession::exerciseState() const +{ + return m_exerciseData ? m_exerciseData->exState : ExerciseState::eUnknown; +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::connectOnlineHelpButton(LtsWidgets::LtsDialog* widget) +{ + // FIXME: HACK: also connect show online help here !! + connect(widget, &LtsDialog::signalShowOnlineHelp, this, &LtsSession::slotShowOnlineHelp, Qt::UniqueConnection); +} + +void LtsSession::slotStapleTopicLockHandler(LtsWidgets::LtsDialog* widget) +{ + if (widget->property("topicLockStapled").isValid()) + { + Q_ASSERT(false); + return; + } + widget->setProperty("topicLockStapled", true); + + connectOnlineHelpButton(widget); + if (m_coreFtc == nullptr) + { + DEBUG_LOG(m_logger) << "no core ftc, no TopicLockHandler for " << toString(); + return; + } + + auto* topicLockHandler = new TopicLockHandler(/* widget <= see comment below */); + /*/ + * Conceptional: widgets is closing, widget deletes lock handler, lock handler unlocks via ftc, + * lock handler was deleted, ftc answers to already deleted lock handler => crash + * This is a conceptional problem in all the ftc handlers + /*/ + + if (!topicLockHandler->init(m_coreFtc, m_exerciseId)) + { + WARNING_LOG(m_logger) << "LtsSession::addWidget: init of TopicLockHandler failed!"; + delete topicLockHandler; + return; + } + + connect(topicLockHandler, &TopicLockHandler::signalLockDialog, widget, &LtsDialog::slotLock, Qt::QueuedConnection); + connect(topicLockHandler, &TopicLockHandler::signalUnlockDialog, widget, &LtsDialog::slotUnlock, + Qt::QueuedConnection); + connect(widget, &LtsDialog::signalLockTopic, topicLockHandler, &TopicLockHandler::slotTryLock, + Qt::DirectConnection); // sync! + + // widget->setTopicLockHandler(topicLockHandler); + + connect(widget, &LtsDialog::destroyed, topicLockHandler, &TopicLockHandler::slotFinalize, Qt::QueuedConnection); + + // qWarning() << "added tlh to" << widget->windowTitle(); + + connectOnlineHelpButton(widget); +} +#else +void LtsSession::connectOnlineHelpButton(LtsWidgets::LtsDialog* widget) +{ + Q_UNUSED(widget) + // no-op in non-RTI build +} + +void LtsSession::slotStapleTopicLockHandler(LtsWidgets::LtsDialog* widget) +{ + Q_UNUSED(widget) + // no-op in non-RTI build +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +bool LtsSession::focusTab(const QString& menuGroup, const QString& identifier, LtsWidgets::LayoutArea area) +{ + if (!m_baseLayout) + { + ERROR_LOG(m_logger) << "no base layout to focus a tab on! menuGroup: " << menuGroup << "ident: " << identifier; + return false; + } + + return m_baseLayout->focusTab(menuGroup, identifier, area); +} +#else +bool LtsSession::focusTab(const QString& menuGroup, const QString& identifier, LtsWidgets::LayoutArea area) +{ + Q_UNUSED(menuGroup) + Q_UNUSED(identifier) + Q_UNUSED(area) + return false; +} +#endif + +#ifdef BUILD_RTI +LtsWidgets::LtsDialog* LtsSession::getWidget(const QString& menuGroup, const QString& identifier, + LtsWidgets::LayoutArea area) +{ + if (!m_baseLayout) + { + ERROR_LOG(m_logger) << "no base layout to get a widget from! menuGroup: " << menuGroup + << "ident: " << identifier; + return nullptr; + } + + return m_baseLayout->getWidget(menuGroup, identifier, area); +} +#else +LtsWidgets::LtsDialog* LtsSession::getWidget(const QString& menuGroup, const QString& identifier, + LtsWidgets::LayoutArea area) +{ + Q_UNUSED(menuGroup) + Q_UNUSED(identifier) + Q_UNUSED(area) + return nullptr; +} +#endif + +#ifdef BUILD_RTI +bool LtsSession::widgetExists(const QString& menuGroup, const QString& identifier, LayoutArea area) const +{ + if (!m_baseLayout) + return false; + LtsTabWidget* tab = m_baseLayout->getTabFromLayoutArea(area); + if (!tab) + return false; + QWidget* existingWidget = tab->getWidget(menuGroup, identifier); + return existingWidget != nullptr; +} +#else +bool LtsSession::widgetExists(const QString& /*menuGroup*/, const QString& /*identifier*/, LayoutArea /*area*/) const +{ + return false; +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +bool LtsSession::addWidget(LtsDialog* widget, const QString& menuGroup, const QString& identifier, LayoutArea area, + bool setClosable) +{ + // TODO: operator selection + possibility to permanent select base layout until its dissolving + + if (!m_baseLayout) + { + ERROR_LOG(m_logger) << "no base layout to put a widget on! menuGroup: " << menuGroup << "ident: " << identifier; + return false; + } + + // slotStapleTopicLockHandler(widget); => already done in blw's addWidget (below!) + // FIXMe: connect(widget, &LtsDialog::signalShowOnlineHelp, + // this, &LtsSession::slotShowOnlineHelp, + // Qt::UniqueConnection) done in slotStaple.. because using LtsDialog::addDialog does NOT reach this + // code here ! + + return m_baseLayout->addWidget(widget, menuGroup, identifier, area, setClosable); +} +#else +bool LtsSession::addWidget(LtsDialog* widget, const QString& menuGroup, const QString& identifier, LayoutArea area, + bool setClosable) +{ + Q_UNUSED(widget) + Q_UNUSED(menuGroup) + Q_UNUSED(identifier) + Q_UNUSED(area) + Q_UNUSED(setClosable) + return false; +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::setExerciseData(const LtsWidgets::ExerciseData& exerciseData) +{ + // avoid mutiple calls (and signal to emitted multiple times) + if ((*m_exerciseData) == exerciseData) + return; + + *m_exerciseData = exerciseData; + // partitionType(); ?!? + if (!m_baseLayout) + return; + m_baseLayout->setExerciseData(exerciseData); + emit signalExerciseDataChanged(); +} + +void LtsSession::setProfilePicture(const QPixmap& pixmap) +{ + // partitionType(); ?!? + if (!m_baseLayout) + return; + m_baseLayout->setProfilePicture(pixmap); +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::makeVisible() +{ + Q_ASSERT(m_baseLayout == nullptr); + if (m_baseLayout) // onyl create a new base layout when there was not one before ! + { + qCritical() << "base layout already visible"; + return; + } + + createBaseLayout(); +} +#else +void LtsSession::makeVisible() +{ + // BUILD_RTI=OFF: No base layout to create +} +#endif + +#ifdef BUILD_RTI +void LtsSession::refetchActions() +{ + // get actions + for (auto i = m_guiPluginInterfaces.cbegin(); i != m_guiPluginInterfaces.cend(); ++i) + { + std::shared_ptr ifc = *i; + + if (!ifc->availableInPartition(partitionType())) + { + DEBUG_LOG(m_logger) << i.key() << " is not available in this partition type " << partitionType(); + continue; + } + + if (m_firstActionsFetch && ifc->getFlags().testFlag(LtsAppDescriptor::PluginInfo::Flag::MAIN) && + !ifc->getFlags().testFlag( + LtsAppDescriptor::PluginInfo::Flag::ACTIONS)) // respect the MAIN flag, even though ACTIONS is not set + // (main, but NOT actions) [but only if this is NOT a + // refetch] + { + ERROR_LOG(m_logger) << "Plugin '" << i.key() + << "' has flag 'MAIN' but is missing the 'ACTIONS' flag - ingoring actions!"; + continue; + } + + if (ifc->getFlags().testFlag(LtsAppDescriptor::PluginInfo::Flag::ACTIONS)) + { + // get gui plugin's actions (only when init was successful) + const QVector plData = ifc->getActions(); + + if (plData.isEmpty()) + DEBUG_LOG(m_logger) << i.key() << " (" << ifc->menuGroup() << ") does not provide actions"; + + // WARNING_LOG(m_logger) << " > " << plData.count() << " Actions"; + + for (const LtsWidgets::PluginData& pd : plData) + { + if (!pd.menuGroup.isEmpty() && !pd.menuText.isEmpty() && + pd.identifier.isEmpty()) // check if identifier is missing + ERROR_LOG(m_logger) << "Identifier for Action " << pd.menuGroup << " - " << pd.menuText + << " missing - not added!"; + else + { + if (!LtsSessionData::LtsSessionData::getInstance()->hasOperatorRight(pd.operatorRight)) + m_missingRightActions += pd; + + m_baseLayout->addMenuAction(pd, m_firstActionsFetch); + } + } + } + else + { + // WARNING_LOG(m_logger) << " > " << plData.count() << " Actions - but ignored by flag"; + } + } + +#ifdef LTS_DEBUG + if (m_firstActionsFetch) + { + const QString& executeAction(qEnvironmentVariable("EXCON_EXECUTE_ACTION", {})); + if (!executeAction.isEmpty()) + { + WARNING_LOG(m_logger) << "EXCON_EXECUTE_ACTION was set to: " << executeAction; + m_baseLayout->executeAction(executeAction); + } + } +#endif + + m_firstActionsFetch = false; +} +#else +void LtsSession::refetchActions() +{ + // BUILD_RTI=OFF: No actions to fetch + m_firstActionsFetch = false; +} +#endif + +#ifdef BUILD_RTI +void LtsSession::slotSwap() +{ + LtsMultiMonitor::LtsMultiMonitor::getInstance()->selectAndSwap(m_baseLayout); +} +#else +void LtsSession::slotSwap() +{ + // BUILD_RTI=OFF: No base layout to swap +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +int LtsSession::screenId() const +{ + if (m_baseLayout == nullptr) + return -1; + + LtsMultiMonitor::LtsScreenBase* screen = + LtsMultiMonitor::LtsMultiMonitor::getInstance()->widgetsScreen(m_baseLayout); + + if (screen == nullptr) + return -2; + + return screen->screenId(); +} +#else +int LtsSession::screenId() const +{ + return -1; +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +int LtsSession::screenContainerId() const +{ + if (m_baseLayout == nullptr) + return -1; + + LtsMultiMonitor::LtsScreenBase* screen = + LtsMultiMonitor::LtsMultiMonitor::getInstance()->widgetsScreen(m_baseLayout); + + if (screen == nullptr) + return -2; + + try + { + return screen->containerIdOfWidget(m_baseLayout); + } + catch (...) + { + } + + return -3; +} +#else +int LtsSession::screenContainerId() const +{ + return -1; +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +int LtsSession::screenTypeId() const +{ + if (m_baseLayout == nullptr) + return -1; + + LtsMultiMonitor::LtsScreenBase* screen = + LtsMultiMonitor::LtsMultiMonitor::getInstance()->widgetsScreen(m_baseLayout); + + if (screen == nullptr) + return -2; + + return screen->screenType(); +} +#else +int LtsSession::screenTypeId() const +{ + return -1; +} +#endif // BUILD_RTI + +LtsAppDescriptor::App LtsSession::app() const +{ + return m_sessionManager ? m_sessionManager->appId() : LtsAppDescriptor::App::Login; +} + +#ifdef BUILD_RTI +bool LtsSession::event(QEvent* e) +{ + if (e->type() == QEvent::LanguageChange) + m_baseLayout->setAppName(appToString(app())); + + return LtsSessionDataDds::event(e); +} +#else +bool LtsSession::event(QEvent* e) +{ + Q_UNUSED(e) + return LtsSessionDataDds::event(e); +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::addDeveloperActions() +{ + // DEVELOPER / DEBUG MENU + { + LtsWidgets::PluginData p; + p.menuGroup = QStringLiteral("[Dev]"); + p.menuText = QStringLiteral("Open Admin Session"); + p.identifier = QStringLiteral("OpenAdminSession"); + + p.directFunc = [&](const LtsWidgets::PluginData&) { + LtsSession* adminSession = m_sessionManager->getSession(IDL::PartitionType::Global, 0); + if (!adminSession) + { + // QMessageBox::information(nullptr, QString(), QStringLiteral("no admin session")); + DdsConnectionParams connParams; + connParams.domainId = domainId(); + connParams.partitionId = 0; + connParams.exerciseId = 0; + connParams.partitionType = IDL::PartitionType::Global; + connParams.tcpConnectionUrl = tcpConnectionUrl(); + connParams.qos_file = m_qosFileList; + adminSession = m_sessionManager->createSession( + connParams, true, + false); // no payloads !! TODO: is this a real domainId or a dead var ?? + return; + } + else + adminSession->makeVisible(); + }; + + m_baseLayout->addMenuAction(p); + } + + { + LtsWidgets::PluginData p; + p.menuGroup = QStringLiteral("[Dev]"); + p.menuText = QStringLiteral("Slow down RequestHelper"); + p.identifier = QStringLiteral("SlowDownRequestHelper"); + + p.directFunc = [&](const LtsWidgets::PluginData&) { LtsUtils::RequestHelper::s_debug = true; }; + + m_baseLayout->addMenuAction(p); + } + + { + LtsWidgets::PluginData p; + p.menuGroup = QStringLiteral("[Dev]"); + p.menuText = QStringLiteral("Reset RequestHelper"); + p.identifier = QStringLiteral("ResetRequestHelper"); + + p.directFunc = [&](const LtsWidgets::PluginData&) { LtsUtils::RequestHelper::s_debug = false; }; + + m_baseLayout->addMenuAction(p); + } + + { + LtsWidgets::PluginData p; + p.menuGroup = QStringLiteral("[Dev]"); + p.menuText = QStringLiteral("fake DoneInitializingSession"); + p.identifier = QStringLiteral("fakeDoneInitializingSession"); + + p.directFunc = [&](const LtsWidgets::PluginData&) { + m_initDone = true; + emit _signalDoneInitializingSession(); + }; + + m_baseLayout->addMenuAction(p); + } + // END DEVELOPER / DEBUG MENU +} +#endif + +#ifdef BUILD_RTI +bool LtsSession::notifyUnsavedChanges() +{ + if (m_baseLayout == nullptr) + return true; + + return m_baseLayout->notifyUnsavedChanges(); +} +#else +bool LtsSession::notifyUnsavedChanges() +{ + return true; +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::createBaseLayout() +{ + // qWarning() << "mep" << + // QStringLiteral("%1:%2").arg(QString::fromUtf8(__FILE__).split(QStringLiteral("/")).last()).arg(__LINE__); + + using namespace LtsAppDescriptor; + + TRACE_LOG(m_logger) << LOGFUNCTION << " START, Creating Base Layout for Session " << partitionId(); + + Q_ASSERT(m_baseLayout == nullptr); + if (m_baseLayout != nullptr) + { + WARNING_LOG(m_logger) << "Base Layout already exists for Session" << this; + return; // already exists + } + + m_baseLayout = new LtsBaseLayoutWidget; // main widget + + connect(m_baseLayout, &LtsBaseLayoutWidget::signalSuccessfullyPlaced, this, [this]() { + DEBUG_LOG(m_logger) << "current APP " << appToString(this->app()); + // qWarning() << "mep" << + // QStringLiteral("%1:%2").arg(QString::fromUtf8(__FILE__).split(QStringLiteral("/")).last()).arg(__LINE__); + if (this->app() == App::Scripts) + { + m_scriptEditorTimer->start(); + } + else + { + if (m_needsToBeSuccessfullyPlaced) + { + // qWarning() << "mep" << + // QStringLiteral("%1:%2").arg(QString::fromUtf8(__FILE__).split(QStringLiteral("/")).last()).arg(__LINE__); + emit + _signalDoneInitializingSession(); // needs to be emitted here, as if 'm_needsToBeSuccessfullyPlaced' is + // TRUE, it was not emitted before + } + } + }); + + connect(m_baseLayout, &LtsBaseLayoutWidget::destroyed, this, [this]() { + m_baseLayout = nullptr; // sec + // qWarning() << "baseLayout deleted"; + }); + + m_baseLayout->hide(); // hide + m_baseLayout->setSessionInfo(domainId(), partitionType(), partitionId(), + workspaceId()); // this shd ptr has a different counter .. + m_baseLayout->setWindowIcon( + appToIcon(app())); // for the magic corner to have an icon to show for switching to / from secondaries + + // auto *x = new QLabel; + // x->setPixmap(m_baseLayout->windowIcon().pixmap(128, 128)); + // x->show(); + + if (app() == App::ScriptEditorEssentialsView || // NOTE: timeline's replay app and snapshot's edit plan are + // secondaries, too - setSecondaryWidget needs to be called from + // timeline & snapshot app, too + m_presetBaseLayoutAsSecondaryWidget) + m_baseLayout->setSecondaryWidget(); + + connect(m_baseLayout, &LtsBaseLayoutWidget::signalRetranslateActions, this, &LtsSession::refetchActions); + connect(m_baseLayout, &LtsBaseLayoutWidget::signalClose, this, &LtsSession::signalClose); + connect(m_baseLayout, &LtsBaseLayoutWidget::signalLogout, this, &LtsSession::signalLogout); + connect(m_baseLayout, &LtsBaseLayoutWidget::signalShowOperatorSettings, this, + &LtsSession::slotShowOperatorSettings); + connect(m_baseLayout, &LtsBaseLayoutWidget::signalSwap, this, &LtsSession::slotSwap); + connect(this, &LtsSession::partitionTimeChanged, m_baseLayout, &LtsBaseLayoutWidget::setExerciseTime); + connect(m_baseLayout, &LtsBaseLayoutWidget::signalStapleTopicLockHandler, this, + &LtsSession::slotStapleTopicLockHandler, Qt::DirectConnection); + + const auto* sessionData = LtsSessionData::LtsSessionData::getInstance(); + + const QString& operatorName = sessionData->getOperatorName(); + bool showTerminalWindow = sessionData->getShowTerminalWindow(); + m_baseLayout->setOperatorName(operatorName, showTerminalWindow); + m_baseLayout->setProfilePicture(sessionData->getProfilePicture()); + m_baseLayout->setAppName(appToString(app())); + + refetchActions(); + +#ifdef LTS_DEBUG + bool showDeveloperActions = true; +#else + bool showDeveloperActions = false; +#endif + + if (sessionData->hasDebugFlag(QStringLiteral("DeveloperTools.Active"))) + showDeveloperActions = true; + + if (showDeveloperActions) + addDeveloperActions(); + + for (LtsNotification::LtsNotificationController* ctl : qAsConst(m_notiCtlList)) + { + if (!m_baseLayout->notificationExists(ctl->identifier())) // add if non-existent only + m_baseLayout->addNotification(ctl->createWidget()); // FIXME: crash when no icons? + } + + m_hasBaseLayout = true; // not needed anymore, but for its correctness..... + + m_baseLayout->getMenu()->setVisible(m_menuVisible); + m_baseLayout->initilizationFinished(); + + // QMessageBox::warning(nullptr, QStringLiteral("attach!"), QString()); + + if (!m_foreverInvisible) + { + // build list of irreplacable widgets by the dependency tree of its dependencies and their dependencies' + // dependencies + QVector irreplacableWidgets{baseLayoutWidget()}; + LtsSession* dependencySession = dependency(); + int runaway = 100; + while (dependencySession && runaway > 0) + { + irreplacableWidgets += dependencySession->baseLayoutWidget(); + dependencySession = dependencySession->dependency(); + runaway--; + } + + // qWarning() << "#2 irreplacableWidgets count" << irreplacableWidgets.count() << "from" << this; + + // for (QWidget *w : irreplacableWidgets) + // qWarning() << "irre" << w; + + LtsMultiMonitor::LtsMultiMonitor* multiMonitor = LtsMultiMonitor::LtsMultiMonitor::getInstance(); + + WARNING_LOG(m_logger) << "Presets: ScreenId: " << m_screenIdPreset + << ", screenContainerId: " << m_screenContainerIdPreset; + if (m_screenIdPreset >= 0) + multiMonitor->putScreen(m_baseLayout, m_screenIdPreset, m_screenContainerIdPreset); + else + multiMonitor->selectScreen(m_baseLayout, nullptr, true, false, irreplacableWidgets); + + slotMonitorSelected(); + connect(multiMonitor, &LtsMultiMonitor::LtsMultiMonitor::signalSelected, this, &LtsSession::slotMonitorSelected, + Qt::UniqueConnection); + + connect(multiMonitor, &LtsMultiMonitor::LtsMultiMonitor::signalScreenCountChanged, m_baseLayout, + &LtsBaseLayoutWidget::slotScreenCountChanged); + + m_baseLayout->slotScreenCountChanged(multiMonitor->screenCount()); + } + + if (!sessionData->isTablet()) + return; // done here if not a tablet + + LtsNotification::LtsNotification* noti = createNotification(QStringLiteral("TabletWindowSwitcher")); + + noti->setIcon(QIcon(QStringLiteral("icon:switch_display.svg"))); + noti->setAction([this]() { emit taskSwitch(this /* tell it that we are the caller, don't hide US! */); }); + + emit hideAllOtherBLWs(this); +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::slotMonitorSelected() +{ + auto mmm = LtsMultiMonitor::LtsMultiMonitor::getInstance(); + LtsMultiMonitor::LtsScreenBase* screen = mmm->widgetsScreen(m_baseLayout); + + if (!screen) + return; + + int newScreenContainerId; + try + { + newScreenContainerId = screen->containerIdOfWidget(m_baseLayout); + } + catch (...) + { + WARNING_LOG(m_logger) << "cannot find container for base layout"; + return; + } + + const int newScreenId = screen->screenId(); + if (m_screenId != newScreenId) + { + m_screenId = newScreenId; + m_screenContainerId = newScreenContainerId; + emit signalScreenIdChanged(m_screenId, m_screenContainerId, screen->screenType()); + } +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::delayScriptEditorStart() +{ + DEBUG_LOG(m_logger) << "LtsSession::delayScriptEditorStart "; + if (m_needsToBeSuccessfullyPlaced) + { + // qWarning() << "delayScriptEditorStart mep" << + // QStringLiteral("%1:%2").arg(QString::fromUtf8(__FILE__).split(QStringLiteral("/")).last()).arg(__LINE__); + + emit _signalDoneInitializingSession(); // needs to be emitted here, as if 'm_needsToBeSuccessfullyPlaced' is + // TRUE, it was not emitted before + } +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +bool LtsSession::isChildOfSession(QWidget* child) +{ + if (!child) + { + return false; + } + return baseLayout()->isAncestorOf(child); +} +#else +bool LtsSession::isChildOfSession(QWidget* /*child*/) +{ + return false; +} +#endif // BUILD_RTI + +void LtsSession::doneInitializingSession() +{ + LtsGlobalWaitDialog::getInstance()->done(); + + // qWarning() << "mep" << + // QStringLiteral("%1:%2").arg(QString::fromUtf8(__FILE__).split(QStringLiteral("/")).last()).arg(__LINE__); + + if (m_markedForDeletion) + { + emit signalInitializationAborted(); // to call done() on global wait dialog + emit signalClose(); // session manager removes us from his list and then deletes us + return; + } + + if (!m_sessionManager->isHeadless()) // disallow base layout creation if app is headless + { + int sessionCount = m_sessionManager->sessionCount(); + + if (!m_hidden && + (m_hasBaseLayout || sessionCount < 1)) // show base layout if m_hasBaseLayout is true OR IF there is only + // this session (e.g. Payloads have not started any sessions) + makeVisible(); + + // if (!m_hasBaseLayout) // delete session if it's useless & empty + // { + // emit signalClose(); + // return; + // } + } + +#ifdef BUILD_RTI + // qWarning() << "emit signalDoneInitializingSession();"; + + if (!createTopicClient(m_coreFtc)) + WARNING_LOG(m_logger) << "could not create core ftc - no tlh"; + m_coreFtc->enableAll(); + + if (!getForeignGuiInterface(m_ohvIfc)) + WARNING_LOG(m_logger) << "no ovh ifc, no Help-Button !"; + + INFO_LOG(m_logger) << "emit signalDoneInitializingSession, session=" << this; + // qWarning() << "mep" << + // QStringLiteral("%1:%2").arg(QString::fromUtf8(__FILE__).split(QStringLiteral("/")).last()).arg(__LINE__); + // qWarning() << !m_needsToBeSuccessfullyPlaced << m_sessionManager->isHeadless() << !m_hasBaseLayout; + if (!m_needsToBeSuccessfullyPlaced || m_sessionManager->isHeadless() || + !m_hasBaseLayout) // can't be placed if without something to show .. :) + { + // qWarning() << "mep" << + // QStringLiteral("%1:%2").arg(QString::fromUtf8(__FILE__).split(QStringLiteral("/")).last()).arg(__LINE__); + // qWarning() << "!! headless !"; + emit _signalDoneInitializingSession(); + } + + // qWarning() << "not headless !"; +#else + // Non-RTI build: always emit signal after initialization + emit _signalDoneInitializingSession(); +#endif // BUILD_RTI +} + +void LtsSession::slotShowOnlineHelp(const QString& fileName) +{ +#ifdef BUILD_RTI + if (m_ohvIfc == nullptr) + { + LtsWidgets::LtsMessageDialog::showMessage(baseLayout() /* can be 0ptr */, tr("Online Help not available.")); + return; + } + + m_ohvIfc->showHelp(fileName); +#else + Q_UNUSED(fileName) + // no-op in non-RTI build +#endif +} + +#ifdef BUILD_RTI +void LtsSession::slotShowOperatorSettings() +{ + const QMap& mapButtons = m_baseLayout->mapButtons(); + + for (auto i = mapButtons.constBegin(); i != mapButtons.constEnd(); ++i) + { + const PluginData& pd = *i; + + if (pd.identifier == QStringLiteral("_OpmShowOperatorSettings")) + { + LtsDialog* showOperatorSettingsDlg = pd.createWidgetFunc(nullptr); + + if (showOperatorSettingsDlg != nullptr) + { + addWidget(showOperatorSettingsDlg, pd.menuGroup, pd.identifier, pd.layoutArea, pd.closable); + // qWarning() << "showing operator settings"; + } + else + WARNING_LOG(m_logger) << "could not create operator settings dialog from action"; + + return; + } + } + + WARNING_LOG(m_logger) << "action for showing operator settings not found !!"; +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::slotStartPluginInit() +{ + m_initializeThesePlugins = m_guiPluginInterfaces; // copy + slotPluginInitDone(); +} + +void LtsSession::slotPluginInitDone() // NEVER call this directly, queue a signal to this slot ! +{ + // qWarning() << "LtsSession::slotPluginInitDone: sender" << sender(); + + if (m_pluginInitDone) + return; + + if (m_slotPluginInitDoneMutex) + { + // qWarning() << "<< never call slotPluginInitDone directly or after all initialization was done! bad sender + // was" << sender(); abort(); + return; + } + + m_slotPluginInitDoneMutex = true; // lock + + GuiPluginBase::Interface* theSender = dynamic_cast(sender()); + + if (theSender != m_currentInitIfc) + { + WARNING_LOG(m_logger) + << this + << " called slotPluginInitDone from plugin which was not currently active for initialization - ignoring"; +#ifdef LTS_DEBUG + WARNING_LOG(m_logger) << "current init ifc: " << m_currentInitIfc << ", sender: " << sender(); +#endif + m_slotPluginInitDoneMutex = false; // unlock + return; + } + + // qWarning() << "currently initializing ifc"< ifc = i.value(); + + if (ifc->availableInPartition(partitionType())) + { + m_currentInitIfc = ifc.get(); + // qWarning() << "set m_currentInitIfc to" << m_currentInitIfc; + + // qWarning() << "initializing" << i.key() << (void *)ifc.get(); + + ifc->init(); + if (!ifc->m_hasInit) // workaround for ifcs without init method (which needs quitting by signals) + { + // qWarning() << "resetting m_currentInitIfc to nullptr"; + m_currentInitIfc = nullptr; + QTimer::singleShot(0, this, &LtsSession::slotPluginInitDone); + } + } + else // do not initialize plugins that are not available in partition x + { + m_currentInitIfc = nullptr; + QTimer::singleShot(0, this, &LtsSession::slotPluginInitDone); + } + + m_initializeThesePlugins.erase(i); + + m_slotPluginInitDoneMutex = false; // unlock +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::slotExecuteNextPayload() +{ + LtsWidgets::LtsGlobalWaitDialog::getInstance()->wait(); // show wait dialog again + + /* there is currently a problem when executing a secondary event loop, + * which leads to resending already sent signals, as they might not be + * marked as executed by Qt itself. So this is a workaround.. */ + // if (m_ignoreSignalInLoop) + // return; + // m_ignoreSignalInLoop = true; + + // execute in order + auto it1 = m_payloadPriorityMap.begin(); // largest key (see qt doc) + + if (it1 != m_payloadPriorityMap.end()) + { + std::shared_ptr ifc = (*it1); + m_payloadPriorityMap.erase( + it1); // delete first, as executePayload can be stuck here when the connection is not queued ! + + DEBUG_LOG(m_logger) << "Executing priorized Payload in Partition " << partitionId() << ", Type " + << partitionType(); + + LtsWidgets::LtsGlobalWaitDialog::getInstance()->done(); // don't interrupt payload uis with the wait dialog + + if (m_blub) + { + m_blub->stop(); + m_blub->deleteLater(); + // qWarning() << "killing blub"; + } + m_blub = new QTimer(this); + m_blub2 = 0; + QString name(QString::fromUtf8(typeid(ifc.get()).name())); + connect(m_blub, &QObject::destroyed, this, [name]() { + // qWarning() << "prio-payload for" << name << "DESTROYED!!!!"; + }); + connect(m_blub, &QTimer::timeout, this, [this, name]() { + m_blub2++; + // qWarning() << "prio-payload for" << name << "running since" << m_blub2 << "seconds"; + }); + m_blub->start(1000); + + ifc->executePayload(m_mainBackground); + } + else // no priority payloads left, check for unpriorized payloads + { + auto it2 = m_payloadList.begin(); + + if (it2 != m_payloadList.end()) + { + std::shared_ptr ifc = (*it2); + m_payloadList.erase( + it2); // delete first, as executePayload can be stuck here when the connection is not queued ! + + DEBUG_LOG(m_logger) << "Executing unpriorized Payload in Partition " << partitionId() << ", Type " + << partitionType(); + + LtsWidgets::LtsGlobalWaitDialog::getInstance()->done(); // don't interrupt payload uis with the wait dialog + + if (m_blub) + { + m_blub->stop(); + m_blub->deleteLater(); + // qWarning() << "killing blub"; + } + m_blub = new QTimer(this); + m_blub2 = 0; + QString name(QString::fromUtf8(typeid(ifc.get()).name())); + connect(m_blub, &QObject::destroyed, this, [name]() { + // qWarning() << "prio-payload for" << name << "DESTROYED!!!!"; + }); + connect(m_blub, &QTimer::timeout, this, [this, name]() { + m_blub2++; + // qWarning() << "prio-payload for" << name << "running since" << m_blub2 << "seconds"; + }); + m_blub->start(1000); + + ifc->executePayload(m_mainBackground); + } + else // no payloads left, delete background widget(s) and say that all plugins have been loaded + { + Q_ASSERT(m_payloadsDone == false); + m_payloadsDone = true; + + m_mainBackground = nullptr; // as it was parented to m_hiddenWidget + + if (m_blub) + { + m_blub->stop(); + m_blub->deleteLater(); + // qWarning() << "killing blub - no payloads left"; + m_blub = nullptr; + } + + // qWarning() << "no payloads left"; + + doneInitializingSession(); + } + } + + // m_ignoreSignalInLoop = false; // executing payload is done, clear the ignore-flag +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::executePayloads() +{ + // look for gui plugins (needed to get execution priority and run payloads) + if (!m_payloadPriorityMap.isEmpty() || !m_payloadList.isEmpty()) + { + // DEBUG_LOG(m_logger) << m_payloadPriorityMap.count() << " priorized payload(s), " << m_payloadList.count() << + // " unpriorized payload(s) - " << m_payloadPriorityMap.count() + m_payloadList.count() << " total."; + + // QMetaObject::invokeMethod(this, &LtsSession::slotExecuteNextPayload); + LtsWidgets::LtsGlobalWaitDialog::getInstance() + ->done(); // ugly workaround: as the next method says wait even if we call it the first time (LtsSession + // c_tor called wait already) + + slotExecuteNextPayload(); + } + else + { + // qWarning() << "this session has no payloads assigned!!"; + DEBUG_LOG(m_logger) << "no payloads"; + + if (partitionType() == IDL::PartitionType::Global) + { + m_hasBaseLayout = + true; // admin session has no payloads, so show base layout, otherwise there is nothing to show.. + } + + doneInitializingSession(); + } +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::clearDataPluginInterfaces() +{ + QMap> weakDataPluginInterfaces; + for (auto i = m_dataPluginInterfaces.cbegin(); i != m_dataPluginInterfaces.cend(); ++i) + { + // i.value()->clearInterfaces(); + weakDataPluginInterfaces.insert(i.key(), i.value()); + } + + DEBUG_LOG(m_logger) << "Clearing data plugin interfaces for " << partitionType() << " - " << this; + m_dataPluginInterfaces.clear(); + +#ifdef LTS_DEBUG + // in global plugins somehow are not unloaded + if (partitionType() != IDL::PartitionType::Global) + { + for (auto i = weakDataPluginInterfaces.cbegin(); i != weakDataPluginInterfaces.cend(); ++i) + { + std::shared_ptr sp = i.value().lock(); + if (!sp) + continue; + WARNING_LOG(m_logger) << "still referenced Data Plugin '" << i.key() << "' in partition type " + << partitionType() << " (use_count=" << sp.use_count() << ")" + << " - application may crash on exit! " << this; + } + } +#endif +} +#endif // BUILD_RTI + +#ifdef BUILD_RTI +void LtsSession::clearGuiPluginInterfaces() +{ + bool bInClearPluginInterfaces = true; + auto cbCheckEventLoop = [this, &bInClearPluginInterfaces]() { + if (bInClearPluginInterfaces) + { + ERROR_LOG(m_logger) << "QEventLoop was called within clearGuiPluginInterfaces which is not allowed!"; + Q_ASSERT(false); + } + }; + QTimer::singleShot(0, this, cbCheckEventLoop); + m_ohvIfc = nullptr; + QMap> weakGuiPluginInterfaces; + for (auto i = m_guiPluginInterfaces.cbegin(); i != m_guiPluginInterfaces.cend(); ++i) + { + i.value()->clearInterfaces(); + weakGuiPluginInterfaces.insert(i.key(), i.value()); + } + bInClearPluginInterfaces = false; + + DEBUG_LOG(m_logger) << "Clearing gui plugin interfaces for " << partitionType() << " - " << this; + m_guiPluginInterfaces.clear(); + +#ifdef LTS_DEBUG + // in global plugins somehow are not unloaded + if (partitionType() != IDL::PartitionType::Global) + { + for (auto i = weakGuiPluginInterfaces.cbegin(); i != weakGuiPluginInterfaces.cend(); ++i) + { + std::shared_ptr sp = i.value().lock(); + if (!sp) + continue; + WARNING_LOG(m_logger) << "still referenced Gui Plugin '" << i.key() << "'in partition type " + << partitionType() << " (use_count=" << sp.use_count() << ")" + << " Gui Plugin '" << i.key() << "'" + << " - application may crash on exit! " << this; + } + } +#endif +} +#endif // BUILD_RTI + +LtsSessionManager* LtsSession::getSessionManager() +{ + return m_sessionManager; +} + +} // namespace LtsSession diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session.h b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session.h index e56fcf07a..36cbff351 100644 --- a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session.h @@ -11,8 +11,11 @@ #pragma once #include "lts_session_data_dds.h" +#ifdef BUILD_RTI #include "lts_session_manager.h" +#endif +#include #include #include #include @@ -83,12 +86,18 @@ class LTSSESSION_EXPORT LtsSession : public LtsSessionDataDds static QString appIconFilename(LtsAppDescriptor::App app); static QIcon appToIcon(LtsAppDescriptor::App app); +#ifdef BUILD_RTI explicit LtsSession(LtsSessionManager* sessionManager); +#else + explicit LtsSession(); +#endif ~LtsSession(); QString toString() const; +#ifdef BUILD_RTI LtsSessionManager* getSessionManager(); +#endif bool init(const DdsConnectionParams& connParams, const QVector& dataPluginList, const QVector& guiPluginList, bool hidden); #ifdef BUILD_RTI @@ -96,7 +105,11 @@ class LTSSESSION_EXPORT LtsSession : public LtsSessionDataDds const QVector& dataPluginList, const QVector& guiPluginList); #endif +#ifdef BUILD_RTI void makeVisible(); +#else + void makeVisible(); // no-op when BUILD_RTI=OFF +#endif void setPayloadsEnabled() { @@ -125,7 +138,9 @@ class LTSSESSION_EXPORT LtsSession : public LtsSessionDataDds */ LtsWidgets::LtsDragIcon* addAction(const LtsWidgets::PluginData& plData, bool isFirstRun = false); void setMenuVisible(bool visible = true); + #ifdef BUILD_RTI bool removeMenuAction(LtsWidgets::LtsDragIcon* icon); +#endif int screenId() const; int screenContainerId() const; int screenTypeId() const; @@ -153,9 +168,15 @@ class LTSSESSION_EXPORT LtsSession : public LtsSessionDataDds * and puts the text into all base layouts of this session * @param exerciseData the human reable exercise name of the current exercise */ +#ifdef BUILD_RTI void setExerciseData(const LtsWidgets::ExerciseData& exerciseData); const LtsWidgets::ExerciseData* exerciseData() const; void setProfilePicture(const QPixmap& pixmap); +#else + void setExerciseData(const LtsWidgets::ExerciseData& exerciseData) { Q_UNUSED(exerciseData) } + const LtsWidgets::ExerciseData* exerciseData() const { return nullptr; } + void setProfilePicture(const QPixmap& pixmap) { Q_UNUSED(pixmap) } +#endif void setBaseLayoutVisible() { @@ -186,10 +207,14 @@ class LTSSESSION_EXPORT LtsSession : public LtsSessionDataDds */ bool isChildOfSession(QWidget* child); + #ifdef BUILD_RTI LtsWidgets::LtsBaseLayoutWidget* baseLayout() { return m_baseLayout; } +#else + void* baseLayout() const { return nullptr; } +#endif QWidget* baseLayoutWidget(); // prevents some classes to include LtsBaseLayoutWidget.h just to specify the blw as a // parent widget @@ -278,10 +303,14 @@ class LTSSESSION_EXPORT LtsSession : public LtsSessionDataDds m_hidden = true; } - const QString workspaceId() const; +const QString workspaceId() const; void setWorkspaceId(const QString& newWorkspaceId); +#ifdef BUILD_RTI LtsWidgets::ExcState exerciseState() const; +#else + LtsWidgets::ExcState exerciseState() const { return LtsWidgets::ExerciseState::eUnknown; } +#endif // BUILD_RTI void setLoadedFromSavegame() { @@ -294,8 +323,24 @@ class LTSSESSION_EXPORT LtsSession : public LtsSessionDataDds } void addDeveloperActions(); +#ifdef BUILD_RTI void refetchActions(); // Do not use. - void setDependency(LtsSession* session); +#else + void refetchActions(); // Do not use. (no-op when BUILD_RTI=OFF) +#endif + void setDependency(LtsSession* session) + { +#ifdef BUILD_RTI + if (m_dependency) + { + ERROR_LOG(m_logger) << "Tried to set session dependency on self"; + return; + } + m_dependency = session; +#else + Q_UNUSED(session) +#endif + } bool hasDependency(LtsSession* session) { @@ -320,19 +365,25 @@ class LTSSESSION_EXPORT LtsSession : public LtsSessionDataDds } public slots: +#ifdef BUILD_RTI void slotExecuteNextPayload(); // NEVER call this directly, queue a signal to this slot ! void slotPluginInitDone(); // NEVER call this directly, queue a signal to this slot ! +#endif void slotShowOnlineHelp(const QString& fileName); // void takeOverBdv(); private slots: +#ifdef BUILD_RTI void slotShowOperatorSettings(); +#endif void slotSwap(); void slotStapleTopicLockHandler(LtsWidgets::LtsDialog* widget); void slotStopWaitDialog(); +#ifdef BUILD_RTI void slotStartPluginInit(); void slotMonitorSelected(); void delayScriptEditorStart(); +#endif signals: void signalInitializationAborted(); @@ -354,10 +405,13 @@ class LTSSESSION_EXPORT LtsSession : public LtsSessionDataDds private: friend class DeveloperTools::DevDialog; friend class DeveloperTools::AppWidget; +#ifdef BUILD_RTI friend class LtsSessionManager; +#endif bool event(QEvent* e) override; void createBaseLayout(); + #ifdef BUILD_RTI void initializePlugins(const QVector& dataPluginList, const QVector& guiPluginList); void initializeDataPlugins(const QVector& dataPluginList); @@ -366,34 +420,51 @@ class LTSSESSION_EXPORT LtsSession : public LtsSessionDataDds void clearDataPluginInterfaces(); void clearGuiPluginInterfaces(); void executePayloads(); +#endif void connectOnlineHelpButton(LtsWidgets::LtsDialog* widget); // TODO: AFTER FAT !! void stapleWidget(LtsWidgets::LtsDialog *dialog); // FIXME: HACK: because an LtsDialog can // directly add widgets to the base layout and misses the staples... void aboutToCloseTab(LtsWidgets::LayoutArea area); +#ifdef BUILD_RTI QPointer m_sessionManager; +#endif +#ifdef BUILD_RTI QMap> m_payloadPriorityMap; // QMap automatically sorts by key on iteration and overwrites multiple occurences with // the latest) QList> m_payloadList; // for payloads that don't care when they are executed (prio '9999' plugins) +#endif LtsWidgets::LtsBackgroundWidget* m_mainBackground; bool m_hasBaseLayout; +#ifdef BUILD_RTI LtsWidgets::LtsBaseLayoutWidget* m_baseLayout; +#else + void* m_baseLayout{nullptr}; // stub for non-RTI build +#endif bool m_markedForDeletion; bool m_payloads; QVector m_notiCtlList; bool m_initDone; // set by doneInitializingSession / signalDoneInitializingSession +#ifdef BUILD_RTI bool m_payloadsDone{false}; // for debug +#endif bool m_menuVisible; // bool m_ignoreSignalInLoop = false; bool m_firstActionsFetch; +#ifdef BUILD_RTI LtsWidgets::ExerciseData* m_exerciseData; +#else + void* m_exerciseData{nullptr}; // stub for non-RTI build +#endif QVector m_missingRightActions; std::shared_ptr m_coreFtc; +#ifdef BUILD_RTI GuiPluginBase::Interface* m_currentInitIfc; // not owning bool m_slotPluginInitDoneMutex; bool m_pluginInitDone; // set by slotPluginInitDone +#endif QJsonObject m_savegame; bool m_hidden; // if true, does not create BLW int m_screenId{-1}; @@ -403,7 +474,9 @@ class LTSSESSION_EXPORT LtsSession : public LtsSessionDataDds bool m_loadedFromSavegame; std::shared_ptr m_ohvIfc; bool m_foreverInvisible; // if true, creates BLW but hides it and does not use MMM +#ifdef BUILD_RTI QStringList m_failedFetches; +#endif QVector m_bgWidgets; QString m_workspaceId; bool m_needsToBeSuccessfullyPlaced{ diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session_data_dds_stub.cpp b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session_data_dds_stub.cpp new file mode 100644 index 000000000..015e555e3 --- /dev/null +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session_data_dds_stub.cpp @@ -0,0 +1,14 @@ +/** + * @RDE_HEADER@ + * Stub implementation for lts_session_data_dds.cpp when BUILD_RTI=OFF + * Provides minimal implementations to allow linking without RTI Connext DDS + */ + +#include "lts_session_data_dds_stub.h" + +namespace LtsSession +{ + +// No additional implementation needed - all methods are inline in header + +} // namespace LtsSession \ No newline at end of file diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session_data_dds_stub.h b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session_data_dds_stub.h index 072348959..9d033371d 100644 --- a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session_data_dds_stub.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session_data_dds_stub.h @@ -2,12 +2,14 @@ * @RDE_HEADER@ * Stub header for lts_session_data_dds.h when BUILD_RTI=OFF * Provides minimal declarations to allow compilation without RTI Connext DDS + * + * NOTE: No Q_OBJECT macro - this is a stub class without signals/slots */ #pragma once -#include #include +#include #include #include #include @@ -15,6 +17,9 @@ #include "Lts/Common/ProjectConfig/project_defines.h" +// IDL::PartitionType is already defined in project_defines.h +// No need to redefine it here + namespace LtsSession { @@ -72,13 +77,12 @@ namespace GuiPluginBase class Interface; } -// Stub LtsSessionDataDds class - minimal version without DDS functionality +// Stub LtsSessionDataDds class - inherits QObject for QPointer compatibility +// NO Q_OBJECT macro - avoids MOC generation issues, but provides QObject interface class LtsSessionDataDds : public QObject { - Q_OBJECT public: explicit LtsSessionDataDds(QObject* parent = nullptr) : QObject(parent) {} - ~LtsSessionDataDds() override = default; bool init(const DdsConnectionParams&) @@ -136,16 +140,30 @@ class LtsSessionDataDds : public QObject return 0; } - signals: - void partitionTimeChanged(qint64); - void partitionTimeChangedInternal(); + // Stub methods for signals (no-op in stub version) + void partitionTimeChanged(qint64) {} // no-op + void partitionTimeChangedInternal() {} // no-op + + // Q_OBJECT compatibility methods (delegate to QObject) + void* qt_metacast(const char* _clname) override + { + return QObject::qt_metacast(_clname); + } + int qt_metacall(QMetaObject::Call _c, int _id, void** _a) override + { + return QObject::qt_metacall(_c, _id, _a); + } + + // staticMetaObject - inline definition to avoid linker errors + // Points to QObject's meta object since we have no custom meta-object + static inline const QMetaObject staticMetaObject = QObject::staticMetaObject; }; // Stub Fetcher class class Fetcher { public: - Fetcher(LtsSessionDataDds*, const QString&) {} + Fetcher(LtsSession::LtsSessionDataDds*, const QString&) {} template void getForeignGuiInterface(std::shared_ptr&, const QString&, bool) {} diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session_manager.h b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session_manager.h index c6eb0b22d..7eccf97f0 100644 --- a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session_manager.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsSession/lts_session_manager.h @@ -10,6 +10,8 @@ #pragma once +#ifdef BUILD_RTI + #include #include #include @@ -120,3 +122,5 @@ class LTSSESSION_EXPORT LtsSessionManager : public QObject }; } // namespace LtsSession + +#endif // BUILD_RTI diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsUtils/LtsUtilsGui/LtsUtilsGuiDds/CMakeLists.txt b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsUtils/LtsUtilsGui/LtsUtilsGuiDds/CMakeLists.txt index 92f4b6031..5363e3f75 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsUtils/LtsUtilsGui/LtsUtilsGuiDds/CMakeLists.txt +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsUtils/LtsUtilsGui/LtsUtilsGuiDds/CMakeLists.txt @@ -43,12 +43,12 @@ NGL_TARGET_INCLUDE_DIRECTORIES(LtsUtilsDds ${CMAKE_CURRENT_SOURCE_DIR}/../ ${CMAKE_CURRENT_BINARY_DIR}/../ ) -IF(BUILD_RTI) NGL_TARGET_LINK_LIBRARIES(LtsUtilsDds PRIVATE LtsUtilsCoreHeaderOnly PUBLIC Qt6::Core - ddscore ) +IF(BUILD_RTI) + TARGET_LINK_LIBRARIES(LtsUtilsDds PUBLIC ddscore) ENDIF(BUILD_RTI) diff --git a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsWebSocket/lts_web_socket_server.cpp b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsWebSocket/lts_web_socket_server.cpp index 3871ccd46..864fb72a0 100644 --- a/qt6-after/qt6-migrated-legatus/Lts/Common/LtsWebSocket/lts_web_socket_server.cpp +++ b/qt6-after/qt6-migrated-legatus/Lts/Common/LtsWebSocket/lts_web_socket_server.cpp @@ -11,7 +11,8 @@ namespace LtsWebSocket { LtsWebSocketServer::LtsWebSocketServer(AbstractClientMessageFactory* messageFactory, QObject* parent) - : QObject(parent), m_logger(getLogger("LtsWebSocket.Server")), m_queueTimer(new QTimer(this)), m_messageFactory(messageFactory), m_connectionHandler(nullptr) + : QObject(parent), m_queueTimer(new QTimer(this)), m_messageFactory(messageFactory), m_connectionHandler(nullptr), + m_logger(getLogger("LtsWebSocket.Server")) { connect(m_queueTimer, &QTimer::timeout, this, &LtsWebSocketServer::onQueueTimerTimeout); diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/AdvancedSymbology/CMakeLists.txt b/qt6-after/qt6-migrated-legatus/Lts/Plugins/AdvancedSymbology/CMakeLists.txt index 926ba82b6..92d0ecc10 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/AdvancedSymbology/CMakeLists.txt +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/AdvancedSymbology/CMakeLists.txt @@ -17,6 +17,7 @@ ADD_INTERFACE_LIBRARY(AsbDataPluginInterface ${CMAKE_CURRENT_SOURCE_DIR}/.. DataPluginInterface advancedSymbology + Qt6::Gui ) # diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/AdvancedSymbology/Data/logger.cpp b/qt6-after/qt6-migrated-legatus/Lts/Plugins/AdvancedSymbology/Data/logger.cpp index 2ca99674a..c65759202 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/AdvancedSymbology/Data/logger.cpp +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/AdvancedSymbology/Data/logger.cpp @@ -3,7 +3,7 @@ #include "logger.h" -#include +#include namespace BuildingViewer { diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/AdvancedSymbology/asb_data_plugin_interface.h b/qt6-after/qt6-migrated-legatus/Lts/Plugins/AdvancedSymbology/asb_data_plugin_interface.h index 6ffb02972..948da8fdc 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/AdvancedSymbology/asb_data_plugin_interface.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/AdvancedSymbology/asb_data_plugin_interface.h @@ -4,7 +4,7 @@ #pragma once #include -#include +#include #include diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/ExerciseManagement/Gui/ExerciseEdit/exm_dialog_model.h b/qt6-after/qt6-migrated-legatus/Lts/Plugins/ExerciseManagement/Gui/ExerciseEdit/exm_dialog_model.h index 7f84775da..7c50e3fff 100644 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/ExerciseManagement/Gui/ExerciseEdit/exm_dialog_model.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/ExerciseManagement/Gui/ExerciseEdit/exm_dialog_model.h @@ -54,11 +54,12 @@ class GetExerciseImageRequester : public AbstractRequester, GetExerciseImageReply m_reply; }; -class ExerciseManagementDialogModel final : public LtsWidgets::LtsAbstractTableModel +class ExerciseManagementDialogModel final : public LtsWidgets::LtsAbstractTableModel { Q_OBJECT public: + using Exercise = ExerciseManagement::Exercise; enum Columns { Id, Name, diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/FileManagement/flm_explorer_gui_plugin_interface.h b/qt6-after/qt6-migrated-legatus/Lts/Plugins/FileManagement/flm_explorer_gui_plugin_interface.h index acb2fc8b7..188f9e3d3 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/FileManagement/flm_explorer_gui_plugin_interface.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/FileManagement/flm_explorer_gui_plugin_interface.h @@ -3,7 +3,7 @@ #pragma once -#include +#include #include #include #include diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/GuezNasat/Gui/Common/CMakeLists.txt b/qt6-after/qt6-migrated-legatus/Lts/Plugins/GuezNasat/Gui/Common/CMakeLists.txt index a9d8f3340..6d16d8478 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/GuezNasat/Gui/Common/CMakeLists.txt +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/GuezNasat/Gui/Common/CMakeLists.txt @@ -18,7 +18,9 @@ SET(gna_common_gui_SRCS NGL_ADD_LIBRARY2(WS GnaCommon SHARED ${gna_common_gui_SRCS} ) NGL_TARGET_INCLUDE_DIRECTORIES(GnaCommon PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/../../ ${CMAKE_CURRENT_SOURCE_DIR}/../../Services/ + ${CMAKE_CURRENT_SOURCE_DIR}/../../../../Proxies/ ) NGL_TARGET_LINK_LIBRARIES(GnaCommon PRIVATE diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/GuezNasat/Gui/Common/gna_nasat_aircraft_model.h b/qt6-after/qt6-migrated-legatus/Lts/Plugins/GuezNasat/Gui/Common/gna_nasat_aircraft_model.h index 17fb711ff..84f0d70e1 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/GuezNasat/Gui/Common/gna_nasat_aircraft_model.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/GuezNasat/Gui/Common/gna_nasat_aircraft_model.h @@ -5,7 +5,7 @@ #include "gnacommon_export.h" #include -#include +#include #include diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/GuezNasat/Gui/Common/gna_nasat_aircraft_part_model.h b/qt6-after/qt6-migrated-legatus/Lts/Plugins/GuezNasat/Gui/Common/gna_nasat_aircraft_part_model.h index ee1b5bdcf..67f8437d5 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/GuezNasat/Gui/Common/gna_nasat_aircraft_part_model.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/GuezNasat/Gui/Common/gna_nasat_aircraft_part_model.h @@ -9,7 +9,7 @@ #include #include -#include +#include #include diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/MarkerManagement/Gui/Common/CMakeLists.txt b/qt6-after/qt6-migrated-legatus/Lts/Plugins/MarkerManagement/Gui/Common/CMakeLists.txt index d169cadc3..56ddc9f1a 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/MarkerManagement/Gui/Common/CMakeLists.txt +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/MarkerManagement/Gui/Common/CMakeLists.txt @@ -11,12 +11,18 @@ SET(mrk_common_gui_SRCS mrk_dialog_model.cpp mrk_dialog_model.h - mrk_apply_filter.cpp - mrk_apply_filter.h CustomViews/mrk_marker.cpp CustomViews/mrk_marker.h ) +# FilterManagement-Plugins temporär ausgeschlossen für BUILD_RTI=OFF +# if(BUILD_RTI) +# list(APPEND mrk_common_gui_SRCS +# mrk_apply_filter.cpp +# mrk_apply_filter.h +# ) +# endif() + NGL_WRAP_UI(mrk_common_gui_SRCS CustomViews/mrk_marker.ui ) @@ -33,7 +39,6 @@ NGL_TARGET_LINK_LIBRARIES(MrkCommon LtsSessionData LtsUtilsGuiDds OpmDataPluginInterface - FltDataPluginInterface ngltools PUBLIC MrkDataPluginInterface @@ -41,3 +46,8 @@ NGL_TARGET_LINK_LIBRARIES(MrkCommon LtsWidgets LtsDataView ) + +# FilterManagement nur bei BUILD_RTI +if(BUILD_RTI) + target_link_libraries(MrkCommon PRIVATE FltDataPluginInterface) +endif() diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/MarkerManagement/Gui/Common/CustomViews/mrk_marker.h b/qt6-after/qt6-migrated-legatus/Lts/Plugins/MarkerManagement/Gui/Common/CustomViews/mrk_marker.h index 48907d1f4..d45cd7f79 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/MarkerManagement/Gui/Common/CustomViews/mrk_marker.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/MarkerManagement/Gui/Common/CustomViews/mrk_marker.h @@ -2,7 +2,7 @@ #pragma once -#include +#include #include namespace Ui diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/MarkerManagement/Gui/Common/mrk_dialog_model.cpp b/qt6-after/qt6-migrated-legatus/Lts/Plugins/MarkerManagement/Gui/Common/mrk_dialog_model.cpp index e02cba2aa..0df94a55a 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/MarkerManagement/Gui/Common/mrk_dialog_model.cpp +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/MarkerManagement/Gui/Common/mrk_dialog_model.cpp @@ -5,7 +5,6 @@ #include "mrk_dialog_model.h" #include -#include #include #include diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/OcBaseDownload/Gui/BaseDownloader/obd_ex_model.h b/qt6-after/qt6-migrated-legatus/Lts/Plugins/OcBaseDownload/Gui/BaseDownloader/obd_ex_model.h index 69a6e04e8..28df6b3d9 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/OcBaseDownload/Gui/BaseDownloader/obd_ex_model.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/OcBaseDownload/Gui/BaseDownloader/obd_ex_model.h @@ -12,11 +12,12 @@ namespace OcBaseDownload { -class ExModel final : public LtsWidgets::LtsAbstractTableModel +class ExModel final : public LtsWidgets::LtsAbstractTableModel { Q_OBJECT public: + using Exercise = ExerciseManagement::Exercise; enum Columns { Name, diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/CMakeLists.txt b/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/CMakeLists.txt index 6c65e7b7a..09f727e89 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/CMakeLists.txt +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/CMakeLists.txt @@ -5,6 +5,7 @@ # Created by Christian Ehrlicher, SLSE, 2016-03-01 # +IF(BUILD_RTI) ADD_SUBDIRECTORY(Data) ADD_SUBDIRECTORY(Gui) @@ -54,3 +55,4 @@ ADD_INTERFACE_LIBRARY(OpmDataPluginInterface DataPluginInterface svcOpmCommon ) +ENDIF() diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/Gui/CMakeLists.txt b/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/Gui/CMakeLists.txt index e6a0eea22..d822e8a39 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/Gui/CMakeLists.txt +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/Gui/CMakeLists.txt @@ -5,10 +5,12 @@ # Created by Christian Ehrlicher, SLSE, 2016-02-29 # +IF(BUILD_RTI) ADD_SUBDIRECTORY(Common) ADD_SUBDIRECTORY(OperatorOverview) ADD_SUBDIRECTORY(OperatorSettings) ADD_SUBDIRECTORY(OperatorEdit) ADD_SUBDIRECTORY(Login) ADD_SUBDIRECTORY(OpmComboBox) +ENDIF() #ADD_SUBDIRECTORY(NewLogin) diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/Gui/Common/operator_dialog_model.cpp b/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/Gui/Common/operator_dialog_model.cpp index 362d0b187..5ddb44fb6 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/Gui/Common/operator_dialog_model.cpp +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/Gui/Common/operator_dialog_model.cpp @@ -4,6 +4,8 @@ #include "operator_dialog_model.h" +#ifdef BUILD_RTI + #include #include #include @@ -19,7 +21,7 @@ namespace OperatorManagement OperatorManagementDialogModel::OperatorManagementDialogModel(QObject *parent, int exerciseId ) - : LtsWidgets::LtsAbstractTableModel({tr("Id"), + : LtsWidgets::LtsAbstractTableModel({tr("Id"), tr("Name"), tr("Info"), tr("Effective ACLs"), @@ -34,7 +36,9 @@ OperatorManagementDialogModel::OperatorManagementDialogModel(QObject *parent, in parent) , m_dtc(nullptr) , m_ppmDtc(nullptr) +#ifdef BUILD_RTI , m_exmDtc(nullptr) +#endif , m_exerciseId(exerciseId) {} @@ -45,11 +49,13 @@ bool OperatorManagementDialogModel::initModel(LtsSession::LtsSession *session, c { m_dtc = dtc; session->getDtc(m_ppmDtc); +#ifdef BUILD_RTI session->getDtc(m_exmDtc); +#endif connect(m_dtc.get(), &OperatorManagement::Interface::Dtc::userChanged, this, &OperatorManagementDialogModel::onDataChanged); - m_dtc->users([this](const OperatorManagement::User &op) { insertRow(op); }); + m_dtc->users([this](const UserType &op) { insertRow(op); }); if (m_ppmDtc) { @@ -66,6 +72,7 @@ bool OperatorManagementDialogModel::initModel(LtsSession::LtsSession *session, c } } +#ifdef BUILD_RTI if (m_exmDtc) { connect(m_exmDtc.get(), &ExerciseManagement::Interface::Dtc::exerciseChanged, @@ -80,6 +87,7 @@ bool OperatorManagementDialogModel::initModel(LtsSession::LtsSession *session, c return false; } } +#endif { auto cb = [this](const Group &group) @@ -106,6 +114,7 @@ void OperatorManagementDialogModel::onPartyChanged(const ParticipantManagement:: } } +#ifdef BUILD_RTI void OperatorManagementDialogModel::onExerciseChanged(const ExerciseManagement::Exercise &data, DataModification modType) { if (modType == DataModification::eRemoved) @@ -118,6 +127,7 @@ void OperatorManagementDialogModel::onExerciseChanged(const ExerciseManagement:: emit dataChanged(idx, idx); } } +#endif QVariant OperatorManagementDialogModel::data(const QModelIndex &index, int role) const { @@ -132,7 +142,7 @@ QVariant OperatorManagementDialogModel::data(const QModelIndex &index, int role) if (role == Qt::DisplayRole) { - const OperatorManagement::User &op = m_vecData.at(index.row()); + const UserType &op = m_vecData.at(index.row()); std::vector pbe = op.visiblePartiesByExercise(); switch (index.column()) { @@ -240,7 +250,7 @@ QString OperatorManagementDialogModel::visibleParties(const std::vector return result.join(QStringLiteral(", ")); } - +#ifdef BUILD_RTI QString OperatorManagementDialogModel::exercises(const std::vector &exercises) const { QStringList result; @@ -250,6 +260,7 @@ QString OperatorManagementDialogModel::exercises(const std::vector &exe return result.join(QStringLiteral(", ")); } +#endif QString OperatorManagementDialogModel::effectiveAcls(std::vector acls) const { @@ -267,7 +278,7 @@ QString OperatorManagementDialogModel::priority(int16_t prio) const return QString::number(prio); } -bool OperatorManagementDialogModel::isFiltered(const OperatorManagement::User &data, DataModification modType) const +bool OperatorManagementDialogModel::isFiltered(const UserType &data, DataModification modType) const { Q_UNUSED(modType); @@ -280,4 +291,6 @@ bool OperatorManagementDialogModel::isFiltered(const OperatorManagement::User &d return true; } -} +} + +#endif // BUILD_RTI diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/Gui/Common/operator_dialog_model.h b/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/Gui/Common/operator_dialog_model.h index 8839d4d37..4644be978 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/Gui/Common/operator_dialog_model.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/OperatorManagement/Gui/Common/operator_dialog_model.h @@ -3,6 +3,8 @@ #pragma once +#ifdef BUILD_RTI + #include #include #include @@ -15,9 +17,10 @@ namespace OperatorManagement { +// Typ-Alias um Namespace-Konflikt mit QtMocConstants::User zu vermeiden +using UserType = User; - -class OPMCHANGEPASSWORDGUI_EXPORT OperatorManagementDialogModel final : public LtsWidgets::LtsAbstractTableModel +class OPMCHANGEPASSWORDGUI_EXPORT OperatorManagementDialogModel final : public LtsWidgets::LtsAbstractTableModel { Q_OBJECT public: @@ -42,9 +45,9 @@ public: bool initModel(LtsSession::LtsSession *session, const std::shared_ptr &dtc); - QVariant data(const QModelIndex &, int) const override final; + QVariant data(const QModelIndex &, int) const override; - bool isFiltered( const OperatorManagement::User &data, DataModification modType ) const override; + bool isFiltered( const UserType &data, DataModification modType ) const override; private: @@ -71,4 +74,6 @@ private: int m_exerciseId; }; -} +} + +#endif // BUILD_RTI diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/ProjectDataManagement/Gui/PdmComboBox/pdm_combobox.cpp b/qt6-after/qt6-migrated-legatus/Lts/Plugins/ProjectDataManagement/Gui/PdmComboBox/pdm_combobox.cpp index 2e1aa234a..bd61c0321 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/ProjectDataManagement/Gui/PdmComboBox/pdm_combobox.cpp +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/ProjectDataManagement/Gui/PdmComboBox/pdm_combobox.cpp @@ -221,11 +221,11 @@ bool fill(QComboBox *cbx, PdmComboBoxType type) case PdmComboBoxType::CbLanguage: { const QString languages = LtsUtils::ProjectSettings::getInstance()->value(QStringLiteral("pdm"), QStringLiteral("EquipmentLanguages")).toString(); - const QVector slLang = languages.splitRef(QLatin1Char(',')); + const QStringList slLang = languages.split(QLatin1Char(',')); QSet alreadySeen; alreadySeen += LanguageConfiguration::NoChange; cbx->addItem(toString(LanguageConfiguration::NoChange), LanguageConfiguration::NoChange); - for (const QStringRef &r : slLang) + for (const QString &r : slLang) { const int langId = r.toInt(); if (alreadySeen.contains(langId)) diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/ProjectDataManagement/Gui/PdmComboBox/pdm_combobox.h b/qt6-after/qt6-migrated-legatus/Lts/Plugins/ProjectDataManagement/Gui/PdmComboBox/pdm_combobox.h index 8d9aed20e..b3682835e 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/ProjectDataManagement/Gui/PdmComboBox/pdm_combobox.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/ProjectDataManagement/Gui/PdmComboBox/pdm_combobox.h @@ -6,6 +6,7 @@ #include #include +#include class QComboBox; class QStandardItemModel; diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/SituationMapPlugin/CMakeLists.txt b/qt6-after/qt6-migrated-legatus/Lts/Plugins/SituationMapPlugin/CMakeLists.txt index c388ad17a..82bbcb6c1 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/SituationMapPlugin/CMakeLists.txt +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/SituationMapPlugin/CMakeLists.txt @@ -5,6 +5,8 @@ # Created by Christian Ehrlicher, SLSE, 2016-03-01 # +IF(BUILD_RTI) + ADD_SUBDIRECTORY(Gui) # @@ -24,3 +26,5 @@ ADD_INTERFACE_LIBRARY(SituationMapScriptFilterGuiPluginInterface ${CMAKE_CURRENT_SOURCE_DIR}/.. GuiPluginInterface TopicReplayInterface TopicEditorInterface Qt6::Core ) + +ENDIF(BUILD_RTI) diff --git a/qt6-after/qt6-migrated-legatus/Lts/Plugins/SituationMapPlugin/Gui/SituationMap/CMakeLists.txt b/qt6-after/qt6-migrated-legatus/Lts/Plugins/SituationMapPlugin/Gui/SituationMap/CMakeLists.txt index ac9f7e00f..4e7536467 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Plugins/SituationMapPlugin/Gui/SituationMap/CMakeLists.txt +++ b/qt6-after/qt6-migrated-legatus/Lts/Plugins/SituationMapPlugin/Gui/SituationMap/CMakeLists.txt @@ -130,6 +130,7 @@ NGL_ADD_LIBRARY2(WS SitmapDds SHARED ${sitmap_dds_SRCS}) NGL_TARGET_INCLUDE_DIRECTORIES(SitmapDds PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../ + ${CMAKE_SOURCE_DIR}/Lts/Viewer/SituationMap ) NGL_TARGET_LINK_LIBRARIES(SitmapDds PUBLIC diff --git a/qt6-after/qt6-migrated-legatus/Lts/Proxies/DifferentialGPS/CMakeLists.txt b/qt6-after/qt6-migrated-legatus/Lts/Proxies/DifferentialGPS/CMakeLists.txt index a8e5e3713..2dcee8e1c 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Proxies/DifferentialGPS/CMakeLists.txt +++ b/qt6-after/qt6-migrated-legatus/Lts/Proxies/DifferentialGPS/CMakeLists.txt @@ -4,6 +4,8 @@ # $Author$ # +IF(BUILD_RTI) + SET(xml_FILE dgps_service.xml) SET(if_SRCS @@ -66,3 +68,5 @@ NGL_TARGET_LINK_LIBRARIES(Tetra_dgps_simulator Qt6::Core Qt6::Network ) + +ENDIF(BUILD_RTI) diff --git a/qt6-after/qt6-migrated-legatus/Lts/Proxies/DifferentialGPS/tetra_if.cpp b/qt6-after/qt6-migrated-legatus/Lts/Proxies/DifferentialGPS/tetra_if.cpp index 73cc21523..babb27b56 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Proxies/DifferentialGPS/tetra_if.cpp +++ b/qt6-after/qt6-migrated-legatus/Lts/Proxies/DifferentialGPS/tetra_if.cpp @@ -3,6 +3,8 @@ #include "tetra_if.h" #include "dgps_config.h" +#ifdef BUILD_RTI + #include #include #include @@ -242,4 +244,6 @@ void TetraIF::onAddGroupMonitoring() NGL::NGLLoggerHelper::hexDumpHelper(m_logger, NGL::LogLevel::Debug, tele.data()); } -} +} + +#endif // BUILD_RTI diff --git a/qt6-after/qt6-migrated-legatus/Lts/Services/AlarmManagement/logger.h b/qt6-after/qt6-migrated-legatus/Lts/Services/AlarmManagement/logger.h index 363f26104..23651ec30 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Services/AlarmManagement/logger.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Services/AlarmManagement/logger.h @@ -9,7 +9,7 @@ #pragma once #include -#include "svcalmcommon_export.h" +#include namespace AlarmManagement { diff --git a/qt6-after/qt6-migrated-legatus/Lts/Services/AudioVideoManagement/ava_control.h b/qt6-after/qt6-migrated-legatus/Lts/Services/AudioVideoManagement/ava_control.h index 2f7f826fd..f16f07928 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Services/AudioVideoManagement/ava_control.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Services/AudioVideoManagement/ava_control.h @@ -17,12 +17,11 @@ #include "logger.h" #include #include +#include #include #include #include -class QStringList; - namespace AudioVideoManagement { diff --git a/qt6-after/qt6-migrated-legatus/Lts/Services/MarkerManagement/logger.h b/qt6-after/qt6-migrated-legatus/Lts/Services/MarkerManagement/logger.h index 1ba32d60b..b797d43f3 100755 --- a/qt6-after/qt6-migrated-legatus/Lts/Services/MarkerManagement/logger.h +++ b/qt6-after/qt6-migrated-legatus/Lts/Services/MarkerManagement/logger.h @@ -9,13 +9,13 @@ #pragma once #include -#include "svcmrkcommon_export.h" +#include namespace MarkerManagement { using LOGGER_T = NGL::INGLLogger &; -MRK_COMMON_EXPORT LOGGER_T getLogger(const char *name); +SVCMRKCOMMON_EXPORT LOGGER_T getLogger(const char *name); inline LOGGER_T getLogger(const QString &loggerName) { return getLogger(loggerName.toUtf8().constData()); diff --git a/qt6-after/qt6-migrated-legatus/TetraIF/CMakeLists.txt b/qt6-after/qt6-migrated-legatus/TetraIF/CMakeLists.txt index 2440f9340..3bf6cd9b0 100644 --- a/qt6-after/qt6-migrated-legatus/TetraIF/CMakeLists.txt +++ b/qt6-after/qt6-migrated-legatus/TetraIF/CMakeLists.txt @@ -4,6 +4,8 @@ # $Author$ # +IF(BUILD_RTI) ADD_SUBDIRECTORY(CoPrtCnv) ADD_SUBDIRECTORY(LogView) ADD_SUBDIRECTORY(PrtCnv) +ENDIF() diff --git a/qt6-after/qt6-migrated-legatus/include/AlarmManagement/svcalmcommon_export.h b/qt6-after/qt6-migrated-legatus/include/AlarmManagement/svcalmcommon_export.h new file mode 100644 index 000000000..2a6e18f8e --- /dev/null +++ b/qt6-after/qt6-migrated-legatus/include/AlarmManagement/svcalmcommon_export.h @@ -0,0 +1,8 @@ +#ifndef SVCALMCOMMON_EXPORT_H +#define SVCALMCOMMON_EXPORT_H + +// Stub export macro for AlarmManagement +#define SVCALMCOMMON_EXPORT +#define SVCALMCOMMON_NO_EXPORT + +#endif // SVCALMCOMMON_EXPORT_H \ No newline at end of file diff --git a/qt6-after/qt6-migrated-legatus/include/AudioVideoManagement/avm_enums.hpp b/qt6-after/qt6-migrated-legatus/include/AudioVideoManagement/avm_enums.hpp index c4a2a16af..f71bc9bc2 100644 --- a/qt6-after/qt6-migrated-legatus/include/AudioVideoManagement/avm_enums.hpp +++ b/qt6-after/qt6-migrated-legatus/include/AudioVideoManagement/avm_enums.hpp @@ -3,6 +3,10 @@ // STUB-HEADER: Diese Datei wird normalerweise von ddsdtc generiert // Für die Migration erstellen wir minimale Typ-Definitionen +#ifdef BUILD_RTI +#include +#endif + namespace AudioVideoManagement { // Placeholder enums - werden durch echte DDS-Typen ersetzt @@ -16,4 +20,12 @@ struct UnitSymbolPosition double y = 0.0; double z = 0.0; }; + +#ifdef BUILD_RTI +// RadioSystem wird von DDS generiert +using RadioSystem = dds::core::Reference; +#else +// Stub für BUILD_RTI=OFF +enum class RadioSystem : int32_t { Cnr = 0, Tvc = 1 }; +#endif } // namespace AudioVideoManagement diff --git a/qt6-after/qt6-migrated-legatus/include/Core/core_types.h b/qt6-after/qt6-migrated-legatus/include/Core/core_types.h index 3f1da0c51..db5b76f4e 100644 --- a/qt6-after/qt6-migrated-legatus/include/Core/core_types.h +++ b/qt6-after/qt6-migrated-legatus/include/Core/core_types.h @@ -9,7 +9,7 @@ #include #include -#include +#include namespace Core { diff --git a/qt6-after/qt6-migrated-legatus/include/GuezNasat/svcgnacommon_export.h b/qt6-after/qt6-migrated-legatus/include/GuezNasat/svcgnacommon_export.h new file mode 100644 index 000000000..65f1be314 --- /dev/null +++ b/qt6-after/qt6-migrated-legatus/include/GuezNasat/svcgnacommon_export.h @@ -0,0 +1,7 @@ +#ifndef SVCGNACOMMON_EXPORT_H +#define SVCGNACOMMON_EXPORT_H + +// Stub export macro for BUILD_RTI=OFF +#define SVCGNACOMMON_EXPORT + +#endif // SVCGNACOMMON_EXPORT_H \ No newline at end of file diff --git a/qt6-after/qt6-migrated-legatus/include/LtsProjectionWorkstation/ltsprojectionworkstation_export.h b/qt6-after/qt6-migrated-legatus/include/LtsProjectionWorkstation/ltsprojectionworkstation_export.h new file mode 100644 index 000000000..fec64b2b0 --- /dev/null +++ b/qt6-after/qt6-migrated-legatus/include/LtsProjectionWorkstation/ltsprojectionworkstation_export.h @@ -0,0 +1,12 @@ +#pragma once + +// Stub export header for LtsProjectionWorkstation +// Created for Qt6 migration with BUILD_RTI=OFF + +#ifndef LTSPROJECTIONWORKSTATION_EXPORT_H +#define LTSPROJECTIONWORKSTATION_EXPORT_H + +#define LTSPROJECTIONWORKSTATION_EXPORT +#define LTSPROJECTIONWORKSTATION_NO_EXPORT + +#endif // LTSPROJECTIONWORKSTATION_EXPORT_H \ No newline at end of file diff --git a/qt6-after/qt6-migrated-legatus/include/ProjectDataManagement/svcpdmcommon_export.h b/qt6-after/qt6-migrated-legatus/include/ProjectDataManagement/svcpdmcommon_export.h new file mode 100644 index 000000000..482f1bc64 --- /dev/null +++ b/qt6-after/qt6-migrated-legatus/include/ProjectDataManagement/svcpdmcommon_export.h @@ -0,0 +1,6 @@ +// Auto-generated export macro for PDM Common +// Stub for BUILD_RTI=OFF or missing dependency + +#ifndef PDM_COMMON_EXPORT +#define PDM_COMMON_EXPORT +#endif \ No newline at end of file