From 63f0a14fe5e6e9d367a5601f4527b819b66df0ba Mon Sep 17 00:00:00 2001 From: Fawzi Mohamed Date: Thu, 31 May 2012 14:42:27 +0200 Subject: [PATCH] zeroconf: add already prepared address strings to services Change-Id: I16cfb5fd6a2c715760556ab9e14daf99941fcdd1 Reviewed-by: Christian Kandeler --- src/libs/zeroconf/servicebrowser.cpp | 35 ++++++++++++++++++++++++++++ src/libs/zeroconf/servicebrowser.h | 7 ++++++ 2 files changed, 42 insertions(+) diff --git a/src/libs/zeroconf/servicebrowser.cpp b/src/libs/zeroconf/servicebrowser.cpp index dc0657bae4e..a8693520526 100644 --- a/src/libs/zeroconf/servicebrowser.cpp +++ b/src/libs/zeroconf/servicebrowser.cpp @@ -298,6 +298,41 @@ QNetworkInterface Service::networkInterface() const return QNetworkInterface::interfaceFromIndex(m_interfaceNr); } +QStringList Service::addresses(Service::AddressStyle style) const +{ + QStringList res; + if (host() == 0) + return res; + foreach (const QHostAddress &addr, host()->addresses()){ + QString addrStr; + if (addr.protocol() == QAbstractSocket::IPv6Protocol) { + // Add the interface to use to the address
% + // + // This is required only for link local addresses (like fe80:*) + // but as we have it we do it (and most likely addresses here are + // link local). + // + // on windows only addresses like fe80::42%22 work + // on OSX 10.5 only things like fe80::42%en4 work + // on later OSX versions and linux both
% + // and
% work, we use the interface name as + // it looks better +#ifdef Q_OS_WIN + QString interfaceStr = QString::number(networkInterface().index()); +#else + QString interfaceStr = networkInterface().name(); +#endif + addrStr = QString::fromLatin1("%1%%2").arg(addr.toString()).arg(interfaceStr); + if (style == QuoteIPv6Adresses) + addrStr = QString::fromLatin1("[%1]").arg(addrStr); + } else { + addrStr = addr.toString(); + } + res.append(addrStr); + } + return res; +} + bool Service::operator==(const Service &o) const { bool eq = m_fullName == o.m_fullName && m_name == o.m_name && m_type == o.m_type diff --git a/src/libs/zeroconf/servicebrowser.h b/src/libs/zeroconf/servicebrowser.h index 36667a4f342..f705a473f37 100644 --- a/src/libs/zeroconf/servicebrowser.h +++ b/src/libs/zeroconf/servicebrowser.h @@ -94,6 +94,12 @@ public: typedef QSharedPointer ConstPtr; typedef QSharedPointer Ptr; + enum AddressStyle + { + PlainAddresses, + QuoteIPv6Adresses + }; + Service(const Service &o); Service(); ~Service(); @@ -109,6 +115,7 @@ public: const QHostInfo *host() const { return m_host; } int interfaceNr() const { return m_interfaceNr; } QNetworkInterface networkInterface() const; + QStringList addresses(AddressStyle style = PlainAddresses) const; bool operator==(const Service &o) const; bool invalidate() { bool res = m_outdated; m_outdated = true; return res; }