Files
qt5-legatus-legacy/Lts/Services/AudioVideoManagement/cnr_tvc_profile_handler.h
T
2026-08-13 18:33:10 +02:00

136 lines
4.6 KiB
C++
Executable File

/**
* CnrTvcProfileHandler - reads TetraChannel and TvcConfig data from the database and publishes the data to dds,
* reacts to TvcConfig related Function topics
* $Id$
* $HeadURL$
* $Author$
* Created by Gerlinde Rudolphus, SLSE, 2017-10-20
*/
#pragma once
#include <logger.h>
#include <avm_fts.h>
#include <avm_db.h>
#include <QObject>
#include <QVector>
#include <QMap>
#include <cstdint>
namespace AudioVideoManagement
{
class CnrHandler;
class TvcHandler;
namespace Interface
{
class Dts;
}
/**
* New with REGG-4433 is that global Tvc- and CnrConfigs have to be taken into account.
* As a consequence, modifying the isGlobal-flag of a Tvc- or CnrConfig might affect the referencing
* CnrTvcProfiles. When the isGlobal-flag changes from global to local the Config has to be removed
* from all TvcCnrProfiles that to not belong to the same exercise.
*
* @author Gerlinde Rudolphus, Christian Fröbel
*/
class CnrTvcProfileHandler final
: public QObject
, private Interface::Fts::ModifyCnrTvcProfileRequestHandler
, private Interface::Fts::RemoveCnrTvcProfileRequestHandler
{
Q_OBJECT
public:
CnrTvcProfileHandler(DatabaseInterface *db, Interface::Dts *dts, Interface::Fts *fts, CnrHandler *cnrHandler, TvcHandler *tvcHandler);
~CnrTvcProfileHandler();
bool init();
private:
struct OperatorExerciseKey;
void onModifyCnrTvcProfileRequest(const rti::core::SampleIdentity &cookie,
const CnrTvcProfile &request) override;
void onRemoveCnrTvcProfileRequest(const rti::core::SampleIdentity &cookie,
const Core::RemoveElementRequest &request) override;
bool collectAndPublish(const Database::AvmCnrTvcProfile &circuitContainerDb, bool isReload = false);
Core::FunctionReplyObject createProfile(const CnrTvcProfile &createRequest);
Core::FunctionReplyObject modifyProfile(const CnrTvcProfile &modifyRequest);
Core::FunctionReplyObject removeProfile(const Core::RemoveElementRequest &request);
std::vector<Database::AvmCnrTvcProfileData> insert(const std::vector<AudioVideoManagement::CnrTvcProfileData>& circuitsDds, qint64 setId, bool &status);
void addProfile(const CnrTvcProfile &profile);
void removeProfile(int64_t id);
void updateProfile(const CnrTvcProfile &profile);
private slots:
void onCnrConfigChanged(const CnrConfig &cnrConfig);
void onTvcConfigChanged(const TvcConfig &tvcConfig);
/** @name DB-Notifications */
///@{
void onDbDeletedCnrTvcProfile(const QVariant &id);
void onDbDeletedCnrTvcProfileData(const QVariant &containerId);
///@}
private:
Core::FunctionReplyObject validateRequest(const CnrTvcProfile &request) const;
Core::FunctionReplyObject validateRequest(const Core::RemoveElementRequest &request) const;
QVector<Database::AvmCnrTvcProfileData> determineInvalidEntries(const QVector<Database::AvmCnrTvcProfileData> &entries, int64_t exerciseId) const;
bool isValidCnr(int32_t cnrConfigId, int64_t exerciseId) const;
bool isValidTvc(int32_t tvcConfigId, int64_t exerciseId) const;
Core::FunctionReplyObject isValidCnr(int32_t cnrConfigId, int64_t exerciseId, int requestId) const;
Core::FunctionReplyObject isValidTvc(int32_t tvcConfigId, int64_t exerciseId, int requestId) const;
void onConfigChanged(int32_t configId, RadioSystem type);
/**
* We use this Key to make sure that the combination of operator and exercise is unique in the database.
*/
struct OperatorExerciseKey
{
OperatorExerciseKey() = default; // QMap requires this -- Argh!!
explicit OperatorExerciseKey(const Database::AvmCnrTvcProfile &dbEntry)
: operatorId(dbEntry.operatorId)
, exerciseId(dbEntry.exerciseId)
{}
explicit OperatorExerciseKey(const CnrTvcProfile &profile)
: operatorId(profile.operatorId())
, exerciseId(profile.exerciseId())
{}
qint64 operatorId{0};
qint64 exerciseId{0};
bool operator==(const OperatorExerciseKey &other) const
{
if (operatorId != other.operatorId)
return false;
if (exerciseId != other.exerciseId)
return false;
return true;
}
bool operator!=(const OperatorExerciseKey &other) const { return !(*this == other); }
};
DatabaseInterface *m_db;
Interface::Dts *m_dts;
Interface::Fts *m_fts;
CnrHandler *m_cnrHandler;
TvcHandler *m_tvcHandler;
QMap<qint64, CnrTvcProfile> m_cache; // db-Id -> CnrTvcProfile
QVector<OperatorExerciseKey> m_uniqueKeys;
LOGGER_T &m_logger;
};
} // namespace AudioVideoManagement