From 9b981ab38b114d92eb806a50b94248e62af3fffa Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Sun, 13 Aug 2017 22:11:14 +0200 Subject: provide extra 'network is unreachable' account state --- .../java/de/pixart/messenger/utils/Resolver.java | 31 +++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) (limited to 'src/main/java/de/pixart/messenger/utils/Resolver.java') diff --git a/src/main/java/de/pixart/messenger/utils/Resolver.java b/src/main/java/de/pixart/messenger/utils/Resolver.java index 0dc5bd0ac..83875b3eb 100644 --- a/src/main/java/de/pixart/messenger/utils/Resolver.java +++ b/src/main/java/de/pixart/messenger/utils/Resolver.java @@ -9,6 +9,7 @@ import java.net.Inet4Address; import java.net.InetAddress; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; import de.measite.minidns.DNSClient; @@ -23,6 +24,7 @@ import de.measite.minidns.record.CNAME; import de.measite.minidns.record.Data; import de.measite.minidns.record.InternetAddressRR; import de.measite.minidns.record.SRV; +import de.measite.minidns.util.MultipleIoException; import de.pixart.messenger.Config; import de.pixart.messenger.R; import de.pixart.messenger.services.XmppConnectionService; @@ -32,6 +34,8 @@ public class Resolver { private static final String DIRECT_TLS_SERVICE = "_xmpps-client"; private static final String STARTTLS_SERICE = "_xmpp-client"; + private static final String NETWORK_IS_UNREACHABLE = "Network is unreachable"; + private static XmppConnectionService SERVICE = null; public static void registerXmppConnectionService(XmppConnectionService service) { @@ -43,19 +47,28 @@ public class Resolver { DNSClient.addDnsServerLookupMechanism(new AndroidUsingLinkProperties(context)); } - public static List resolve(String domain) { + public static List resolve(String domain) throws NetworkIsUnreachableException { List results = new ArrayList<>(); + HashSet messages = new HashSet<>(); + try { results.addAll(resolveSrv(domain, true)); + } catch (MultipleIoException e) { + messages.addAll(extractMessages(e)); } catch (Throwable throwable) { Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + ": error resolving SRV record (direct TLS)", throwable); } try { results.addAll(resolveSrv(domain, false)); + } catch (MultipleIoException e) { + messages.addAll(extractMessages(e)); } catch (Throwable throwable) { Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + ": error resolving SRV record (STARTTLS)", throwable); } if (results.size() == 0) { + if (messages.size() == 1 && messages.contains(NETWORK_IS_UNREACHABLE)) { + throw new NetworkIsUnreachableException(); + } results.addAll(resolveNoSrvRecords(DNSName.from(domain), true)); } Collections.sort(results); @@ -63,6 +76,18 @@ public class Resolver { return results; } + private static HashSet extractMessages(MultipleIoException e) { + HashSet messages = new HashSet<>(); + for (Exception inner : e.getExceptions()) { + if (inner instanceof MultipleIoException) { + messages.addAll(extractMessages((MultipleIoException) inner)); + } else { + messages.add(inner.getMessage()); + } + } + return messages; + } + private static List resolveSrv(String domain, final boolean directTls) throws IOException { if (Thread.currentThread().isInterrupted()) { return Collections.emptyList(); @@ -238,4 +263,8 @@ public class Resolver { return createDefault(hostname, null); } } + + public static class NetworkIsUnreachableException extends Exception { + + } } \ No newline at end of file -- cgit v1.2.3