package net.java.sip.communicator.impl.netaddr;
import net.java.stun4j.*;
/**
* The class is used to deliver results from a STUN Discovery Process. It
* contains information about the NAT Server (or firewall )this client is behind,
* and a mapped address value (if discovered)
*
*
* <p>Organisation: <p> Louis Pasteur University, Strasbourg, France</p>
* <p>Network Research Team (http://www-r2.u-strasbg.fr)</p></p>
* @author Emil Ivov
* @version 0.1
*/
public class StunDiscoveryReport
{
/**
* Indicates that NAT detection has failed or not yet initiated.
*/
public static final String UNKNOWN = "Unknown Network Configuration";
/**
* Means, there's no NAT or firewall.
*/
public static final String OPEN_INTERNET = "Open Internet Configuration";
/**
* Indicates that UDP communication is not possible.
*/
public static final String UDP_BLOCKING_FIREWALL = "UDP Blocking Firewall";
/**
* Means we are behind a symmetric udp firewall.
*/
public static final String SYMMETRIC_UDP_FIREWALL= "Symmetric UDP Firewall";
/**
* NAT type is full cone.
*/
public static final String FULL_CONE_NAT = "Full Cone NAT";
/**
* We are behind a symmetric nat.
*/
public static final String SYMMETRIC_NAT = "Symmetric NAT";
/**
* NAT type is Restricted Cone.
*/
public static final String RESTRICTED_CONE_NAT = "Restricted Cone NAT";
/**
* NAT type is port restricted cone.
*/
public static final String PORT_RESTRICTED_CONE_NAT= "Port Restricted Cone NAT";
private String natType = UNKNOWN;
private StunAddress publicAddress = null;
/**
* Creates a discovery report with natType = UNKNOWN and a null public
* address.
*/
StunDiscoveryReport()
{
}
/**
* Returns the type of the NAT described in the report.
* @return the type of the NAT that this report is about.
*/
public String getNatType()
{
return natType;
}
/**
* Sets the type of the NAT indicated by the report.
* @param natType the type of the NAT.
*/
void setNatType(String natType)
{
this.natType = natType;
}
/**
* Returns the public addressed discovered by a discovery process.
* @return an Inetner address for public use.
*/
public StunAddress getPublicAddress()
{
return publicAddress;
}
/**
* Sets a public address.
* @param stunAddress An address that's accesible from everywhere.
*/
void setPublicAddress(StunAddress stunAddress)
{
this.publicAddress = stunAddress;
}
/**
* Compares this object with obj. Two reports are considered equal if and
* only if both have the same nat type and their public addresses are
* equal or are both null.
* @param obj the object to compare against.
* @return true if the two objects are equal and false otherwise.
*/
public boolean equals(Object obj)
{
if(obj == null
|| !(obj instanceof StunDiscoveryReport))
return false;
if(obj == this)
return true;
StunDiscoveryReport target = (StunDiscoveryReport)obj;
return ( target.getNatType() == getNatType()
&& ( getPublicAddress() == null && target.getPublicAddress() == null
|| target.getPublicAddress().equals(getPublicAddress())));
}
/**
* Returns a readable representation of the report.
* @return a readable representation of the report.
*/
public String toString()
{
return "The detected network configuration is: " + getNatType() + "\n"
+ "Your mapped public address is: " + getPublicAddress();
}
}