15using namespace std::chrono_literals;
20#include <QNetworkAddressEntry>
21#include <QNetworkInterface>
35 const QHostAddress& peerAddress,
39 Task(
"UPnpSearchTask"),
40 m_nServicePort(nServicePort),
42 m_peerAddress(peerAddress),
43 m_nPeerPort(nPeerPort),
44 m_sST(
std::move(sST)),
45 m_sUDN(
std::move(sUDN))
51 QString uniqueServiceName = sST;
52 if (( sUDN.length() > 0) && ( sUDN != sST ))
53 uniqueServiceName = sUDN +
"::" + uniqueServiceName;
55 QByteArray data = QString(
"CACHE-CONTROL: max-age=%1\r\n"
61 "Content-Length: 0\r\n\r\n")
69 LOG(VB_UPNP, LOG_DEBUG, QString(
"UPnpSearchTask::SendMsg ST: %1 USN: %2; m_peerAddress = %3 Port=%4")
78 QList<QNetworkInterface> IFs = QNetworkInterface::allInterfaces();
79 for (
const auto & qni : std::as_const(IFs))
81 QList<QNetworkAddressEntry> netAddressList = qni.addressEntries();
82 for (
const auto & netAddr : std::as_const(netAddressList))
84 QString ip_subnet = QString(
"%1/%2").arg(netAddr.ip().toString()).arg(netAddr.prefixLength());
85 QPair<QHostAddress, int> subnet = QHostAddress::parseSubnet(ip_subnet);
87 LOG(VB_UPNP, LOG_DEBUG, QString(
"UPnpSearchTask::SendMsg : IP: [%1], Found network [%2], relevant to peer [%3]")
88 .arg(netAddr.ip().toString(), subnet.first.toString(),
m_peerAddress.toString()));
91 QHostAddress ip = netAddr.ip();
95 ip.setScopeId(QString());
98 if (ip.protocol() == QAbstractSocket::IPv6Protocol)
99 ipaddress =
"[" + ip.toString() +
"]";
101 ipaddress = ip.toString();
103 QByteArray datagram =
104 QString(
"HTTP/1.1 200 OK\r\n"
105 "LOCATION: http://%1:%2/getDeviceDesc\r\n")
112 std::this_thread::sleep_for(std::chrono::milliseconds(
MythRandom(0, 250)));
125 if ((
m_sST ==
"upnp:rootdevice") || (
m_sST ==
"ssdp:all" ))
129 if (
m_sST ==
"ssdp:all")
153 for (
const auto* embedded_device : std::as_const(device.
m_listDevices))
static QString GetServerVersion(void)
QString GetUDN(void) const
UPnpServiceList m_listServices
UPnpDeviceList m_listDevices
UPnpSearchTask(int nServicePort, const QHostAddress &peerAddress, int nPeerPort, QString sST, QString sUDN)
std::chrono::seconds m_nMaxAge
void Execute(TaskQueue *pQueue) override
void SendMsg(QUdpSocket &socket, const QString &sST, const QString &sUDN)
QHostAddress m_peerAddress
void ProcessDevice(QUdpSocket &socket, const UPnpDevice &device)
static UPnpDeviceDesc g_UPnpDeviceDesc
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Convenience inline random number generator functions.
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
uint32_t MythRandom()
generate 32 random bits