From 4b6eac52d5cddac6803e3bb762523da95f571bf6 Mon Sep 17 00:00:00 2001 From: Michael Koch Date: Fri, 2 May 2003 05:35:57 +0000 Subject: [PATCH] 2003-05-02 Michael Koch * 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 --- libjava/ChangeLog | 22 ++++ libjava/gnu/java/nio/FileChannelImpl.java | 125 ++++++++++++++------- libjava/gnu/java/nio/natFileChannelImpl.cc | 16 +++ libjava/java/nio/ByteBuffer.java | 8 +- libjava/java/nio/CharBuffer.java | 3 + 5 files changed, 131 insertions(+), 43 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 0c956560c1e..a73e9d81683 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,25 @@ +2003-05-02 Michael Koch + + * 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. + 2003-04-30 Tom Tromey PR libgcj/10582: diff --git a/libjava/gnu/java/nio/FileChannelImpl.java b/libjava/gnu/java/nio/FileChannelImpl.java index c233d8210a7..79a7a58eb90 100644 --- a/libjava/gnu/java/nio/FileChannelImpl.java +++ b/libjava/gnu/java/nio/FileChannelImpl.java @@ -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); } diff --git a/libjava/gnu/java/nio/natFileChannelImpl.cc b/libjava/gnu/java/nio/natFileChannelImpl.cc index 9413a77d700..b33a79f16f6 100644 --- a/libjava/gnu/java/nio/natFileChannelImpl.cc +++ b/libjava/gnu/java/nio/natFileChannelImpl.cc @@ -28,6 +28,7 @@ details. */ #include #include #include +#include #include jlong @@ -49,6 +50,21 @@ gnu::java::nio::FileChannelImpl::implPosition (jlong newPosition) return this; } +jint +gnu::java::nio::FileChannelImpl::implRead (JArray* buffer, + jint offset, jint len) +{ + return fd->read (buffer, offset, len); +} + +jint +gnu::java::nio::FileChannelImpl::implWrite (JArray* buffer, + jint offset, jint len) +{ + fd->write (buffer, offset, len); + return len; +} + java::nio::channels::FileChannel* gnu::java::nio::FileChannelImpl::implTruncate (jlong size) { diff --git a/libjava/java/nio/ByteBuffer.java b/libjava/java/nio/ByteBuffer.java index b3e72aaf689..5a687cac611 100644 --- a/libjava/java/nio/ByteBuffer.java +++ b/libjava/java/nio/ByteBuffer.java @@ -251,7 +251,7 @@ public abstract class ByteBuffer extends Buffer implements Comparable */ public int hashCode() { - // FIXME: Check what SUN calcs here + // FIXME: Check what SUN calculates here return super.hashCode(); } @@ -344,7 +344,8 @@ public abstract class ByteBuffer extends Buffer implements Comparable /** * Absolute get method. * - * @exception IndexOutOfBoundsException FIXME + * @exception IndexOutOfBoundsException If index < 0 or index >= this + * buffers limit. */ public abstract byte get (int index); @@ -352,7 +353,8 @@ public abstract class ByteBuffer extends Buffer implements Comparable * Absolute put method. * * @exception ReadOnlyBufferException If this buffer is read-only - * @exception IndexOutOfBoundsException FIXME + * @exception IndexOutOfBoundsException If index < 0 or index >= this + * buffers limit. */ public abstract ByteBuffer put (int index, byte b); diff --git a/libjava/java/nio/CharBuffer.java b/libjava/java/nio/CharBuffer.java index e5b31b44075..e2f8d5e130a 100644 --- a/libjava/java/nio/CharBuffer.java +++ b/libjava/java/nio/CharBuffer.java @@ -83,6 +83,9 @@ public abstract class CharBuffer extends Buffer */ final public static CharBuffer wrap (CharSequence a, int offset, int length) { + // FIXME: implement better handling of java.lang.String. + // Probably share data with String via reflection. + if ((offset < 0) || (offset > a.length ()) || (length < 0)