@@ -42,83 +42,88 @@ const QString SSDPDiscover::getFirstService(const searchType& type, const QStrin
4242 // search
4343 sendSearch (st);
4444
45- _udpSocket->waitForReadyRead (timeout_ms);
46-
47- while (_udpSocket->hasPendingDatagrams ())
45+ if ( _udpSocket->waitForReadyRead (timeout_ms) )
4846 {
49- QByteArray datagram;
50- datagram.resize (_udpSocket->pendingDatagramSize ());
51- QHostAddress sender;
52- quint16 senderPort;
53-
54- _udpSocket->readDatagram (datagram.data (), datagram.size (), &sender, &senderPort);
55-
56- QString data (datagram);
47+ while (_udpSocket->waitForReadyRead (500 ))
48+ {
49+ QByteArray datagram;
50+ while (_udpSocket->hasPendingDatagrams ())
51+ {
5752
58- Debug (_log, " _data: [%s]" , QSTRING_CSTR (data));
53+ datagram.resize (_udpSocket->pendingDatagramSize ());
54+ QHostAddress sender;
55+ quint16 senderPort;
5956
60- QMap<QString,QString> headers;
61- QString address;
62- // parse request
63- QStringList entries = data.split (" \n " , QString::SkipEmptyParts);
64- for (auto entry : entries)
65- {
66- // http header parse skip
67- if (entry.contains (" HTTP/1.1" ))
68- continue ;
57+ _udpSocket->readDatagram (datagram.data (), datagram.size (), &sender, &senderPort);
6958
70- // split into key:vale, be aware that value field may contain also a ":"
71- entry = entry.simplified ();
72- int pos = entry.indexOf (" :" );
73- if (pos == -1 )
74- continue ;
59+ QString data (datagram);
7560
76- headers[entry.left (pos).trimmed ().toLower ()] = entry.mid (pos+1 ).trimmed ();
77- }
61+ Debug (_log, " _data: [%s]" , QSTRING_CSTR (data));
7862
79- // verify ssdp spec
80- if (!headers.contains (" st" ))
81- continue ;
63+ QMap<QString,QString> headers;
64+ QString address;
65+ // parse request
66+ QStringList entries = data.split (" \n " , QString::SkipEmptyParts);
67+ for (auto entry : entries)
68+ {
69+ // http header parse skip
70+ if (entry.contains (" HTTP/1.1" ))
71+ continue ;
8272
83- // usn duplicates
84- if (_usnList.contains (headers.value (" usn" )))
85- continue ;
73+ // split into key:vale, be aware that value field may contain also a ":"
74+ entry = entry.simplified ();
75+ int pos = entry.indexOf (" :" );
76+ if (pos == -1 )
77+ continue ;
8678
87- if (headers.value (" st" ) == _searchTarget)
88- {
89- _usnList << headers.value (" usn" );
90- QUrl url (headers.value (" location" ));
91- // Debug(_log, "Received msearch response from '%s:%d'. Search target: %s",QSTRING_CSTR(sender.toString()), senderPort, QSTRING_CSTR(headers.value("st")));
92- if (type == STY_WEBSERVER)
93- {
94- Debug (_log, " Found service [%s] at: %s:%d" , QSTRING_CSTR (st), QSTRING_CSTR (url.host ()), url.port ());
79+ headers[entry.left (pos).trimmed ().toLower ()] = entry.mid (pos+1 ).trimmed ();
80+ }
9581
96- return url.host ()+" :" +QString::number (url.port ());
97- }
98- else if (type == STY_FLATBUFSERVER)
99- {
100- const QString fbsport = headers.value (" hyperion-fbs-port" );
101- if (fbsport.isEmpty ())
102- {
82+ // verify ssdp spec
83+ if (!headers.contains (" st" ))
10384 continue ;
104- }
105- else
106- {
107- Debug (_log, " Found service [%s] at: %s:%s" , QSTRING_CSTR (st), QSTRING_CSTR (url.host ()), QSTRING_CSTR (fbsport));
108- return url.host ()+" :" +fbsport;
109- }
110- }
111- else if (type == STY_JSONSERVER)
112- {
113- const QString jssport = headers.value (" hyperion-jss-port" );
114- if (jssport.isEmpty ())
115- {
85+
86+ // usn duplicates
87+ if (_usnList.contains (headers.value (" usn" )))
11688 continue ;
117- }
118- else
89+
90+ if (headers. value ( " st " ) == _searchTarget)
11991 {
120- Debug (_log, " Found service at: %s:%s" , QSTRING_CSTR (url.host ()), QSTRING_CSTR (jssport));
121- return url.host ()+" :" +jssport;
92+ _usnList << headers.value (" usn" );
93+ QUrl url (headers.value (" location" ));
94+ // Debug(_log, "Received msearch response from '%s:%d'. Search target: %s",QSTRING_CSTR(sender.toString()), senderPort, QSTRING_CSTR(headers.value("st")));
95+ if (type == STY_WEBSERVER)
96+ {
97+ Debug (_log, " Found service [%s] at: %s:%d" , QSTRING_CSTR (st), QSTRING_CSTR (url.host ()), url.port ());
98+
99+ return url.host ()+" :" +QString::number (url.port ());
100+ }
101+ else if (type == STY_FLATBUFSERVER)
102+ {
103+ const QString fbsport = headers.value (" hyperion-fbs-port" );
104+ if (fbsport.isEmpty ())
105+ {
106+ continue ;
107+ }
108+ else
109+ {
110+ Debug (_log, " Found service [%s] at: %s:%s" , QSTRING_CSTR (st), QSTRING_CSTR (url.host ()), QSTRING_CSTR (fbsport));
111+ return url.host ()+" :" +fbsport;
112+ }
113+ }
114+ else if (type == STY_JSONSERVER)
115+ {
116+ const QString jssport = headers.value (" hyperion-jss-port" );
117+ if (jssport.isEmpty ())
118+ {
119+ continue ;
120+ }
121+ else
122+ {
123+ Debug (_log, " Found service at: %s:%s" , QSTRING_CSTR (url.host ()), QSTRING_CSTR (jssport));
124+ return url.host ()+" :" +jssport;
125+ }
126+ }
122127 }
123128 }
124129 }
0 commit comments