2004-04-08 04:41:54 +00:00
|
|
|
package net.i2p.client.streaming;
|
|
|
|
|
2004-04-14 15:28:02 +00:00
|
|
|
import java.net.ConnectException;
|
|
|
|
|
2004-04-08 04:41:54 +00:00
|
|
|
import net.i2p.I2PException;
|
|
|
|
import net.i2p.util.Log;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initial stub implementation for the server socket
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
class I2PServerSocketImpl implements I2PServerSocket {
|
|
|
|
private final static Log _log = new Log(I2PServerSocketImpl.class);
|
|
|
|
private I2PSocketManager mgr;
|
2004-04-10 11:50:11 +00:00
|
|
|
private I2PSocket cached = null; // buffer one socket here
|
|
|
|
|
2004-04-14 15:28:02 +00:00
|
|
|
private boolean closing = false; // Are we being closed?
|
|
|
|
|
|
|
|
private Object acceptLock = new Object();
|
|
|
|
|
2004-04-08 04:41:54 +00:00
|
|
|
public I2PServerSocketImpl(I2PSocketManager mgr) {
|
2004-04-10 11:50:11 +00:00
|
|
|
this.mgr = mgr;
|
2004-04-08 04:41:54 +00:00
|
|
|
}
|
2004-04-10 11:50:11 +00:00
|
|
|
|
2004-04-14 15:28:02 +00:00
|
|
|
public synchronized I2PSocket accept() throws I2PException, ConnectException {
|
|
|
|
I2PSocket ret;
|
|
|
|
|
|
|
|
synchronized (acceptLock) {
|
|
|
|
while ((cached == null) && !closing) {
|
|
|
|
myWait();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (closing) {
|
|
|
|
throw new ConnectException("I2PServerSocket closed");
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = cached;
|
|
|
|
cached = null;
|
|
|
|
acceptLock.notifyAll();
|
|
|
|
}
|
|
|
|
|
2004-04-10 11:50:11 +00:00
|
|
|
_log.debug("TIMING: handed out accept result " + ret.hashCode());
|
|
|
|
return ret;
|
2004-04-08 04:41:54 +00:00
|
|
|
}
|
2004-04-10 11:50:11 +00:00
|
|
|
|
2004-04-14 15:28:02 +00:00
|
|
|
public boolean getNewSocket(I2PSocket s) {
|
|
|
|
synchronized (acceptLock) {
|
|
|
|
while (cached != null) {
|
|
|
|
myWait();
|
|
|
|
}
|
|
|
|
cached = s;
|
|
|
|
acceptLock.notifyAll();
|
|
|
|
}
|
|
|
|
|
2004-04-10 11:50:11 +00:00
|
|
|
return true;
|
2004-04-08 04:41:54 +00:00
|
|
|
}
|
2004-04-10 11:50:11 +00:00
|
|
|
|
2004-04-08 04:41:54 +00:00
|
|
|
public void close() throws I2PException {
|
2004-04-14 15:28:02 +00:00
|
|
|
synchronized (acceptLock) {
|
|
|
|
closing = true;
|
|
|
|
acceptLock.notifyAll();
|
|
|
|
}
|
2004-04-08 04:41:54 +00:00
|
|
|
}
|
|
|
|
|
2004-04-10 11:50:11 +00:00
|
|
|
public I2PSocketManager getManager() {
|
|
|
|
return mgr;
|
|
|
|
}
|
2004-04-14 15:28:02 +00:00
|
|
|
|
|
|
|
private void myWait() {
|
|
|
|
try {
|
|
|
|
acceptLock.wait();
|
|
|
|
} catch (InterruptedException ex) {}
|
|
|
|
}
|
|
|
|
}
|