SocketChannelImpl.java [plain text]
package gnu.java.nio;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AlreadyConnectedException;
import java.nio.channels.SocketChannel;
import java.nio.channels.spi.SelectorProvider;
import gnu.classpath.Configuration;
public class SocketChannelImpl extends SocketChannel
{
Socket sock_object;
int fd;
int local_port;
boolean blocking = true;
boolean connected = false;
InetSocketAddress sa;
static native int SocketCreate();
static native int SocketConnect(int fd, InetAddress addr, int port);
static native int SocketBind(int fd, InetAddress addr, int port);
static native int SocketListen(int fd, int backlog);
static native int SocketAvailable(int fd);
static native int SocketClose(int fd);
static native int SocketRead(int fd, byte b[], int off, int len);
static native int SocketWrite(int fd, byte b[], int off, int len);
public SocketChannelImpl(SelectorProvider provider)
{
super(provider);
fd = SocketCreate();
if (fd == -1)
{
System.err.println("failed to create socket:"+fd);
}
}
public void finalizer()
{
if (connected)
{
try
{
close();
}
catch (Exception e)
{
}
}
}
protected void implCloseSelectableChannel()
{
connected = false;
SocketClose(fd);
fd = SocketCreate();
}
protected void implConfigureBlocking(boolean block)
{
if (blocking == block)
return;
}
public boolean connect(SocketAddress remote)
throws IOException
{
if (connected)
{
throw new AlreadyConnectedException();
}
sa = (InetSocketAddress) remote;
InetAddress addr = sa.getAddress();
int port = sa.getPort();
int err = SocketConnect(fd, addr, port);
if (err < 0)
{
throw new IOException("Connection refused:"+err + ", connect="+err);
}
local_port = err;
connected = true;
return blocking;
}
public boolean finishConnect()
{
return false;
}
public boolean isConnected()
{
return connected;
}
public boolean isConnectionPending()
{
if (blocking)
return true;
return false;
}
public Socket socket()
{
if (sock_object != null)
{
}
return sock_object;
}
public int read(ByteBuffer dst)
{
int bytes = 0;
int len = 1024;
byte[]b = new byte[len];
bytes = SocketRead(fd, b, 0, len);
dst.put(b, 0, bytes);
if (bytes == 0)
{
return -1;
}
return bytes;
}
public long read(ByteBuffer[] dsts, int offset, int length)
{
long bytes = 0;
for (int i=offset; i<length; i++)
{
bytes += read(dsts[i]);
}
return bytes;
}
public int write(ByteBuffer src)
{
int bytes = 0;
int len = src.position();
if (src instanceof ByteBufferImpl)
{
ByteBufferImpl bi = (ByteBufferImpl) src;
byte[]b = bi.array();
bytes = SocketWrite(fd, b, 0, len);
}
else
{
byte[]b = new byte[len];
src.get(b, 0, len);
bytes = SocketWrite(fd, b, 0, len);
}
return bytes;
}
public long write (ByteBuffer[] srcs, int offset, int length)
{
long bytes = 0;
for (int i=offset; i<length; i++)
{
bytes += write(srcs[i]);
}
return bytes;
}
}