29#include "libmythbase/mythversion.h"
49 Task(
"UPnpNotifyTask"),
50 m_nServicePort(nServicePort)
65 if ( sUDN.length() > 0)
66 sUSN = sUDN +
"::" + sNT;
70 QString sData = QString (
"Server: %1\r\n"
74 "CACHE-CONTROL: max-age=%6\r\n"
75 "Content-Length: 0\r\n\r\n" )
82 LOG(VB_UPNP, LOG_INFO,
83 QString(
"UPnpNotifyTask::SendNotifyMsg : %1:%2 : %3 : %4")
84 .arg(pSocket->address().toString(), QString::number(pSocket->port()),
95 for (
const auto & addr : std::as_const(addressList))
97 if (addr.toString().isEmpty())
99 LOG(VB_GENERAL, LOG_ERR,
100 "UPnpNotifyTask::SendNotifyMsg - NULL in address list");
104 QHostAddress ip = addr;
108 ip.setScopeId(QString());
110 QString ipaddress = ip.toString();
113 if (ipaddress.contains(
":"))
114 ipaddress =
"[" + ipaddress +
"]";
116 QString sHeader = QString(
"NOTIFY * HTTP/1.1\r\n"
118 "LOCATION: http://%3:%4/getDeviceDesc\r\n")
119 .arg(pSocket->address().toString()) .arg(pSocket->port())
122 QString sPacket = sHeader + sData;
123 QByteArray scPacket = sPacket.toUtf8();
129 pSocket->writeBlock( scPacket, scPacket.length(),
130 pSocket->address(), pSocket->port() );
133 std::this_thread::sleep_for(std::chrono::milliseconds(
MythRandom(0, 250)));
135 pSocket->writeBlock( scPacket, scPacket.length(),
136 pSocket->address(), pSocket->port() );
170 pMulticast =
nullptr;
209 for (
const auto & dev : std::as_const(pDevice->
m_listDevices))
static QString GetServerVersion(void)
void AddTask(std::chrono::milliseconds msec, Task *pTask)
Add a task to run in the future.
QString GetUDN(void) const
UPnpServiceList m_listServices
UPnpDeviceList m_listDevices
void ProcessDevice(MSocketDevice *pSocket, UPnpDevice *pDevice)
std::chrono::seconds m_nMaxAge
UPnpNotifyTask(int nServicePort)
void Execute(TaskQueue *pQueue) override
void SendNotifyMsg(MSocketDevice *pSocket, const QString &sNT, const QString &sUDN)
static QList< QHostAddress > g_IPAddrList
static UPnpDeviceDesc g_UPnpDeviceDesc
std::enable_if_t< std::chrono::__is_duration< T >::value, T > GetDuration(const QString &setting, T defaultValue=T::zero())
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Convenience inline random number generator functions.
uint32_t MythRandom()
generate 32 random bits
static constexpr uint16_t SSDP_PORT
static constexpr const char * SSDP_GROUP