NIOSocket.java (setChannel): Initialize impl.

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.

From-SVN: r72345
This commit is contained in:
Michael Koch 2003-10-11 18:01:35 +00:00 committed by Michael Koch
parent 5a2a057de8
commit 51914674f4
9 changed files with 224 additions and 51 deletions

View File

@ -1,3 +1,34 @@
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,

View File

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

View File

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

View File

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

View File

@ -66,6 +66,7 @@ public final class NIOSocket extends Socket
final void setChannel (SocketChannelImpl channel)
{
this.impl = channel.getImpl();
this.channel = channel;
}

View File

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

View File

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

View File

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

View File

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