diff options
author | mkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-10-11 18:01:35 +0000 |
---|---|---|
committer | mkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-10-11 18:01:35 +0000 |
commit | e95addcda5341dfee5599f8347c30f58ae3a8be6 (patch) | |
tree | f3c9f1f5921233e31d10682889fd919d402a47e7 /libjava/gnu/java/nio | |
parent | 88a78d982ea6dc0ca6049e836a1fb17c489dc877 (diff) | |
download | gcc-e95addcda5341dfee5599f8347c30f58ae3a8be6.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72345 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/gnu/java/nio')
-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 |
5 files changed, 174 insertions, 45 deletions
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(); +} |