diff options
author | Remko Tronçon <git@el-tramo.be> | 2009-12-04 21:49:44 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2009-12-04 23:52:36 (GMT) |
commit | 897ad55ffee76c9e84ffb174d700f6182a3e7d0b (patch) | |
tree | f31e6bd601cf5f1483a3f4ad5e79a492d3a9ca3e /Swiften/Network/PlatformDomainNameResolver.cpp | |
parent | c8802e3bef6b73d349a711b187c72aea0a3dd964 (diff) | |
download | swift-897ad55ffee76c9e84ffb174d700f6182a3e7d0b.zip swift-897ad55ffee76c9e84ffb174d700f6182a3e7d0b.tar.bz2 |
Implemented CAresDomainNameResolver.
Diffstat (limited to 'Swiften/Network/PlatformDomainNameResolver.cpp')
-rw-r--r-- | Swiften/Network/PlatformDomainNameResolver.cpp | 12 |
1 files changed, 0 insertions, 12 deletions
diff --git a/Swiften/Network/PlatformDomainNameResolver.cpp b/Swiften/Network/PlatformDomainNameResolver.cpp index 755b177..5ffa2fb 100644 --- a/Swiften/Network/PlatformDomainNameResolver.cpp +++ b/Swiften/Network/PlatformDomainNameResolver.cpp @@ -1,106 +1,94 @@ #include "Swiften/Network/PlatformDomainNameResolver.h" // Putting this early on, because some system types conflict with thread #include "Swiften/Network/PlatformDomainNameServiceQuery.h" #include <string> #include <vector> #include <boost/asio.hpp> #include <boost/bind.hpp> #include <boost/thread.hpp> #include <boost/enable_shared_from_this.hpp> -#include <idna.h> #include <algorithm> #include "Swiften/Base/String.h" #include "Swiften/Network/HostAddress.h" #include "Swiften/EventLoop/MainEventLoop.h" #include "Swiften/Network/HostAddressPort.h" #include "Swiften/Network/DomainNameAddressQuery.h" using namespace Swift; namespace { struct AddressQuery : public DomainNameAddressQuery, public boost::enable_shared_from_this<AddressQuery>, public EventOwner { AddressQuery(const String& host) : hostname(host), thread(NULL), safeToJoin(false) {} ~AddressQuery() { if (safeToJoin) { thread->join(); } else { // FIXME: UGLYYYYY } delete thread; } void run() { safeToJoin = false; thread = new boost::thread(boost::bind(&AddressQuery::doRun, shared_from_this())); } void doRun() { std::cout << "PlatformDomainNameResolver::doRun()" << std::endl; boost::asio::ip::tcp::resolver resolver(ioService); boost::asio::ip::tcp::resolver::query query(hostname.getUTF8String(), "5222"); try { std::cout << "PlatformDomainNameResolver::doRun(): Resolving" << std::endl; boost::asio::ip::tcp::resolver::iterator endpointIterator = resolver.resolve(query); std::cout << "PlatformDomainNameResolver::doRun(): Resolved" << std::endl; if (endpointIterator == boost::asio::ip::tcp::resolver::iterator()) { std::cout << "PlatformDomainNameResolver::doRun(): Error 1" << std::endl; emitError(); } else { boost::asio::ip::address address = (*endpointIterator).endpoint().address(); HostAddress result = (address.is_v4() ? HostAddress(&address.to_v4().to_bytes()[0], 4) : HostAddress(&address.to_v6().to_bytes()[0], 16)); std::cout << "PlatformDomainNameResolver::doRun(): Success" << std::endl; MainEventLoop::postEvent( boost::bind(boost::ref(onResult), result, boost::optional<DomainNameResolveError>()), shared_from_this()); } } catch (...) { std::cout << "PlatformDomainNameResolver::doRun(): Error 2" << std::endl; emitError(); } safeToJoin = true; } void emitError() { MainEventLoop::postEvent(boost::bind(boost::ref(onResult), HostAddress(), boost::optional<DomainNameResolveError>(DomainNameResolveError())), shared_from_this()); } boost::asio::io_service ioService; String hostname; boost::thread* thread; bool safeToJoin; }; - String getNormalized(const String& domain) { - char* output; - if (idna_to_ascii_8z(domain.getUTF8Data(), &output, 0) == IDNA_SUCCESS) { - String result(output); - free(output); - return result; - } - else { - return domain; - } - } } namespace Swift { PlatformDomainNameResolver::PlatformDomainNameResolver() { } boost::shared_ptr<DomainNameServiceQuery> PlatformDomainNameResolver::createServiceQuery(const String& name) { return boost::shared_ptr<DomainNameServiceQuery>(new PlatformDomainNameServiceQuery(getNormalized(name))); } boost::shared_ptr<DomainNameAddressQuery> PlatformDomainNameResolver::createAddressQuery(const String& name) { return boost::shared_ptr<DomainNameAddressQuery>(new AddressQuery(getNormalized(name))); } } |