summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2009-07-24 18:07:47 (GMT)
committerRemko Tronçon <git@el-tramo.be>2009-07-24 19:03:45 (GMT)
commit30f99a2bcbbeb41bfd61768b98c243ebcfdf67c7 (patch)
tree7cce7dd0fdd485b32fb0634e2b2abe51e98d29f6 /Swiften
parentf6e73393afbe7ce8d1a5c5fc55565582cb8906cc (diff)
downloadswift-contrib-30f99a2bcbbeb41bfd61768b98c243ebcfdf67c7.zip
swift-contrib-30f99a2bcbbeb41bfd61768b98c243ebcfdf67c7.tar.bz2
Make BonjourQuerier thread-safe.
Diffstat (limited to 'Swiften')
-rw-r--r--Swiften/LinkLocal/BonjourBrowseQuery.h15
-rw-r--r--Swiften/LinkLocal/BonjourPublishQuery.h21
-rw-r--r--Swiften/LinkLocal/BonjourQuerier.cpp6
-rw-r--r--Swiften/LinkLocal/BonjourQuerier.h5
-rw-r--r--Swiften/LinkLocal/BonjourQuery.cpp2
-rw-r--r--Swiften/LinkLocal/BonjourQuery.h6
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();