/* This code is part of Freenet. It is distributed under the GNU General * Public License, version 2 (or at your option any later version). See * http://www.gnu.org/ for further details of the GPL. */ package thaw.plugins.mDns; import java.util.LinkedList; import javax.jmdns.JmDNS; import javax.jmdns.ServiceEvent; import javax.jmdns.ServiceInfo; import javax.jmdns.ServiceListener; import thaw.plugins.MDns; import thaw.core.Logger; public class MDNSDiscovery { // SYNC IT!!! private LinkedList foundNodes; private JmDNS jmdns; private MDns mDns; public MDNSDiscovery(MDns mDns) { this.mDns = mDns; this.foundNodes = new LinkedList(); start(); } public void start() { this.foundNodes = new LinkedList(); try { // Spawn the mdns listener Logger.info(this, "Starting JMDNS ..."); this.jmdns = new JmDNS(); // Start listening for new nodes jmdns.addServiceListener(MDNSDiscoveryPanel.FCP_SERVICE_TYPE, new FCPMDNSListener()); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Error loading MDNSDiscoveryPanel : " + e.getMessage()); } } private class FCPMDNSListener implements ServiceListener { public void serviceAdded(ServiceEvent event) { Logger.notice(this, "Service added : " + event.getName()+"."+event.getType()); // Force the gathering of informations jmdns.getServiceInfo(MDNSDiscoveryPanel.FCP_SERVICE_TYPE, event.getName()); } public void serviceRemoved(ServiceEvent event) { Logger.notice(this, "Service removed : " + event.getName()+"."+event.getType()); ServiceInfo service = event.getInfo(); synchronized (foundNodes) { foundNodes.remove(service); synchronized (mDns.getMdnsPanel()) { mDns.getMdnsPanel().notifyAll(); } } } public void serviceResolved(ServiceEvent event) { Logger.debug(this, "Service resolved: " + event.getInfo()); ServiceInfo service = event.getInfo(); synchronized (foundNodes) { foundNodes.add(service); synchronized (mDns.getMdnsPanel()) { mDns.getMdnsPanel().notifyAll(); } } } } public boolean isHasTheSameIPAddress(ServiceInfo host) { try{ return (jmdns.getInterface().equals(host.getAddress()) ? true : false); } catch (java.io.IOException e) { return false; } } public LinkedList getFoundNodes() { return foundNodes; } public void stop() { Logger.info(this, "Stopping JMDNS ..."); jmdns.close(); } }