#pragma once #include #include #include #include #include #include #ifndef TOPICDISCOVER_EXPORT # ifdef BUILD_STATIC_LIBRARIES # define TOPICDISCOVER_EXPORT # else # if defined(MAKE_TOPICDISCOVER_LIB) # define TOPICDISCOVER_EXPORT Q_DECL_EXPORT # else # define TOPICDISCOVER_EXPORT Q_DECL_IMPORT # endif # endif #endif namespace NGL { class INGLLogger; } class BuiltinAnyListener : public QObject { Q_OBJECT public: dds::core::xtypes::StructType structType(const std::string &typeName); protected: template void on_data_available(dds::sub::DataReader& reader); explicit BuiltinAnyListener(QObject *parent = nullptr); virtual ~BuiltinAnyListener() = default; signals: void topicDescription(const std::string &topicName, const std::string &typeName); protected: QMap m_structTypes; QReadWriteLock m_safeTypeLock; NGL::INGLLogger &m_logger; }; class BuiltinPublicationListener : public BuiltinAnyListener , public dds::sub::NoOpDataReaderListener { Q_OBJECT public: explicit BuiltinPublicationListener(QObject *parent = nullptr); virtual ~BuiltinPublicationListener() = default; void on_data_available(dds::sub::DataReader &reader) override final; }; class BuiltinSubscriberListener : public BuiltinAnyListener , public dds::sub::NoOpDataReaderListener { Q_OBJECT public: explicit BuiltinSubscriberListener(QObject *parent = nullptr); virtual ~BuiltinSubscriberListener() = default; void on_data_available(dds::sub::DataReader &reader) override final; }; class TOPICDISCOVER_EXPORT TopicDiscoverer : public QObject { Q_OBJECT public: explicit TopicDiscoverer(int domainId, QObject *parent = nullptr); virtual ~TopicDiscoverer() = default; void init(DDS::QosProfile::ConnectionType ct, const QUrl &tcpDiscoveryUrl); const dds::domain::DomainParticipant &getDomainParticipant() const { return m_domainParticipant; } signals: void topicDescription(const std::string &topicName, const std::string &typeName, const dds::core::xtypes::StructType &type); private slots: void onTopicDescription(const std::string &topicName, const std::string &typeName); private: int m_domainId; dds::domain::DomainParticipant m_domainParticipant; rti::core::ListenerBinder< dds::sub::DataReader > m_publisherListener; rti::core::ListenerBinder< dds::sub::DataReader > m_subscriberListener; NGL::INGLLogger &m_logger; };