diff options
author | Remko Tronçon <git@el-tramo.be> | 2009-07-24 18:07:47 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2009-07-24 19:03:45 (GMT) |
commit | 30f99a2bcbbeb41bfd61768b98c243ebcfdf67c7 (patch) | |
tree | 7cce7dd0fdd485b32fb0634e2b2abe51e98d29f6 /Swiften/LinkLocal | |
parent | f6e73393afbe7ce8d1a5c5fc55565582cb8906cc (diff) | |
download | swift-30f99a2bcbbeb41bfd61768b98c243ebcfdf67c7.zip swift-30f99a2bcbbeb41bfd61768b98c243ebcfdf67c7.tar.bz2 |
Make BonjourQuerier thread-safe.
Diffstat (limited to 'Swiften/LinkLocal')
-rw-r--r-- | Swiften/LinkLocal/BonjourBrowseQuery.h | 15 | ||||
-rw-r--r-- | Swiften/LinkLocal/BonjourPublishQuery.h | 21 | ||||
-rw-r--r-- | Swiften/LinkLocal/BonjourQuerier.cpp | 6 | ||||
-rw-r--r-- | Swiften/LinkLocal/BonjourQuerier.h | 5 | ||||
-rw-r--r-- | Swiften/LinkLocal/BonjourQuery.cpp | 2 | ||||
-rw-r--r-- | Swiften/LinkLocal/BonjourQuery.h | 6 |
6 files changed, 32 insertions, 23 deletions
diff --git a/Swiften/LinkLocal/BonjourBrowseQuery.h b/Swiften/LinkLocal/BonjourBrowseQuery.h index 6a50a61..6db108d 100644 --- a/Swiften/LinkLocal/BonjourBrowseQuery.h +++ b/Swiften/LinkLocal/BonjourBrowseQuery.h @@ -2,6 +2,7 @@ #include "Swiften/LinkLocal/BonjourQuery.h" #include "Swiften/LinkLocal/DNSSDBrowseQuery.h" +#include "Swiften/EventLoop/MainEventLoop.h" namespace Swift { class BonjourQuerier; @@ -11,7 +12,7 @@ namespace Swift { BonjourBrowseQuery(boost::shared_ptr<BonjourQuerier> q) : BonjourQuery(q) { DNSServiceErrorType result = DNSServiceBrowse( &sdRef, 0, 0, "_presence._tcp", 0, - &BonjourBrowseQuery::handleServiceDiscovered, this); + &BonjourBrowseQuery::handleServiceDiscoveredStatic, this); if (result != kDNSServiceErr_NoError) { std::cout << "Error" << std::endl; // TODO @@ -28,19 +29,21 @@ namespace Swift { } private: - static void handleServiceDiscovered(DNSServiceRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *name, const char *type, const char *domain, void *context) { + static void handleServiceDiscoveredStatic(DNSServiceRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *name, const char *type, const char *domain, void *context) { + static_cast<BonjourBrowseQuery*>(context)->handleServiceDiscovered(flags, interfaceIndex, errorCode, name, type, domain); + } + + void handleServiceDiscovered(DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *name, const char *type, const char *domain) { if (errorCode != kDNSServiceErr_NoError) { return; } else { - BonjourBrowseQuery* query = static_cast<BonjourBrowseQuery*>(context); LinkLocalServiceID service(name, type, domain, interfaceIndex); - std::cout << "Service discovered: " << name << std::endl; if (flags & kDNSServiceFlagsAdd) { - query->onServiceAdded(service); + MainEventLoop::postEvent(boost::bind(boost::ref(onServiceAdded), service), shared_from_this()); } else { - query->onServiceRemoved(service); + MainEventLoop::postEvent(boost::bind(boost::ref(onServiceRemoved), service), shared_from_this()); } } } diff --git a/Swiften/LinkLocal/BonjourPublishQuery.h b/Swiften/LinkLocal/BonjourPublishQuery.h index 4e7fd2f..a96e25a 100644 --- a/Swiften/LinkLocal/BonjourPublishQuery.h +++ b/Swiften/LinkLocal/BonjourPublishQuery.h @@ -4,6 +4,7 @@ #include "Swiften/LinkLocal/DNSSDPublishQuery.h" #include "Swiften/LinkLocal/LinkLocalServiceInfo.h" #include "Swiften/Base/ByteArray.h" +#include "Swiften/EventLoop/MainEventLoop.h" namespace Swift { class BonjourQuerier; @@ -15,7 +16,7 @@ namespace Swift { DNSServiceErrorType result = DNSServiceRegister( &sdRef, 0, 0, name.getUTF8Data(), "_presence._tcp", NULL, NULL, port, txtRecord.getSize(), txtRecord.getData(), - &BonjourPublishQuery::handleServiceRegistered, this); + &BonjourPublishQuery::handleServicePublishedStatic, this); if (result != kDNSServiceErr_NoError) { // TODO std::cerr << "Error creating service registration" << std::endl; @@ -26,15 +27,23 @@ namespace Swift { run(); } + void update(const LinkLocalService& info) { + boost::lock_guard<boost::mutex> lock(sdRefMutex); + ByteArray txtRecord = info.toTXTRecord(); + DNSServiceUpdateRecord(sdRef, NULL, NULL, txtRecord.getSize(), txtRecord.getData(), 0); + } + private: - static void handleServiceRegistered(DNSServiceRef, DNSServiceFlags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, void *context) { - std::cout << "Publish finished " << name << std::endl; - BonjourPublishQuery* query = static_cast<BonjourPublishQuery*>(context); + static void handleServicePublishedStatic(DNSServiceRef, DNSServiceFlags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, void *context) { + static_cast<BonjourPublishQuery*>(context)->handleServicePublished(errorCode, name, regtype, domain); + } + + void handleServicePublished(DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain) { if (errorCode != kDNSServiceErr_NoError) { - query->onPublishFinished(boost::optional<LinkLocalServiceID>()); + MainEventLoop::postEvent(boost::bind(boost::ref(onPublishFinished), boost::optional<LinkLocalServiceID>()), shared_from_this()); } else { - query->onPublishFinished(boost::optional<LinkLocalServiceID>(LinkLocalServiceID(name, regtype, domain, 0))); + MainEventLoop::postEvent(boost::bind(boost::ref(onPublishFinished), boost::optional<LinkLocalServiceID>(LinkLocalServiceID(name, regtype, domain, 0))), shared_from_this()); } } }; diff --git a/Swiften/LinkLocal/BonjourQuerier.cpp b/Swiften/LinkLocal/BonjourQuerier.cpp index 93259c1..3080869 100644 --- a/Swiften/LinkLocal/BonjourQuerier.cpp +++ b/Swiften/LinkLocal/BonjourQuerier.cpp @@ -5,7 +5,6 @@ #include <netinet/in.h> #include <fcntl.h> -#include "Swiften/EventLoop/MainEventLoop.h" #include "Swiften/LinkLocal/BonjourBrowseQuery.h" #include "Swiften/LinkLocal/BonjourPublishQuery.h" #include "Swiften/Base/foreach.h" @@ -108,10 +107,9 @@ void BonjourQuerier::run() { { boost::lock_guard<boost::mutex> lock(runningQueriesMutex); - foreach(const boost::shared_ptr<BonjourQuery>& query, runningQueries) { + foreach(boost::shared_ptr<BonjourQuery> query, runningQueries) { if (FD_ISSET(query->getSocketID(), &fdSet)) { - MainEventLoop::postEvent( - boost::bind(&BonjourQuery::processResult, query), shared_from_this()); + query->processResult(); } } } diff --git a/Swiften/LinkLocal/BonjourQuerier.h b/Swiften/LinkLocal/BonjourQuerier.h index 5f69ad6..e5ffa49 100644 --- a/Swiften/LinkLocal/BonjourQuerier.h +++ b/Swiften/LinkLocal/BonjourQuerier.h @@ -6,7 +6,6 @@ #include <boost/thread.hpp> #include <boost/thread/mutex.hpp> -#include "Swiften/EventLoop/EventOwner.h" #include "Swiften/LinkLocal/DNSSDBrowseQuery.h" #include "Swiften/LinkLocal/DNSSDPublishQuery.h" #include "Swiften/LinkLocal/BonjourQuery.h" @@ -14,9 +13,7 @@ namespace Swift { class LinkLocalServiceInfo; - class BonjourQuerier : - public boost::enable_shared_from_this<BonjourQuerier>, - public EventOwner { + class BonjourQuerier : public boost::enable_shared_from_this<BonjourQuerier> { public: BonjourQuerier(); ~BonjourQuerier(); diff --git a/Swiften/LinkLocal/BonjourQuery.cpp b/Swiften/LinkLocal/BonjourQuery.cpp index 965a845..a9c13fb 100644 --- a/Swiften/LinkLocal/BonjourQuery.cpp +++ b/Swiften/LinkLocal/BonjourQuery.cpp @@ -11,9 +11,7 @@ BonjourQuery::~BonjourQuery() { } void BonjourQuery::processResult() { - std::cout << "Process result" << std::endl; boost::lock_guard<boost::mutex> lock(sdRefMutex); - std::cout << "DNSSDServiceProcessResult" << std::endl; DNSServiceProcessResult(sdRef); } diff --git a/Swiften/LinkLocal/BonjourQuery.h b/Swiften/LinkLocal/BonjourQuery.h index 2a47f73..bdb91a4 100644 --- a/Swiften/LinkLocal/BonjourQuery.h +++ b/Swiften/LinkLocal/BonjourQuery.h @@ -5,10 +5,14 @@ #include <boost/enable_shared_from_this.hpp> #include <boost/thread/mutex.hpp> +#include "Swiften/EventLoop/EventOwner.h" + namespace Swift { class BonjourQuerier; - class BonjourQuery : public boost::enable_shared_from_this<BonjourQuery> { + class BonjourQuery : + public EventOwner, + public boost::enable_shared_from_this<BonjourQuery> { public: BonjourQuery(boost::shared_ptr<BonjourQuerier>); virtual ~BonjourQuery(); |