diff --git a/protocols/bonjour/bonjouraccount.h b/protocols/bonjour/bonjouraccount.h --- a/protocols/bonjour/bonjouraccount.h +++ b/protocols/bonjour/bonjouraccount.h @@ -174,6 +174,14 @@ */ void comingOnline(KDNSSD::RemoteService::Ptr pointer); + /** + * @brief Called when a contact comes online and is resolved + * + * @param pointer RemoteService representing the contact, should be resolved + * @param success \c true if resolution was successful + */ + void comingOnlineResolved(KDNSSD::RemoteService::Ptr pointer, bool success); + /** * @brief Slots Called When a Contact Goes Offline * diff --git a/protocols/bonjour/bonjouraccount.cpp b/protocols/bonjour/bonjouraccount.cpp --- a/protocols/bonjour/bonjouraccount.cpp +++ b/protocols/bonjour/bonjouraccount.cpp @@ -232,10 +232,23 @@ void BonjourAccount::comingOnline(KDNSSD::RemoteService::Ptr pointer) { - if (!pointer->resolve()) { + if (contacts().value(pointer->serviceName())) + return; + + if (pointer->isResolved()) + comingOnlineResolved(pointer, true); + + const auto ptrValue = &*pointer; + QObject::connect(ptrValue, &KDNSSD::RemoteService::resolved, this, [this, ptrValue](bool r) { comingOnlineResolved(KDNSSD::RemoteService::Ptr(ptrValue), r); }); + pointer->resolveAsync(); +} + +void BonjourAccount::comingOnlineResolved(KDNSSD::RemoteService::Ptr pointer, bool success) +{ + if (!success) { qDebug()<<"Unable to Resolve! Dumping Contact"; + return; } - qDebug()<<"Coming Online:"<serviceName(); if (pointer->serviceName() == username) { // Don't Add Ourselves @@ -285,8 +298,6 @@ void BonjourAccount::goingOffline(KDNSSD::RemoteService::Ptr pointer) { - pointer->resolve(); - // In case we have lost connection, this may return NULL Kopete::Contact *c = contacts().value(pointer->serviceName());