2003-05-02 Michael Koch <konqueror@gmx.de>

* gnu/java/nio/FileChannelImpl.java
	(read): New implementation.
	(implRead): New methods.
	(write): New implementation, call other write insteal of read method.
	(implWrite): New methods.
	(map): Added comment.
	(transferFrom): Implemented.
	(transferTo): Implemented.
	(lock): Added checks to throw exceptions.
	(truncate): Added check to throw exception.
	* gnu/java/nio/natFileChannelImpl.cc
	(implRead): New method.
	(implWrite): New method.
	* java/nio/ByteBuffer.java
	(hashCode): Fixed comment.
	(get): Fixed exception documentation.
	(put): Fixed exception documentation.
	* java/nio/CharBuffer.java:
	Added comment for later optimizations.

From-SVN: r66373
This commit is contained in:
Michael Koch 2003-05-02 05:35:57 +00:00 committed by Michael Koch
parent c67528fe19
commit 4b6eac52d5
5 changed files with 131 additions and 43 deletions

View file

@ -126,19 +126,15 @@ public class FileChannelImpl extends FileChannel
public int read (ByteBuffer dst) throws IOException
{
int s = (int)size();
if (buf == null)
// Check if file is mapped into memory.
if (buf != null)
{
throw new EOFException("file not mapped");
// FIXME: implement this
throw new Error ("Accessing mapped buffers not implemented.");
}
for (int i = 0; i < s; i++)
{
dst.put (buf.get());
}
return s;
// File not mapped, access it directly.
return implRead (dst);
}
public int read (ByteBuffer dst, long position)
@ -149,12 +145,34 @@ public class FileChannelImpl extends FileChannel
if (!isOpen ())
throw new ClosedChannelException ();
// FIXME: check for NonReadableChannelException
if (file_obj instanceof FileOutputStream)
throw new NonReadableChannelException ();
throw new Error ("Not implemented");
int result;
long oldPosition;
oldPosition = implPosition ();
result = implRead (dst);
implPosition (oldPosition);
return result;
}
private int implRead (ByteBuffer dst) throws IOException
{
int result;
byte[] buffer = new byte [dst.remaining ()];
result = implRead (buffer, 0, buffer.length);
dst.put (buffer, 0, result);
return result;
}
private native int implRead (byte[] buffer, int offset, int length)
throws IOException;
public long read (ByteBuffer[] dsts, int offset, int length)
throws IOException
{
@ -162,7 +180,7 @@ public class FileChannelImpl extends FileChannel
for (int i = offset; i < offset + length; i++)
{
result += write (dsts [i]);
result += read (dsts [i]);
}
return result;
@ -170,20 +188,15 @@ public class FileChannelImpl extends FileChannel
public int write (ByteBuffer src) throws IOException
{
int w = 0;
if (buf == null)
// Check if file is mapped into memory.
if (buf != null)
{
throw new EOFException ("file not mapped");
// FIXME: implement this
throw new Error ("Accessing mapped buffers not implemented.");
}
while (src.hasRemaining ())
{
buf.put (src.get ());
w++;
}
return w;
// File not mapped, access it directly.
return implWrite (src);
}
public int write (ByteBuffer src, long position)
@ -195,10 +208,29 @@ public class FileChannelImpl extends FileChannel
if (!isOpen ())
throw new ClosedChannelException ();
// FIXME: check for NonWritableChannelException
if (file_obj instanceof FileInputStream)
throw new NonWritableChannelException ();
throw new Error ("Not implemented");
int result;
long oldPosition;
oldPosition = implPosition ();
result = implWrite (src);
implPosition (oldPosition);
return result;
}
private int implWrite (ByteBuffer src) throws IOException
{
byte[] buffer = new byte [src.remaining ()];
src.get (buffer, 0, buffer.length);
return implWrite (buffer, 0, buffer.length);
}
private native int implWrite (byte[] buffer, int offset, int length)
throws IOException;
public long write(ByteBuffer[] srcs, int offset, int length)
throws IOException
@ -225,6 +257,7 @@ public class FileChannelImpl extends FileChannel
|| size > Integer.MAX_VALUE)
throw new IllegalArgumentException ();
// FIXME: Make this working.
int cmode = mode.m;
map_address = nio_mmap_file (position, size, cmode);
length = (int) size;
@ -272,10 +305,13 @@ public class FileChannelImpl extends FileChannel
if (!isOpen ())
throw new ClosedChannelException ();
// FIXME: check for NonReadableChannelException
// FIXME: check for NonWritableChannelException
throw new Error ("Not implemented");
if (file_obj instanceof FileOutputStream)
throw new NonReadableChannelException ();
// XXX: count needs to be casted from long to int. Dataloss ?
ByteBuffer buffer = ByteBuffer.allocate ((int) count);
read (buffer, position);
return target.write (buffer);
}
public long transferFrom (ReadableByteChannel src, long position, long count)
@ -288,10 +324,13 @@ public class FileChannelImpl extends FileChannel
if (!isOpen ())
throw new ClosedChannelException ();
// FIXME: check for NonReadableChannelException
// FIXME: check for NonWritableChannelException
throw new Error ("Not implemented");
if (file_obj instanceof FileInputStream)
throw new NonWritableChannelException ();
// XXX: count needs to be casted from long to int. Dataloss ?
ByteBuffer buffer = ByteBuffer.allocate ((int) count);
src.read (buffer);
return write (buffer, position);
}
public FileLock lock (long position, long size, boolean shared)
@ -304,9 +343,14 @@ public class FileChannelImpl extends FileChannel
if (!isOpen ())
throw new ClosedChannelException ();
// FIXME: check for NonReadableChannelException
// FIXME: check for NonWritableChannelException
if (shared &&
file_obj instanceof FileOutputStream)
throw new NonReadableChannelException ();
if (!shared &&
file_obj instanceof FileInputStream)
throw new NonWritableChannelException ();
throw new Error ("Not implemented");
}
@ -353,7 +397,8 @@ public class FileChannelImpl extends FileChannel
if (!isOpen ())
throw new ClosedChannelException ();
// FIXME: check for NonWritableChannelException
if (file_obj instanceof FileInputStream)
throw new NonWritableChannelException ();
return implTruncate (size);
}