diff options
Diffstat (limited to 'Swiften/Network/StaticDomainNameResolver.cpp')
-rw-r--r-- | Swiften/Network/StaticDomainNameResolver.cpp | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/Swiften/Network/StaticDomainNameResolver.cpp b/Swiften/Network/StaticDomainNameResolver.cpp index 275ec78..609bbdd 100644 --- a/Swiften/Network/StaticDomainNameResolver.cpp +++ b/Swiften/Network/StaticDomainNameResolver.cpp @@ -1,27 +1,47 @@ #include "Swiften/Network/StaticDomainNameResolver.h" + +#include <boost/bind.hpp> +#include <boost/lexical_cast.hpp> + #include "Swiften/Network/DomainNameResolveError.h" #include "Swiften/Base/String.h" using namespace Swift; namespace { - struct ServiceQuery : public DomainNameServiceQuery { + struct ServiceQuery : public DomainNameServiceQuery, public EventOwner { ServiceQuery(const String& service, Swift::StaticDomainNameResolver* resolver) : service(service), resolver(resolver) {} virtual void run() { + std::vector<DomainNameServiceQuery::Result> results; + for(StaticDomainNameResolver::ServicesCollection::const_iterator i = resolver->getServices().begin(); i != resolver->getServices().end(); ++i) { + if (i->first == service) { + results.push_back(i->second); + } + } + MainEventLoop::postEvent(boost::bind(boost::ref(onResult), results)); } String service; StaticDomainNameResolver* resolver; }; - struct AddressQuery : public DomainNameAddressQuery { + struct AddressQuery : public DomainNameAddressQuery, public EventOwner { AddressQuery(const String& host, StaticDomainNameResolver* resolver) : host(host), resolver(resolver) {} virtual void run() { + StaticDomainNameResolver::AddressesMap::const_iterator i = resolver->getAddresses().find(host); + if (i != resolver->getAddresses().end()) { + MainEventLoop::postEvent( + boost::bind(boost::ref(onResult), i->second, boost::optional<DomainNameResolveError>())); + } + else { + MainEventLoop::postEvent(boost::bind(boost::ref(onResult), HostAddress(), boost::optional<DomainNameResolveError>(DomainNameResolveError()))); + } + } String host; StaticDomainNameResolver* resolver; }; } @@ -34,14 +54,18 @@ void StaticDomainNameResolver::addAddress(const String& domain, const HostAddres void StaticDomainNameResolver::addService(const String& service, const DomainNameServiceQuery::Result& result) { services.push_back(std::make_pair(service, result)); } void StaticDomainNameResolver::addXMPPClientService(const String& domain, const HostAddressPort& address) { - addService("_xmpp-client._tcp." + domain, ServiceQuery::Result(domain, 5222, 0, 0)); - addAddress(domain, address.getAddress()); + static int hostid = 0; + String hostname(std::string("host-") + boost::lexical_cast<std::string>(hostid)); + hostid++; + + addService("_xmpp-client._tcp." + domain, ServiceQuery::Result(hostname, address.getPort(), 0, 0)); + addAddress(hostname, address.getAddress()); } boost::shared_ptr<DomainNameServiceQuery> StaticDomainNameResolver::createServiceQuery(const String& name) { return boost::shared_ptr<DomainNameServiceQuery>(new ServiceQuery(name, this)); } |