/******************************************************************************* * Copyright (c) 2013 Jens Kristian Villadsen. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * Jens Kristian Villadsen - Lead developer, owner and creator ******************************************************************************/ package org.dyndns.jkiddo.raop.client; import java.net.InetAddress; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import javax.inject.Singleton; import javax.jmdns.JmDNS; import javax.jmdns.JmmDNS; import javax.jmdns.NetworkTopologyEvent; import javax.jmdns.ServiceEvent; import org.dyndns.jkiddo.IDiscoverer; import org.dyndns.jkiddo.raop.ISpeakerListener; import org.dyndns.jkiddo.raop.client.model.Device; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton public class RemoteSpeakerDiscoverer implements IDiscoverer { private static final Logger LOGGER = LoggerFactory.getLogger(RemoteSpeakerDiscoverer.class); private final JmmDNS mDNS; private final Map<JmDNS, InetAddress> interfaces = new HashMap<JmDNS, InetAddress>(); private final ISpeakerListener speakerListener; @Inject public RemoteSpeakerDiscoverer(JmmDNS mDNS, ISpeakerListener speakerListener) { this.mDNS = mDNS; this.speakerListener = speakerListener; this.mDNS.addServiceListener(ISpeakerListener.RAOP_TYPE, this); this.mDNS.addNetworkTopologyListener(this); } @Override public void serviceAdded(ServiceEvent event) { LOGGER.info("ADD: " + event.getDNS().getServiceInfo(event.getType(), event.getName())); } @Override public void serviceRemoved(ServiceEvent event) { LOGGER.debug("REMOVE: " + event.getName()); this.speakerListener.removeAvailableSpeaker(event.getInfo().getServer(), event.getInfo().getPort()); } @SuppressWarnings("deprecation") @Override public void serviceResolved(ServiceEvent event) { LOGGER.info("ADD: " + event.getDNS().getServiceInfo(event.getType(), event.getName())); speakerListener.registerAvailableSpeaker(DeviceConnectionService.getConnection(new Device(event.getName(), event.getInfo().getInetAddress(), event.getInfo().getPort()))); } @Override public void inetAddressAdded(NetworkTopologyEvent event) { JmDNS mdns = event.getDNS(); InetAddress address = event.getInetAddress(); LOGGER.info("Registered RemoteSpeakerDiscoverer @ " + address.getHostAddress()); mdns.addServiceListener(ISpeakerListener.RAOP_TYPE, this); interfaces.put(mdns, address); } @Override public void inetAddressRemoved(NetworkTopologyEvent event) { JmDNS mdns = event.getDNS(); mdns.removeServiceListener(ISpeakerListener.RAOP_TYPE, this); mdns.unregisterAllServices(); interfaces.remove(mdns); } }