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

@ -1,3 +1,25 @@
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.
2003-04-30 Tom Tromey <tromey@redhat.com>
PR libgcj/10582:

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);
}

View File

@ -28,6 +28,7 @@ details. */
#include <gnu/java/nio/FileChannelImpl.h>
#include <java/io/FileDescriptor.h>
#include <java/io/IOException.h>
#include <java/nio/ByteBuffer.h>
#include <java/nio/channels/FileChannel.h>
jlong
@ -49,6 +50,21 @@ gnu::java::nio::FileChannelImpl::implPosition (jlong newPosition)
return this;
}
jint
gnu::java::nio::FileChannelImpl::implRead (JArray<jbyte>* buffer,
jint offset, jint len)
{
return fd->read (buffer, offset, len);
}
jint
gnu::java::nio::FileChannelImpl::implWrite (JArray<jbyte>* buffer,
jint offset, jint len)
{
fd->write (buffer, offset, len);
return len;
}
java::nio::channels::FileChannel*
gnu::java::nio::FileChannelImpl::implTruncate (jlong size)
{

View File

@ -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 &lt; 0 or index &gt;= 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 &lt; 0 or index &gt;= this
* buffers limit.
*/
public abstract ByteBuffer put (int index, byte b);

View File

@ -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)