package org.limewire.net;
import org.limewire.listener.EventBroadcaster;
import org.limewire.listener.EventMulticaster;
import org.limewire.listener.EventMulticasterImpl;
import org.limewire.listener.ListenerSupport;
import org.limewire.net.address.AddressFactory;
import org.limewire.net.address.AddressFactoryImpl;
import org.limewire.net.address.ConnectableSerializer;
import org.limewire.util.OSUtils;
import com.google.inject.AbstractModule;
import com.google.inject.TypeLiteral;
/**
* A Guice-module for binding all net related activity.
* This class can be constructed with or without a ProxySettings.
* If it is without, then a default no-proxy settings is used.
* <p>
* Note: You MUST either provide settings classes or also bind
* a module that binds the settings correctly.
*/
public class LimeWireNetModule extends AbstractModule {
private final Class<? extends ProxySettings> proxySettings;
private final Class<? extends SocketBindingSettings> socketBindingSettings;
/**
* Constructs the module without using any proxies.
* You MUST also provide a module that binds the settings!
*/
public LimeWireNetModule() {
this(null, null);
}
/** Constructs the module with the given settings for using proxies. */
public LimeWireNetModule(Class<? extends ProxySettings> proxySettings, Class<? extends SocketBindingSettings> socketBindingSettings) {
this.proxySettings = proxySettings;
this.socketBindingSettings = socketBindingSettings;
}
@Override
protected void configure() {
bind(SocketsManager.class).to(SocketsManagerImpl.class);
bind(ProxyManager.class).to(ProxyManagerImpl.class);
bind(WhoIsRequestFactory.class).to(WhoIsRequestFactoryImpl.class);
bind(FirewallService.class).to(FirewallServiceImpl.class);
bind(AddressFactory.class).to(AddressFactoryImpl.class);
bind(ConnectableSerializer.class).asEagerSingleton();
bind(new TypeLiteral<ListenerSupport<ConnectivityChangeEvent>>(){}).to(SocketsManager.class);
bind(new TypeLiteral<EventBroadcaster<ConnectivityChangeEvent>>(){}).to(SocketsManagerImpl.class);
EventMulticaster<ConnectBackRequestedEvent> connectRequestEventMulticaster = new EventMulticasterImpl<ConnectBackRequestedEvent>();
bind(new TypeLiteral<EventMulticaster<ConnectBackRequestedEvent>>(){}).toInstance(connectRequestEventMulticaster);
bind(new TypeLiteral<EventBroadcaster<ConnectBackRequestedEvent>>(){}).toInstance(connectRequestEventMulticaster);
bind(new TypeLiteral<ListenerSupport<ConnectBackRequestedEvent>>(){}).toInstance(connectRequestEventMulticaster);
if(OSUtils.isSocketChallengedWindows())
bind(SocketController.class).to(LimitedSocketController.class);
else
bind(SocketController.class).to(SimpleSocketController.class);
if(proxySettings != null)
bind(ProxySettings.class).to(proxySettings);
if(socketBindingSettings != null)
bind(SocketBindingSettings.class).to(socketBindingSettings);
}
}