summaryrefslogtreecommitdiff
path: root/src/javax/jmdns/impl/NetworkTopologyDiscoveryImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/javax/jmdns/impl/NetworkTopologyDiscoveryImpl.java')
-rw-r--r--src/javax/jmdns/impl/NetworkTopologyDiscoveryImpl.java132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/javax/jmdns/impl/NetworkTopologyDiscoveryImpl.java b/src/javax/jmdns/impl/NetworkTopologyDiscoveryImpl.java
new file mode 100644
index 0000000..aa692f3
--- /dev/null
+++ b/src/javax/jmdns/impl/NetworkTopologyDiscoveryImpl.java
@@ -0,0 +1,132 @@
+/**
+ *
+ */
+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<InetAddress> result = new HashSet<InetAddress>();
+ try {
+
+ for (Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces(); nifs.hasMoreElements();) {
+ NetworkInterface nif = nifs.nextElement();
+ for (Enumeration<InetAddress> 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.
+ }
+
+}