Merged gcj-eclipse branch to trunk.

From-SVN: r120621
This commit is contained in:
Tom Tromey 2007-01-09 19:58:05 +00:00
parent c648dedbde
commit 97b8365caf
17478 changed files with 606493 additions and 100744 deletions

View file

@ -1,5 +1,5 @@
/* Socket.java -- Client socket implementation
Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004
Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2006
Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -82,13 +82,6 @@ public class Socket
// package-private because ServerSocket.implAccept() needs to access it.
SocketImpl impl;
/**
* True if socket implementation was created by calling their
* create() method.
*/
// package-private because ServerSocket.implAccept() needs to access it.
boolean implCreated;
/**
* True if the socket is bound.
* Package private so it can be set from ServerSocket when accept is called.
@ -298,15 +291,33 @@ public class Socket
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkConnect(raddr.getHostName(), rport);
sm.checkConnect(raddr.getHostAddress(), rport);
// bind socket
SocketAddress bindaddr =
laddr == null ? null : new InetSocketAddress(laddr, lport);
bind(bindaddr);
// connect socket
connect(new InetSocketAddress(raddr, rport));
// Connect socket in case of Exceptions we must close the socket
// because an exception in the constructor means that the caller will
// not have a reference to this instance.
// Note: You may have the idea that the exception treatment
// should be moved into connect() but there is a Mauve test which
// shows that a failed connect should not close the socket.
try
{
connect(new InetSocketAddress(raddr, rport));
}
catch (IOException ioe)
{
impl.close();
throw ioe;
}
catch (RuntimeException re)
{
impl.close();
throw re;
}
// FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port,
// i.e. '0' and if localAddr is unspecified, use getLocalAddress() as
@ -315,21 +326,6 @@ public class Socket
private SocketImpl getImpl() throws SocketException
{
try
{
if (! implCreated)
{
impl.create(true);
implCreated = true;
}
}
catch (IOException e)
{
SocketException se = new SocketException(e.toString());
se.initCause(e);
throw se;
}
return impl;
}
@ -363,6 +359,7 @@ public class Socket
// bind to address/port
try
{
getImpl().create(true);
getImpl().bind(tmp.getAddress(), tmp.getPort());
bound = true;
}
@ -479,16 +476,22 @@ public class Socket
InetAddress addr = null;
try
if (impl instanceof PlainSocketImpl)
addr = ((PlainSocketImpl) impl).getLocalAddress().getAddress();
if (addr == null)
{
addr = (InetAddress) getImpl().getOption(SocketOptions.SO_BINDADDR);
}
catch (SocketException e)
{
// (hopefully) shouldn't happen
// throw new java.lang.InternalError
// ("Error in PlainSocketImpl.getOption");
return null;
try
{
addr = (InetAddress) getImpl().getOption(SocketOptions.SO_BINDADDR);
}
catch (SocketException e)
{
// (hopefully) shouldn't happen
// throw new java.lang.InternalError
// ("Error in PlainSocketImpl.getOption");
return null;
}
}
// FIXME: According to libgcj, checkConnect() is supposed to be called
@ -707,10 +710,10 @@ public class Socket
if (linger > 65535)
linger = 65535;
getImpl().setOption(SocketOptions.SO_LINGER, new Integer(linger));
getImpl().setOption(SocketOptions.SO_LINGER, Integer.valueOf(linger));
}
else
getImpl().setOption(SocketOptions.SO_LINGER, Boolean.valueOf(false));
getImpl().setOption(SocketOptions.SO_LINGER, Integer.valueOf(-1));
}
/**
@ -1001,12 +1004,8 @@ public class Socket
if (isClosed())
return;
getImpl().close();
impl.close();
impl = null;
bound = false;
if (getChannel() != null)
getChannel().close();
}
/**
@ -1019,16 +1018,17 @@ public class Socket
try
{
if (isConnected())
return ("Socket[addr=" + getImpl().getInetAddress() + ",port="
+ getImpl().getPort() + ",localport="
+ getImpl().getLocalPort() + "]");
return (super.toString()
+ " [addr=" + getImpl().getInetAddress() + ",port="
+ getImpl().getPort() + ",localport="
+ getImpl().getLocalPort() + "]");
}
catch (SocketException e)
{
// This cannot happen as we are connected.
}
return "Socket[unconnected]";
return super.toString() + " [unconnected]";
}
/**
@ -1206,17 +1206,10 @@ public class Socket
*/
public boolean isConnected()
{
try
{
if (getImpl() == null)
return false;
return getImpl().getInetAddress() != null;
}
catch (SocketException e)
{
return false;
}
if (impl == null)
return false;
return impl.getInetAddress() != null;
}
/**
@ -1228,6 +1221,13 @@ public class Socket
*/
public boolean isBound()
{
if (isClosed())
return false;
if (impl instanceof PlainSocketImpl)
{
InetSocketAddress addr = ((PlainSocketImpl) impl).getLocalAddress();
return addr != null && addr.getAddress() != null;
}
return bound;
}
@ -1240,7 +1240,9 @@ public class Socket
*/
public boolean isClosed()
{
return impl == null;
SocketChannel channel = getChannel();
return impl == null || (channel != null && ! channel.isOpen());
}
/**