Author: helio
Date: Tue Feb  6 14:13:46 2007
New Revision: 116720

Added:
   
packages/cooker/kdelibs/current/SOURCES/kdelibs-3.5.6-add-dnssd-avahi-support.patch
Removed:
   
packages/cooker/kdelibs/current/SOURCES/kdelibs-3.5.0-add-dnssd-avahi-support.patch
   
packages/cooker/kdelibs/current/SOURCES/kdelibs-3.5.0-fix-avahi-search-daemon.patch
Modified:
   packages/cooker/kdelibs/current/SPECS/kdelibs.spec

Log:
- Reenable avahi support

Added: 
packages/cooker/kdelibs/current/SOURCES/kdelibs-3.5.6-add-dnssd-avahi-support.patch
==============================================================================
--- (empty file)
+++ 
packages/cooker/kdelibs/current/SOURCES/kdelibs-3.5.6-add-dnssd-avahi-support.patch
 Tue Feb  6 14:13:46 2007
@@ -0,0 +1,1218 @@
+diff -r -u kdelibs-3.5.6/dnssd/configure.in.in k/dnssd/configure.in.in
+--- kdelibs-3.5.6/dnssd/configure.in.in        2005-07-18 13:30:36.000000000 
-0300
++++ k/dnssd/configure.in.in    2007-01-08 16:21:27.000000000 -0200
+@@ -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 -r -u kdelibs-3.5.6/dnssd/domainbrowser.cpp k/dnssd/domainbrowser.cpp
+--- kdelibs-3.5.6/dnssd/domainbrowser.cpp      2005-10-12 16:21:19.000000000 
-0300
++++ k/dnssd/domainbrowser.cpp  2007-01-08 16:21:27.000000000 -0200
+@@ -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 -r -u kdelibs-3.5.6/dnssd/Makefile.am k/dnssd/Makefile.am
+--- kdelibs-3.5.6/dnssd/Makefile.am    2004-12-06 14:53:15.000000000 -0200
++++ k/dnssd/Makefile.am        2007-01-08 16:21:27.000000000 -0200
+@@ -1,22 +1,19 @@
+ # 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
+-
+-# let automoc handle all of the meta source files (moc)
+-METASOURCES = AUTO
++SUBDIRS = .
+ 
++noinst_HEADERS = sdevent.h
+ lib_LTLIBRARIES =  libkdnssd.la
+ 
+ libkdnssd_la_SOURCES = remoteservice.cpp responder.cpp servicebase.cpp \
+                               settings.kcfgc publicservice.cpp query.cpp 
domainbrowser.cpp servicebrowser.cpp
+ 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)
++dnssdinclude_HEADERS = domainbrowser.h query.h remoteservice.h 
publicservice.h \
++                                              servicebase.h servicebrowser.h 
settings.h responder.h
++libkdnssd_la_LIBADD = $(LIB_KDECORE) $(AVAHI_LIBS) -lavahi-client
+ libkdnssd_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) -version-info 1:0
+ 
+-#kde_kcfg_DATA = kcm_kdnssd.kcfg
++METASOURCES = AUTO
+ 
+ include ../admin/Doxyfile.am
+diff -r -u kdelibs-3.5.6/dnssd/publicservice.cpp k/dnssd/publicservice.cpp
+--- kdelibs-3.5.6/dnssd/publicservice.cpp      2005-09-29 06:47:40.000000000 
-0300
++++ k/dnssd/publicservice.cpp  2007-01-08 16:21:27.000000000 -0200
+@@ -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 -r -u kdelibs-3.5.6/dnssd/publicservice.h k/dnssd/publicservice.h
+--- kdelibs-3.5.6/dnssd/publicservice.h        2005-09-29 06:47:40.000000000 
-0300
++++ k/dnssd/publicservice.h    2007-01-08 16:21:27.000000000 -0200
+@@ -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 -r -u kdelibs-3.5.6/dnssd/query.cpp k/dnssd/query.cpp
+--- kdelibs-3.5.6/dnssd/query.cpp      2005-10-12 16:49:27.000000000 -0300
++++ k/dnssd/query.cpp  2007-01-08 16:21:27.000000000 -0200
+@@ -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 -r -u kdelibs-3.5.6/dnssd/README k/dnssd/README
+--- kdelibs-3.5.6/dnssd/README 2005-07-30 06:57:01.000000000 -0300
++++ k/dnssd/README     2007-01-08 16:20:41.000000000 -0200
+@@ -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 -r -u kdelibs-3.5.6/dnssd/remoteservice.cpp k/dnssd/remoteservice.cpp
+--- kdelibs-3.5.6/dnssd/remoteservice.cpp      2006-12-25 12:19:44.000000000 
-0200
++++ k/dnssd/remoteservice.cpp  2007-01-08 17:07:38.000000000 -0200
+@@ -30,30 +30,38 @@
+ #include "remoteservice.h"
+ #include "responder.h"
+ #include "sdevent.h"
+-#include <kdebug.h>
++
++#include <avahi-client/client.h>
++#include <avahi-common/strlst.h>
++#ifdef AVAHI_API_0_6
++#include <avahi-client/lookup.h>
++#endif
+ 
+ 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 unsigned 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 +91,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),(DNSServiceResolveReply)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,44 +166,37 @@
+       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 unsigned char                 *txtRecord,
+-                            void                                *context
+-                       )
+-{
+-      QObject *obj = reinterpret_cast<QObject*>(context);
+-      if (errorCode != kDNSServiceErr_NoError) {
+-              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);
+-      QApplication::sendEvent(obj, &rev);
+-}
++#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 (e != AVAHI_RESOLVER_FOUND) 
++      {
++         ErrorEvent err;
++         QApplication::sendEvent(obj, &err);  
++         return;
++      }
++      
++      QMap<QString,QString> 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);
++   }
+ }
+ 
+ #include "remoteservice.moc"
+diff -r -u kdelibs-3.5.6/dnssd/responder.cpp k/dnssd/responder.cpp
+--- kdelibs-3.5.6/dnssd/responder.cpp  2005-09-29 06:47:40.000000000 -0300
++++ k/dnssd/responder.cpp      2007-01-08 16:21:27.000000000 -0200
+@@ -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 -r -u kdelibs-3.5.6/dnssd/responder.h k/dnssd/responder.h
+--- kdelibs-3.5.6/dnssd/responder.h    2005-09-29 06:47:40.000000000 -0300
++++ k/dnssd/responder.h        2007-01-08 16:21:27.000000000 -0200
+@@ -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
[EMAIL PROTECTED] Internal class wrapping dns_sd.h interface
[EMAIL PROTECTED] 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 -r -u kdelibs-3.5.6/dnssd/sdevent.h k/dnssd/sdevent.h
+--- kdelibs-3.5.6/dnssd/sdevent.h      2005-09-29 06:47:40.000000000 -0300
++++ k/dnssd/sdevent.h  2007-01-08 16:21:27.000000000 -0200
+@@ -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 -r -u kdelibs-3.5.6/dnssd/servicebase.cpp k/dnssd/servicebase.cpp
+--- kdelibs-3.5.6/dnssd/servicebase.cpp        2005-10-12 16:21:19.000000000 
-0300
++++ k/dnssd/servicebase.cpp    2007-01-08 16:21:27.000000000 -0200
+@@ -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 -r -u kdelibs-3.5.6/dnssd/servicebrowser.cpp k/dnssd/servicebrowser.cpp
+--- kdelibs-3.5.6/dnssd/servicebrowser.cpp     2005-09-29 06:47:40.000000000 
-0300
++++ k/dnssd/servicebrowser.cpp 2007-01-08 16:21:27.000000000 -0200
+@@ -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()
+ {

Modified: packages/cooker/kdelibs/current/SPECS/kdelibs.spec
==============================================================================
--- packages/cooker/kdelibs/current/SPECS/kdelibs.spec  (original)
+++ packages/cooker/kdelibs/current/SPECS/kdelibs.spec  Tue Feb  6 14:13:46 2007
@@ -44,7 +44,7 @@
 Name: kdelibs
 Summary: K Desktop Environment - Libraries
 Version: 3.5.6
-Release: %mkrel 2
+Release: %mkrel 3
 Epoch: %epoch_kdelibs
 Group: Graphical desktop/KDE
 License: ARTISTIC BSD GPL_V2 LGPL_V2 QPL_V1.0
@@ -94,7 +94,7 @@
 Patch51:       kdelibs-3.5.1-fix-call-config.patch
 Patch52: kdelibs-3.5.1-smooth-scrolling.patch
 Patch53: kdelibs-3.5.0-rubberband-selection.patch 
-Patch54:       kdelibs-3.5.0-add-dnssd-avahi-support.patch     
+Patch54:       kdelibs-3.5.6-add-dnssd-avahi-support.patch     
 Patch55:       kdelibs-3.5.2-move-xdg-menu-dir.patch
 Patch56:       kdelibs-3.5.3-xinerama.patch    
 Patch57:       kdelibs-3.5.3-menu-xdg.patch
@@ -673,7 +673,7 @@
 %patch52 -p1 -b .smooth
 %patch53 -p0 -b .rubber
 %if %mdkversion > 200600
-#%patch54 -p0 -b .avahi_support
+%patch54 -p1 -b .avahi_support
 %patch55 -p1 -b .move_xdg_menu_dir
 %patch56 -p1 -b .xinerama
 %patch57 -p1 -b .menu_xdg

Reply via email to