/** * 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 #include #include #include #include #include #include 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 insert(const std::vector& 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 determineInvalidEntries(const QVector &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 m_cache; // db-Id -> CnrTvcProfile QVector m_uniqueKeys; LOGGER_T &m_logger; }; } // namespace AudioVideoManagement