package net.i2p.client;
import android.net.LocalServerSocket;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.nio.channels.ServerSocketChannel;
/**
* Bridge to LocalServerSocket.
* <p/>
* accept() returns a real Socket (a DomainSocket).
* <p/>
* DomainServerSockets are always bound.
* You may not create an unbound DomainServerSocket.
* Create this through the DomainSocketFactory.
*
* @author str4d
* @since 0.9.14
*/
class DomainServerSocket extends ServerSocket {
private final LocalServerSocket mLocalServerSocket;
private final DomainSocketFactory mDomainSocketFactory;
private volatile boolean mClosed;
/**
* @throws IOException
*/
public DomainServerSocket(String name, DomainSocketFactory domainSocketFactory) throws IOException {
this(new LocalServerSocket(name), domainSocketFactory);
}
/**
* Used for testing.
*
* @throws IOException
*/
DomainServerSocket(LocalServerSocket localServerSocket, DomainSocketFactory domainSocketFactory) throws IOException {
mLocalServerSocket = localServerSocket;
mDomainSocketFactory = domainSocketFactory;
}
/**
* @throws IOException
*/
@Override
public Socket accept() throws IOException {
return mDomainSocketFactory.createSocket(mLocalServerSocket.accept());
}
/**
* @throws UnsupportedOperationException always
*/
@Override
public void bind(SocketAddress endpoint) {
throw new UnsupportedOperationException();
}
/**
* @throws UnsupportedOperationException always
*/
@Override
public void bind(SocketAddress endpoint, int backlog) {
throw new UnsupportedOperationException();
}
/**
* @throws IOException
*/
@Override
public void close() throws IOException {
mLocalServerSocket.close();
mClosed = true;
}
/**
* @return null always
*/
@Override
public ServerSocketChannel getChannel() {
return null;
}
/**
* @return null always
*/
@Override
public InetAddress getInetAddress() {
return null;
}
/**
* @return -1 always
*/
@Override
public int getLocalPort() {
return -1;
}
/**
* @return null always
*/
@Override
public SocketAddress getLocalSocketAddress() {
return null;
}
/**
* @throws UnsupportedOperationException always
*/
@Override
public int getReceiveBufferSize() {
throw new UnsupportedOperationException();
}
/**
* @return false always
*/
@Override
public boolean getReuseAddress() {
return false;
}
/**
* @throws UnsupportedOperationException always
*/
@Override
public int getSoTimeout() {
throw new UnsupportedOperationException();
}
/**
* @return true always
*/
@Override
public boolean isBound() {
return true;
}
@Override
public boolean isClosed() {
return mClosed;
}
/**
* Does nothing.
*/
@Override
public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) {
}
/**
* Does nothing.
*/
@Override
public void setReceiveBufferSize(int size) {
}
/**
* Does nothing.
*/
@Override
public void setReuseAddress(boolean on) {
}
/**
* Does nothing.
*/
@Override
public void setSoTimeout(int timeout) throws SocketException {
}
@Override
public String toString() {
return mLocalServerSocket.toString();
}
}