/************************************************************************** * Copyright (c) 2006, 2007, 2009 by /k/ Embedded Java Solutions. * * All rights reserved. * * * * Redistribution and use in source and binary forms, with or without * * modification, are permitted provided that the following conditions * * are met: * * 1. Redistributions of source code must retain the above copyright * * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * * notice, this list of conditions and the following disclaimer in the * * documentation and/or other materials provided with the distribution. * * 3. Neither the name of /k/ Embedded Java Solutions nor the names of * * other contributors may be used to endorse or promote products * * derived from this software without specific prior written permission.* * * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * * IN NO EVENT SHALL /K/ EMBEDDED JAVA SOLUTIONS OR OTHER CONTRIBUTORS BE * * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ package java.net; import java.util.Arrays; import java.util.Enumeration; import java.util.NoSuchElementException; import java.util.Vector; /** * NetworkInterface: * * @author ruelens * * created: Mar 28, 2006 */ public final class NetworkInterface { /** * AddrEnum: * * @author ruelens * * created: Mar 28, 2006 */ private static class AddrEnum implements Enumeration { private InetAddress[] addr; private int current; private int next; /** * @param addresses the array to enumerate over; * */ public AddrEnum(InetAddress[] addresses) { this.addr = addresses; next = -1; current = -1; } /** * @see java.util.Enumeration#hasMoreElements() */ public boolean hasMoreElements() { if(next == current) { while(++next < addr.length) { try { InetAddress ad = addr[next]; InetAddress.connectCheck(ad.hostName,-1); break; } catch (SecurityException se){} } } return next < addr.length; } /** * @see java.util.Enumeration#nextElement() */ public Object nextElement() throws NoSuchElementException { if(!hasMoreElements()) { throw new NoSuchElementException(); } current = next; return addr[current]; } } private String name; private InetAddress[] addresses; private String displayName; private NetworkInterface(String name, int ip) { this.name = name; this.displayName = name; addresses = new InetAddress[]{InetAddress.createInetAddress(ip)}; } public String getName() { return name; } public Enumeration getInetAddresses() { if (addresses == null) { return new Vector(0).elements(); } return new AddrEnum(addresses); } public String getDisplayName() { return displayName != null && !"".equals(displayName) ? displayName : name; } public boolean equals(Object obj) { if (obj instanceof NetworkInterface) { NetworkInterface ni = (NetworkInterface) obj; return this.name.equals(ni.name) && Arrays.equals(this.addresses, ni.addresses); } return false; } public int hashCode() { int hc = 9753113; for(int i = 0 ; i < addresses.length ; i++) { hc ^= addresses[i].hashCode(); } return name.hashCode() ^ hc; } public String toString() { StringBuffer buffer = new StringBuffer().append(name).append(':'); for(int i = 0 ; i < addresses.length ; i++) { (i>0 ? buffer.append(',') : buffer).append(addresses[i]); } return buffer.toString(); } public static NetworkInterface getByName(String name) throws SocketException { int ip = getAddressDevice(name); if(ip != -1) { return new NetworkInterface(name,ip); } return null; } /* * TODO: rework ! */ public static NetworkInterface getByInetAddress(InetAddress addr) throws SocketException { Enumeration enumeration = getNetworkInterfaces(); while (enumeration.hasMoreElements()) { NetworkInterface element = (NetworkInterface) enumeration.nextElement(); InetAddress[] addresses = element.addresses; for(int i=0 ; i < addresses.length ; i++) { if(addr.equals(addresses[i])) { return element; } } } return null; } public static Enumeration getNetworkInterfaces() throws SocketException { Vector list = new Vector(); nativeGetInterfaces(list); return list.elements(); } static final void addToList(Vector list,int ip, String name) { list.add(new NetworkInterface(name, ip)); } private static native void nativeGetInterfaces(Vector list); private static native int getAddressDevice(String device); }