Merged gcj-eclipse branch to trunk.

From-SVN: r120621
This commit is contained in:
Tom Tromey 2007-01-09 19:58:05 +00:00
parent c648dedbde
commit 97b8365caf
17478 changed files with 606493 additions and 100744 deletions

View file

@ -1,5 +1,5 @@
/* NetworkInterface.java --
Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -38,6 +38,8 @@ exception statement from your version. */
package java.net;
import gnu.classpath.SystemProperties;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
@ -58,25 +60,23 @@ import java.util.Vector;
*/
public final class NetworkInterface
{
private String name;
private Vector inetAddresses;
NetworkInterface(String name, InetAddress address)
private final VMNetworkInterface netif;
private NetworkInterface(VMNetworkInterface netif)
{
this.netif = netif;
}
/** Creates an NetworkInterface instance which
* represents any interface in the system. Its only
* address is <code>0.0.0.0/0.0.0.0</code>. This
* method is needed by {@link MulticastSocket#getNetworkInterface}
*/
static NetworkInterface createAnyInterface()
{
this.name = name;
this.inetAddresses = new Vector(1, 1);
this.inetAddresses.add(address);
return new NetworkInterface(new VMNetworkInterface());
}
NetworkInterface(String name, InetAddress[] addresses)
{
this.name = name;
this.inetAddresses = new Vector(addresses.length, 1);
for (int i = 0; i < addresses.length; i++)
this.inetAddresses.add(addresses[i]);
}
/**
* Returns the name of the network interface
*
@ -84,7 +84,7 @@ public final class NetworkInterface
*/
public String getName()
{
return name;
return netif.name;
}
/**
@ -97,22 +97,23 @@ public final class NetworkInterface
*
* @return An enumeration of all addresses.
*/
public Enumeration getInetAddresses()
public Enumeration<InetAddress> getInetAddresses()
{
SecurityManager s = System.getSecurityManager();
Vector inetAddresses = new Vector(netif.addresses);
if (s == null)
return inetAddresses.elements();
Vector tmpInetAddresses = new Vector(1, 1);
Vector<InetAddress> tmpInetAddresses = new Vector<InetAddress>(1, 1);
for (Enumeration addresses = inetAddresses.elements();
for (Enumeration<InetAddress> addresses = inetAddresses.elements();
addresses.hasMoreElements();)
{
InetAddress addr = (InetAddress) addresses.nextElement();
InetAddress addr = addresses.nextElement();
try
{
s.checkConnect(addr.getHostAddress(), 58000);
s.checkConnect(addr.getHostAddress(), -1);
tmpInetAddresses.add(addr);
}
catch (SecurityException e)
@ -131,7 +132,7 @@ public final class NetworkInterface
*/
public String getDisplayName()
{
return name;
return netif.name;
}
/**
@ -148,15 +149,14 @@ public final class NetworkInterface
public static NetworkInterface getByName(String name)
throws SocketException
{
for (Enumeration e = getNetworkInterfaces(); e.hasMoreElements();)
if (name == null)
throw new NullPointerException();
VMNetworkInterface[] netifs = VMNetworkInterface.getVMInterfaces();
for (int i = 0; i < netifs.length; i++)
{
NetworkInterface tmp = (NetworkInterface) e.nextElement();
if (name.equals(tmp.getName()))
return tmp;
if (netifs[i].name.equals(name))
return new NetworkInterface(netifs[i]);
}
// No interface with the given name found.
return null;
}
@ -173,55 +173,15 @@ public final class NetworkInterface
public static NetworkInterface getByInetAddress(InetAddress addr)
throws SocketException
{
for (Enumeration interfaces = getNetworkInterfaces();
interfaces.hasMoreElements();)
if (addr == null)
throw new NullPointerException();
VMNetworkInterface[] netifs = VMNetworkInterface.getVMInterfaces();
for (int i = 0; i < netifs.length; i++)
{
NetworkInterface tmp = (NetworkInterface) interfaces.nextElement();
for (Enumeration addresses = tmp.inetAddresses.elements();
addresses.hasMoreElements();)
{
if (addr.equals((InetAddress) addresses.nextElement()))
return tmp;
}
if (netifs[i].addresses.contains(addr))
return new NetworkInterface(netifs[i]);
}
throw new SocketException("no network interface is bound to such an IP address");
}
static private Collection condense(Collection interfaces)
{
final Map condensed = new HashMap();
final Iterator interfs = interfaces.iterator();
while (interfs.hasNext()) {
final NetworkInterface face = (NetworkInterface) interfs.next();
final String name = face.getName();
if (condensed.containsKey(name))
{
final NetworkInterface conface = (NetworkInterface) condensed.get(name);
if (!conface.inetAddresses.containsAll(face.inetAddresses))
{
final Iterator faceAddresses = face.inetAddresses.iterator();
while (faceAddresses.hasNext())
{
final InetAddress faceAddress = (InetAddress) faceAddresses.next();
if (!conface.inetAddresses.contains(faceAddress))
{
conface.inetAddresses.add(faceAddress);
}
}
}
}
else
{
condensed.put(name, face);
}
}
return condensed.values();
return null;
}
/**
@ -231,16 +191,18 @@ public final class NetworkInterface
*
* @exception SocketException If an error occurs
*/
public static Enumeration getNetworkInterfaces() throws SocketException
public static Enumeration<NetworkInterface> getNetworkInterfaces()
throws SocketException
{
Vector networkInterfaces = VMNetworkInterface.getInterfaces();
if (networkInterfaces.isEmpty())
return null;
Collection condensed = condense(networkInterfaces);
return Collections.enumeration(condensed);
VMNetworkInterface[] netifs = VMNetworkInterface.getVMInterfaces();
Vector<NetworkInterface> networkInterfaces =
new Vector<NetworkInterface>(netifs.length);
for (int i = 0; i < netifs.length; i++)
{
if (!netifs[i].addresses.isEmpty())
networkInterfaces.add(new NetworkInterface(netifs[i]));
}
return networkInterfaces.elements();
}
/**
@ -256,8 +218,12 @@ public final class NetworkInterface
return false;
NetworkInterface tmp = (NetworkInterface) obj;
if (netif.name == null)
return tmp.netif.name == null;
return (name.equals(tmp.name) && inetAddresses.equals(tmp.inetAddresses));
return (netif.name.equals(tmp.netif.name)
&& (netif.addresses.equals(tmp.netif.addresses)));
}
/**
@ -268,7 +234,12 @@ public final class NetworkInterface
public int hashCode()
{
// FIXME: hash correctly
return name.hashCode() + inetAddresses.hashCode();
int hc = netif.addresses.hashCode();
if (netif.name != null)
hc += netif.name.hashCode();
return hc;
}
/**
@ -279,19 +250,22 @@ public final class NetworkInterface
public String toString()
{
// FIXME: check if this is correct
String result;
String separator = System.getProperty("line.separator");
StringBuffer result;
String separator = SystemProperties.getProperty("line.separator");
result =
"name: " + getDisplayName() + " (" + getName() + ") addresses:"
+ separator;
result = new StringBuffer();
result.append("name: ");
result.append(getDisplayName());
result.append(" (").append(getName()).append(") addresses:");
result.append(separator);
for (Enumeration e = inetAddresses.elements(); e.hasMoreElements();)
for (Iterator it = netif.addresses.iterator(); it.hasNext(); )
{
InetAddress address = (InetAddress) e.nextElement();
result += address.toString() + ";" + separator;
InetAddress address = (InetAddress) it.next();
result.append(address.toString()).append(";").append(separator);
}
return result;
return result.toString();
}
}