From kde-core-devel Thu Mar 06 12:03:08 2008 From: Sebastian =?iso-8859-1?q?Tr=FCg?= Date: Thu, 06 Mar 2008 12:03:08 +0000 To: kde-core-devel Subject: [PATCH] Resolve Service address in DNSSD::RemoteService Message-Id: <200803061303.08305.strueg () mandriva ! com> X-MARC-Message: https://marc.info/?l=kde-core-devel&m=120480541230712 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--Boundary-00=_819zHj/FmaxXIBn" --Boundary-00=_819zHj/FmaxXIBn Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi all, please find attached a patch for kdelibs/dnssd which adds handling of service addresses. ATM we only get the hostname which is completely useless in my network since I get stuff like "local.local". Address lookup was disabled via AVAHAI_LOOKUP_NO_ADDRESS. Why, I don't know. Now the address is resolved and stored in ServiceBasePrivate, accessible via the new address() method. I know that it would probably make more sense to only store it in RemoteService but the design sees it only as a trivial extension to ServiceBase without any new members. Any objections? Cheers, Sebastian --Boundary-00=_819zHj/FmaxXIBn Content-Type: text/x-diff; charset="us-ascii"; name="kdelibs-dnssd-address.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="kdelibs-dnssd-address.patch" Index: servicebase.h =================================================================== --- servicebase.h (revision 782189) +++ servicebase.h (working copy) @@ -81,6 +81,12 @@ QString hostName() const; /** + * \return The address of the service. Only valid for resolved remote services. + * \since 4.1 + */ + QString address() const; + + /** Returns port number. It is only valid for local and resolved remote services. */ unsigned short port() const; Index: avahi-publicservice_p.h =================================================================== --- avahi-publicservice_p.h (revision 782189) +++ avahi-publicservice_p.h (working copy) @@ -38,7 +38,7 @@ Q_OBJECT public: PublicServicePrivate(PublicService* parent, const QString& name, const QString& type, const QString& domain, unsigned int port) : - QObject(), ServiceBasePrivate(name, type, domain, QString(), port), m_published(false), m_running(false), m_group(0), + QObject(), ServiceBasePrivate(name, type, domain, QString(), QString(), port), m_published(false), m_running(false), m_group(0), m_server(0), m_collision(false), m_parent(parent) {} ~PublicServicePrivate() { Index: mdnsd-remoteservice.cpp =================================================================== --- mdnsd-remoteservice.cpp (revision 782189) +++ mdnsd-remoteservice.cpp (working copy) @@ -101,6 +101,7 @@ if (event->type() == QEvent::User+SD_RESOLVE) { ResolveEvent* rev = static_cast(event); m_hostName = rev->m_hostname; + m_address = rev->m_address; m_port = rev->m_port; m_textData = rev->m_txtdata; m_resolved = true; Index: avahi-servicebrowser.cpp =================================================================== --- avahi-servicebrowser.cpp (revision 782189) +++ avahi-servicebrowser.cpp (working copy) @@ -27,6 +27,7 @@ #ifndef KDE_USE_FINAL Q_DECLARE_METATYPE(QList) #endif + namespace DNSSD { Index: servicebase.cpp =================================================================== --- servicebase.cpp (revision 782189) +++ servicebase.cpp (working copy) @@ -29,7 +29,7 @@ ServiceBase::ServiceBase(const QString& name, const QString& type, const QString& domain, const QString& host, unsigned short port) - : d(new ServiceBasePrivate(name,type,domain,host,port)) + : d(new ServiceBasePrivate(name,type,domain,host,QString(),port)) {} ServiceBase::ServiceBase(ServiceBasePrivate* const _d) @@ -61,6 +61,11 @@ return d->m_hostName; } +QString ServiceBase::address() const +{ + return d->m_address; +} + unsigned short ServiceBase::port() const { return d->m_port; Index: avahi-remoteservice.cpp =================================================================== --- avahi-remoteservice.cpp (revision 782189) +++ avahi-remoteservice.cpp (working copy) @@ -58,9 +58,8 @@ registerTypes(); kDebug() << this << ":Starting resolve of : " << d->m_serviceName << " " << d->m_type << " " << d->m_domain << "\n"; org::freedesktop::Avahi::Server s("org.freedesktop.Avahi","/",QDBusConnection::systemBus()); - //FIXME: don't use LOOKUP_NO_ADDRESS if NSS unavailable QDBusReply rep=s.ServiceResolverNew(-1, -1, d->m_serviceName, d->m_type, - domainToDNS(d->m_domain), -1, 8 /*AVAHI_LOOKUP_NO_ADDRESS*/); + domainToDNS(d->m_domain), -1, 0); if (!rep.isValid()) { emit resolved(false); return; @@ -89,10 +88,11 @@ emit m_parent->resolved(false); } -void RemoteServicePrivate::gotFound(int, int, const QString &name, const QString &, const QString &domain, const QString &host, int, const QString &, ushort port, const QList &txt, uint) +void RemoteServicePrivate::gotFound(int, int, const QString &name, const QString &, const QString &domain, const QString &host, int, const QString &address, ushort port, const QList &txt, uint) { m_serviceName = name; m_hostName = host; + m_address = address; m_port = port; m_domain=DNSToDomain(domain); Q_FOREACH(QByteArray x, txt) { Index: servicebase_p.h =================================================================== --- servicebase_p.h (revision 782189) +++ servicebase_p.h (working copy) @@ -30,8 +30,10 @@ { public: ServiceBasePrivate(const QString& name, const QString& type, const QString& domain, - const QString& host, unsigned short port) : m_serviceName(name), m_type(type), - m_domain(domain), m_hostName(host), m_port(port) {} + const QString& host, const QString& address, unsigned short port) + : m_serviceName(name), m_type(type), + m_domain(domain), m_hostName(host), + m_address(address), m_port(port) {} virtual ~ServiceBasePrivate() {} @@ -39,6 +41,7 @@ QString m_type; QString m_domain; QString m_hostName; + QString m_address; unsigned short m_port; /** Index: avahi-remoteservice_p.h =================================================================== --- avahi-remoteservice_p.h (revision 782189) +++ avahi-remoteservice_p.h (working copy) @@ -39,7 +39,7 @@ Q_OBJECT public: RemoteServicePrivate(RemoteService* parent, const QString& name, const QString& type, const QString& domain) : QObject(), - ServiceBasePrivate(name, type, domain, QString(), 0), m_resolved(false), m_running(false), m_resolver(0), m_parent(parent) + ServiceBasePrivate(name, type, domain, QString(), QString(), 0), m_resolved(false), m_running(false), m_resolver(0), m_parent(parent) {} ~RemoteServicePrivate() { if (m_resolver) m_resolver->Free(); delete m_resolver; } bool m_resolved; --Boundary-00=_819zHj/FmaxXIBn--