package net.i2p.sam;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
/* requires Java 7 */
import java.net.SocketOption;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.nio.channels.spi.SelectorProvider;
import java.util.Collections;
import java.util.Set;
import javax.net.ssl.SSLSocket;
/**
* Simple wrapper for a SSLSocket.
* Cannot be used for asynch ops.
*
* @since 0.9.24
*/
class SSLSocketChannel extends SocketChannel {
private final SSLSocket _socket;
public SSLSocketChannel(SSLSocket socket) {
super(SelectorProvider.provider());
_socket = socket;
}
//// SocketChannel abstract methods
public Socket socket() {
return _socket;
}
public boolean connect(SocketAddress remote) {
throw new UnsupportedOperationException();
}
public boolean finishConnect() {
return true;
}
public boolean isConnected() {
return _socket.isConnected();
}
public boolean isConnectionPending() {
return false;
}
/** new in Java 7 */
public SocketAddress getRemoteAddress() {
return _socket.getRemoteSocketAddress();
}
/** new in Java 7 */
public SocketChannel shutdownInput() throws IOException {
_socket.getInputStream().close();
return this;
}
/** new in Java 7 */
public SocketChannel shutdownOutput() throws IOException {
_socket.getOutputStream().close();
return this;
}
/** requires Java 7 */
public <T> SocketChannel setOption(SocketOption<T> name, T value) {
return this;
}
/** requires Java 7 */
public SocketChannel bind(SocketAddress local) {
throw new UnsupportedOperationException();
}
//// SocketChannel abstract methods
public int read(ByteBuffer src) throws IOException {
if (!src.hasArray())
throw new UnsupportedOperationException();
int pos = src.position();
int len = src.remaining();
int read = _socket.getInputStream().read(src.array(), src.arrayOffset() + pos, len);
if (read > 0)
src.position(pos + read);
return read;
}
public long read(ByteBuffer[] srcs, int offset, int length) {
throw new UnsupportedOperationException();
}
public int write(ByteBuffer src) throws IOException {
if (!src.hasArray())
throw new UnsupportedOperationException();
int pos = src.position();
int len = src.remaining();
_socket.getOutputStream().write(src.array(), src.arrayOffset() + pos, len);
src.position(pos + len);
return len;
}
public long write(ByteBuffer[] srcs, int offset, int length) {
throw new UnsupportedOperationException();
}
//// AbstractSelectableChannel abstract methods
public void implCloseSelectableChannel() throws IOException {
_socket.close();
}
public void implConfigureBlocking(boolean block) throws IOException {
if (!block)
throw new UnsupportedOperationException();
}
//// NetworkChannel interface methods
public SocketAddress getLocalAddress() {
return _socket.getLocalSocketAddress();
}
public <T> T getOption(SocketOption<T> name) {
return null;
}
public Set<SocketOption<?>> supportedOptions() {
return Collections.emptySet();
}
}