| package org.jivesoftware.smack; |
| |
| import java.io.File; |
| |
| import android.os.Build; |
| |
| import org.jivesoftware.smack.proxy.ProxyInfo; |
| import org.jivesoftware.smack.util.DNSUtil; |
| import org.jivesoftware.smack.util.dns.HostAddress; |
| |
| import java.util.List; |
| |
| /** |
| * This class wraps DNS SRV lookups for a new ConnectionConfiguration in a |
| * new thread, since Android API >= 11 (Honeycomb) does not allow network |
| * activity in the main thread. |
| * |
| * @author Florian Schmaus fschmaus@gmail.com |
| * |
| */ |
| public class AndroidConnectionConfiguration extends ConnectionConfiguration { |
| private static final int DEFAULT_TIMEOUT = 10000; |
| |
| /** |
| * Creates a new ConnectionConfiguration for the specified service name. |
| * A DNS SRV lookup will be performed to find out the actual host address |
| * and port to use for the connection. |
| * |
| * @param serviceName the name of the service provided by an XMPP server. |
| */ |
| public AndroidConnectionConfiguration(String serviceName) throws XMPPException { |
| super(); |
| AndroidInit(serviceName, DEFAULT_TIMEOUT); |
| } |
| |
| /** |
| * |
| * @param serviceName |
| * @param timeout |
| * @throws XMPPException |
| */ |
| public AndroidConnectionConfiguration(String serviceName, int timeout) throws XMPPException { |
| super(); |
| AndroidInit(serviceName, timeout); |
| } |
| |
| public AndroidConnectionConfiguration(String host, int port, String name) { |
| super(host, port, name); |
| AndroidInit(); |
| } |
| |
| private void AndroidInit() { |
| // API 14 is Ice Cream Sandwich |
| if (Build.VERSION.SDK_INT >= 14) { |
| setTruststoreType("AndroidCAStore"); |
| setTruststorePassword(null); |
| setTruststorePath(null); |
| } else { |
| setTruststoreType("BKS"); |
| String path = System.getProperty("javax.net.ssl.trustStore"); |
| if (path == null) |
| path = System.getProperty("java.home") + File.separator + "etc" |
| + File.separator + "security" + File.separator |
| + "cacerts.bks"; |
| setTruststorePath(path); |
| } |
| } |
| |
| /** |
| * |
| * @param serviceName |
| * @param timeout |
| * @throws XMPPException |
| */ |
| private void AndroidInit(String serviceName, int timeout) throws XMPPException { |
| AndroidInit(); |
| class DnsSrvLookupRunnable implements Runnable { |
| String serviceName; |
| List<HostAddress> addresses; |
| |
| public DnsSrvLookupRunnable(String serviceName) { |
| this.serviceName = serviceName; |
| } |
| |
| @Override |
| public void run() { |
| addresses = DNSUtil.resolveXMPPDomain(serviceName); |
| } |
| |
| public List<HostAddress> getHostAddresses() { |
| return addresses; |
| } |
| } |
| |
| DnsSrvLookupRunnable dnsSrv = new DnsSrvLookupRunnable(serviceName); |
| Thread t = new Thread(dnsSrv, "dns-srv-lookup"); |
| t.start(); |
| try { |
| t.join(timeout); |
| } catch (InterruptedException e) { |
| throw new XMPPException("DNS lookup timeout after " + timeout + "ms", e); |
| } |
| |
| hostAddresses = dnsSrv.getHostAddresses(); |
| if (hostAddresses == null) { |
| throw new XMPPException("DNS lookup failure"); |
| } |
| |
| ProxyInfo proxy = ProxyInfo.forDefaultProxy(); |
| |
| init(serviceName, proxy); |
| } |
| } |