package net.tomp2p.connection;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.Collection;
public class DiscoverResults {
private final Collection<InetAddress> newAddresses;
private final Collection<InetAddress> newBroadcastAddresses;
private final Collection<InetAddress> removedFoundAddresses;
private final Collection<InetAddress> removedFoundBroadcastAddresses;
private final Collection<InetAddress> existingAddresses;
private final Collection<InetAddress> existingBroadcastAddresses;
private final String status;
private final boolean listenAny;
public DiscoverResults(Collection<InetAddress> newAddresses, Collection<InetAddress> newBroadcastAddresses,
Collection<InetAddress> removedFoundAddresses, Collection<InetAddress> removedFoundBroadcastAddresses,
Collection<InetAddress> existingAddresses, Collection<InetAddress> existingBroadcastAddresses, boolean listenAny, String status) {
this.newAddresses = newAddresses;
this.newBroadcastAddresses = newBroadcastAddresses;
this.removedFoundAddresses = removedFoundAddresses;
this.removedFoundBroadcastAddresses = removedFoundBroadcastAddresses;
this.existingAddresses = existingAddresses;
this.existingBroadcastAddresses = existingBroadcastAddresses;
this.listenAny = listenAny;
this.status = status;
}
public Collection<InetAddress> newAddresses() {
return newAddresses;
}
public Collection<InetAddress> newBroadcastAddresses() {
return newBroadcastAddresses;
}
public Collection<InetAddress> removedFoundAddresses() {
return removedFoundAddresses;
}
public Collection<InetAddress> removedFoundBroadcastAddresses() {
return removedFoundBroadcastAddresses;
}
public Collection<InetAddress> existingAddresses() {
return existingAddresses;
}
public Collection<InetAddress> existingBroadcastAddresses() {
return existingBroadcastAddresses;
}
public boolean isListenAny() {
return listenAny;
}
public String status() {
return status;
}
public boolean isEmpty() {
return newAddresses.isEmpty() && newBroadcastAddresses.isEmpty()
&& removedFoundAddresses.isEmpty() && removedFoundBroadcastAddresses.isEmpty();
}
public InetAddress foundAddress() {
InetAddress localhost = null;
// first check for IPv4
for (InetAddress inetAddress : newAddresses) {
if (inetAddress instanceof Inet4Address) {
if(inetAddress.isLoopbackAddress()) {
// don't prefer loopback addresses over other ones
localhost = inetAddress;
} else {
return inetAddress;
}
}
}
// TODO prefer local IPv4 over other addresses?
if(localhost != null) {
return localhost;
}
if (!newAddresses.isEmpty()) {
return newAddresses.iterator().next();
}
return null;
}
public SocketAddress wildCardSocket() {
InetAddress foundAddress = foundAddress();
if(foundAddress != null) {
return new InetSocketAddress(foundAddress, 0);
} else {
return new InetSocketAddress(0);
}
}
}