/* * Copyright (C) 2003-2014, C. Ramakrishnan / Auracle. * All rights reserved. * * This code is licensed under the BSD 3-Clause license. * See file LICENSE (or LICENSE.html) for more information. */ package com.illposed.osc.utility; import com.illposed.osc.AddressSelector; import com.illposed.osc.OSCBundle; import com.illposed.osc.OSCListener; import com.illposed.osc.OSCMessage; import com.illposed.osc.OSCPacket; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; /** * Dispatches {@link OSCPacket}s to registered listeners (<i>Method</i>s). * * @author Chandrasekhar Ramakrishnan */ public class OSCPacketDispatcher { private final Map<AddressSelector, OSCListener> selectorToListener; public OSCPacketDispatcher() { this.selectorToListener = new HashMap<AddressSelector, OSCListener>(); } /** * Adds a listener (<i>Method</i> in OSC speak) that will be notified * of incoming messages that match the selector. * @param addressSelector selects which messages will be forwarded to the listener, * depending on the message address * @param listener receives messages accepted by the selector */ public void addListener(AddressSelector addressSelector, OSCListener listener) { selectorToListener.put(addressSelector, listener); } public void dispatchPacket(OSCPacket packet) { dispatchPacket(packet, null); } public void dispatchPacket(OSCPacket packet, Date timestamp) { if (packet instanceof OSCBundle) { dispatchBundle((OSCBundle) packet); } else { dispatchMessage((OSCMessage) packet, timestamp); } } private void dispatchBundle(OSCBundle bundle) { Date timestamp = bundle.getTimestamp(); List<OSCPacket> packets = bundle.getPackets(); for (OSCPacket packet : packets) { dispatchPacket(packet, timestamp); } } private void dispatchMessage(OSCMessage message, Date time) { for (Entry<AddressSelector, OSCListener> addrList : selectorToListener.entrySet()) { if (addrList.getKey().matches(message.getAddress())) { addrList.getValue().acceptMessage(time, message); } } } }