| 198 | } |
| 199 | |
| 200 | int SSDPDiscover::discoverServices(const QString& searchTarget, const QString& key) |
| 201 | { |
| 202 | _searchTarget = searchTarget; |
| 203 | int rc = -1; |
| 204 | |
| 205 | Debug(_log, "Search for Service [%s], address [%s], port [%d]", QSTRING_CSTR(_searchTarget), QSTRING_CSTR(_ssdpAddr.toString()), _ssdpPort); |
| 206 | |
| 207 | _services.clear(); |
| 208 | |
| 209 | // search |
| 210 | sendSearch(_searchTarget); |
| 211 | |
| 212 | if (_udpSocket->waitForReadyRead(_ssdpTimeout)) |
| 213 | { |
| 214 | while (_udpSocket->waitForReadyRead(500)) |
| 215 | { |
| 216 | QByteArray datagram; |
| 217 | while (_udpSocket->hasPendingDatagrams()) |
| 218 | { |
| 219 | |
| 220 | datagram.resize(_udpSocket->pendingDatagramSize()); |
| 221 | QHostAddress sender; |
| 222 | quint16 senderPort; |
| 223 | |
| 224 | _udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort); |
| 225 | |
| 226 | QString data(datagram); |
| 227 | |
| 228 | //Debug(_log, "_data: [%s]", QSTRING_CSTR(data)); |
| 229 | |
| 230 | QMap<QString, QString> headers; |
| 231 | // parse request |
| 232 | QStringList entries = data.split('\n', Qt::SkipEmptyParts); |
| 233 | for (auto entry : entries) |
| 234 | { |
| 235 | // http header parse skip |
| 236 | if (entry.contains("HTTP/1.1")) |
| 237 | continue; |
| 238 | |
| 239 | // split into key:vale, be aware that value field may contain also a ":" |
| 240 | entry = entry.simplified(); |
| 241 | int pos = entry.indexOf(":"); |
| 242 | if (pos == -1) |
| 243 | continue; |
| 244 | |
| 245 | headers[entry.left(pos).trimmed().toUpper()] = entry.mid(pos + 1).trimmed(); |
| 246 | } |
| 247 | |
| 248 | QRegularExpressionMatch match = _regExFilter.match(headers[_filterHeader]); |
| 249 | if (match.hasMatch()) |
| 250 | { |
| 251 | Debug(_log, "Found target [%s], plus record [%s] matches [%s:%s]", QSTRING_CSTR(_searchTarget), QSTRING_CSTR(headers[_filterHeader]), QSTRING_CSTR(_filterHeader), QSTRING_CSTR(_filter)); |
| 252 | //Debug(_log, "_data: [%s]", QSTRING_CSTR(data)); |
| 253 | |
| 254 | QString mapKey = headers[key]; |
| 255 | |
| 256 | SSDPService service; |
| 257 | service.cacheControl = headers["CACHE-CONTROL"]; |