aboutsummaryrefslogtreecommitdiff
path: root/libjava/gnu
diff options
context:
space:
mode:
authorMichael Koch <konqueror@gmx.de>2003-05-02 05:35:57 +0000
committerMichael Koch <mkoch@gcc.gnu.org>2003-05-02 05:35:57 +0000
commit4b6eac52d5cddac6803e3bb762523da95f571bf6 (patch)
tree4aa891e39e8bfb18f8fb0e1d235f4f3bf97600d1 /libjava/gnu
parentc67528fe19d425cf537589701f67218ff729130b (diff)
downloadgcc-4b6eac52d5cddac6803e3bb762523da95f571bf6.zip
gcc-4b6eac52d5cddac6803e3bb762523da95f571bf6.tar.gz
gcc-4b6eac52d5cddac6803e3bb762523da95f571bf6.tar.bz2
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
Diffstat (limited to 'libjava/gnu')
-rw-r--r--libjava/gnu/java/nio/FileChannelImpl.java123
-rw-r--r--libjava/gnu/java/nio/natFileChannelImpl.cc16
2 files changed, 100 insertions, 39 deletions
diff --git a/libjava/gnu/java/nio/FileChannelImpl.java b/libjava/gnu/java/nio/FileChannelImpl.java
index c233d82..79a7a58 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,11 +145,33 @@ public class FileChannelImpl extends FileChannel
if (!isOpen ())
throw new ClosedChannelException ();
+
+ if (file_obj instanceof FileOutputStream)
+ throw new NonReadableChannelException ();
+
+ int result;
+ long oldPosition;
+
+ oldPosition = implPosition ();
+ result = implRead (dst);
+ implPosition (oldPosition);
- // FIXME: check for NonReadableChannelException
+ return result;
+ }
- throw new Error ("Not implemented");
+ 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)
- {
- throw new EOFException ("file not mapped");
- }
-
- while (src.hasRemaining ())
+ // Check if file is mapped into memory.
+ if (buf != null)
{
- buf.put (src.get ());
- w++;
+ // FIXME: implement this
+ throw new Error ("Accessing mapped buffers not implemented.");
}
-
- 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 9413a77..b33a79f 100644
--- a/libjava/gnu/java/nio/natFileChannelImpl.cc
+++ b/libjava/gnu/java/nio/natFileChannelImpl.cc
@@ -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)
{