#pragma once #include class QUdpSocket; /// /// @brief The SSDP Server sends and receives (parses) SSDP requests /// class SSDPServer : public QObject { Q_OBJECT public: friend class SSDPHandler; /// /// @brief Construct the server, listen on default ssdp address/port with multicast /// @param parent The parent object /// SSDPServer(QObject* parent = nullptr); ~SSDPServer() override; /// /// @brief Prepare server after thread start /// void initServer(); /// /// @brief Start SSDP /// @return false if already running or bind failure /// bool start(); /// /// @brief Stop SSDP /// void stop(); /// /// @brief Send an answer to mSearch requester /// @param st the searchTarget /// @param senderIp Ip address of the sender /// @param senderPort The port of the sender /// void sendMSearchResponse(const QString& st, const QString& senderIp, quint16 senderPort); /// /// @brief Send ByeBye notification (on SSDP stop) (repeated 3 times) /// @param st Search target /// void sendByeBye(const QString& st); /// /// @brief Send a NOTIFY msg on SSDP startup to notify our presence (repeated 3 times) /// @param st The search target /// void sendAlive(const QString& st); /// /// @brief Send a NOTIFY msg as ssdp:update to notify about changes /// @param st The search target /// void sendUpdate(const QString& st); /// /// @brief Overwrite description address /// @param addr new address /// void setDescriptionAddress(const QString& addr) { _descAddress = addr; }; /// /// @brief Set uuid /// @param uuid The uuid /// void setUuid(const QString& uuid) { _uuid = uuid; }; /// /// @brief set new flatbuffer server port /// void setFlatBufPort(quint16 port) { _fbsPort = QString::number(port); }; /// /// @brief Get current flatbuffer server port /// quint16 getFlatBufPort() const { return _fbsPort.toInt(); }; /// /// @brief set new protobuf server port /// void setProtoBufPort(quint16 port) { _pbsPort = QString::number(port); }; /// /// @brief Get current protobuf server port /// quint16 getProtoBufPort() const { return _pbsPort.toInt(); }; /// /// @brief set new json server port /// void setJsonServerPort(quint16 port) { _jssPort = QString::number(port); }; /// /// @brief get new json server port /// quint16 getJsonServerPort() const { return _jssPort.toInt(); }; /// /// @brief set new ssl server port /// void setSSLServerPort(quint16 port) { _sslPort = QString::number(port); }; /// /// @brief get new ssl server port /// quint16 getSSLServerPort() const { return _sslPort.toInt(); }; /// /// @brief set new hyperion name /// void setHyperionName(const QString &name) { _name = name; }; /// /// @brief get hyperion name /// QString getHyperionName() const { return _name; }; signals: /// /// @brief Emits whenever a new SSDP search "man : ssdp:discover" is received along with the service type /// @param target The ST service type /// @param mx Answer with delay in s /// @param address The ip of the caller /// @param port The port of the caller /// void msearchRequestReceived(const QString& target, const QString& mx, const QString address, quint16 port); private: Logger* _log; QUdpSocket* _udpSocket; QString _serverHeader, _uuid, _fbsPort, _pbsPort, _jssPort, _sslPort, _name, _descAddress; bool _running; private slots: void readPendingDatagrams(); };