diff options
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 31 | ||||
-rw-r--r-- | libjava/Makefile.am | 3 | ||||
-rw-r--r-- | libjava/Makefile.in | 10 | ||||
-rw-r--r-- | libjava/gnu/java/nio/NIOServerSocket.java | 80 | ||||
-rw-r--r-- | libjava/gnu/java/nio/NIOSocket.java | 1 | ||||
-rw-r--r-- | libjava/gnu/java/nio/ServerSocketChannelImpl.java | 50 | ||||
-rw-r--r-- | libjava/gnu/java/nio/SocketChannelImpl.java | 64 | ||||
-rw-r--r-- | libjava/gnu/java/nio/natNIOServerSocket.cc | 24 | ||||
-rw-r--r-- | libjava/java/net/ServerSocket.java | 12 |
9 files changed, 224 insertions, 51 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index c76ce1ea2d6..78d5b340ca6 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,5 +1,36 @@ 2003-10-11 Michael Koch <konqueror@gmx.de> + * gnu/java/nio/NIOSocket.java (setChannel): Initialize impl. + * gnu/java/nio/ServerSocketChannelImpl.java + (serverSocket): Made it a NIOServerSocket. + (impl): Removed. + (ServerSocketChannelImpl): Initialize only serverSocket. + (initServerSocket): Removed. + (getNativeFD): Rewritten. + (implConfigureBlocking): Set socket timeout and removed comment. + (accept): Rewritten. + * gnu/java/nio/SocketChannelImpl.java + (impl): New variable. + (connected): Removed. + (SocketChannelImpl): Initialize impl too. + (getImpl): New method. + (isConnected): Rewritten. + (read): Rewritten, set position in buffer correctly. + (write): Set position in buffer correctly. + * java/net/ServerSocket.java (getImpl): New method. + * gnu/java/nio/NIOServerSocket.java, + gnu/java/nio/natNIOServerSocket.cc: New files. + * gnu/java/nio/natServerSocketChannelImpl.cc: Removed. + * Makefile.am + (ordinary_java_source_files): + Added gnu/java/nio/NIOServerSocket.java. + (nat_source_files): + Removed gnu/java/nio/natServerSocketChannelImpl.cc + and added gnu/java/nio/natNIOServerSocket.cc. + * Makefile.in: Regenerated. + +2003-10-11 Michael Koch <konqueror@gmx.de> + * java/awt/ActiveEvent.java, java/awt/datatransfer/ClipboardOwner.java, java/awt/datatransfer/FlavorMap.java, diff --git a/libjava/Makefile.am b/libjava/Makefile.am index c2588eb2bb6..47c4b1ad788 100644 --- a/libjava/Makefile.am +++ b/libjava/Makefile.am @@ -2187,6 +2187,7 @@ gnu/java/nio/DatagramChannelSelectionKey.java \ gnu/java/nio/FileLockImpl.java \ gnu/java/nio/NIOConstants.java \ gnu/java/nio/NIODatagramSocket.java \ +gnu/java/nio/NIOServerSocket.java \ gnu/java/nio/NIOSocket.java \ gnu/java/nio/PipeImpl.java \ gnu/java/nio/SelectionKeyImpl.java \ @@ -2659,7 +2660,7 @@ gnu/java/net/natPlainSocketImpl.cc \ gnu/java/net/protocol/core/natCoreInputStream.cc \ gnu/java/nio/natFileLockImpl.cc \ gnu/java/nio/natSelectorImpl.cc \ -gnu/java/nio/natServerSocketChannelImpl.cc \ +gnu/java/nio/natNIOServerSocket.cc \ java/io/natFile.cc \ java/io/natFileDescriptor.cc \ java/io/natObjectInputStream.cc \ diff --git a/libjava/Makefile.in b/libjava/Makefile.in index cbebfe6dbb1..08a68befe1c 100644 --- a/libjava/Makefile.in +++ b/libjava/Makefile.in @@ -1906,6 +1906,7 @@ gnu/java/nio/DatagramChannelSelectionKey.java \ gnu/java/nio/FileLockImpl.java \ gnu/java/nio/NIOConstants.java \ gnu/java/nio/NIODatagramSocket.java \ +gnu/java/nio/NIOServerSocket.java \ gnu/java/nio/NIOSocket.java \ gnu/java/nio/PipeImpl.java \ gnu/java/nio/SelectionKeyImpl.java \ @@ -2377,7 +2378,7 @@ gnu/java/net/natPlainSocketImpl.cc \ gnu/java/net/protocol/core/natCoreInputStream.cc \ gnu/java/nio/natFileLockImpl.cc \ gnu/java/nio/natSelectorImpl.cc \ -gnu/java/nio/natServerSocketChannelImpl.cc \ +gnu/java/nio/natNIOServerSocket.cc \ java/io/natFile.cc \ java/io/natFileDescriptor.cc \ java/io/natObjectInputStream.cc \ @@ -2555,7 +2556,7 @@ gnu/java/net/natPlainDatagramSocketImpl.lo \ gnu/java/net/natPlainSocketImpl.lo \ gnu/java/net/protocol/core/natCoreInputStream.lo \ gnu/java/nio/natFileLockImpl.lo gnu/java/nio/natSelectorImpl.lo \ -gnu/java/nio/natServerSocketChannelImpl.lo java/io/natFile.lo \ +gnu/java/nio/natNIOServerSocket.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 \ @@ -3035,7 +3036,8 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \ .deps/gnu/java/nio/DatagramChannelImpl.P \ .deps/gnu/java/nio/DatagramChannelSelectionKey.P \ .deps/gnu/java/nio/FileLockImpl.P .deps/gnu/java/nio/NIOConstants.P \ -.deps/gnu/java/nio/NIODatagramSocket.P .deps/gnu/java/nio/NIOSocket.P \ +.deps/gnu/java/nio/NIODatagramSocket.P \ +.deps/gnu/java/nio/NIOServerSocket.P .deps/gnu/java/nio/NIOSocket.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 \ @@ -3052,8 +3054,8 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.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/natFileLockImpl.P \ +.deps/gnu/java/nio/natNIOServerSocket.P \ .deps/gnu/java/nio/natSelectorImpl.P \ -.deps/gnu/java/nio/natServerSocketChannelImpl.P \ .deps/gnu/java/rmi/RMIMarshalledObjectInputStream.P \ .deps/gnu/java/rmi/RMIMarshalledObjectOutputStream.P \ .deps/gnu/java/rmi/dgc/DGCImpl.P .deps/gnu/java/rmi/dgc/DGCImpl_Skel.P \ diff --git a/libjava/gnu/java/nio/NIOServerSocket.java b/libjava/gnu/java/nio/NIOServerSocket.java new file mode 100644 index 00000000000..89def3bb5ee --- /dev/null +++ b/libjava/gnu/java/nio/NIOServerSocket.java @@ -0,0 +1,80 @@ +/* NIOServerSocket.java -- + Copyright (C) 2003 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 gnu.java.net.PlainSocketImpl; +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; + +/** + * @author Michael Koch + */ +public final class NIOServerSocket extends ServerSocket +{ + private PlainSocketImpl impl; + private ServerSocketChannelImpl channel; + + protected NIOServerSocket (ServerSocketChannelImpl channel) + throws IOException + { + super(); + this.channel = channel; + } + + public native PlainSocketImpl getPlainSocketImpl(); + + public ServerSocketChannel getChannel() + { + return channel; + } + + public Socket accept() throws IOException + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkListen (getLocalPort()); + + SocketChannel socketChannel = channel.provider().openSocketChannel(); + implAccept (socketChannel.socket()); + return socketChannel.socket(); + } +} diff --git a/libjava/gnu/java/nio/NIOSocket.java b/libjava/gnu/java/nio/NIOSocket.java index bbdddccbdb0..ba9807396be 100644 --- a/libjava/gnu/java/nio/NIOSocket.java +++ b/libjava/gnu/java/nio/NIOSocket.java @@ -66,6 +66,7 @@ public final class NIOSocket extends Socket final void setChannel (SocketChannelImpl channel) { + this.impl = channel.getImpl(); this.channel = channel; } diff --git a/libjava/gnu/java/nio/ServerSocketChannelImpl.java b/libjava/gnu/java/nio/ServerSocketChannelImpl.java index 3ee0ae0849b..89bbdec8746 100644 --- a/libjava/gnu/java/nio/ServerSocketChannelImpl.java +++ b/libjava/gnu/java/nio/ServerSocketChannelImpl.java @@ -1,5 +1,5 @@ /* ServerSocketChannelImpl.java -- - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -44,14 +44,17 @@ import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketAddress; +import java.net.SocketException; +import java.net.SocketTimeoutException; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.NotYetBoundException; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.channels.spi.SelectorProvider; public final class ServerSocketChannelImpl extends ServerSocketChannel { - ServerSocket serverSocket; - PlainSocketImpl impl; + NIOServerSocket serverSocket; boolean blocking = true; boolean connected = false; @@ -59,20 +62,12 @@ public final class ServerSocketChannelImpl extends ServerSocketChannel throws IOException { super (provider); - impl = new PlainSocketImpl(); - initServerSocket(); + serverSocket = new NIOServerSocket (this); } - /* - * This method is only need to call a package private constructor - * of java.net.ServerSocket. It only initializes the member variables - * "serverSocket". - */ - private native void initServerSocket() throws IOException; - public int getNativeFD() { - return impl.getNativeFD(); + return serverSocket.getPlainSocketImpl().getNativeFD(); } public void finalizer() @@ -97,15 +92,34 @@ public final class ServerSocketChannelImpl extends ServerSocketChannel protected void implConfigureBlocking (boolean blocking) throws IOException { - this.blocking = blocking; // FIXME + serverSocket.setSoTimeout (blocking ? 0 : NIOConstants.DEFAULT_TIMEOUT); + this.blocking = blocking; } public SocketChannel accept () throws IOException { - SocketChannelImpl result = new SocketChannelImpl (provider ()); - Socket socket = serverSocket.accept(); - //socket.setChannel (result); // FIXME - return result; + if (!isOpen()) + throw new ClosedChannelException(); + + if (!serverSocket.isBound()) + throw new NotYetBoundException(); + + boolean completed = false; + + try + { + NIOSocket socket = (NIOSocket) serverSocket.accept(); + completed = true; + return socket.getChannel(); + } + catch (SocketTimeoutException e) + { + return null; + } + finally + { + end (completed); + } } public ServerSocket socket () diff --git a/libjava/gnu/java/nio/SocketChannelImpl.java b/libjava/gnu/java/nio/SocketChannelImpl.java index 632d743abb1..0478e32ea99 100644 --- a/libjava/gnu/java/nio/SocketChannelImpl.java +++ b/libjava/gnu/java/nio/SocketChannelImpl.java @@ -63,16 +63,17 @@ import gnu.classpath.Configuration; public final class SocketChannelImpl extends SocketChannel { + private PlainSocketImpl impl; private NIOSocket socket; private boolean blocking = true; - private boolean connected = false; private boolean connectionPending = false; SocketChannelImpl (SelectorProvider provider) throws IOException { super (provider); - socket = new NIOSocket (new PlainSocketImpl(), this); + impl = new PlainSocketImpl(); + socket = new NIOSocket (impl, this); } SocketChannelImpl (SelectorProvider provider, @@ -80,8 +81,8 @@ public final class SocketChannelImpl extends SocketChannel throws IOException { super (provider); + this.impl = socket.getImpl(); this.socket = socket; - this.connected = socket.isConnected(); } public void finalizer() @@ -98,6 +99,11 @@ public final class SocketChannelImpl extends SocketChannel } } + PlainSocketImpl getImpl() + { + return impl; + } + int getNativeFD() { return socket.getImpl().getNativeFD(); @@ -105,7 +111,6 @@ public final class SocketChannelImpl extends SocketChannel protected void implCloseSelectableChannel () throws IOException { - connected = false; socket.close(); } @@ -136,7 +141,6 @@ public final class SocketChannelImpl extends SocketChannel { // Do blocking connect. socket.connect (remote); - connected = true; return true; } @@ -144,7 +148,6 @@ public final class SocketChannelImpl extends SocketChannel try { socket.connect (remote, NIOConstants.DEFAULT_TIMEOUT); - connected = true; return true; } catch (SocketTimeoutException e) @@ -174,7 +177,6 @@ public final class SocketChannelImpl extends SocketChannel if (isBlocking()) { selector.select(); // blocking until channel is connected. - connected = true; connectionPending = false; return true; } @@ -182,7 +184,6 @@ public final class SocketChannelImpl extends SocketChannel int ready = selector.selectNow(); // non-blocking if (ready == 1) { - connected = true; connectionPending = false; return true; } @@ -192,7 +193,7 @@ public final class SocketChannelImpl extends SocketChannel public boolean isConnected () { - return connected; + return socket.isConnected(); } public boolean isConnectionPending () @@ -207,13 +208,21 @@ public final class SocketChannelImpl extends SocketChannel public int read (ByteBuffer dst) throws IOException { - if (!connected) + if (!isConnected()) throw new NotYetConnectedException(); byte[] data; int offset = 0; + InputStream input = socket.getInputStream(); + int available = input.available(); int len = dst.remaining(); + if (available == 0) + return 0; + + if (len > available) + len = available; + if (dst.hasArray()) { offset = dst.arrayOffset() + dst.position(); @@ -224,15 +233,6 @@ public final class SocketChannelImpl extends SocketChannel data = new byte [len]; } - InputStream input = socket.getInputStream(); - int available = input.available(); - - if (available == 0) - return 0; - - if (len > available) - len = available; - int readBytes = 0; boolean completed = false; @@ -247,11 +247,15 @@ public final class SocketChannelImpl extends SocketChannel end (completed); } - if (readBytes > 0 - && !dst.hasArray()) - { - dst.put (data, offset, len); - } + if (readBytes > 0) + if (dst.hasArray()) + { + dst.position (dst.position() + readBytes); + } + else + { + dst.put (data, offset, len); + } return readBytes; } @@ -259,7 +263,7 @@ public final class SocketChannelImpl extends SocketChannel public long read (ByteBuffer[] dsts, int offset, int length) throws IOException { - if (!connected) + if (!isConnected()) throw new NotYetConnectedException(); if ((offset < 0) @@ -279,7 +283,7 @@ public final class SocketChannelImpl extends SocketChannel public int write (ByteBuffer src) throws IOException { - if (!connected) + if (!isConnected()) throw new NotYetConnectedException(); byte[] data; @@ -301,13 +305,19 @@ public final class SocketChannelImpl extends SocketChannel OutputStream output = socket.getOutputStream(); output.write (data, offset, len); + + if (src.hasArray()) + { + src.position (src.position() + len); + } + return len; } public long write (ByteBuffer[] srcs, int offset, int length) throws IOException { - if (!connected) + if (!isConnected()) throw new NotYetConnectedException(); if ((offset < 0) diff --git a/libjava/gnu/java/nio/natNIOServerSocket.cc b/libjava/gnu/java/nio/natNIOServerSocket.cc new file mode 100644 index 00000000000..2d3fb2db760 --- /dev/null +++ b/libjava/gnu/java/nio/natNIOServerSocket.cc @@ -0,0 +1,24 @@ +// natNIOServerSocket.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 <platform.h> + +#include <gnu/java/net/PlainSocketImpl.h> +#include <gnu/java/nio/NIOServerSocket.h> +#include <java/net/ServerSocket.h> +#include <java/net/SocketImpl.h> + +gnu::java::net::PlainSocketImpl* +gnu::java::nio::NIOServerSocket::getPlainSocketImpl() +{ + return (gnu::java::net::PlainSocketImpl*) + ::java::net::ServerSocket::getImpl(); +} diff --git a/libjava/java/net/ServerSocket.java b/libjava/java/net/ServerSocket.java index 6b5544b3a27..f4d1ecc45de 100644 --- a/libjava/java/net/ServerSocket.java +++ b/libjava/java/net/ServerSocket.java @@ -76,7 +76,7 @@ public class ServerSocket private boolean closed = false; /* - * This is only used by java.nio. + * This constructor is only used by java.nio. */ // FIXME: Workaround a bug in gcj. //ServerSocket (PlainSocketImpl impl) throws IOException @@ -85,6 +85,16 @@ public class ServerSocket this.impl = impl; this.impl.create (true); } + + /* + * This method is only used by java.nio. + */ + // FIXME: Workaround a bug in gcj. + //PlainSocketImpl getImpl() + SocketImpl getImpl() + { + return impl; + } /** * Constructor that simply sets the implementation. |