Skip to content

Commit c867e26

Browse files
committed
Actually parse TXT record of DNS-SD services
1 parent 2949f33 commit c867e26

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

mdns/mdnsresolver.cpp

+29-3
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,32 @@ auto qualifiedHostName(QString name, QString domain)
100100
return name;
101101
}
102102

103+
auto parseTxtRecord(const QByteArray &txtRecord)
104+
{
105+
auto stringList = QStringList{};
106+
107+
const auto first = txtRecord.cbegin();
108+
const auto last = txtRecord.cend();
109+
110+
for (auto it = first; it < last; ) {
111+
const auto length = static_cast<int>(static_cast<quint8>(*it));
112+
113+
if (it + length >= last) {
114+
qCWarning(lcResolver, "Malformed TXT record at offset");
115+
break;
116+
}
117+
118+
++it;
119+
stringList += QString::fromUtf8(++it, length);
120+
it += length;
121+
}
122+
123+
return stringList;
103124
}
104125

105-
ServiceDescription::ServiceDescription(QString domain, QByteArray name, ServiceRecord service, QByteArray info)
126+
} // namespace
127+
128+
ServiceDescription::ServiceDescription(QString domain, QByteArray name, ServiceRecord service, QStringList info)
106129
: m_name{normalizedHostName(name, domain)}
107130
, m_target{normalizedHostName(service.target().toByteArray(), domain)}
108131
, m_port{service.port()}
@@ -310,8 +333,11 @@ void Resolver::onReadyRead(QUdpSocket *socket)
310333
}
311334
}
312335

313-
for (const auto &[name, service]: resolvedServices)
314-
emit serviceResolved({m_domain, name, service, resolvedText[name]});
336+
for (const auto &[name, service]: resolvedServices) {
337+
auto info = parseTxtRecord(resolvedText[name]);
338+
emit serviceResolved({m_domain, name, service, std::move(info)});
339+
}
340+
315341
for (const auto &[name, addresses]: resolvedAddresses)
316342
emit hostNameResolved(normalizedHostName(name, m_domain), addresses);
317343

mdns/mdnsresolver.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class ServiceDescription
2121
Q_GADGET
2222

2323
public:
24-
ServiceDescription(QString domain, QByteArray name, ServiceRecord service, QByteArray info);
24+
ServiceDescription(QString domain, QByteArray name, ServiceRecord service, QStringList info);
2525

2626
auto name() const { return m_name; };
2727
auto type() const { return m_type; }
@@ -40,7 +40,7 @@ class ServiceDescription
4040
int m_priority;
4141
int m_weight;
4242

43-
QByteArray m_info;
43+
QStringList m_info;
4444
};
4545

4646
class Resolver : public QObject

0 commit comments

Comments
 (0)