diff options
| author | Remko Tronçon <git@el-tramo.be> | 2009-07-26 08:21:20 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2009-07-26 14:52:17 (GMT) | 
| commit | 26d623d3cfd8937fb52acf76ef33d230f5010538 (patch) | |
| tree | ade8246f719fa4dee9de1daaa2ba3f7b6c324e53 /Swiften/LinkLocal/LinkLocalServiceBrowser.cpp | |
| parent | 2833b8f09c9aef09004662a2a89eefbaee1e4247 (diff) | |
| download | swift-26d623d3cfd8937fb52acf76ef33d230f5010538.zip swift-26d623d3cfd8937fb52acf76ef33d230f5010538.tar.bz2 | |
Implement fake DNSSD querier.
Diffstat (limited to 'Swiften/LinkLocal/LinkLocalServiceBrowser.cpp')
| -rw-r--r-- | Swiften/LinkLocal/LinkLocalServiceBrowser.cpp | 66 | 
1 files changed, 64 insertions, 2 deletions
| diff --git a/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp b/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp index 4e9c2de..aed917a 100644 --- a/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp +++ b/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp @@ -7,17 +7,66 @@  namespace Swift { -LinkLocalServiceBrowser::LinkLocalServiceBrowser(boost::shared_ptr<DNSSDQuerier> querier) : querier(querier) { +LinkLocalServiceBrowser::LinkLocalServiceBrowser(boost::shared_ptr<DNSSDQuerier> querier) : querier(querier), haveError(false) { +} + +LinkLocalServiceBrowser::~LinkLocalServiceBrowser() { +	assert(!isRunning()); +} + + +void LinkLocalServiceBrowser::start() { +	assert(!isRunning()); +	haveError = false;  	browseQuery = querier->createBrowseQuery();  	browseQuery->onServiceAdded.connect(  			boost::bind(&LinkLocalServiceBrowser::handleServiceAdded, this, _1));  	browseQuery->onServiceRemoved.connect(  			boost::bind(&LinkLocalServiceBrowser::handleServiceRemoved, this, _1)); +	browseQuery->onError.connect( +			boost::bind(&LinkLocalServiceBrowser::handleBrowseError, this));  	browseQuery->startBrowsing();  } -LinkLocalServiceBrowser::~LinkLocalServiceBrowser() { +void LinkLocalServiceBrowser::stop() { +	assert(isRunning()); +	if (isRegistered()) { +		unregisterService(); +	} +	for (ResolveQueryMap::const_iterator i = resolveQueries.begin(); i != resolveQueries.end(); ++i) { +		i->second->stop(); +	} +	resolveQueries.clear(); +	services.clear();  	browseQuery->stopBrowsing(); +	browseQuery.reset(); +	onStopped(haveError); +} + +bool LinkLocalServiceBrowser::isRunning() const { +	return browseQuery; +} + +bool LinkLocalServiceBrowser::hasError() const { +	return haveError; +} + +bool LinkLocalServiceBrowser::isRegistered() const { +	return registerQuery; +} + +void LinkLocalServiceBrowser::registerService(const String& name, int port, const LinkLocalServiceInfo& info) { +	assert(!registerQuery); +	registerQuery = querier->createRegisterQuery(name, port, info); +	registerQuery->onRegisterFinished.connect( +		boost::bind(&LinkLocalServiceBrowser::handleRegisterFinished, this, _1)); +	registerQuery->registerService(); +} + +void LinkLocalServiceBrowser::unregisterService() { +	assert(registerQuery); +	registerQuery->unregisterService(); +	registerQuery.reset();  }  std::vector<LinkLocalService> LinkLocalServiceBrowser::getServices() const { @@ -44,6 +93,7 @@ void LinkLocalServiceBrowser::handleServiceRemoved(const DNSSDServiceID& service  	assert(i != resolveQueries.end());  	i->second->stop();  	resolveQueries.erase(i); +	services.erase(service);  	onServiceRemoved(service);  } @@ -60,4 +110,16 @@ void LinkLocalServiceBrowser::handleServiceResolved(const DNSSDServiceID& servic  	}  } +void LinkLocalServiceBrowser::handleRegisterFinished(const boost::optional<DNSSDServiceID>& result) { +	if (!result) { +		haveError = true; +		stop(); +	} +} + +void LinkLocalServiceBrowser::handleBrowseError() { +	haveError = true; +	stop(); +} +  } | 
 Swift
 Swift