OSDN Git Service

Merged gcj-eclipse branch to trunk.
[pf3gnuchains/gcc-fork.git] / libjava / classpath / java / net / NetworkInterface.java
index 47b1c67..6c78ead 100644 (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)
-  {
-    this.name = name;
-    this.inetAddresses = new Vector(1, 1);
-    this.inetAddresses.add(address);
-  }
-
-  NetworkInterface(String name, InetAddress[] addresses)
+  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(addresses.length, 1);
-
-    for (int i = 0; i < addresses.length; i++)
-      this.inetAddresses.add(addresses[i]);
+    return new NetworkInterface(new VMNetworkInterface());
   }
-
+  
   /**
    * 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();
   }
 }