package com.limegroup.gnutella.rudp; import java.io.IOException; import java.nio.channels.SelectableChannel; import org.limewire.concurrent.AbstractLazySingletonProvider; import org.limewire.concurrent.ExecutorsHelper; import org.limewire.concurrent.ListeningExecutorService; import org.limewire.listener.AsynchronousEventBroadcaster; import org.limewire.listener.AsynchronousMulticasterImpl; import org.limewire.listener.ListenerSupport; import org.limewire.nio.NIODispatcher; import org.limewire.rudp.RUDPContext; import org.limewire.rudp.RUDPSettings; import org.limewire.rudp.UDPMultiplexor; import org.limewire.rudp.UDPSelectorProvider; import org.limewire.rudp.UDPService; import org.limewire.rudp.UDPSocketChannelConnectionEvent; import org.limewire.rudp.messages.RUDPMessageFactory; import org.limewire.rudp.messages.impl.DefaultMessageFactory; import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.name.Names; import com.limegroup.gnutella.rudp.messages.LimeWireGnutellaRudpMessageModule; public class LimeWireGnutellaRudpModule extends AbstractModule { @Override protected void configure() { binder().install(new LimeWireGnutellaRudpMessageModule()); ListeningExecutorService executorService = ExecutorsHelper.newProcessingQueue(UDPSocketChannelConnectionEvent.class.getSimpleName()); AsynchronousMulticasterImpl<UDPSocketChannelConnectionEvent> connectionEventMulticaster = new AsynchronousMulticasterImpl<UDPSocketChannelConnectionEvent>(executorService); bind(new TypeLiteral<AsynchronousEventBroadcaster<UDPSocketChannelConnectionEvent>>(){}).toInstance(connectionEventMulticaster); bind(new TypeLiteral<ListenerSupport<UDPSocketChannelConnectionEvent>>(){}).toInstance(connectionEventMulticaster); bind(RUDPContext.class).to(LimeRUDPContext.class); bind(UDPMultiplexor.class).toProvider(UDPMultiplexorProvider.class); bind(UDPService.class).to(LimeUDPService.class); bind(RUDPSettings.class).to(LimeRUDPSettings.class); bind(RUDPMessageFactory.class).annotatedWith(Names.named("delegate")).to(DefaultMessageFactory.class); } @Singleton private static class UDPMultiplexorProvider extends AbstractLazySingletonProvider<UDPMultiplexor> { private final UDPSelectorProvider provider; private final NIODispatcher nioDispatcher; @Inject @SuppressWarnings("unused") public UDPMultiplexorProvider(UDPSelectorProvider provider, NIODispatcher nioDispatcher) { this.provider = provider; this.nioDispatcher = nioDispatcher; } @Override protected UDPMultiplexor createObject() { UDPMultiplexor multiplexor = provider.openSelector(); SelectableChannel socketChannel = provider.openSocketChannel(); try { socketChannel.close(); } catch(IOException ignored) {} nioDispatcher.registerSelector(multiplexor, socketChannel.getClass()); return multiplexor; } } }