+2003-07-13 Michael Koch <konqueror@gmx.de>
+
+ * gnu/java/nio/FileChannelImpl.java,
+ gnu/java/nio/natFileChannelImpl.cc: Removed.
+ * java/io/FileInputStream.java,
+ java/io/FileOutputStream.java,
+ java/io/RandomAccessFile.java,
+ java/nio/MappedByteBufferImpl.java:
+ Import java.nio.channels.FileChannelImpl instead of
+ gnu.java.nio.FileChannelImpl.
+ * java/nio/channels/FileChannelImpl.java,
+ java/nio/channels/natFileChannelImpl.cc:
+ New files.
+ * Makefile.am
+ (ordinary_java_source_files):
+ Removed gnu/java/nio/FileChannelImpl.java and added
+ java/nio/channels/FileChannelImpl.java.
+ (nat source_files):
+ Removed gnu/java/nio/natFileChannelImpl.cc and added
+ java/nio/channels/natFileChannelImpl.cc.
+ * Makefile.in: Regenerated.
+
2003-07-13 Michael Koch <konqueror@gmx.de>
* javax/swing/plaf/basic/BasicBorders.java,
gnu/java/locale/LocaleInformation_zh_TW.java \
gnu/java/math/MPN.java \
gnu/java/nio/DatagramChannelImpl.java \
-gnu/java/nio/FileChannelImpl.java \
gnu/java/nio/FileLockImpl.java \
gnu/java/nio/PipeImpl.java \
gnu/java/nio/SelectionKeyImpl.java \
java/nio/channels/ConnectionPendingException.java \
java/nio/channels/DatagramChannel.java \
java/nio/channels/FileChannel.java \
+java/nio/channels/FileChannelImpl.java \
java/nio/channels/FileLock.java \
java/nio/channels/FileLockInterruptionException.java \
java/nio/channels/GatheringByteChannel.java \
gnu/gcj/runtime/natStringBuffer.cc \
gnu/gcj/runtime/natVMClassLoader.cc \
gnu/java/awt/natEmbeddedWindow.cc \
-gnu/java/nio/natFileChannelImpl.cc \
gnu/java/nio/natFileLockImpl.cc \
gnu/java/nio/natSelectorImpl.cc \
java/io/natFile.cc \
java/net/natPlainDatagramSocketImpl.cc \
java/net/natPlainSocketImpl.cc \
java/nio/natDirectByteBufferImpl.cc \
+java/nio/channels/natFileChannelImpl.cc \
java/text/natCollator.cc \
java/util/natResourceBundle.cc \
java/util/natTimeZone.cc \
gnu/java/locale/LocaleInformation_zh_TW.java \
gnu/java/math/MPN.java \
gnu/java/nio/DatagramChannelImpl.java \
-gnu/java/nio/FileChannelImpl.java \
gnu/java/nio/FileLockImpl.java \
gnu/java/nio/PipeImpl.java \
gnu/java/nio/SelectionKeyImpl.java \
java/nio/channels/ConnectionPendingException.java \
java/nio/channels/DatagramChannel.java \
java/nio/channels/FileChannel.java \
+java/nio/channels/FileChannelImpl.java \
java/nio/channels/FileLock.java \
java/nio/channels/FileLockInterruptionException.java \
java/nio/channels/GatheringByteChannel.java \
gnu/gcj/runtime/natStringBuffer.cc \
gnu/gcj/runtime/natVMClassLoader.cc \
gnu/java/awt/natEmbeddedWindow.cc \
-gnu/java/nio/natFileChannelImpl.cc \
gnu/java/nio/natFileLockImpl.cc \
gnu/java/nio/natSelectorImpl.cc \
java/io/natFile.cc \
java/net/natPlainDatagramSocketImpl.cc \
java/net/natPlainSocketImpl.cc \
java/nio/natDirectByteBufferImpl.cc \
+java/nio/channels/natFileChannelImpl.cc \
java/text/natCollator.cc \
java/util/natResourceBundle.cc \
java/util/natTimeZone.cc \
gnu/gcj/runtime/natNameFinder.lo gnu/gcj/runtime/natSharedLibLoader.lo \
gnu/gcj/runtime/natStackTrace.lo gnu/gcj/runtime/natStringBuffer.lo \
gnu/gcj/runtime/natVMClassLoader.lo gnu/java/awt/natEmbeddedWindow.lo \
-gnu/java/nio/natFileChannelImpl.lo gnu/java/nio/natFileLockImpl.lo \
-gnu/java/nio/natSelectorImpl.lo java/io/natFile.lo \
-java/io/natFileDescriptor.lo java/io/natObjectInputStream.lo \
-java/io/natVMObjectStreamClass.lo java/lang/natCharacter.lo \
-java/lang/natClass.lo java/lang/natClassLoader.lo \
-java/lang/natConcreteProcess.lo java/lang/natDouble.lo \
-java/lang/natFloat.lo java/lang/natMath.lo java/lang/natObject.lo \
-java/lang/natRuntime.lo java/lang/natString.lo \
+gnu/java/nio/natFileLockImpl.lo gnu/java/nio/natSelectorImpl.lo \
+java/io/natFile.lo java/io/natFileDescriptor.lo \
+java/io/natObjectInputStream.lo java/io/natVMObjectStreamClass.lo \
+java/lang/natCharacter.lo java/lang/natClass.lo \
+java/lang/natClassLoader.lo java/lang/natConcreteProcess.lo \
+java/lang/natDouble.lo java/lang/natFloat.lo java/lang/natMath.lo \
+java/lang/natObject.lo java/lang/natRuntime.lo java/lang/natString.lo \
java/lang/natStringBuffer.lo java/lang/natSystem.lo \
java/lang/natThread.lo java/lang/natVMSecurityManager.lo \
java/lang/ref/natReference.lo java/lang/reflect/natArray.lo \
java/lang/reflect/natMethod.lo java/lang/reflect/natProxy.lo \
java/net/natNetworkInterface.lo java/net/natInetAddress.lo \
java/net/natPlainDatagramSocketImpl.lo java/net/natPlainSocketImpl.lo \
-java/nio/natDirectByteBufferImpl.lo java/text/natCollator.lo \
+java/nio/natDirectByteBufferImpl.lo \
+java/nio/channels/natFileChannelImpl.lo java/text/natCollator.lo \
java/util/natResourceBundle.lo java/util/natTimeZone.lo \
java/util/zip/natDeflater.lo java/util/zip/natInflater.lo
lib_org_xml_sax_la_LDFLAGS =
.deps/gnu/java/locale/LocaleInformation_zh_SG.P \
.deps/gnu/java/locale/LocaleInformation_zh_TW.P \
.deps/gnu/java/math/MPN.P .deps/gnu/java/nio/DatagramChannelImpl.P \
-.deps/gnu/java/nio/FileChannelImpl.P .deps/gnu/java/nio/FileLockImpl.P \
-.deps/gnu/java/nio/PipeImpl.P .deps/gnu/java/nio/SelectionKeyImpl.P \
-.deps/gnu/java/nio/SelectorImpl.P \
+.deps/gnu/java/nio/FileLockImpl.P .deps/gnu/java/nio/PipeImpl.P \
+.deps/gnu/java/nio/SelectionKeyImpl.P .deps/gnu/java/nio/SelectorImpl.P \
.deps/gnu/java/nio/SelectorProviderImpl.P \
.deps/gnu/java/nio/ServerSocketChannelImpl.P \
.deps/gnu/java/nio/SocketChannelImpl.P \
.deps/gnu/java/nio/charset/UTF_16Decoder.P \
.deps/gnu/java/nio/charset/UTF_16Encoder.P \
.deps/gnu/java/nio/charset/UTF_16LE.P \
-.deps/gnu/java/nio/charset/UTF_8.P \
-.deps/gnu/java/nio/natFileChannelImpl.P \
-.deps/gnu/java/nio/natFileLockImpl.P \
+.deps/gnu/java/nio/charset/UTF_8.P .deps/gnu/java/nio/natFileLockImpl.P \
.deps/gnu/java/nio/natSelectorImpl.P \
.deps/gnu/java/rmi/RMIMarshalledObjectInputStream.P \
.deps/gnu/java/rmi/RMIMarshalledObjectOutputStream.P \
.deps/java/nio/channels/ConnectionPendingException.P \
.deps/java/nio/channels/DatagramChannel.P \
.deps/java/nio/channels/FileChannel.P \
+.deps/java/nio/channels/FileChannelImpl.P \
.deps/java/nio/channels/FileLock.P \
.deps/java/nio/channels/FileLockInterruptionException.P \
.deps/java/nio/channels/GatheringByteChannel.P \
.deps/java/nio/channels/UnresolvedAddressException.P \
.deps/java/nio/channels/UnsupportedAddressTypeException.P \
.deps/java/nio/channels/WritableByteChannel.P \
+.deps/java/nio/channels/natFileChannelImpl.P \
.deps/java/nio/channels/spi/AbstractInterruptibleChannel.P \
.deps/java/nio/channels/spi/AbstractSelectableChannel.P \
.deps/java/nio/channels/spi/AbstractSelectionKey.P \
+++ /dev/null
-/* FileChannelImpl.java --
- Copyright (C) 2002 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-02111-1307 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-
-package gnu.java.nio;
-
-import java.io.EOFException;
-import java.io.FileDescriptor;
-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.MappedByteBufferImpl;
-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;
-import gnu.gcj.RawData;
-
-/**
- * This file is not user visible !
- * But alas, Java does not have a concept of friendly packages
- * so this class is public.
- * Instances of this class are created by invoking getChannel
- * Upon a Input/Output/RandomAccessFile object.
- */
-
-public class FileChannelImpl extends FileChannel
-{
- public RawData map_address;
-
- int length;
- FileDescriptor fd;
- MappedByteBuffer buf;
- Object file_obj; // just to keep it live...
-
- public FileChannelImpl (FileDescriptor fd, boolean write, Object obj)
- {
- if (!(obj instanceof RandomAccessFile)
- && !(obj instanceof FileInputStream)
- && !(obj instanceof FileOutputStream))
- throw new InternalError ();
-
- this.fd = fd;
- this.file_obj = obj;
- }
-
- public FileChannelImpl ()
- {
- this (new FileDescriptor (), true, null);
- }
-
- private native long implPosition ();
- private native FileChannel implPosition (long newPosition);
- private native FileChannel implTruncate (long size);
-
- private native RawData nio_mmap_file (long pos, long size, int mode);
- private native void nio_unmmap_file (RawData map_address, int size);
- private native void nio_msync (RawData map_address, int length);
-
- public native long size () throws IOException;
-
- protected void implCloseChannel() throws IOException
- {
- if (map_address != null)
- {
- nio_unmmap_file (map_address, (int) length);
- map_address = null;
- }
-
- 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
- {
- // Check if file is mapped into memory.
- if (buf != null)
- {
- // FIXME: implement this
- throw new Error ("Accessing mapped buffers not implemented.");
- }
-
- // File not mapped, access it directly.
- return implRead (dst);
- }
-
- public int read (ByteBuffer dst, long position)
- throws IOException
- {
- if (position < 0)
- throw new IllegalArgumentException ();
-
- if (!isOpen ())
- throw new ClosedChannelException ();
-
- if (file_obj instanceof FileOutputStream)
- throw new NonReadableChannelException ();
-
- 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
- {
- long result = 0;
-
- for (int i = offset; i < offset + length; i++)
- {
- result += read (dsts [i]);
- }
-
- return result;
- }
-
- public int write (ByteBuffer src) throws IOException
- {
- // Check if file is mapped into memory.
- if (buf != null)
- {
- // FIXME: implement this
- throw new Error ("Accessing mapped buffers not implemented.");
- }
-
- // File not mapped, access it directly.
- return implWrite (src);
- }
-
- public int write (ByteBuffer src, long position)
- throws IOException
- {
- if (position < 0)
- throw new IllegalArgumentException ();
-
- if (!isOpen ())
- throw new ClosedChannelException ();
-
- if (file_obj instanceof FileInputStream)
- throw new NonWritableChannelException ();
-
- 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
- {
- long result = 0;
-
- for (int i = offset;i < offset + length;i++)
- {
- result += write (srcs[i]);
- }
-
- return result;
- }
-
- 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 ();
-
- // FIXME: Make this working.
- int cmode = mode.m;
- map_address = nio_mmap_file (position, size, cmode);
- length = (int) size;
- buf = new MappedByteBufferImpl (this);
- return buf;
- }
-
- static MappedByteBuffer create_direct_mapped_buffer (RawData map_address,
- long length)
- throws IOException
- {
- FileChannelImpl ch = new FileChannelImpl ();
- ch.map_address = map_address;
- ch.length = (int) length;
- ch.buf = new MappedByteBufferImpl (ch);
- return ch.buf;
- }
-
- /**
- * msync with the disk
- */
- public void force (boolean metaData) throws IOException
- {
- if (!isOpen ())
- throw new ClosedChannelException ();
-
- // FIXME: What to do with metaData ?
-
- nio_msync (map_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 ();
-
- 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)
- throws IOException
- {
- if (position < 0
- || count < 0)
- throw new IllegalArgumentException ();
-
- if (!isOpen ())
- throw new ClosedChannelException ();
-
- 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)
- throws IOException
- {
- if (position < 0
- || size < 0)
- throw new IllegalArgumentException ();
-
- if (!isOpen ())
- throw new ClosedChannelException ();
-
- if (shared &&
- file_obj instanceof FileOutputStream)
- throw new NonReadableChannelException ();
-
- if (!shared &&
- file_obj instanceof FileInputStream)
- throw new NonWritableChannelException ();
-
- 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 ();
-
- return implPosition ();
- }
-
- public FileChannel position (long newPosition)
- throws IOException
- {
- if (newPosition < 0)
- throw new IllegalArgumentException ();
-
- if (!isOpen ())
- throw new ClosedChannelException ();
-
- return implPosition (newPosition);
- }
-
- public FileChannel truncate (long size)
- throws IOException
- {
- if (size < 0)
- throw new IllegalArgumentException ();
-
- if (!isOpen ())
- throw new ClosedChannelException ();
-
- if (file_obj instanceof FileInputStream)
- throw new NonWritableChannelException ();
-
- return implTruncate (size);
- }
-}
+++ /dev/null
-// natFileChannelImpl.cc
-
-/* Copyright (C) 2003 Free Software Foundation
-
- This file is part of libgcj.
-
-This software is copyrighted work licensed under the terms of the
-Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
-details. */
-
-#include <config.h>
-
-#include <jvm.h>
-
-#include <errno.h>
-#include <string.h>
-#include <sys/types.h>
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
-
-#include <gnu/gcj/RawData.h>
-#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
-gnu::java::nio::FileChannelImpl::size ()
-{
- return fd->getLength ();
-}
-
-jlong
-gnu::java::nio::FileChannelImpl::implPosition ()
-{
- return fd->getFilePointer ();
-}
-
-java::nio::channels::FileChannel*
-gnu::java::nio::FileChannelImpl::implPosition (jlong newPosition)
-{
- fd->seek (newPosition, ::java::io::FileDescriptor::SET, true);
- 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)
-{
- fd->setLength (size);
- return this;
-}
-
-gnu::gcj::RawData*
-gnu::java::nio::FileChannelImpl::nio_mmap_file (jlong /*pos*/, jlong /*size*/,
- jint /*mode*/)
-{
- throw new ::java::io::IOException (JvNewStringUTF ("mmap not implemented"));
-}
-
-void
-gnu::java::nio::FileChannelImpl::nio_unmmap_file (gnu::gcj::RawData* /*address*/,
- jint /*size*/)
-{
- throw new ::java::io::IOException (JvNewStringUTF ("munmap not implemented"));
-}
-
-void
-gnu::java::nio::FileChannelImpl::nio_msync (gnu::gcj::RawData* /*map_address*/,
- jint /*length*/)
-{
- throw new ::java::io::IOException (JvNewStringUTF ("msync not implemented"));
-}
package java.io;
import java.nio.channels.FileChannel;
-import gnu.java.nio.FileChannelImpl;
+import java.nio.channels.FileChannelImpl;
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
package java.io;
import java.nio.channels.FileChannel;
-import gnu.java.nio.FileChannelImpl;
+import java.nio.channels.FileChannelImpl;
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
package java.io;
import java.nio.channels.FileChannel;
-import gnu.java.nio.FileChannelImpl;
+import java.nio.channels.FileChannelImpl;
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
package java.nio;
-import gnu.java.nio.FileChannelImpl;
import java.io.IOException;
+import java.nio.channels.FileChannelImpl;
import gnu.gcj.RawData;
public class MappedByteBufferImpl extends MappedByteBuffer
--- /dev/null
+/* FileChannelImpl.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.nio.channels;
+
+import java.io.EOFException;
+import java.io.FileDescriptor;
+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.MappedByteBufferImpl;
+import gnu.gcj.RawData;
+
+/**
+ * This file is not user visible !
+ * But alas, Java does not have a concept of friendly packages
+ * so this class is public.
+ * Instances of this class are created by invoking getChannel
+ * Upon a Input/Output/RandomAccessFile object.
+ */
+
+public class FileChannelImpl extends FileChannel
+{
+ public RawData map_address;
+
+ int length;
+ FileDescriptor fd;
+ MappedByteBuffer buf;
+ Object file_obj; // just to keep it live...
+
+ public FileChannelImpl (FileDescriptor fd, boolean write, Object obj)
+ {
+ if (!(obj instanceof RandomAccessFile)
+ && !(obj instanceof FileInputStream)
+ && !(obj instanceof FileOutputStream))
+ throw new InternalError ();
+
+ this.fd = fd;
+ this.file_obj = obj;
+ }
+
+ public FileChannelImpl ()
+ {
+ this (new FileDescriptor (), true, null);
+ }
+
+ private native long implPosition ();
+ private native FileChannel implPosition (long newPosition);
+ private native FileChannel implTruncate (long size);
+
+ private native RawData nio_mmap_file (long pos, long size, int mode);
+ private native void nio_unmmap_file (RawData map_address, int size);
+ private native void nio_msync (RawData map_address, int length);
+
+ public native long size () throws IOException;
+
+ protected void implCloseChannel() throws IOException
+ {
+ if (map_address != null)
+ {
+ nio_unmmap_file (map_address, (int) length);
+ map_address = null;
+ }
+
+ 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
+ {
+ // Check if file is mapped into memory.
+ if (buf != null)
+ {
+ // FIXME: implement this
+ throw new Error ("Accessing mapped buffers not implemented.");
+ }
+
+ // File not mapped, access it directly.
+ return implRead (dst);
+ }
+
+ public int read (ByteBuffer dst, long position)
+ throws IOException
+ {
+ if (position < 0)
+ throw new IllegalArgumentException ();
+
+ if (!isOpen ())
+ throw new ClosedChannelException ();
+
+ if (file_obj instanceof FileOutputStream)
+ throw new NonReadableChannelException ();
+
+ 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
+ {
+ long result = 0;
+
+ for (int i = offset; i < offset + length; i++)
+ {
+ result += read (dsts [i]);
+ }
+
+ return result;
+ }
+
+ public int write (ByteBuffer src) throws IOException
+ {
+ // Check if file is mapped into memory.
+ if (buf != null)
+ {
+ // FIXME: implement this
+ throw new Error ("Accessing mapped buffers not implemented.");
+ }
+
+ // File not mapped, access it directly.
+ return implWrite (src);
+ }
+
+ public int write (ByteBuffer src, long position)
+ throws IOException
+ {
+ if (position < 0)
+ throw new IllegalArgumentException ();
+
+ if (!isOpen ())
+ throw new ClosedChannelException ();
+
+ if (file_obj instanceof FileInputStream)
+ throw new NonWritableChannelException ();
+
+ 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
+ {
+ long result = 0;
+
+ for (int i = offset;i < offset + length;i++)
+ {
+ result += write (srcs[i]);
+ }
+
+ return result;
+ }
+
+ 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 ();
+
+ // FIXME: Make this working.
+ int cmode = mode.m;
+ map_address = nio_mmap_file (position, size, cmode);
+ length = (int) size;
+ buf = new MappedByteBufferImpl (this);
+ return buf;
+ }
+
+ static MappedByteBuffer create_direct_mapped_buffer (RawData map_address,
+ long length)
+ throws IOException
+ {
+ FileChannelImpl ch = new FileChannelImpl ();
+ ch.map_address = map_address;
+ ch.length = (int) length;
+ ch.buf = new MappedByteBufferImpl (ch);
+ return ch.buf;
+ }
+
+ /**
+ * msync with the disk
+ */
+ public void force (boolean metaData) throws IOException
+ {
+ if (!isOpen ())
+ throw new ClosedChannelException ();
+
+ // FIXME: What to do with metaData ?
+
+ nio_msync (map_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 ();
+
+ 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)
+ throws IOException
+ {
+ if (position < 0
+ || count < 0)
+ throw new IllegalArgumentException ();
+
+ if (!isOpen ())
+ throw new ClosedChannelException ();
+
+ 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)
+ throws IOException
+ {
+ if (position < 0
+ || size < 0)
+ throw new IllegalArgumentException ();
+
+ if (!isOpen ())
+ throw new ClosedChannelException ();
+
+ if (shared &&
+ file_obj instanceof FileOutputStream)
+ throw new NonReadableChannelException ();
+
+ if (!shared &&
+ file_obj instanceof FileInputStream)
+ throw new NonWritableChannelException ();
+
+ 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 ();
+
+ return implPosition ();
+ }
+
+ public FileChannel position (long newPosition)
+ throws IOException
+ {
+ if (newPosition < 0)
+ throw new IllegalArgumentException ();
+
+ if (!isOpen ())
+ throw new ClosedChannelException ();
+
+ return implPosition (newPosition);
+ }
+
+ public FileChannel truncate (long size)
+ throws IOException
+ {
+ if (size < 0)
+ throw new IllegalArgumentException ();
+
+ if (!isOpen ())
+ throw new ClosedChannelException ();
+
+ if (file_obj instanceof FileInputStream)
+ throw new NonWritableChannelException ();
+
+ return implTruncate (size);
+ }
+}
--- /dev/null
+// natFileChannelImpl.cc
+
+/* Copyright (C) 2003 Free Software Foundation
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#include <config.h>
+
+#include <jvm.h>
+
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#include <gnu/gcj/RawData.h>
+#include <java/io/FileDescriptor.h>
+#include <java/io/IOException.h>
+#include <java/nio/ByteBuffer.h>
+#include <java/nio/channels/FileChannel.h>
+#include <java/nio/channels/FileChannelImpl.h>
+
+jlong
+java::nio::channels::FileChannelImpl::size ()
+{
+ return fd->getLength ();
+}
+
+jlong
+java::nio::channels::FileChannelImpl::implPosition ()
+{
+ return fd->getFilePointer ();
+}
+
+java::nio::channels::FileChannel*
+java::nio::channels::FileChannelImpl::implPosition (jlong newPosition)
+{
+ fd->seek (newPosition, ::java::io::FileDescriptor::SET, true);
+ return this;
+}
+
+jint
+java::nio::channels::FileChannelImpl::implRead (JArray<jbyte>* buffer,
+ jint offset, jint len)
+{
+ return fd->read (buffer, offset, len);
+}
+
+jint
+java::nio::channels::FileChannelImpl::implWrite (JArray<jbyte>* buffer,
+ jint offset, jint len)
+{
+ fd->write (buffer, offset, len);
+ return len;
+}
+
+java::nio::channels::FileChannel*
+java::nio::channels::FileChannelImpl::implTruncate (jlong size)
+{
+ fd->setLength (size);
+ return this;
+}
+
+gnu::gcj::RawData*
+java::nio::channels::FileChannelImpl::nio_mmap_file (jlong /*pos*/, jlong /*size*/,
+ jint /*mode*/)
+{
+ throw new ::java::io::IOException (JvNewStringUTF ("mmap not implemented"));
+}
+
+void
+java::nio::channels::FileChannelImpl::nio_unmmap_file (gnu::gcj::RawData* /*address*/,
+ jint /*size*/)
+{
+ throw new ::java::io::IOException (JvNewStringUTF ("munmap not implemented"));
+}
+
+void
+java::nio::channels::FileChannelImpl::nio_msync (gnu::gcj::RawData* /*map_address*/,
+ jint /*length*/)
+{
+ throw new ::java::io::IOException (JvNewStringUTF ("msync not implemented"));
+}