FileChannelImpl.java [plain text]
package gnu.java.nio;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.NonReadableChannelException;
import java.nio.channels.NonWritableChannelException;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
public class FileChannelImpl extends FileChannel
{
public long address;
public int length;
public int fd;
public MappedByteBuffer buf;
public Object file_obj;
private native long lengthInternal (int native_fd) throws IOException;
public FileChannelImpl (int fd, Object obj)
{
this.fd = fd;
this.file_obj = obj;
}
public long size () throws IOException
{
if (!isOpen ())
throw new ClosedChannelException ();
return lengthInternal (fd);
}
protected void implCloseChannel() throws IOException
{
if (address != 0)
{
nio_unmmap_file (fd, address, (int) length);
address = 0;
}
fd = 0;
if (file_obj instanceof RandomAccessFile)
{
RandomAccessFile o = (RandomAccessFile) file_obj;
o.close();
}
else if (file_obj instanceof FileInputStream)
{
FileInputStream o = (FileInputStream) file_obj;
o.close();
}
else if (file_obj instanceof FileOutputStream)
{
FileOutputStream o = (FileOutputStream) file_obj;
o.close();
}
}
public int read (ByteBuffer dst) throws IOException
{
int s = (int)size();
if (buf == null)
{
throw new EOFException("file not mapped");
}
for (int i=0; i<s; i++)
{
dst.put( buf.get() );
}
return s;
}
public int read (ByteBuffer dst, long position)
throws IOException
{
if (position < 0)
throw new IllegalArgumentException ();
if (!isOpen ())
throw new ClosedChannelException ();
throw new Error ("Not implemented");
}
public long read (ByteBuffer[] dsts, int offset, int length)
throws IOException
{
long result = 0;
for (int i = offset; i < offset + length; i++)
{
result += write (dsts[i]);
}
return result;
}
public int write (ByteBuffer src) throws IOException
{
int w = 0;
if (buf == null)
{
throw new EOFException ("file not mapped");
}
while (src.hasRemaining ())
{
buf.put (src.get ());
w++;
}
return w;
}
public int write (ByteBuffer src, long position)
throws IOException
{
if (position < 0)
throw new IllegalArgumentException ();
if (!isOpen ())
throw new ClosedChannelException ();
throw new Error ("Not implemented");
}
public long write(ByteBuffer[] srcs, int offset, int length)
throws IOException
{
long res = 0;
for (int i = offset;i < offset + length;i++)
{
res += write (srcs[i]);
}
return res;
}
public MappedByteBuffer map (FileChannel.MapMode mode, long position,
long size)
throws IOException
{
if ((mode != MapMode.READ_ONLY
&& mode != MapMode.READ_WRITE
&& mode != MapMode.PRIVATE)
|| position < 0
|| size < 0
|| size > Integer.MAX_VALUE)
throw new IllegalArgumentException ();
return null;
}
static MappedByteBuffer create_direct_mapped_buffer (long address,
long length)
{
return null;
}
public long write (ByteBuffer[] srcs)
throws IOException
{
return write (srcs, 0, srcs.length);
}
public void force (boolean metaData) throws IOException
{
if (!isOpen ())
throw new ClosedChannelException ();
nio_msync (fd, address, length);
}
public long transferTo (long position, long count, WritableByteChannel target)
throws IOException
{
if (position < 0
|| count < 0)
throw new IllegalArgumentException ();
if (!isOpen ())
throw new ClosedChannelException ();
throw new Error ("Not implemented");
}
public long transferFrom (ReadableByteChannel src, long position, long count)
throws IOException
{
if (position < 0
|| count < 0)
throw new IllegalArgumentException ();
if (!isOpen ())
throw new ClosedChannelException ();
throw new Error ("Not implemented");
}
public FileLock lock (long position, long size, boolean shared)
throws IOException
{
if (position < 0
|| size < 0)
throw new IllegalArgumentException ();
if (!isOpen ())
throw new ClosedChannelException ();
throw new Error ("Not implemented");
}
public FileLock tryLock (long position, long size, boolean shared)
throws IOException
{
if (position < 0
|| size < 0)
throw new IllegalArgumentException ();
if (!isOpen ())
throw new ClosedChannelException ();
throw new Error ("Not implemented");
}
public long position ()
throws IOException
{
if (!isOpen ())
throw new ClosedChannelException ();
throw new Error ("not implemented");
}
public FileChannel position (long newPosition)
throws IOException
{
if (newPosition < 0)
throw new IllegalArgumentException ();
if (!isOpen ())
throw new ClosedChannelException ();
throw new Error ("not implemented");
}
public FileChannel truncate (long size)
throws IOException
{
if (size < 0)
throw new IllegalArgumentException ();
if (!isOpen ())
throw new ClosedChannelException ();
throw new Error ("not implemented");
}
private static native long nio_mmap_file (int fd, long pos, int size, int mode);
private static native void nio_unmmap_file (int fd, long address, int size);
private static native void nio_msync (int fd, long address, int length);
}