[pkg-kde-commits] rev 2825 - in trunk/packages/kdelibs/debian: . patches

Isaac Clerencia isaac at costa.debian.org
Wed Jan 11 19:22:45 UTC 2006


Author: isaac
Date: 2006-01-11 19:22:44 +0000 (Wed, 11 Jan 2006)
New Revision: 2825

Added:
   trunk/packages/kdelibs/debian/patches/27_kdnssd_avahi.diff
Modified:
   trunk/packages/kdelibs/debian/changelog
   trunk/packages/kdelibs/debian/control
Log:
Add kdnssd-avahi as a patch, it replaces the dummy kdnssd built just now
by kdelibs with a working one based on avahi.
Updated buildprep
Addded required build-depends


Modified: trunk/packages/kdelibs/debian/changelog
===================================================================
--- trunk/packages/kdelibs/debian/changelog	2006-01-11 13:14:14 UTC (rev 2824)
+++ trunk/packages/kdelibs/debian/changelog	2006-01-11 19:22:44 UTC (rev 2825)
@@ -5,6 +5,14 @@
   * Add kdelibs-data Replaces for libdjvulibre1 and libdjvulibre15 (<< 3.5.1-2)
     which also include x-djvu.desktop. (Closes: #347218)
 
+  +++ Changes by Isaac Clerencia:
+
+  * Apply patch 27_kdnssd_avahi.diff to replace dummy kdelibs kdnssd
+    implementation with a working one avahi-based
+
+  * Add Build-Depends on libavahi-client-dev and libavahi-qt3-dev to get
+    the patch referenced above working
+
  -- Debian Qt/KDE Maintainers <debian-qt-kde at lists.debian.org>  Wed, 11 Jan 2006 08:08:53 -0500
 
 kdelibs (4:3.5.0-3) unstable; urgency=low

Modified: trunk/packages/kdelibs/debian/control
===================================================================
--- trunk/packages/kdelibs/debian/control	2006-01-11 13:14:14 UTC (rev 2824)
+++ trunk/packages/kdelibs/debian/control	2006-01-11 19:22:44 UTC (rev 2825)
@@ -3,7 +3,7 @@
 Priority: optional
 Maintainer: Debian Qt/KDE Maintainers <debian-qt-kde at lists.debian.org>
 Uploaders: Isaac Clerencia <isaac at debian.org>, Pierre Habouzit <madcoder at debian.org>, Christopher Martin <chrsmrtn at debian.org>, Adeodato Simó <dato at net.com.org.es>, Riku Voipio <riku.voipio at iki.fi>, Luk Claes <luk at debian.org>, Josh Metzler <joshdeb at metzlers.org>
-Build-Depends: cdbs (>= 0.4.27), debhelper (>= 5.0), autotools-dev, binutils (>= 2.14.90.0.7), docbook-to-man, gawk, gettext, libart-2.0-dev (>= 2.3.17), libarts1-dev (>= 1.5.0), libacl1-dev, libattr1-dev, libasound2-dev [!kfreebsd-i386 !hurd-i386], libaspell-dev, hspell, libbz2-dev, libcupsys2-dev, libfam-dev (>= 2.7.0-7.2), libidn11-dev, libjasper-1.701-dev, libkrb5-dev, libldap2-dev, liblualib50-dev, libopenexr-dev (>= 1.2.2-4.1), libpcre3-dev, libqt3-mt-dev (>= 3:3.3.5), libsasl2-dev, libssl-dev, libtiff4-dev (>= 3.7.3-1), libxml2-dev, libxml2-utils, libxslt1-dev, sharutils, texinfo
+Build-Depends: cdbs (>= 0.4.27), debhelper (>= 5.0), autotools-dev, binutils (>= 2.14.90.0.7), docbook-to-man, gawk, gettext, libart-2.0-dev (>= 2.3.17), libarts1-dev (>= 1.5.0), libacl1-dev, libattr1-dev, libasound2-dev [!kfreebsd-i386 !hurd-i386], libaspell-dev, hspell, libbz2-dev, libcupsys2-dev, libfam-dev (>= 2.7.0-7.2), libidn11-dev, libjasper-1.701-dev, libkrb5-dev, libldap2-dev, liblualib50-dev, libopenexr-dev (>= 1.2.2-4.1), libpcre3-dev, libqt3-mt-dev (>= 3:3.3.5), libsasl2-dev, libssl-dev, libtiff4-dev (>= 3.7.3-1), libavahi-client-dev (>= 0.4), libavahi-qt3-dev (>= 0.4), libxml2-dev, libxml2-utils, libxslt1-dev, sharutils, texinfo
 Build-Depends-Indep: doxygen, qt3-doc, graphviz, gsfonts-x11
 Standards-Version: 3.6.2
 

Added: trunk/packages/kdelibs/debian/patches/27_kdnssd_avahi.diff
===================================================================
--- trunk/packages/kdelibs/debian/patches/27_kdnssd_avahi.diff	2006-01-11 13:14:14 UTC (rev 2824)
+++ trunk/packages/kdelibs/debian/patches/27_kdnssd_avahi.diff	2006-01-11 19:22:44 UTC (rev 2825)
@@ -0,0 +1,1193 @@
+diff -u -Nrua kdelibs-3.5.0.original/dnssd/Makefile.am kdelibs-3.5.0/dnssd/Makefile.am
+--- kdelibs-3.5.0.original/dnssd/Makefile.am	2005-09-10 10:27:49.000000000 +0200
++++ kdelibs-3.5.0/dnssd/Makefile.am	2006-01-11 18:44:01.000000000 +0100
+@@ -1,5 +1,5 @@
+ # set the include path for X, qt and KDE
+-INCLUDES = -I$(top_srcdir) $(all_includes)
++INCLUDES = -I$(top_srcdir) $(all_includes) $(AVAHI_CFLAGS)
+ 
+ # these are the headers for your project
+ noinst_HEADERS = sdevent.h
+@@ -14,7 +14,8 @@
+ dnssdincludedir = $(includedir)/dnssd
+ dnssdinclude_HEADERS = domainbrowser.h query.h remoteservice.h \
+ 	publicservice.h servicebase.h servicebrowser.h settings.h
+-libkdnssd_la_LIBADD = ../kdecore/libkdecore.la $(LIB_DNSSD)
++libkdnssd_la_CXXFLAGS = $(INCLUDES)
++libkdnssd_la_LIBADD = ../kdecore/libkdecore.la $(AVAHI_LIBS)
+ libkdnssd_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) -version-info 1:0
+ 
+ #kde_kcfg_DATA = kcm_kdnssd.kcfg
+diff -u -Nrua kdelibs-3.5.0.original/dnssd/README kdelibs-3.5.0/dnssd/README
+--- kdelibs-3.5.0.original/dnssd/README	2005-09-10 10:27:49.000000000 +0200
++++ kdelibs-3.5.0/dnssd/README	2006-01-11 18:39:50.000000000 +0100
+@@ -1,12 +1,11 @@
+ Checklist to ensure that zeroconf will work:
+ 
+-1) Install Apple's mdnsd, at least version 85
+-2) kdelibs (and kdebase for ksysguard) should be configured and compiled with dns_sd sdk (part
+-of mdnsd installation) present - config.h should contain '#define HAVE_DNSSD 1'
++1) Install Avahi, at least version 0.3
++2) compile kdnssd-avahi and install it to replace 'stub' libkdnssd.so provided by kdelibs
+ 3) check /etc/nsswitch.conf and ensure that there is 'mdns' before 'dns' in
+ line starting with 'host:'. It should be something like:
+ host: files mdns dns
+-4) ensure that mdnsd is being started in initscripts
++4) ensure that avahi-daemon is being started in initscripts
+ 5) for testing: use kpf kicker applet to publish a directory, then open 'zeroconf:/'
+ URL in konqueror. You should be able to see a local webserver with that published dir.
+ 
+diff -u -Nrua kdelibs-3.5.0.original/dnssd/configure.in.in kdelibs-3.5.0/dnssd/configure.in.in
+--- kdelibs-3.5.0.original/dnssd/configure.in.in	2005-09-10 10:27:49.000000000 +0200
++++ kdelibs-3.5.0/dnssd/configure.in.in	2006-01-11 18:39:51.000000000 +0100
+@@ -1,38 +1,17 @@
+ #MIN_CONFIG
+ 
+-AC_ARG_ENABLE(dnssd, [  --disable-dnssd     don't require libdns_sd (browsing and publishing DNS-SD services will not be possible) ],  with_dnssd=$enableval, with_dnssd=yes)
+-if test "$with_dnssd" = "yes"; then
+-AC_MSG_CHECKING(for DNS-SD support)
+-save_dnssdtest_LIBS="$LIBS"
+-save_dnssdtest_LDFLAGS="$LDFLAGS"
+-save_dnssdtest_CPPFLAGS="$CPPFLAGS"
+-LDFLAGS="$all_libraries $LDFLAGS"
+-CPPFLAGS="$CPPFLAGS $all_includes"
+-case $host_os in
+-  darwin*) LIBS="" ;;
+-  *) LIBS="-ldns_sd" ;;
+-esac
+-have_libdns_sd="no"
+-AC_TRY_LINK(	[
+-			#include <dns_sd.h>
+-		],[
+-			DNSServiceRefDeallocate( (DNSServiceRef) 0);
+-			TXTRecordDeallocate( (TXTRecordRef*) 0);
+-		],[
+-			AC_DEFINE(HAVE_DNSSD,1,[Define if dns-sd is available])
+-			case $host_os in
+-				darwin*) LIB_DNSSD="" ;;
+-				*) LIB_DNSSD="-ldns_sd" ;;
+-			esac
+-			have_libdns_sd="yes"
+-			AC_MSG_RESULT(yes)
+-		],[
+-			AC_MSG_RESULT(no)
+-                        LIB_DNSSD=""
+-])
+-CPPFLAGS=$save_dnssdtest_CPPFLAGS
+-LDFLAGS=$save_dnssdtest_LDFLAGS
+-LIBS=$save_dnssdtest_LIBS
++# Check for pkg-config manually first, as if its not installed the
++# PKG_PROG_PKG_CONFIG macro won't be defined.
++m4_pattern_allow(PKG_CONFIG_MIN_VERSION)
++AC_CHECK_PROG(have_pkg_config, pkg-config, yes, no)
++
++if test x"$have_pkg_config" == xno; then
++    AC_MSG_ERROR(pkg-config is required to install this program)
+ fi
+-AC_SUBST(LIB_DNSSD)
+-AM_CONDITIONAL(HAVE_DNSSD, test "$have_libdns_sd" = "yes")
++
++PKG_PROG_PKG_CONFIG
++
++PKG_CHECK_MODULES( AVAHI, [ avahi-qt3 >= 0.4 , avahi-client >= 0.4 ])
++AC_SUBST(AVAHI_CFLAGS)
++AC_SUBST(AVAHI_LIBS)
++PKG_CHECK_EXISTS( [ avahi-client >= 0.6], AC_DEFINE(AVAHI_API_0_6,1,[Avahi API 0.6] ) )
+diff -u -Nrua kdelibs-3.5.0.original/dnssd/domainbrowser.cpp kdelibs-3.5.0/dnssd/domainbrowser.cpp
+--- kdelibs-3.5.0.original/dnssd/domainbrowser.cpp	2005-11-08 23:39:39.000000000 +0100
++++ kdelibs-3.5.0/dnssd/domainbrowser.cpp	2006-01-11 18:39:51.000000000 +0100
+@@ -27,46 +27,56 @@
+ #include "query.h"
+ #include "servicebrowser.h"
+ #include <kapplication.h>
++#ifdef AVAHI_API_0_6
++#include <avahi-client/lookup.h>
++#endif
+ 
+ namespace DNSSD
+ {
+ 
+-#ifdef HAVE_DNSSD
+-void domain_callback(DNSServiceRef, DNSServiceFlags flags, uint32_t, DNSServiceErrorType errorCode, 
+-	const char *replyDomain, void *context);
++#ifdef AVAHI_API_0_6
++void domains_callback(AvahiDomainBrowser*,  AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* replyDomain,
++     AvahiLookupResultFlags, void* context);
++#else
++void domains_callback(AvahiDomainBrowser*,  AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* replyDomain,
++     void* context);
+ #endif
+ 
+-class DomainBrowserPrivate : public Responder
++
++class DomainBrowserPrivate 
+ {
+ public:
+-	DomainBrowserPrivate(DomainBrowser* owner) : Responder(), m_browseLAN(false), m_started(false), m_owner(owner) {}
++	DomainBrowserPrivate(DomainBrowser* owner) : m_browseLAN(false), m_started(false), 
++	    m_browser(0), m_owner(owner) {}
++	~DomainBrowserPrivate() { if (m_browser) avahi_domain_browser_free(m_browser); }
+ 	QStringList m_domains;
+ 	virtual void customEvent(QCustomEvent* event);
+ 	bool m_browseLAN;
+ 	bool m_started;
++	AvahiDomainBrowser* m_browser;
+ 	DomainBrowser* m_owner;
+ };		
+ 
+ void DomainBrowserPrivate::customEvent(QCustomEvent* event)
+ {
+-	if (event->type()==QEvent::User+SD_ERROR) stop();
+ 	if (event->type()==QEvent::User+SD_ADDREMOVE) {
+ 		AddRemoveEvent *aev = static_cast<AddRemoveEvent*>(event);
+ 		if (aev->m_op==AddRemoveEvent::Add) m_owner->gotNewDomain(aev->m_domain);
+ 			else m_owner->gotRemoveDomain(aev->m_domain);
+ 	}
+ }
++
+ 	
+ DomainBrowser::DomainBrowser(QObject *parent) : QObject(parent)
+ {
+ 	d = new DomainBrowserPrivate(this);
+-	d->m_domains = Configuration::domainList();
++ 	d->m_domains = Configuration::domainList();
+ 	if (Configuration::browseLocal()) {
+ 		d->m_domains+="local.";
+ 		d->m_browseLAN=true;
+ 	}
+-	connect(KApplication::kApplication(),SIGNAL(kipcMessage(int,int)),this,
+-	        SLOT(domainListChanged(int,int)));
++ 	connect(KApplication::kApplication(),SIGNAL(kipcMessage(int,int)),this,
++ 	        SLOT(domainListChanged(int,int)));
+ }
+ 
+ DomainBrowser::DomainBrowser(const QStringList& domains, bool recursive, QObject *parent) : QObject(parent)
+@@ -88,14 +98,15 @@
+ 	if (d->m_started) return;
+ 	d->m_started=true;
+ 	if (ServiceBrowser::isAvailable()!=ServiceBrowser::Working) return;
+-	QStringList::const_iterator itEnd = d->m_domains.end();
++ 	QStringList::const_iterator itEnd = d->m_domains.end();
+ 	for (QStringList::const_iterator it=d->m_domains.begin(); it!=itEnd; ++it ) emit domainAdded(*it);
+-#ifdef HAVE_DNSSD		
+-	if (d->m_browseLAN) {
+-		DNSServiceRef ref;
+-		if (DNSServiceEnumerateDomains(&ref,kDNSServiceFlagsBrowseDomains,0,domain_callback,
+-		reinterpret_cast<void*>(d))==kDNSServiceErr_NoError) d->setRef(ref);
+-	}
++	if (d->m_browseLAN) 
++#ifdef AVAHI_API_0_6
++	    d->m_browser = avahi_domain_browser_new(Responder::self().client(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
++		"local.", AVAHI_DOMAIN_BROWSER_BROWSE, (AvahiLookupFlags)0, domains_callback, this);
++#else
++	    d->m_browser = avahi_domain_browser_new(Responder::self().client(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
++		"local.", AVAHI_DOMAIN_BROWSER_BROWSE, domains_callback, this);
+ #endif
+ }
+ 
+@@ -115,9 +126,14 @@
+ void DomainBrowser::domainListChanged(int message,int)
+ {
+ 	if (message!=KIPCDomainsChanged) return;
++
+ 	bool was_started = d->m_started;
+-	if (d->isRunning()) d->stop(); // LAN query
++	if (d->m_browser) { 
++	    avahi_domain_browser_free(d->m_browser);  // LAN query
++	    d->m_browser=0;
++	}
+ 	d->m_started = false;
++
+ 	// remove all domains and resolvers
+ 	if (was_started) {
+ 		QStringList::const_iterator itEnd = d->m_domains.end();
+@@ -129,7 +145,7 @@
+ 	Configuration::self()->readConfig();
+ 	d->m_browseLAN = Configuration::browseLocal();
+ 	d->m_domains = Configuration::domainList();
+-	if (Configuration::browseLocal()) d->m_domains+="local.";
++	if (Configuration::browseLocal()) d->m_domains+="local";
+ 	// this will emit domainAdded() for every domain if necessary
+ 	if (was_started) startBrowse();
+ }
+@@ -147,22 +163,21 @@
+ void DomainBrowser::virtual_hook(int, void*)
+ {}
+ 
+-#ifdef HAVE_DNSSD
+-void domain_callback(DNSServiceRef, DNSServiceFlags flags, uint32_t, DNSServiceErrorType errorCode, 
+-	const char *replyDomain, void *context)
++#ifdef AVAHI_API_0_6
++void domains_callback(AvahiDomainBrowser*,  AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* replyDomain,
++     AvahiLookupResultFlags,void* context)
++#else
++void domains_callback(AvahiDomainBrowser*,  AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* replyDomain,
++     void* context)
++#endif
+ {
+ 	QObject *obj = reinterpret_cast<QObject*>(context);
+-	if (errorCode != kDNSServiceErr_NoError) {
+-		ErrorEvent err;
+-		QApplication::sendEvent(obj, &err);
+-	} else {
+-		AddRemoveEvent arev((flags & kDNSServiceFlagsAdd) ? AddRemoveEvent::Add :
++	AddRemoveEvent* arev=new AddRemoveEvent((event==AVAHI_BROWSER_NEW) ? AddRemoveEvent::Add :
+ 			AddRemoveEvent::Remove, QString::null, QString::null, 
+-			DNSToDomain(replyDomain), !(flags & kDNSServiceFlagsMoreComing));
+-		QApplication::sendEvent(obj, &arev);
+-	}
++			DNSToDomain(replyDomain));
++		QApplication::postEvent(obj, arev);
+ }
+-#endif
++
+ 
+ }
+ #include "domainbrowser.moc"
+diff -u -Nrua kdelibs-3.5.0.original/dnssd/publicservice.cpp kdelibs-3.5.0/dnssd/publicservice.cpp
+--- kdelibs-3.5.0.original/dnssd/publicservice.cpp	2005-10-10 17:06:42.000000000 +0200
++++ kdelibs-3.5.0/dnssd/publicservice.cpp	2006-01-11 18:49:11.000000000 +0100
+@@ -30,6 +30,12 @@
+ #include <network/ksocketaddress.h>
+ #include <kurl.h>
+ #include <unistd.h>
++#include <avahi-client/client.h>
++#ifdef AVAHI_API_0_6
++#include <avahi-client/publish.h>
++#endif
++#include <avahi-common/alternative.h>
++#include <avahi-common/strlst.h>
+ #include "sdevent.h"
+ #include "responder.h"
+ #include "servicebrowser.h"
+@@ -38,16 +44,23 @@
+ namespace DNSSD
+ {
+ static unsigned long publicIP();
+-#ifdef HAVE_DNSSD
+-void publish_callback (DNSServiceRef, DNSServiceFlags, DNSServiceErrorType errorCode, const char *name,
+-		       const char*, const char*, void *context);
+-#endif
+-class PublicServicePrivate : public Responder
++
++void publish_callback (AvahiEntryGroup*, AvahiEntryGroupState s,  void *context);
++
++class PublicServicePrivate 
+ {
+ public:
+-	PublicServicePrivate() : m_published(false)
++	PublicServicePrivate() : m_published(false), m_running(false), m_collision(false)
+ 	{}
+ 	bool m_published;
++	bool m_running;
++	bool m_collision;
++	AvahiEntryGroup* m_group;
++	void commit()
++	{
++	    if (!m_collision) avahi_entry_group_commit(m_group);
++	}    
++	
+ };
+ 
+ PublicService::PublicService(const QString& name, const QString& type, unsigned int port,
+@@ -55,6 +68,9 @@
+   		: QObject(), ServiceBase(name, type, QString::null, domain, port)
+ {
+ 	d = new PublicServicePrivate;
++	if (Responder::self().client()) d->m_group = avahi_entry_group_new(Responder::self().client(),
++	    publish_callback,this);
++	connect(&Responder::self(),SIGNAL(stateChanged(AvahiClientState)),this,SLOT(clientState(AvahiClientState)));
+ 	if (domain.isNull())
+ 		if (Configuration::publishType()==Configuration::EnumPublishType::LAN) m_domain="local.";
+ 		else m_domain=Configuration::publishDomain();
+@@ -63,114 +79,148 @@
+ 
+ PublicService::~PublicService()
+ {
+-	stop();
++	if (d->m_group) avahi_entry_group_free(d->m_group);
+ 	delete d;
+ }
+ 
++void PublicService::tryApply()
++{
++    if (fillEntryGroup()) d->commit();
++    else {
++	stop();
++	emit published(false);
++    }
++}
++
+ void PublicService::setServiceName(const QString& serviceName)
+ {
+ 	m_serviceName = serviceName;
+-	if (d->isRunning()) {
+-		stop();
+-		publishAsync();
+-	}
++	if (d->m_running) {
++	    avahi_entry_group_reset(d->m_group);
++	    tryApply();
++	} 
+ }
+ 
+ void PublicService::setDomain(const QString& domain)
+ {
+ 	m_domain = domain;
+-	if (d->isRunning()) {
+-	stop();
+-	publishAsync();
+-	}
++	if (d->m_running) {
++	    avahi_entry_group_reset(d->m_group);
++	    tryApply();
++	} 
+ }
+ 
+ 
+ void PublicService::setType(const QString& type)
+ {
+ 	m_type = type;
+-	if (d->isRunning()) {
+-		stop();
+-		publishAsync();
+-	}
++	if (d->m_running) {
++	    avahi_entry_group_reset(d->m_group);
++	    tryApply();
++	} 
+ }
+ 
+ void PublicService::setPort(unsigned short port)
+ {
+ 	m_port = port;
+-	if (d->isRunning()) {
+-		stop();
+-		publishAsync();
+-	}
++	if (d->m_running) {
++	    avahi_entry_group_reset(d->m_group);
++	    tryApply();
++    	} 
+ }
+ 
+-bool PublicService::isPublished() const
++void PublicService::setTextData(const QMap<QString,QString>& textData)
+ {
+-	return d->m_published;
++	m_textData = textData;
++	if (d->m_running) {
++	    avahi_entry_group_reset(d->m_group);
++	    tryApply();
++	} 
+ }
+ 
+-void PublicService::setTextData(const QMap<QString,QString>& textData)
++bool PublicService::isPublished() const
+ {
+-	m_textData = textData;
+-	if (d->isRunning()) {
+-		stop();
+-		publishAsync();
+-	}
++	return d->m_published;
+ }
+ 
+ bool PublicService::publish()
+ {
+ 	publishAsync();
+-	while (d->isRunning() && !d->m_published) d->process();
++	while (d->m_running && !d->m_published) Responder::self().process();
+ 	return d->m_published;
+ }
+ 
+ void PublicService::stop()
+ {
+-	d->stop();
+-	d->m_published = false;
++    if (d->m_group) avahi_entry_group_reset(d->m_group);
++    d->m_published = false;
++}
++bool PublicService::fillEntryGroup()
++{
++    AvahiStringList *s=0;
++    QMap<QString,QString>::ConstIterator itEnd = m_textData.end();
++    for (QMap<QString,QString>::ConstIterator it = m_textData.begin(); it!=itEnd ; ++it) 
++	s = avahi_string_list_add_pair(s, it.key().utf8(),it.data().utf8());
++#ifdef AVAHI_API_0_6
++    bool res = (!avahi_entry_group_add_service_strlst(d->m_group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, (AvahiPublishFlags)0, 
++	m_serviceName.isNull() ? avahi_client_get_host_name(Responder::self().client()) : m_serviceName.utf8().data(),
++	m_type.ascii(),domainToDNS(m_domain),m_hostName.utf8(),m_port,s));
++#else
++    bool res = (!avahi_entry_group_add_service_strlst(d->m_group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 
++	m_serviceName.isNull() ? avahi_client_get_host_name(Responder::self().client()) : m_serviceName.utf8().data(),
++	m_type.ascii(),m_domain.utf8(),m_hostName.utf8(),m_port,s));
++#endif
++    avahi_string_list_free(s);
++    return res;
+ }
+ 
+-void PublicService::publishAsync()
++void PublicService::clientState(AvahiClientState s)
+ {
+-	if (d->isRunning()) stop();
+-#ifdef HAVE_DNSSD
+-	if (ServiceBrowser::isAvailable()==ServiceBrowser::Working) {
+-		TXTRecordRef txt;
+-		TXTRecordCreate(&txt,0,0);
+-		QMap<QString,QString>::ConstIterator itEnd = m_textData.end();
+-		for (QMap<QString,QString>::ConstIterator it = m_textData.begin(); it!=itEnd ; ++it) {
+-			QCString value = it.data().utf8();
+-			if (TXTRecordSetValue(&txt,it.key().utf8(),value.length(),value)!=kDNSServiceErr_NoError) {
+-				TXTRecordDeallocate(&txt);
+-				emit published(false);
+-				return;
+-			}
+-		}
+-		DNSServiceRef ref;
+-		if (DNSServiceRegister(&ref,0,0,m_serviceName.utf8(),m_type.ascii(),domainToDNS(m_domain),NULL,
+-		    htons(m_port),TXTRecordGetLength(&txt),TXTRecordGetBytesPtr(&txt),publish_callback,
+-		    reinterpret_cast<void*>(this)) == kDNSServiceErr_NoError) d->setRef(ref);
+-		TXTRecordDeallocate(&txt);
+-	}
++    if (!d->m_running) return;
++    switch (s) {
++#ifdef AVAHI_API_0_6
++	case AVAHI_CLIENT_FAILURE:
++#else
++	case AVAHI_CLIENT_S_INVALID:
++	case AVAHI_CLIENT_DISCONNECTED:
+ #endif
+-	if (!d->isRunning()) emit published(false);
++	    stop();
++	    emit published(false);
++	    break;
++	case AVAHI_CLIENT_S_REGISTERING:
++	case AVAHI_CLIENT_S_COLLISION:
++	    avahi_entry_group_reset(d->m_group);
++	    d->m_collision=true;
++	    break;
++	case AVAHI_CLIENT_S_RUNNING:
++	    if (d->m_collision) {
++		d->m_collision=false;
++		tryApply();
++	    }
++    }
++}				    
++
++void PublicService::publishAsync()
++{
++	if (d->m_running) stop();
++	
++	if (!d->m_group) {
++	    emit published(false);
++	    return;
++	}
++	AvahiClientState s=avahi_client_get_state(Responder::self().client());
++	d->m_running=true; 
++	d->m_collision=true; // make it look like server is getting out of collision to force registering
++	clientState(s);
+ }
+ 
+-#ifdef HAVE_DNSSD
+-void publish_callback (DNSServiceRef, DNSServiceFlags, DNSServiceErrorType errorCode, const char *name,
+-		       const char*, const char*, void *context)
++void publish_callback (AvahiEntryGroup*, AvahiEntryGroupState s,  void *context)
+ {
+ 	QObject *obj = reinterpret_cast<QObject*>(context);
+-	if (errorCode != kDNSServiceErr_NoError) {
+-		ErrorEvent err;
+-		QApplication::sendEvent(obj, &err);
+-	} else {
+-		PublishEvent pev(QString::fromUtf8(name));
+-		QApplication::sendEvent(obj, &pev);
+-	}
++	if (s!=AVAHI_ENTRY_GROUP_ESTABLISHED && s!=AVAHI_ENTRY_GROUP_COLLISION) return;
++	PublishEvent* pev=new PublishEvent(s==AVAHI_ENTRY_GROUP_ESTABLISHED);
++	QApplication::postEvent(obj, pev);
+ }
+-#endif
+ 
+ const KURL PublicService::toInvitation(const QString& host)
+ {
+@@ -194,14 +244,13 @@
+ 
+ void PublicService::customEvent(QCustomEvent* event)
+ {
+-	if (event->type()==QEvent::User+SD_ERROR) {
+-		stop();
+-		emit published(false);
+-	}
+ 	if (event->type()==QEvent::User+SD_PUBLISH) {
++		if (!static_cast<PublishEvent*>(event)->m_ok) {
++		    setServiceName(QString::fromUtf8(avahi_alternative_service_name(m_serviceName.utf8())));
++		    return;
++		}
+ 		d->m_published=true;
+ 		emit published(true);
+-		m_serviceName = static_cast<PublishEvent*>(event)->m_name;
+ 	}
+ }
+ 
+diff -u -Nrua kdelibs-3.5.0.original/dnssd/publicservice.h kdelibs-3.5.0/dnssd/publicservice.h
+--- kdelibs-3.5.0.original/dnssd/publicservice.h	2005-10-10 17:06:42.000000000 +0200
++++ kdelibs-3.5.0/dnssd/publicservice.h	2006-01-11 18:39:52.000000000 +0100
+@@ -23,6 +23,7 @@
+ 
+ #include <qobject.h>
+ #include <dnssd/servicebase.h>
++#include <avahi-client/client.h>
+ 
+ class KURL;
+ namespace DNSSD
+@@ -137,6 +138,10 @@
+ 	void published(bool);
+ private:
+ 	PublicServicePrivate *d;
++	bool fillEntryGroup();
++	void tryApply();
++private slots:
++	void clientState(AvahiClientState);
+ 
+ protected:
+ 	virtual void customEvent(QCustomEvent* event);
+diff -u -Nrua kdelibs-3.5.0.original/dnssd/query.cpp kdelibs-3.5.0/dnssd/query.cpp
+--- kdelibs-3.5.0.original/dnssd/query.cpp	2005-11-08 23:39:39.000000000 +0100
++++ kdelibs-3.5.0/dnssd/query.cpp	2006-01-11 18:39:52.000000000 +0100
+@@ -22,26 +22,46 @@
+ #include "responder.h"
+ #include "remoteservice.h"
+ #include "sdevent.h"
+-#include <kdebug.h>
++#include <qdatetime.h>
+ #include <qapplication.h>
+ #include <qtimer.h>
+ 
+-#define TIMEOUT_WAN 2000
++#include <avahi-client/client.h>
++#ifdef AVAHI_API_0_6
++#include <avahi-client/lookup.h>
++#endif
++
+ #define TIMEOUT_LAN 200
+ 
+ namespace DNSSD
+ {
+-#ifdef HAVE_DNSSD  
+-void query_callback (DNSServiceRef, DNSServiceFlags flags, uint32_t, DNSServiceErrorType errorCode,
+-		     const char *serviceName, const char *regtype, const char *replyDomain, void *context);
++#ifdef AVAHI_API_0_6
++
++void services_callback(AvahiServiceBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* name,
++    const char* regtype, const char* domain, AvahiLookupResultFlags, void* context);
++void types_callback(AvahiServiceTypeBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* regtype,
++    const char* replyDomain, AvahiLookupResultFlags, void* context);
++#else
++void services_callback(AvahiServiceBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* name,
++    const char* regtype, const char* domain, void* context);
++void types_callback(AvahiServiceTypeBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* regtype,
++    const char* replyDomain, void* context);
++void domains_callback(AvahiDomainBrowser*,  AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* replyDomain,
++     void* context);
+ #endif
+-class QueryPrivate : public Responder
++
++enum BrowserType { Types, Services };
++
++class QueryPrivate 
+ {
+ public:
+-	QueryPrivate(const QString& type, const QString& domain) : Responder(), m_finished(false),
+-	m_domain(domain), m_type(type)
+-	{};
++	QueryPrivate(const QString& type, const QString& domain) : m_finished(false), m_browser(0),
++	m_running(false), m_domain(domain), m_type(type) {}
++
+ 	bool m_finished;
++	BrowserType m_browserType;
++	void* m_browser;
++	bool m_running;
+ 	QString m_domain;
+ 	QTimer timeout;
+ 	QString m_type;
+@@ -56,12 +76,18 @@
+ 
+ Query::~Query()
+ {
++	if (d->m_browser) {
++	    switch (d->m_browserType) {
++		case Services: avahi_service_browser_free((AvahiServiceBrowser*)d->m_browser); break;
++		case Types: avahi_service_type_browser_free((AvahiServiceTypeBrowser*)d->m_browser); break;
++	    }
++	}		    
+ 	delete d;
+ }
+ 
+ bool Query::isRunning() const
+ {
+-	return d->isRunning();
++	return d->m_running;
+ }
+ 
+ bool Query::isFinished() const
+@@ -76,16 +102,31 @@
+ 
+ void Query::startQuery()
+ {
+-	if (d->isRunning()) return;
++	if (d->m_running) return;
+ 	d->m_finished = false;
+-#ifdef HAVE_DNSSD
+-	DNSServiceRef ref;
+-	if (DNSServiceBrowse(&ref,0,0, d->m_type.ascii(), 
+-	    domainToDNS(d->m_domain),query_callback,reinterpret_cast<void*>(this))
+-		   == kDNSServiceErr_NoError) d->setRef(ref);
++	if (d->m_type=="_services._dns-sd._udp") {
++	    d->m_browserType = Types;
++#ifdef AVAHI_API_0_6
++	    d->m_browser = avahi_service_type_browser_new(Responder::self().client(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
++		domainToDNS(d->m_domain), (AvahiLookupFlags)0, types_callback, this);
++#else
++	    d->m_browser = avahi_service_type_browser_new(Responder::self().client(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
++		d->m_domain.utf8(), types_callback, this);
+ #endif
+-	if (!d->isRunning()) emit finished();
+-		else d->timeout.start(domainIsLocal(d->m_domain) ? TIMEOUT_LAN : TIMEOUT_WAN,true);
++	} else {
++	    d->m_browserType = Services;
++#ifdef AVAHI_API_0_6
++	    d->m_browser = avahi_service_browser_new(Responder::self().client(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
++	    d->m_type.ascii(),domainToDNS(d->m_domain),  (AvahiLookupFlags)0, services_callback,this);
++#else
++	    d->m_browser = avahi_service_browser_new(Responder::self().client(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
++	    d->m_type.ascii(),d->m_domain.utf8(),services_callback,this);
++#endif
++	}
++	if (d->m_browser) {
++		d->m_running=true;
++		d->timeout.start(TIMEOUT_LAN,true);
++	} else emit finished();
+ }
+ void Query::virtual_hook(int, void*)
+ {
+@@ -93,24 +134,15 @@
+ 
+ void Query::customEvent(QCustomEvent* event)
+ {
+-	if (event->type()==QEvent::User+SD_ERROR) {
+-		d->stop();
+-		d->m_finished=false;
+-		emit finished();
+-	}
+ 	if (event->type()==QEvent::User+SD_ADDREMOVE) {
+-		RemoteService* svr;
++		d->timeout.start(TIMEOUT_LAN,true);
++		d->m_finished=false;
+ 		AddRemoveEvent *aev = static_cast<AddRemoveEvent*>(event);
+ 		// m_type has useless trailing dot
+-		QString type=aev->m_type.left(aev->m_type.length()-1);
+-		// label is badly splitted here - _http   _tcp.local. . - rely on decode()
+-		if (d->m_type=="_services._dns-sd._udp") svr = new RemoteService(aev->m_name+"."+
+-			type+"."+aev->m_domain);
+-		else svr = new RemoteService(aev->m_name, type, aev->m_domain);
++		RemoteService*  svr = new RemoteService(aev->m_name,
++		    	aev->m_type,aev->m_domain);
+ 		if (aev->m_op==AddRemoveEvent::Add) emit serviceAdded(svr);
+ 			else emit serviceRemoved(svr);
+-		d->m_finished = aev->m_last;
+-		if (d->m_finished) emit finished();
+ 	}
+ }
+ 
+@@ -119,22 +151,36 @@
+ 	d->m_finished=true;
+ 	emit finished();
+ }
+-#ifdef HAVE_DNSSD
+-void query_callback (DNSServiceRef, DNSServiceFlags flags, uint32_t, DNSServiceErrorType errorCode,
+-		     const char *serviceName, const char *regtype, const char *replyDomain,
+-		     void *context)
++
++#ifdef AVAHI_API_0_6
++void services_callback (AvahiServiceBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, 
++    const char* serviceName, const char* regtype, const char* replyDomain, AvahiLookupResultFlags, void* context)
++#else
++void services_callback (AvahiServiceBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, 
++    const char* serviceName, const char* regtype, const char* replyDomain, void* context)
++#endif
+ {
+ 	QObject *obj = reinterpret_cast<QObject*>(context);
+-	if (errorCode != kDNSServiceErr_NoError) {
+-		ErrorEvent err;
+-		QApplication::sendEvent(obj, &err);
+-	} else {
+-		AddRemoveEvent arev((flags & kDNSServiceFlagsAdd) ? AddRemoveEvent::Add :
++	AddRemoveEvent* arev = new AddRemoveEvent((event==AVAHI_BROWSER_NEW) ? AddRemoveEvent::Add :
+ 			AddRemoveEvent::Remove, QString::fromUtf8(serviceName), regtype, 
+-			DNSToDomain(replyDomain), !(flags & kDNSServiceFlagsMoreComing));
+-		QApplication::sendEvent(obj, &arev);
+-	}
++			DNSToDomain(replyDomain));
++		QApplication::postEvent(obj, arev);
+ }
++
++#ifdef AVAHI_API_0_6
++void types_callback(AvahiServiceTypeBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* regtype,
++    const char* replyDomain, AvahiLookupResultFlags, void* context)
++#else
++void types_callback(AvahiServiceTypeBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* regtype,
++    const char* replyDomain, void* context)
+ #endif
++{
++	QObject *obj = reinterpret_cast<QObject*>(context);
++	AddRemoveEvent* arev = new AddRemoveEvent((event==AVAHI_BROWSER_NEW) ? AddRemoveEvent::Add :
++			AddRemoveEvent::Remove, QString::null, regtype, 
++			DNSToDomain(replyDomain));
++		QApplication::postEvent(obj, arev);
++}
++
+ }
+ #include "query.moc"
+diff -u -Nrua kdelibs-3.5.0.original/dnssd/remoteservice.cpp kdelibs-3.5.0/dnssd/remoteservice.cpp
+--- kdelibs-3.5.0.original/dnssd/remoteservice.cpp	2006-01-11 18:36:46.000000000 +0100
++++ kdelibs-3.5.0/dnssd/remoteservice.cpp	2006-01-11 18:39:53.000000000 +0100
+@@ -27,33 +27,39 @@
+ #include <sys/types.h>
+ #endif
+ #include <netinet/in.h>
++#include <avahi-client/client.h>
++#include <avahi-common/strlst.h>
++#ifdef AVAHI_API_0_6
++#include <avahi-client/lookup.h>
++#endif
+ #include "remoteservice.h"
+ #include "responder.h"
+ #include "sdevent.h"
+-#include <kdebug.h>
+ 
+ namespace DNSSD
+ {
+-#ifdef HAVE_DNSSD
+-void resolve_callback    (    DNSServiceRef,
+-				DNSServiceFlags,
+-				uint32_t,
+-				DNSServiceErrorType                 errorCode,
+-				const char*,
+-				const char                          *hosttarget,
+-				uint16_t                            port,
+-				uint16_t                            txtLen,
+-				const char                          *txtRecord,
+-				void                                *context
+-			 );
+-
++#ifdef AVAHI_API_0_6
++void resolve_callback(AvahiServiceResolver*, AvahiIfIndex, AvahiProtocol proto, AvahiResolverEvent e,
++    const char* name, const char* type, const char* domain, const char* hostname, const AvahiAddress* a,
++    uint16_t port, AvahiStringList* txt, AvahiLookupResultFlags, void* context);
++#else
++void resolve_callback(AvahiServiceResolver*, AvahiIfIndex, AvahiProtocol proto, AvahiResolverEvent e,
++    const char* name, const char* type, const char* domain, const char* hostname, const AvahiAddress* a,
++    uint16_t port, AvahiStringList* txt, void* context);
+ #endif
++
+ class RemoteServicePrivate : public Responder
+ {
+ public:
+-	RemoteServicePrivate() : Responder(), m_resolved(false)
+-	{};
++	RemoteServicePrivate() :  m_resolved(false), m_running(false), m_resolver(0) {}
+ 	bool m_resolved;
++	bool m_running;
++	AvahiServiceResolver* m_resolver;
++	void stop() {
++	    m_running = false;
++	    if (m_resolver) avahi_service_resolver_free(m_resolver);
++	    m_resolver=0;
++	}
+ };
+ 
+ RemoteService::RemoteService(const QString& label)
+@@ -83,29 +89,33 @@
+ 
+ RemoteService::~RemoteService()
+ {
++	if (d->m_resolver) avahi_service_resolver_free(d->m_resolver);
+ 	delete d;
+ }
+ 
+ bool RemoteService::resolve()
+ {
+ 	resolveAsync();
+-	while (d->isRunning() && !d->m_resolved) d->process();
++	while (d->m_running && !d->m_resolved) Responder::self().process();
+ 	d->stop();
+ 	return d->m_resolved;
+ }
+ 
+ void RemoteService::resolveAsync()
+ {
+-	if (d->isRunning()) return;
++	if (d->m_running) return;
+ 	d->m_resolved = false;
+-	kdDebug() << this << ":Starting resolve of : " << m_serviceName << " " << m_type << " " << m_domain << "\n";
+-#ifdef HAVE_DNSSD
+-	DNSServiceRef ref;
+-	if (DNSServiceResolve(&ref,0,0,m_serviceName.utf8(), m_type.ascii(), 
+-		domainToDNS(m_domain),resolve_callback,reinterpret_cast<void*>(this))
+-		== kDNSServiceErr_NoError) d->setRef(ref);
++	// FIXME: first protocol should be set?
++#ifdef AVAHI_API_0_6
++	d->m_resolver = avahi_service_resolver_new(Responder::self().client(),AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
++	    m_serviceName.utf8(), m_type.ascii(), domainToDNS(m_domain), AVAHI_PROTO_UNSPEC, AVAHI_LOOKUP_NO_ADDRESS,
++	    resolve_callback, this);
++#else
++	d->m_resolver = avahi_service_resolver_new(Responder::self().client(),AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
++	    m_serviceName.utf8(), m_type.ascii(), m_domain.utf8(), AVAHI_PROTO_UNSPEC, resolve_callback, this);
+ #endif
+-	if (!d->isRunning()) emit resolved(false);
++	if (d->m_resolver) d->m_running=true;
++	    else  emit resolved(false);
+ }
+ 
+ bool RemoteService::isResolved() const
+@@ -154,42 +164,33 @@
+ 	return s;
+ }
+ 
+-
+-#ifdef HAVE_DNSSD
+-void resolve_callback    (    DNSServiceRef,
+-			      DNSServiceFlags,
+-			      uint32_t,
+-			      DNSServiceErrorType                 errorCode,
+-			      const char*,
+-			      const char                          *hosttarget,
+-			      uint16_t                            port,
+-			      uint16_t                            txtLen,
+-			      const char                          *txtRecord,
+-			      void                                *context
+-			 )
++#ifdef AVAHI_API_0_6
++void resolve_callback(AvahiServiceResolver*, AvahiIfIndex, AvahiProtocol, AvahiResolverEvent e,
++    const char*, const char*, const char*, const char* hostname, const AvahiAddress*,
++    uint16_t port, AvahiStringList* txt, AvahiLookupResultFlags, void* context)
++#else
++void resolve_callback(AvahiServiceResolver*, AvahiIfIndex, AvahiProtocol, AvahiResolverEvent e,
++    const char*, const char*, const char*, const char* hostname, const AvahiAddress*,
++    uint16_t port, AvahiStringList* txt, void* context)
++#endif
+ {
+ 	QObject *obj = reinterpret_cast<QObject*>(context);
+-	if (errorCode != kDNSServiceErr_NoError) {
++	if (e != AVAHI_RESOLVER_FOUND) {
+ 		ErrorEvent err;
+ 		QApplication::sendEvent(obj, &err);	
+ 		return;
+ 	}
+-	char key[256];
+-	int index=0;
+-	unsigned char valueLen;
+-	kdDebug() << "Resolve callback\n";
+ 	QMap<QString,QString> map;
+-        const void *voidValue = 0;
+-	while (TXTRecordGetItemAtIndex(txtLen,txtRecord,index++,256,key,&valueLen,
+-		&voidValue) == kDNSServiceErr_NoError)  
+-        {
+-		if (voidValue) map[QString::fromUtf8(key)]=QString::fromUtf8((const char*)voidValue,valueLen);
+-			else map[QString::fromUtf8(key)]=QString::null;
+-        }
+-	ResolveEvent rev(DNSToDomain(hosttarget),ntohs(port),map);
++	while (txt) {
++	    char *key, *value;
++	    size_t size;
++	    if (avahi_string_list_get_pair(txt,&key,&value,&size)) break;
++	    map[QString::fromUtf8(key)]=(value) ? QString::fromUtf8(value) : QString::null;
++	    txt = txt->next;
++	}
++	ResolveEvent rev(DNSToDomain(hostname),port,map);
+ 	QApplication::sendEvent(obj, &rev);
+ }
+-#endif
+ 
+ 
+ }
+diff -u -Nrua kdelibs-3.5.0.original/dnssd/responder.cpp kdelibs-3.5.0/dnssd/responder.cpp
+--- kdelibs-3.5.0.original/dnssd/responder.cpp	2005-10-10 17:06:42.000000000 +0200
++++ kdelibs-3.5.0/dnssd/responder.cpp	2006-01-11 18:39:53.000000000 +0100
+@@ -20,62 +20,61 @@
+ 
+ #include "responder.h"
+ #include <qapplication.h>
++#include <qeventloop.h>
++#include <kstaticdeleter.h>
+ #include <kidna.h>
++#include <kdebug.h>
++#include <avahi-qt3/qt-watch.h>
+ 
+-// dns_sd.h API should care about proper encoding of non-latin1 characters
+-// but for now it does not
+-#define IDN_BROKEN_IN_MDNSRESPONDER
+ 
+ namespace DNSSD
+ {
+ 
+-Responder::Responder(DNSServiceRef ref,QObject *parent, const char *name)
+-		: QObject(parent, name), m_ref(0), m_socket(0)
++static KStaticDeleter<Responder> responder_sd;
++Responder* Responder::m_self = 0;
++
++void client_callback(AvahiClient *, AvahiClientState s, void* u) 
+ {
+-	setRef(ref);
++    Responder *r = reinterpret_cast<Responder*>(u);    
++    emit (r->stateChanged(s));
+ }
+- 
+-void Responder::setRef(DNSServiceRef ref)
++
++
++Responder::Responder()
+ {
+-	if (m_socket || m_ref) stop();	
+-	m_running = false;
+-	m_ref = ref;
+-	if (m_ref == 0 ) return;
+-#ifdef HAVE_DNSSD
+-	int fd = DNSServiceRefSockFD(ref);
+-	if (fd == -1) return;
+-	m_socket = new QSocketNotifier(fd,QSocketNotifier::Read,this);
+-	connect(m_socket,SIGNAL(activated(int)),this,SLOT(process()));
+-	m_running = true;
++    int error;
++    const AvahiPoll* poll = avahi_qt_poll_get();
++#ifdef AVAHI_API_0_6
++    m_client = avahi_client_new(poll, AVAHI_CLIENT_IGNORE_USER_CONFIG,client_callback, this,  &error);
++#else
++    m_client = avahi_client_new(poll, client_callback, this,  &error);
+ #endif
++    if (!m_client) kdWarning() << "Failed to create avahi client" << endl;
+ }
++ 
+ Responder::~Responder()
+ {
+-	stop();
++    if (m_client) avahi_client_free(m_client);
+ }
+ 
+-void Responder::stop()
++Responder& Responder::self()
+ {
+-	if (m_socket) delete m_socket;
+-	m_socket = 0;
+-#ifdef HAVE_DNSSD
+-	if (m_ref) DNSServiceRefDeallocate(m_ref);
+-#endif
+-	m_ref = 0;
+-	m_running = false;
+-}	
+-
++    if (!m_self) responder_sd.setObject(m_self, new Responder);
++    return *m_self;
++}
+ 
+ void Responder::process()
+ {
+-#ifdef HAVE_DNSSD
+-	if ( DNSServiceProcessResult(m_ref) != kDNSServiceErr_NoError) stop();
+-#endif
++    qApp->eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
+ }
+ 
+-bool Responder::isRunning() const
++AvahiClientState Responder::state() const
+ {
+-	return m_running;
++#ifdef AVAHI_API_0_6
++	return (m_client) ? (avahi_client_get_state(m_client)) : AVAHI_CLIENT_FAILURE;
++#else
++	return (m_client) ? (avahi_client_get_state(m_client)) : AVAHI_CLIENT_DISCONNECTED;
++#endif
+ }
+ 
+ bool domainIsLocal(const QString& domain)
+@@ -85,22 +84,14 @@
+ 
+ QCString domainToDNS(const QString &domain)
+ {
+-#ifdef IDN_BROKEN_IN_MDNSRESPONDER
+ 	if (domainIsLocal(domain)) return domain.utf8();
+ 		else return KIDNA::toAsciiCString(domain);
+-#else
+-	return domain.utf8();       
+-#endif
+ }
+ 
+ QString DNSToDomain(const char* domain)
+ {
+-#ifdef IDN_BROKEN_IN_MDNSRESPONDER
+ 	if (domainIsLocal(domain)) return QString::fromUtf8(domain);
+ 		else return KIDNA::toUnicode(domain);
+-#else
+-	return QString::fromUtf8(domain);
+-#endif
+ }
+ 
+ 
+diff -u -Nrua kdelibs-3.5.0.original/dnssd/responder.h kdelibs-3.5.0/dnssd/responder.h
+--- kdelibs-3.5.0.original/dnssd/responder.h	2005-10-10 17:06:42.000000000 +0200
++++ kdelibs-3.5.0/dnssd/responder.h	2006-01-11 18:39:54.000000000 +0100
+@@ -25,12 +25,7 @@
+ #include <qsocketnotifier.h>
+ #include <qsignal.h>
+ #include <config.h>
+-#ifdef HAVE_DNSSD
+-#include <dns_sd.h>
+-#else
+-#define DNSServiceRef void*
+-#endif
+-
++#include <avahi-client/client.h>
+ namespace DNSSD
+ {
+ 
+@@ -38,30 +33,28 @@
+ This class should not be used directly.
+  
+ @author Jakub Stachowski
+- at short Internal class wrapping dns_sd.h interface
++ at short Internal class wrapping avahi client
+  */
+ class Responder : public QObject
+ {
+ 	Q_OBJECT
+ 
+ public:
+-	Responder(DNSServiceRef ref=0,QObject *parent = 0, const char *name = 0);
++	Responder();
+ 
+ 	~Responder();
+ 
+-	/**
+-	Returns true if it is possible to use mDNS service publishing and discovery. 
+-	It needs mDNSResponder running.
+-	 */
+-	bool isRunning() const;
+-	void setRef(DNSServiceRef ref);
+-	void stop();
+-public slots:
++	static Responder& self();
++	AvahiClientState state() const;
++	AvahiClient* client() const { return m_client; }
+ 	void process();
+-protected:
+-	DNSServiceRef m_ref;
+-	bool m_running;
+-	QSocketNotifier *m_socket;
++signals:
++	void stateChanged(AvahiClientState);
++private:
++	AvahiClient* m_client;
++	static Responder* m_self;
++	friend void client_callback(AvahiClient*, AvahiClientState, void*);
++
+ };
+ 
+ /* Utils functions */
+@@ -71,6 +64,7 @@
+ QCString domainToDNS(const QString &domain);
+ QString DNSToDomain(const char* domain);
+ 
++
+ }
+ 
+ #endif
+diff -u -Nrua kdelibs-3.5.0.original/dnssd/sdevent.h kdelibs-3.5.0/dnssd/sdevent.h
+--- kdelibs-3.5.0.original/dnssd/sdevent.h	2005-10-10 17:06:42.000000000 +0200
++++ kdelibs-3.5.0/dnssd/sdevent.h	2006-01-11 18:39:54.000000000 +0100
+@@ -41,24 +41,23 @@
+ public:
+ 	enum Operation { Add, Remove };
+ 	AddRemoveEvent(Operation op,const QString& name,const QString& type,
+-		const QString& domain, bool last) : QCustomEvent(QEvent::User+SD_ADDREMOVE),
+-	m_op(op), m_name(name), m_type(type), m_domain(domain), m_last(last) 
++		const QString& domain) : QCustomEvent(QEvent::User+SD_ADDREMOVE),
++	m_op(op), m_name(name), m_type(type), m_domain(domain) 
+ 	{}
+ 
+ 	const Operation m_op;
+ 	const QString m_name;
+ 	const QString m_type;
+ 	const QString m_domain;
+-	const bool m_last;
+ };
+ 
+ class PublishEvent : public QCustomEvent
+ {
+ public:
+-	PublishEvent(const QString& name) : QCustomEvent(QEvent::User+SD_PUBLISH), m_name(name)
++	PublishEvent(bool ok) : QCustomEvent(QEvent::User+SD_PUBLISH), m_ok(ok)
+ 	{}
+ 
+-	const QString m_name;
++	bool m_ok;
+ };
+ 
+ class ResolveEvent : public QCustomEvent
+diff -u -Nrua kdelibs-3.5.0.original/dnssd/servicebase.cpp kdelibs-3.5.0/dnssd/servicebase.cpp
+--- kdelibs-3.5.0.original/dnssd/servicebase.cpp	2005-11-08 23:39:39.000000000 +0100
++++ kdelibs-3.5.0/dnssd/servicebase.cpp	2006-01-11 18:39:54.000000000 +0100
+@@ -34,7 +34,7 @@
+ 
+ QString ServiceBase::encode()
+ {
+-	return  m_serviceName.replace("\\","\\\\").replace(".","\\.") + QString(".") + m_type +
++	return  m_serviceName.replace(".","\\.").replace("\\","\\\\") + QString(".") + m_type +
+ 			 QString(".") + m_domain;
+ }
+ 
+diff -u -Nrua kdelibs-3.5.0.original/dnssd/servicebrowser.cpp kdelibs-3.5.0/dnssd/servicebrowser.cpp
+--- kdelibs-3.5.0.original/dnssd/servicebrowser.cpp	2005-10-10 17:06:42.000000000 +0200
++++ kdelibs-3.5.0/dnssd/servicebrowser.cpp	2006-01-11 18:39:55.000000000 +0100
+@@ -23,14 +23,11 @@
+ #include <qstringlist.h>
+ #include <qfile.h>
+ #include "domainbrowser.h"
++#include "responder.h"
+ #include "query.h"
+ #include "servicebrowser.h"
++#include <avahi-client/client.h>
+ #include <config.h>
+-#ifdef HAVE_DNSSD
+-#include <dns_sd.h>
+-#endif
+-
+-#define MDNSD_PID "/var/run/mdnsd.pid"
+ 
+ namespace DNSSD
+ {
+@@ -85,20 +82,12 @@
+ 
+ const ServiceBrowser::State ServiceBrowser::isAvailable()
+ {
+-#ifdef HAVE_DNSSD
+-	QFile f(MDNSD_PID);
+-	if (!f.open(IO_ReadOnly)) return Stopped; // no pidfile
+-	QString line;
+-	if (f.readLine(line,16)<1) return Stopped;
+-	unsigned int pid = line.toUInt();
+-	if (pid==0) return Stopped;           // not a pid
+-	return (kill(pid,0)==0 || errno==EPERM) ? Working : Stopped; 
+-	// signal 0 only checks if process is running, mdnsd is probably owned by 'nobody' so we will
+-	// get EPERM, if mdnsd is not running error will be ESRCH
+-	
++	AvahiClientState s = Responder::self().state();
++#ifdef AVAHI_API_0_6
++	return (s==AVAHI_CLIENT_FAILURE) ? Stopped : Working;
+ #else
+-	return Unsupported;
+-#endif
++	return (s==AVAHI_CLIENT_S_INVALID || s==AVAHI_CLIENT_DISCONNECTED) ? Stopped : Working;
++#endif 
+ }
+ ServiceBrowser::~ ServiceBrowser()
+ {




More information about the pkg-kde-commits mailing list