19 #include <QStringList>
20 #include <QNetworkInterface>
28 #include "libmythbase/mythversion.h"
34 QHostAddress::parseSubnet(
"fe80::/10");
49 QHostAddress peerAddress,
53 Task(
"UPnpSearchTask")
57 m_sST = std::move(sST);
74 if (( sUDN.length() > 0) && ( sUDN != sST ))
75 sUSN = sUDN +
"::" + sST;
81 QString sData = QString (
"CACHE-CONTROL: max-age=%1\r\n"
87 "Content-Length: 0\r\n\r\n" )
95 LOG(VB_UPNP, LOG_DEBUG, QString(
"UPnpSearchTask::SendMsg : %1 : %2 ")
96 .arg(sST) .arg(sUSN));
98 LOG(VB_UPNP, LOG_DEBUG,
99 QString(
"UPnpSearchTask::SendMsg m_peerAddress = %1 Port=%2")
108 QList<QNetworkInterface> IFs = QNetworkInterface::allInterfaces();
109 for (
const auto & qni : qAsConst(IFs))
111 QList<QNetworkAddressEntry> netAddressList = qni.addressEntries();
112 for (
const auto & netAddr : qAsConst(netAddressList))
114 QString ip_subnet = QString(
"%1/%2").arg(netAddr.ip().toString()).arg(netAddr.prefixLength());
115 QPair<QHostAddress, int> subnet = QHostAddress::parseSubnet(ip_subnet);
117 LOG(VB_UPNP, LOG_DEBUG, QString(
"UPnpSearchTask::SendMsg : IP: [%1], Found network [%2], relevant to peer [%3]")
118 .arg(netAddr.ip().toString(), subnet.first.toString(),
m_peerAddress.toString()));
121 QHostAddress ip = netAddr.ip();
125 ip.setScopeId(QString());
128 if (ip.protocol() == QAbstractSocket::IPv6Protocol)
129 ipaddress =
"[" + ip.toString() +
"]";
131 ipaddress = ip.toString();
133 QString sHeader = QString (
"HTTP/1.1 200 OK\r\n"
134 "LOCATION: http://%1:%2/getDeviceDesc\r\n" )
139 QString sPacket = sHeader + sData;
140 QByteArray scPacket = sPacket.toUtf8();
146 pSocket->writeBlock( scPacket, scPacket.length(),
m_peerAddress,
149 std::this_thread::sleep_for(std::chrono::milliseconds(
MythRandom(0, 250)));
151 pSocket->writeBlock( scPacket, scPacket.length(),
m_peerAddress,
164 auto *pSocket =
new MSocketDevice( MSocketDevice::Datagram );
178 if ((
m_sST ==
"upnp:rootdevice") || (
m_sST ==
"ssdp:all" ))
182 if (
m_sST ==
"ssdp:all")