diff options
Diffstat (limited to 'Swiften/LinkLocal/DNSSD')
11 files changed, 274 insertions, 185 deletions
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.cpp b/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.cpp new file mode 100644 index 0000000..e31bf87 --- /dev/null +++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h> + +#include <boost/bind.hpp> +#include <iostream> + +#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h> + +namespace Swift { + +void AvahiBrowseQuery::startBrowsing() { +	std::cout << "Start browsing" << std::endl; +	assert(!browser); +	avahi_threaded_poll_lock(querier->getThreadedPoll()); +	browser = avahi_service_browser_new(querier->getClient(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_presence._tcp", NULL, static_cast<AvahiLookupFlags>(0), &handleServiceDiscoveredStatic, this); +	if (!browser) { +		std::cout << "Error" << std::endl; +		eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this()); +	} +	avahi_threaded_poll_unlock(querier->getThreadedPoll()); +} + +void AvahiBrowseQuery::stopBrowsing() { +	std::cout << "Stop browsing" << std::endl; +	avahi_threaded_poll_lock(querier->getThreadedPoll()); +	avahi_service_browser_free(browser); +	browser = NULL; +	avahi_threaded_poll_unlock(querier->getThreadedPoll()); +} + +void AvahiBrowseQuery::handleServiceDiscovered(AvahiServiceBrowser *, AvahiIfIndex interfaceIndex, AvahiProtocol, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, AvahiLookupResultFlags) { +	switch (event) { +		case AVAHI_BROWSER_FAILURE:	 +			std::cout << "Service browse error" << std::endl; +			eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this()); +			break; +		case AVAHI_BROWSER_NEW: { +			DNSSDServiceID service(name, domain, type, interfaceIndex); +			std::cout << "Service discovered " << name << " " << domain << " " << type << " " << interfaceIndex << std::endl; +			eventLoop->postEvent(boost::bind(boost::ref(onServiceAdded), service), shared_from_this()); +			break; +		} +		case AVAHI_BROWSER_REMOVE: { +			std::cout << "Service went away " << name << " " << domain << " " << type << " " << interfaceIndex << std::endl; +			DNSSDServiceID service(name, domain, type, interfaceIndex); +			eventLoop->postEvent(boost::bind(boost::ref(onServiceRemoved), service), shared_from_this()); +			break; +		} +		case AVAHI_BROWSER_ALL_FOR_NOW: +		case AVAHI_BROWSER_CACHE_EXHAUSTED: +			break; +	} +} + +} diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h index 163a5f6..7641712 100644 --- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h +++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h @@ -6,7 +6,7 @@  #pragma once -#include <boost/bind.hpp> +#include <avahi-client/lookup.h>  #include "Swiften/LinkLocal/DNSSD/Avahi/AvahiQuery.h"  #include "Swiften/LinkLocal/DNSSD/DNSSDBrowseQuery.h" @@ -20,54 +20,15 @@ namespace Swift {  			AvahiBrowseQuery(boost::shared_ptr<AvahiQuerier> q, EventLoop* eventLoop) : AvahiQuery(q, eventLoop), browser(NULL) {  			} -			void startBrowsing() { -				std::cout << "Start browsing" << std::endl; -				assert(!browser); -				avahi_threaded_poll_lock(querier->getThreadedPoll()); -				browser = avahi_service_browser_new(querier->getClient(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_presence._tcp", NULL, static_cast<AvahiLookupFlags>(0), &handleServiceDiscoveredStatic, this); -				if (!browser) { -					std::cout << "Error" << std::endl; -					eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this()); -				} -				avahi_threaded_poll_unlock(querier->getThreadedPoll()); -			} - -			void stopBrowsing() { -				std::cout << "Stop browsing" << std::endl; -				avahi_threaded_poll_lock(querier->getThreadedPoll()); -				avahi_service_browser_free(browser); -				browser = NULL; -				avahi_threaded_poll_unlock(querier->getThreadedPoll()); -			} +			void startBrowsing(); +			void stopBrowsing();  		private:  			static void handleServiceDiscoveredStatic(AvahiServiceBrowser *b, AvahiIfIndex interfaceIndex, AvahiProtocol protocol, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, AvahiLookupResultFlags flags, void* context) {  				static_cast<AvahiBrowseQuery*>(context)->handleServiceDiscovered(b, interfaceIndex, protocol, event, name, type, domain, flags);  			} -			void handleServiceDiscovered(AvahiServiceBrowser *, AvahiIfIndex interfaceIndex, AvahiProtocol, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, AvahiLookupResultFlags) { -				switch (event) { -					case AVAHI_BROWSER_FAILURE:	 -						std::cout << "Service browse error" << std::endl; -						eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this()); -						break; -					case AVAHI_BROWSER_NEW: { -						DNSSDServiceID service(name, domain, type, interfaceIndex); -						std::cout << "Service discovered " << name << " " << domain << " " << type << " " << interfaceIndex << std::endl; -						eventLoop->postEvent(boost::bind(boost::ref(onServiceAdded), service), shared_from_this()); -						break; -					} -					case AVAHI_BROWSER_REMOVE: { -						std::cout << "Service went away " << name << " " << domain << " " << type << " " << interfaceIndex << std::endl; -						DNSSDServiceID service(name, domain, type, interfaceIndex); -						eventLoop->postEvent(boost::bind(boost::ref(onServiceRemoved), service), shared_from_this()); -						break; -					} -					case AVAHI_BROWSER_ALL_FOR_NOW: -					case AVAHI_BROWSER_CACHE_EXHAUSTED: -						break; -				} -			} +			void handleServiceDiscovered(AvahiServiceBrowser *, AvahiIfIndex interfaceIndex, AvahiProtocol, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, AvahiLookupResultFlags);  		private:  			AvahiServiceBrowser* browser; diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.cpp b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.cpp new file mode 100644 index 0000000..7975e7b --- /dev/null +++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.cpp @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h> + +#include <iostream> +#include <boost/bind.hpp> + +#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h> + +namespace Swift { + +void AvahiRegisterQuery::registerService() { +	std::cout << "Registering service " << name << ":" << port << std::endl; +	avahi_threaded_poll_lock(querier->getThreadedPoll()); +	if (!group) { +		std::cout << "Creating entry group" << std::endl; +		group = avahi_entry_group_new(querier->getClient(), handleEntryGroupChange, this); +		if (!group) { +			std::cout << "Error ceating entry group" << std::endl; +			eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); +		} +	} + +	doRegisterService(); +	avahi_threaded_poll_unlock(querier->getThreadedPoll()); +} + +void AvahiRegisterQuery::unregisterService() { +	if (group) { +		avahi_entry_group_free(group); +		group = NULL; +	} +} + +void AvahiRegisterQuery::updateServiceInfo(const ByteArray& txtRecord) { +	this->txtRecord = txtRecord; +	avahi_threaded_poll_lock(querier->getThreadedPoll()); +	assert(group); +	avahi_entry_group_reset(group); +	doRegisterService(); +	avahi_threaded_poll_unlock(querier->getThreadedPoll()); +} + +void AvahiRegisterQuery::doRegisterService() { +	AvahiStringList* txtList; +	avahi_string_list_parse(txtRecord.getData(), txtRecord.getSize(), &txtList); + +	int result = avahi_entry_group_add_service_strlst(group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, static_cast<AvahiPublishFlags>(0), name.c_str(), "_presence._tcp", NULL, NULL, port, txtList); +	if (result < 0) { +		std::cout << "Error registering service: " << avahi_strerror(result) << std::endl; +		eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); +	} +	result = avahi_entry_group_commit(group); +	if (result < 0) { +		std::cout << "Error registering service: " << avahi_strerror(result) << std::endl; +	} +} + +void AvahiRegisterQuery::handleEntryGroupChange(AvahiEntryGroup* g, AvahiEntryGroupState state) { +	std::cout << "ENtry group callback: " << state << std::endl; +	switch (state) { +		case AVAHI_ENTRY_GROUP_ESTABLISHED : +			// Domain is a hack! +			eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>(DNSSDServiceID(name, "local", "_presence._tcp", 0))), shared_from_this()); +			std::cout << "Entry group established" << std::endl; +			break; +	case AVAHI_ENTRY_GROUP_COLLISION : { +			std::cout << "Entry group collision" << std::endl; +			/*char *n; +			n = avahi_alternative_service_name(name); +			avahi_free(name); +			name = n;*/ +			break; +	} + +	case AVAHI_ENTRY_GROUP_FAILURE : +			std::cout << "Entry group failure " << avahi_strerror(avahi_client_errno(avahi_entry_group_get_client(g))) << std::endl; +			break; + +	case AVAHI_ENTRY_GROUP_UNCOMMITED: +	case AVAHI_ENTRY_GROUP_REGISTERING: +			; + +	/* +	DNSServiceErrorType result = DNSServiceRegister( +			&sdRef, 0, 0, name.c_str(), "_presence._tcp", NULL, NULL, port,  +			txtRecord.getSize(), txtRecord.getData(),  +			&AvahiRegisterQuery::handleServiceRegisteredStatic, this); +	if (result != kDNSServiceErr_NoError) { +		sdRef = NULL; +	}*/ +	//eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); +	} +} + + +} diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h index 07966af..3303f1b 100644 --- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h +++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h @@ -21,94 +21,18 @@ namespace Swift {  			AvahiRegisterQuery(const std::string& name, int port, const ByteArray& txtRecord, boost::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop) : AvahiQuery(querier, eventLoop), name(name), port(port), txtRecord(txtRecord), group(0) {  			} -			void registerService() { -				std::cout << "Registering service " << name << ":" << port << std::endl; -				avahi_threaded_poll_lock(querier->getThreadedPoll()); -				if (!group) { -					std::cout << "Creating entry group" << std::endl; -					group = avahi_entry_group_new(querier->getClient(), handleEntryGroupChange, this); -					if (!group) { -						std::cout << "Error ceating entry group" << std::endl; -						eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); -					} -				} - -				doRegisterService(); -				avahi_threaded_poll_unlock(querier->getThreadedPoll()); -			} - -			void unregisterService() { -				if (group) { -					avahi_entry_group_free(group); -					group = NULL; -				} -			} - -			void updateServiceInfo(const ByteArray& txtRecord) { -				this->txtRecord = txtRecord; -				avahi_threaded_poll_lock(querier->getThreadedPoll()); -				assert(group); -				avahi_entry_group_reset(group); -				doRegisterService(); -				avahi_threaded_poll_unlock(querier->getThreadedPoll()); -			} +			void registerService(); +			void unregisterService(); +			void updateServiceInfo(const ByteArray& txtRecord);  		private: -			void doRegisterService() { -				AvahiStringList* txtList; -				avahi_string_list_parse(txtRecord.getData(), txtRecord.getSize(), &txtList); - -				int result = avahi_entry_group_add_service_strlst(group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, static_cast<AvahiPublishFlags>(0), name.c_str(), "_presence._tcp", NULL, NULL, port, txtList); -				if (result < 0) { -					std::cout << "Error registering service: " << avahi_strerror(result) << std::endl; -					eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); -				} -				result = avahi_entry_group_commit(group); -				if (result < 0) { -					std::cout << "Error registering service: " << avahi_strerror(result) << std::endl; -				} -			} +			void doRegisterService();  			static void handleEntryGroupChange(AvahiEntryGroup *g, AvahiEntryGroupState state, void *userdata) {  				static_cast<AvahiRegisterQuery*>(userdata)->handleEntryGroupChange(g, state);  			} -			void handleEntryGroupChange(AvahiEntryGroup* g, AvahiEntryGroupState state) { -				std::cout << "ENtry group callback: " << state << std::endl; -				switch (state) { -					case AVAHI_ENTRY_GROUP_ESTABLISHED : -						// Domain is a hack! -						eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>(DNSSDServiceID(name, "local", "_presence._tcp", 0))), shared_from_this()); -						std::cout << "Entry group established" << std::endl; -						break; -				case AVAHI_ENTRY_GROUP_COLLISION : { -						std::cout << "Entry group collision" << std::endl; -						/*char *n; -						n = avahi_alternative_service_name(name); -						avahi_free(name); -						name = n;*/ -						break; -				} - -				case AVAHI_ENTRY_GROUP_FAILURE : -						std::cout << "Entry group failure " << avahi_strerror(avahi_client_errno(avahi_entry_group_get_client(g))) << std::endl; -						break; - -				case AVAHI_ENTRY_GROUP_UNCOMMITED: -				case AVAHI_ENTRY_GROUP_REGISTERING: -						; - -				/* -				DNSServiceErrorType result = DNSServiceRegister( -						&sdRef, 0, 0, name.c_str(), "_presence._tcp", NULL, NULL, port,  -						txtRecord.getSize(), txtRecord.getData(),  -						&AvahiRegisterQuery::handleServiceRegisteredStatic, this); -				if (result != kDNSServiceErr_NoError) { -					sdRef = NULL; -				}*/ -				//eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); -			} -		} +			void handleEntryGroupChange(AvahiEntryGroup* g, AvahiEntryGroupState state);  /*  			static void handleServiceRegisteredStatic(DNSServiceRef, DNSServiceFlags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, void *context) { diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.cpp b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.cpp new file mode 100644 index 0000000..d9a1c5c --- /dev/null +++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.cpp @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h> + +#include <iostream> +#include <boost/bind.hpp> + +namespace Swift { + +AvahiResolveHostnameQuery::AvahiResolveHostnameQuery(const std::string& hostname, int, boost::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop) : AvahiQuery(querier, eventLoop), hostname(hostname) { +	std::cout << "Resolving hostname " << hostname << std::endl; +} + +void AvahiResolveHostnameQuery::run() { +		eventLoop->postEvent(boost::bind(boost::ref(onHostnameResolved), boost::optional<HostAddress>(HostAddress(hostname))), shared_from_this()); +} + +} diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h index 00712f1..acc1897 100644 --- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h +++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h @@ -19,13 +19,9 @@ namespace Swift {  	class AvahiResolveHostnameQuery : public DNSSDResolveHostnameQuery, public AvahiQuery {  		public:  -			AvahiResolveHostnameQuery(const std::string& hostname, int, boost::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop) : AvahiQuery(querier, eventLoop), hostname(hostname) { -				std::cout << "Resolving hostname " << hostname << std::endl; -			} +			AvahiResolveHostnameQuery(const std::string& hostname, int, boost::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop); -			void run() { -					eventLoop->postEvent(boost::bind(boost::ref(onHostnameResolved), boost::optional<HostAddress>(HostAddress(hostname))), shared_from_this()); -			} +			void run();  			void finish() {  			} diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.cpp b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.cpp new file mode 100644 index 0000000..24fe067 --- /dev/null +++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h> + +#include <boost/bind.hpp> +#include <iostream> + +#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h> + +namespace Swift { + +void AvahiResolveServiceQuery::start() { +	std::cout << "Start resolving " << service.getName() << " " << service.getType() << " " << service.getDomain() << std::endl; +	avahi_threaded_poll_lock(querier->getThreadedPoll()); +	assert(!resolver); +	resolver = avahi_service_resolver_new(querier->getClient(), service.getNetworkInterfaceID(), AVAHI_PROTO_UNSPEC, service.getName().c_str(), service.getType().c_str(), service.getDomain().c_str(), AVAHI_PROTO_UNSPEC, static_cast<AvahiLookupFlags>(0), handleServiceResolvedStatic, this); +	if (!resolver) { +		std::cout << "Error starting resolver" << std::endl; +		eventLoop->postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this()); +	} +	avahi_threaded_poll_unlock(querier->getThreadedPoll()); +} + +void AvahiResolveServiceQuery::stop() { +	std::cout << "Stop resolving" << std::endl; +	avahi_threaded_poll_lock(querier->getThreadedPoll()); +	avahi_service_resolver_free(resolver); +	resolver = NULL; +	avahi_threaded_poll_unlock(querier->getThreadedPoll()); +} + +void AvahiResolveServiceQuery::handleServiceResolved(AvahiServiceResolver* resolver, AvahiIfIndex, AvahiProtocol, AvahiResolverEvent event, const char *name, const char * type, const char* domain, const char * /*host_name*/, const AvahiAddress *address, uint16_t port, AvahiStringList *txt, AvahiLookupResultFlags) { +	std::cout << "Resolve finished" << std::endl; +	switch(event) { +		case AVAHI_RESOLVER_FAILURE: +			std::cout << "Resolve error " << avahi_strerror(avahi_client_errno(avahi_service_resolver_get_client(resolver))) << std::endl; +			eventLoop->postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this()); +			break; +		case AVAHI_RESOLVER_FOUND: { +			std::cout << "Success" << std::endl; +			char a[AVAHI_ADDRESS_STR_MAX]; +			avahi_address_snprint(a, sizeof(a), address); + +			ByteArray txtRecord; +			txtRecord.resize(1024); +			avahi_string_list_serialize(txt, txtRecord.getData(), txtRecord.getSize()); + +			// FIXME: Probably not accurate +			std::string fullname = std::string(name) + "." + std::string(type) + "." + std::string(domain) + "."; +			std::cout << "Result: " << fullname << "->" << std::string(a) << ":" << port << std::endl; +			eventLoop->postEvent( +					boost::bind( +						boost::ref(onServiceResolved),  +						Result(fullname, std::string(a), port, txtRecord)), +					shared_from_this()); +			break; +		} +	} +} + +} diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h index e9c4db1..be48409 100644 --- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h +++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h @@ -6,6 +6,8 @@  #pragma once +#include <avahi-client/lookup.h> +  #include "Swiften/LinkLocal/DNSSD/Avahi/AvahiQuery.h"  #include "Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h"  #include "Swiften/LinkLocal/LinkLocalServiceInfo.h" @@ -20,59 +22,15 @@ namespace Swift {  			AvahiResolveServiceQuery(const DNSSDServiceID& service, boost::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop) : AvahiQuery(querier, eventLoop), service(service), resolver(NULL) {  			} -			void start() { -				std::cout << "Start resolving " << service.getName() << " " << service.getType() << " " << service.getDomain() << std::endl; -				avahi_threaded_poll_lock(querier->getThreadedPoll()); -				assert(!resolver); -				resolver = avahi_service_resolver_new(querier->getClient(), service.getNetworkInterfaceID(), AVAHI_PROTO_UNSPEC, service.getName().c_str(), service.getType().c_str(), service.getDomain().c_str(), AVAHI_PROTO_UNSPEC, static_cast<AvahiLookupFlags>(0), handleServiceResolvedStatic, this); -				if (!resolver) { -					std::cout << "Error starting resolver" << std::endl; -					eventLoop->postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this()); -				} -				avahi_threaded_poll_unlock(querier->getThreadedPoll()); -			} - -			void stop() { -				std::cout << "Stop resolving" << std::endl; -				avahi_threaded_poll_lock(querier->getThreadedPoll()); -				avahi_service_resolver_free(resolver); -				resolver = NULL; -				avahi_threaded_poll_unlock(querier->getThreadedPoll()); -			} +			void start(); +			void stop();  		private:  			static void handleServiceResolvedStatic(AvahiServiceResolver* resolver, AvahiIfIndex interfaceIndex, AvahiProtocol protocol, AvahiResolverEvent event, const char *name, const char *type, const char *domain, const char *host_name, const AvahiAddress *address, uint16_t port, AvahiStringList *txt, AvahiLookupResultFlags flags, void* context) {  				static_cast<AvahiResolveServiceQuery*>(context)->handleServiceResolved(resolver, interfaceIndex, protocol, event, name, type, domain, host_name, address, port, txt, flags);  			} -			void handleServiceResolved(AvahiServiceResolver* resolver, AvahiIfIndex, AvahiProtocol, AvahiResolverEvent event, const char *name, const char * type, const char* domain, const char * /*host_name*/, const AvahiAddress *address, uint16_t port, AvahiStringList *txt, AvahiLookupResultFlags) { -				std::cout << "Resolve finished" << std::endl; -				switch(event) { -					case AVAHI_RESOLVER_FAILURE: -						std::cout << "Resolve error " << avahi_strerror(avahi_client_errno(avahi_service_resolver_get_client(resolver))) << std::endl; -						eventLoop->postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this()); -						break; -					case AVAHI_RESOLVER_FOUND: { -						std::cout << "Success" << std::endl; -						char a[AVAHI_ADDRESS_STR_MAX]; -						avahi_address_snprint(a, sizeof(a), address); - -						ByteArray txtRecord; -						txtRecord.resize(1024); -						avahi_string_list_serialize(txt, txtRecord.getData(), txtRecord.getSize()); - -						// FIXME: Probably not accurate -						std::string fullname = std::string(name) + "." + std::string(type) + "." + std::string(domain) + "."; -						std::cout << "Result: " << fullname << "->" << std::string(a) << ":" << port << std::endl; -						eventLoop->postEvent( -								boost::bind( -									boost::ref(onServiceResolved),  -									Result(fullname, std::string(a), port, txtRecord)), -								shared_from_this()); -						break; -					} -				} -			} +			void handleServiceResolved(AvahiServiceResolver* resolver, AvahiIfIndex, AvahiProtocol, AvahiResolverEvent event, const char *name, const char * type, const char* domain, const char * /*host_name*/, const AvahiAddress *address, uint16_t port, AvahiStringList *txt, AvahiLookupResultFlags);  		private:  			DNSSDServiceID service; diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h index edd3056..c342247 100644 --- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h +++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h @@ -9,7 +9,7 @@  #include <boost/shared_ptr.hpp>  #include <boost/enable_shared_from_this.hpp>  #include <list> -#include <boost/thread.hpp> +#include <boost/thread/thread.hpp>  #include <boost/thread/mutex.hpp>  #include "Swiften/LinkLocal/DNSSD/DNSSDQuerier.h" diff --git a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp index d7d0228..b13b0c4 100644 --- a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp +++ b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp @@ -7,7 +7,9 @@  #include "Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h"  #include <boost/bind.hpp> +#include <iostream> +#include <Swiften/Base/foreach.h>  #include "Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDBrowseQuery.h"  #include "Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDRegisterQuery.h"  #include "Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDResolveServiceQuery.h" diff --git a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h index b2871c9..9aef6a5 100644 --- a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h +++ b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h @@ -11,7 +11,6 @@  #include <list>  #include <set> -#include "Swiften/Base/foreach.h"  #include <string>  #include "Swiften/EventLoop/EventOwner.h"  #include "Swiften/LinkLocal/DNSSD/DNSSDQuerier.h" @@ -63,8 +62,8 @@ namespace Swift {  			template<typename T>  			std::vector< boost::shared_ptr<T> > getAllQueriesEverRun() const {  				std::vector< boost::shared_ptr<T> > result; -				foreach(const boost::shared_ptr<FakeDNSSDQuery>& query, allQueriesEverRun) { -					if (boost::shared_ptr<T> resultQuery = boost::dynamic_pointer_cast<T>(query)) { +				for (QueryList::const_iterator i = allQueriesEverRun.begin(); i != allQueriesEverRun.end(); ++i) { +					if (boost::shared_ptr<T> resultQuery = boost::dynamic_pointer_cast<T>(*i)) {  						result.push_back(resultQuery);  					}  				} @@ -75,8 +74,8 @@ namespace Swift {  			template<typename T>  			std::vector< boost::shared_ptr<T> > getQueries() const {  				std::vector< boost::shared_ptr<T> > result; -				foreach(const boost::shared_ptr<FakeDNSSDQuery>& query, runningQueries) { -					if (boost::shared_ptr<T> resultQuery = boost::dynamic_pointer_cast<T>(query)) { +				for (QueryList::const_iterator i = runningQueries.begin(); i != runningQueries.end(); ++i) { +					if (boost::shared_ptr<T> resultQuery = boost::dynamic_pointer_cast<T>(*i)) {  						result.push_back(resultQuery);  					}  				} @@ -86,8 +85,9 @@ namespace Swift {  		private:  			std::string domain;  			EventLoop* eventLoop; -			std::list< boost::shared_ptr<FakeDNSSDQuery> > runningQueries; -			std::list< boost::shared_ptr<FakeDNSSDQuery> > allQueriesEverRun; +			typedef std::list< boost::shared_ptr<FakeDNSSDQuery> > QueryList; +			QueryList runningQueries; +			QueryList allQueriesEverRun;  			std::set<DNSSDServiceID> services;  			typedef std::map<DNSSDServiceID,DNSSDResolveServiceQuery::Result> ServiceInfoMap;  			ServiceInfoMap serviceInfo;  | 
 Swift