summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Smith <git@kismith.co.uk>2012-07-17 06:58:38 (GMT)
committerKevin Smith <git@kismith.co.uk>2012-07-17 11:01:15 (GMT)
commit8568b7b74fe962bf6d3252e9967aa3123968615c (patch)
tree2dd65509241cd52cb87df764c2255cec599fce12 /src/com/isode/stroke/network/PlatformDomainNameResolver.java
parentdbb5beeeb522bd937f235c619321594a25247749 (diff)
downloadstroke-8568b7b74fe962bf6d3252e9967aa3123968615c.zip
stroke-8568b7b74fe962bf6d3252e9967aa3123968615c.tar.bz2
Move DNS resolution into a thread to make the API asyncronous.
Diffstat (limited to 'src/com/isode/stroke/network/PlatformDomainNameResolver.java')
-rw-r--r--src/com/isode/stroke/network/PlatformDomainNameResolver.java94
1 files changed, 29 insertions, 65 deletions
diff --git a/src/com/isode/stroke/network/PlatformDomainNameResolver.java b/src/com/isode/stroke/network/PlatformDomainNameResolver.java
index 45c8dce..ccdee6d 100644
--- a/src/com/isode/stroke/network/PlatformDomainNameResolver.java
+++ b/src/com/isode/stroke/network/PlatformDomainNameResolver.java
@@ -1,14 +1,14 @@
/*
- * Copyright (c) 2010, Isode Limited, London, England.
+ * Copyright (c) 2010-2012, Isode Limited, London, England.
* All rights reserved.
*/
/*
* Copyright (c) 2010, Remko Tronçon.
* All rights reserved.
*/
-
package com.isode.stroke.network;
+import com.isode.stroke.eventloop.Event.Callback;
import com.isode.stroke.eventloop.EventLoop;
import com.isode.stroke.eventloop.EventOwner;
import java.net.InetAddress;
@@ -16,79 +16,44 @@ import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;
-
public class PlatformDomainNameResolver extends DomainNameResolver {
private class AddressQuery extends DomainNameAddressQuery implements EventOwner {
- AddressQuery(String host, EventLoop eventLoop) {
+
+ private class AddressQueryThread extends Thread {
+ @Override
+ public void run() {
+ final Collection<HostAddress> results = new ArrayList<HostAddress>();
+ try {
+ results.add(new HostAddress(InetAddress.getByName(hostname)));
+ } catch (UnknownHostException ex) {
+ }
+ eventLoop.postEvent(new Callback() {
+ public void run() {
+ onResult.emit(results, results.isEmpty() ? new DomainNameResolveError() : null);
+ }
+ });
+ }
+ }
+
+ AddressQuery(String host, EventLoop eventLoop) {
hostname = host;
this.eventLoop = eventLoop;
- //FIXME: port asyncDNS
-// thread = null;
-// safeToJoin = false;
}
- public void run() {
- //FIXME: port asyncDNS
- Collection<HostAddress> results = new ArrayList<HostAddress>();
- try {
- results.add(new HostAddress(InetAddress.getByName(hostname)));
- } catch (UnknownHostException ex) {
-
- }
- onResult.emit(results, results.isEmpty() ? new DomainNameResolveError() : null);
-
-// safeToJoin = false;
-// thread = new boost::thread(boost::bind(&AddressQuery::doRun, shared_from_this()));
- }
-// FIXME: Port async DNS.
-// 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 {
-// std::vector<HostAddress> results;
-// for ( ; endpointIterator != boost::asio::ip::tcp::resolver::iterator(); ++endpointIterator) {
-// boost::asio::ip::address address = (*endpointIterator).endpoint().address();
-// results.push_back(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;
-// eventLoop->postEvent(
-// boost::bind(boost::ref(onResult), results, boost::optional<DomainNameResolveError>()),
-// shared_from_this());
-// }
-// }
-// catch (...) {
-// //std::cout << "PlatformDomainNameResolver::doRun(): Error 2" << std::endl;
-// emitError();
-// }
-// safeToJoin = true;
-// }
-//
-// void emitError() {
-// eventLoop->postEvent(boost::bind(boost::ref(onResult), std::vector<HostAddress>(), boost::optional<DomainNameResolveError>(DomainNameResolveError())), shared_from_this());
-// }
-//
-// boost::asio::io_service ioService;
- String hostname;
- EventLoop eventLoop;
-// boost::thread* thread;
-// bool safeToJoin;
- }
+ public void run() {
+ AddressQueryThread thread = new AddressQueryThread();
+ thread.setDaemon(true);
+ thread.start();
+ }
+ final String hostname;
+ final EventLoop eventLoop;
+ }
public PlatformDomainNameResolver(EventLoop eventLoop) {
this.eventLoop = eventLoop;
}
-
+
@Override
public DomainNameServiceQuery createServiceQuery(String name) {
return new PlatformDomainNameServiceQuery(getNormalized(name), eventLoop);
@@ -98,6 +63,5 @@ public class PlatformDomainNameResolver extends DomainNameResolver {
public DomainNameAddressQuery createAddressQuery(String name) {
return new AddressQuery(getNormalized(name), eventLoop);
}
-
private final EventLoop eventLoop;
}