DirectConnectionUtils.java

 1package eu.siacs.conversations.xmpp.jingle;
 2
 3import java.net.Inet6Address;
 4import java.net.InetAddress;
 5import java.net.NetworkInterface;
 6import java.net.SocketException;
 7import java.net.UnknownHostException;
 8import java.security.SecureRandom;
 9import java.util.ArrayList;
10import java.util.Enumeration;
11import java.util.List;
12import java.util.UUID;
13
14import eu.siacs.conversations.xmpp.Jid;
15
16public class DirectConnectionUtils {
17
18    private static List<InetAddress> getLocalAddresses() {
19        final List<InetAddress> addresses = new ArrayList<>();
20        final Enumeration<NetworkInterface> interfaces;
21        try {
22            interfaces = NetworkInterface.getNetworkInterfaces();
23        } catch (SocketException e) {
24            return addresses;
25        }
26        while (interfaces.hasMoreElements()) {
27            NetworkInterface networkInterface = interfaces.nextElement();
28            final Enumeration<InetAddress> inetAddressEnumeration = networkInterface.getInetAddresses();
29            while (inetAddressEnumeration.hasMoreElements()) {
30                final InetAddress inetAddress = inetAddressEnumeration.nextElement();
31                if (inetAddress.isLoopbackAddress() || inetAddress.isLinkLocalAddress()) {
32                    continue;
33                }
34                if (inetAddress instanceof Inet6Address) {
35                    //let's get rid of scope
36                    try {
37                        addresses.add(Inet6Address.getByAddress(inetAddress.getAddress()));
38                    } catch (UnknownHostException e) {
39                        //ignored
40                    }
41                } else {
42                    addresses.add(inetAddress);
43                }
44            }
45        }
46        return addresses;
47    }
48
49    public static List<JingleCandidate> getLocalCandidates(Jid jid) {
50        SecureRandom random = new SecureRandom();
51        ArrayList<JingleCandidate> candidates = new ArrayList<>();
52        for (InetAddress inetAddress : getLocalAddresses()) {
53            final JingleCandidate candidate = new JingleCandidate(UUID.randomUUID().toString(), true);
54            candidate.setHost(inetAddress.getHostAddress());
55            candidate.setPort(random.nextInt(60000) + 1024);
56            candidate.setType(JingleCandidate.TYPE_DIRECT);
57            candidate.setJid(jid);
58            candidate.setPriority(8257536 + candidates.size());
59            candidates.add(candidate);
60        }
61        return candidates;
62    }
63
64}