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