package com.limegroup.gnutella.browser;
import java.io.IOException;
import org.limewire.i18n.I18nMarker;
import org.limewire.inject.EagerSingleton;
import org.limewire.lifecycle.Service;
import org.limewire.net.ConnectionDispatcher;
import org.limewire.net.SocketAcceptor;
import org.limewire.service.MessageService;
import com.google.inject.Inject;
import com.google.inject.name.Named;
/**
* Listens on an HTTP port, accepts incoming connections, and dispatches threads
* to handle requests. This allows simple HTTP requests.
*/
@EagerSingleton
public class LocalAcceptor implements Service {
private final static int FIRST_PORT = 45100;
private final SocketAcceptor acceptor;
@Inject
public LocalAcceptor(@Named("local") ConnectionDispatcher connectionDispatcher) {
this.acceptor = new SocketAcceptor(connectionDispatcher);
}
public String getServiceName() {
return org.limewire.i18n.I18nMarker.marktr("Local Socket Listener");
}
@Inject
void register(org.limewire.lifecycle.ServiceRegistry registry) {
registry.register(this);
}
public void initialize() {
}
/**
* Starts listening to incoming connections.
*/
public void start() {
if (!bind(FIRST_PORT)) {
MessageService.showError(I18nMarker.marktr("LimeWire was unable to set up a port to listen for incoming connections. Some features of LimeWire may not work as expected."));
}
}
public void stop() {
acceptor.unbind();
}
private boolean bind(final int listeningPort) {
// try 20 different consecutive ports from 45100 to 45119 (inclusive)
// no longer random, since this listening socket is used by the
// executable stub to launch magnet downloads, so the stub needs to know
// what (small) range of ports to try...
for (int i = 0; i < 20; i++) {
try {
acceptor.bind(listeningPort + i);
return true;
} catch (IOException ignored) {
}
}
return false;
}
/**
* Return the listening port.
*/
public int getPort() {
return acceptor.getPort();
}
/**
* Returns the dispatcher that dispatches incoming requests to a handler.
*/
public ConnectionDispatcher getDispatcher() {
return acceptor.getDispatcher();
}
}