package com.limegroup.gnutella; import java.net.InetSocketAddress; import com.limegroup.gnutella.messages.Message; import com.limegroup.gnutella.util.ProcessingQueue; /** * Dispatches messages to the MessageRouter. */ class MessageDispatcher { private static final MessageDispatcher INSTANCE = new MessageDispatcher(); private MessageDispatcher() {} public static MessageDispatcher instance() { return INSTANCE; } private final ProcessingQueue DISPATCH = new ProcessingQueue("MessageDispatch"); /** * Dispatches a UDP message. */ public void dispatchUDP(Message m, InetSocketAddress addr) { DISPATCH.add(new UDPDispatch(m, addr)); } /** * Dispatches a Multicast message. */ public void dispatchMulticast(Message m, InetSocketAddress addr) { DISPATCH.add(new MulticastDispatch(m, addr)); } /** * Dispatches a TCP message. */ public void dispatchTCP(Message m, ManagedConnection conn) { DISPATCH.add(new TCPDispatch(m, conn)); } private static class UDPDispatch implements Runnable { private static final MessageRouter ROUTER = RouterService.getMessageRouter(); private final Message m; private final InetSocketAddress addr; UDPDispatch(Message m, InetSocketAddress addr) { this.m = m; this.addr = addr; } public void run() { ROUTER.handleUDPMessage(m, addr); } } private static class MulticastDispatch implements Runnable { private static final MessageRouter ROUTER = RouterService.getMessageRouter(); private final Message m; private final InetSocketAddress addr; MulticastDispatch(Message m, InetSocketAddress addr) { this.m = m; this.addr = addr; } public void run() { ROUTER.handleMulticastMessage(m, addr); } } private static class TCPDispatch implements Runnable { private static final MessageRouter ROUTER = RouterService.getMessageRouter(); private final Message m; private final ManagedConnection conn; TCPDispatch(Message m, ManagedConnection conn) { this.m = m; this.conn = conn; } public void run() { ROUTER.handleMessage(m, conn); } } }