SVN commit 1090024 by qbast: Fixes small corner case where service got removed before it could be resolved. In this case serviceRemoved should not be emitted. M +14 -7 avahi-servicebrowser.cpp M +2 -2 avahi-servicebrowser_p.h M +13 -7 mdnsd-servicebrowser.cpp M +2 -2 mdnsd-servicebrowser_p.h --- trunk/KDE/kdelibs/dnssd/avahi-servicebrowser.cpp #1090023:1090024 @@ -101,11 +101,10 @@ } } -RemoteService::Ptr ServiceBrowserPrivate::find(RemoteService::Ptr s) const +RemoteService::Ptr ServiceBrowserPrivate::find(RemoteService::Ptr s, const QList& where) const { - Q_FOREACH (const RemoteService::Ptr& i, m_services) if (*s==*i) return i; - Q_FOREACH (const RemoteService::Ptr& i, m_duringResolve) if (*s==*i) return i; - return s; + Q_FOREACH (const RemoteService::Ptr& i, where) if (*s==*i) return i; + return RemoteService::Ptr(); } void ServiceBrowserPrivate::gotNewService(int,int,const QString& name, const QString& type, const QString& domain, uint) @@ -125,9 +124,17 @@ void ServiceBrowserPrivate::gotRemoveService(int,int,const QString& name, const QString& type, const QString& domain, uint) { m_timer.start(TIMEOUT_LAST_SERVICE); - RemoteService::Ptr svr=find(RemoteService::Ptr(new RemoteService(name, type,domain))); - emit m_parent->serviceRemoved(svr); - m_services.removeAll(svr); + RemoteService::Ptr tmpl(new RemoteService(name, type,domain)); + RemoteService::Ptr found=find(tmpl, m_duringResolve); + if (!found.isNull()) { + m_duringResolve.removeAll(found); + return; + } + found=find(tmpl, m_services); + if (found.isNull()) return; + + emit m_parent->serviceRemoved(found); + m_services.removeAll(found); } void ServiceBrowserPrivate::browserFinished() { --- trunk/KDE/kdelibs/dnssd/avahi-servicebrowser_p.h #1090023:1090024 @@ -50,8 +50,8 @@ org::freedesktop::Avahi::ServiceBrowser* m_browser; ServiceBrowser* m_parent; - // get already found service identical to s or just return s if not found - RemoteService::Ptr find(RemoteService::Ptr s) const; + // get already found service identical to s or null if not found + RemoteService::Ptr find(RemoteService::Ptr s, const QList& where) const; private Q_SLOTS: void browserFinished(); --- trunk/KDE/kdelibs/dnssd/mdnsd-servicebrowser.cpp #1090023:1090024 @@ -117,11 +117,10 @@ void ServiceBrowser::virtual_hook(int, void*) {} -RemoteService::Ptr ServiceBrowserPrivate::find(RemoteService::Ptr s) const +RemoteService::Ptr ServiceBrowserPrivate::find(RemoteService::Ptr s, const QList& where) const { - Q_FOREACH (const RemoteService::Ptr& i, m_services) if (*s==*i) return i; - Q_FOREACH (const RemoteService::Ptr& i, m_duringResolve) if (*s==*i) return i; - return s; + Q_FOREACH (const RemoteService::Ptr& i, where) if (*s==*i) return i; + return RemoteService::Ptr(); } @@ -147,9 +146,16 @@ } } else { - svr=find(svr); - emit m_parent->serviceRemoved(svr); - m_services.removeAll(svr); + + RemoteService::Ptr found=find(svr, m_duringResolve); + if (!found.isNull()) m_duringResolve.removeAll(found); + else { + found=find(svr, m_services); + if (!found.isNull()) { + emit m_parent->serviceRemoved(found); + m_services.removeAll(found); + } + } } m_finished = aev->m_last; if (m_finished) queryFinished(); --- trunk/KDE/kdelibs/dnssd/mdnsd-servicebrowser_p.h #1090023:1090024 @@ -46,8 +46,8 @@ ServiceBrowser* m_parent; QTimer timeout; - // get already found service identical to s or just return s if not found - RemoteService::Ptr find(RemoteService::Ptr s) const; + // get already found service identical to s or null if not found + RemoteService::Ptr find(RemoteService::Ptr s, const QList& where) const; virtual void customEvent(QEvent* event); public Q_SLOTS: void queryFinished();