/** * */ package javax.jmdns.impl; import java.lang.reflect.Method; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import javax.jmdns.NetworkTopologyDiscovery; /** * This class implements NetworkTopologyDiscovery. * * @author Pierre Frisch */ public class NetworkTopologyDiscoveryImpl implements NetworkTopologyDiscovery { private final static Logger logger = Logger.getLogger(NetworkTopologyDiscoveryImpl.class.getName()); private final Method _isUp; private final Method _supportsMulticast; /** * */ public NetworkTopologyDiscoveryImpl() { super(); Method isUp; try { isUp = NetworkInterface.class.getMethod("isUp", (Class[]) null); } catch (Exception exception) { // We do not want to throw anything if the method does not exist. isUp = null; } _isUp = isUp; Method supportsMulticast; try { supportsMulticast = NetworkInterface.class.getMethod("supportsMulticast", (Class[]) null); } catch (Exception exception) { // We do not want to throw anything if the method does not exist. supportsMulticast = null; } _supportsMulticast = supportsMulticast; } /* * (non-Javadoc) * @see javax.jmdns.JmmDNS.NetworkTopologyDiscovery#getInetAddresses() */ @Override public InetAddress[] getInetAddresses() { Set result = new HashSet(); try { for (Enumeration nifs = NetworkInterface.getNetworkInterfaces(); nifs.hasMoreElements();) { NetworkInterface nif = nifs.nextElement(); for (Enumeration iaenum = nif.getInetAddresses(); iaenum.hasMoreElements();) { InetAddress interfaceAddress = iaenum.nextElement(); if (logger.isLoggable(Level.FINEST)) { logger.finest("Found NetworkInterface/InetAddress: " + nif + " -- " + interfaceAddress); } if (this.useInetAddress(nif, interfaceAddress)) { result.add(interfaceAddress); } } } } catch (SocketException se) { logger.warning("Error while fetching network interfaces addresses: " + se); } return result.toArray(new InetAddress[result.size()]); } /* * (non-Javadoc) * @see javax.jmdns.JmmDNS.NetworkTopologyDiscovery#useInetAddress(java.net.NetworkInterface, java.net.InetAddress) */ @Override public boolean useInetAddress(NetworkInterface networkInterface, InetAddress interfaceAddress) { try { if (_isUp != null) { try { if (!((Boolean) _isUp.invoke(networkInterface, (Object[]) null)).booleanValue()) { return false; } } catch (Exception exception) { // We should hide that exception. } } if (_supportsMulticast != null) { try { if (!((Boolean) _supportsMulticast.invoke(networkInterface, (Object[]) null)).booleanValue()) { return false; } } catch (Exception exception) { // We should hide that exception. } } if (interfaceAddress.isLoopbackAddress()) { return false; } return true; } catch (Exception exception) { return false; } } /* * (non-Javadoc) * @see javax.jmdns.NetworkTopologyDiscovery#lockInetAddress(java.net.InetAddress) */ @Override public void lockInetAddress(InetAddress interfaceAddress) { // Default implementation does nothing. } /* * (non-Javadoc) * @see javax.jmdns.NetworkTopologyDiscovery#unlockInetAddress(java.net.InetAddress) */ @Override public void unlockInetAddress(InetAddress interfaceAddress) { // Default implementation does nothing. } }