2002-09-25 Michael Koch <konqueror@gmx.de>

* java/net/DatagramSocket.java
	(DatagramSocket): Initialize new instance variables.
	(close): Reset new instance variables.
	(getLocalAddress): Remove unneeded SecurityManager usage.
	(getLocalPort): Check if socket is already bound.
	(isConnected): New method.
	(getInetAddress): Implemented.
	(getPort): Better Implementation, documentation fixed.
	(getRemoteSocketAddress): New method.
	* java/net/JarURLConnection.java
	(element): Typo fixed.
	(getMainAttributes): New method.
	(getAttributes): New method (stub only).
	(getManifest): New method (stub only).
	* java/net/NetPermission.java: Added serialVersionsUID.
	* java/net/Socket.java
	(connect): Check blocking mode of associated channel,
	documentation added.
	(getLocalSocketAddress): Better implementation.
	(getRemoteSocketAddress): Implemented.
	(isBound): New method.
	(setSendBufferSize): Documentation added.
	* java/net/SocketAddress.java: Added serialVersionsUID.
	* java/net/SocketPermission.java: Added serialVersionsUID.
	* java/net/URL.java
	(URL): Wrap for shorter lines, initialize new instance variables,
	documentation added.
	(equals): Check new instance variables too.
	(getContent): Documentation added.
	(getPath): Documentation added.
	(getAuthority): New method.
	(getHost): Documentation added.
	(getPort): Documentation added.
	(getDefaultPort): New method.
	(getProtocol): Documentation added.
	(getUserInfo): Documentation added.
	(set): Initialize new instance variables, documentation added.
	* java/net/URLStreamHandler.java
	(setURL): New method.
	* java/net/natPlainDatagramSocketImpl.cc
	(connect): Fix exception name.
	(disconnect): Fix exception name.

From-SVN: r57501
This commit is contained in:
Michael Koch 2002-09-25 17:14:09 +00:00 committed by Michael Koch
parent 6f950405a0
commit fc44b85de7
10 changed files with 320 additions and 32 deletions

View file

@ -1,3 +1,48 @@
2002-09-25 Michael Koch <konqueror@gmx.de>
* java/net/DatagramSocket.java
(DatagramSocket): Initialize new instance variables.
(close): Reset new instance variables.
(getLocalAddress): Remove unneeded SecurityManager usage.
(getLocalPort): Check if socket is already bound.
(isConnected): New method.
(getInetAddress): Implemented.
(getPort): Better Implementation, documentation fixed.
(getRemoteSocketAddress): New method.
* java/net/JarURLConnection.java
(element): Typo fixed.
(getMainAttributes): New method.
(getAttributes): New method (stub only).
(getManifest): New method (stub only).
* java/net/NetPermission.java: Added serialVersionsUID.
* java/net/Socket.java
(connect): Check blocking mode of associated channel,
documentation added.
(getLocalSocketAddress): Better implementation.
(getRemoteSocketAddress): Implemented.
(isBound): New method.
(setSendBufferSize): Documentation added.
* java/net/SocketAddress.java: Added serialVersionsUID.
* java/net/SocketPermission.java: Added serialVersionsUID.
* java/net/URL.java
(URL): Wrap for shorter lines, initialize new instance variables,
documentation added.
(equals): Check new instance variables too.
(getContent): Documentation added.
(getPath): Documentation added.
(getAuthority): New method.
(getHost): Documentation added.
(getPort): Documentation added.
(getDefaultPort): New method.
(getProtocol): Documentation added.
(getUserInfo): Documentation added.
(set): Initialize new instance variables, documentation added.
* java/net/URLStreamHandler.java
(setURL): New method.
* java/net/natPlainDatagramSocketImpl.cc
(connect): Fix exception name.
(disconnect): Fix exception name.
2002-09-25 Michael Koch <konqueror@gmx.de> 2002-09-25 Michael Koch <konqueror@gmx.de>
* java/nio/channels/spi/AbstractSelectableChannel.java: New file. * java/nio/channels/spi/AbstractSelectableChannel.java: New file.

View file

@ -37,6 +37,9 @@ public class DatagramSocket
DatagramChannel ch; DatagramChannel ch;
private InetAddress remoteAddress;
private int remotePort;
/** /**
* Creates a DatagramSocket * Creates a DatagramSocket
* *
@ -59,6 +62,8 @@ public class DatagramSocket
protected DatagramSocket (DatagramSocketImpl impl) protected DatagramSocket (DatagramSocketImpl impl)
{ {
this.impl = impl; this.impl = impl;
this.remoteAddress = null;
this.remotePort = -1;
} }
/** /**
@ -134,6 +139,9 @@ public class DatagramSocket
impl.setOption(SocketOptions.SO_REUSEADDR, new Boolean(true)); impl.setOption(SocketOptions.SO_REUSEADDR, new Boolean(true));
impl.bind(port, laddr == null ? InetAddress.ANY_IF : laddr); impl.bind(port, laddr == null ? InetAddress.ANY_IF : laddr);
remoteAddress = null;
remotePort = -1;
} }
/** /**
@ -169,6 +177,8 @@ public class DatagramSocket
public void close() public void close()
{ {
impl.close(); impl.close();
remoteAddress = null;
remotePort = -1;
} }
/** /**
@ -198,7 +208,6 @@ public class DatagramSocket
*/ */
public InetAddress getLocalAddress() public InetAddress getLocalAddress()
{ {
SecurityManager s = System.getSecurityManager();
// FIXME: JCL p. 510 says this should call checkConnect. But what // FIXME: JCL p. 510 says this should call checkConnect. But what
// string should be used as the hostname? Maybe this is just a side // string should be used as the hostname? Maybe this is just a side
// effect of calling InetAddress.getLocalHost. // effect of calling InetAddress.getLocalHost.
@ -241,6 +250,9 @@ public class DatagramSocket
*/ */
public int getLocalPort() public int getLocalPort()
{ {
if (!isBound ())
return -1;
return impl.getLocalPort(); return impl.getLocalPort();
} }
@ -416,6 +428,16 @@ public class DatagramSocket
return true; return true;
} }
/**
* Returns the connection state of the socket
*
* @since 1.4
*/
public boolean isConnected()
{
return remoteAddress != null;
}
/** /**
* Returns the InetAddress the socket is connected to * Returns the InetAddress the socket is connected to
* or null if the socket is not connected * or null if the socket is not connected
@ -424,18 +446,37 @@ public class DatagramSocket
*/ */
public InetAddress getInetAddress() public InetAddress getInetAddress()
{ {
// FIXME: if (!isConnected ())
return null; return null;
return remoteAddress;
} }
/** /**
* Returns the local port number of the socket * Returns the port number the socket is connected to or -1 if not connected
* *
* @since 1.2 * @since 1.2
*/ */
public int getPort() public int getPort()
{ {
return impl.localPort; if (!isConnected ())
return -1;
return remotePort;
}
/**
* Returns the SocketAddress of the host this socket is conneted to
* or null if this socket is not connected
*
* @since 1.4
*/
public SocketAddress getRemoteSocketAddress()
{
if (!isConnected ())
return null;
return new InetSocketAddress (remoteAddress, remotePort);
} }
/** /**

View file

@ -34,7 +34,7 @@ public abstract class JarURLConnection extends URLConnection
* either case this describes just the jar file itself. */ * either case this describes just the jar file itself. */
protected URLConnection jarFileURLConnection; protected URLConnection jarFileURLConnection;
// If this is a connection to a jar file element this is set, otherwose null. // If this is a connection to a jar file element this is set, otherwise null.
private final String element; private final String element;
// Cached JarURLConnection's // Cached JarURLConnection's
@ -349,4 +349,39 @@ public abstract class JarURLConnection extends URLConnection
{ {
return getJarEntry().getCertificates(); return getJarEntry().getCertificates();
} }
/**
* Returns the main Attributes for the JAR file for this connection
*
* @exception IOException If an error occurs
*/
public Attributes getMainAttributes () throws IOException
{
return getManifest ().getMainAttributes ();
}
/**
* Return the Attributes object for this connection if the URL for it points
* to a JAR file entry, null otherwise
*
* @exception IOException If an error occurs
*/
public Attributes getAttributes () throws IOException
{
// FIXME: implement this
return null;
}
/**
* Returns the Manifest for this connection, or null if none
*
* @exception IOException If an error occurs
*/
public Manifest getManifest () throws IOException
{
JarFile file = getJarFile ();
// FIXME: implement this
return null;
}
} }

View file

@ -50,6 +50,8 @@ import java.security.BasicPermission;
public final class NetPermission extends BasicPermission public final class NetPermission extends BasicPermission
implements java.io.Serializable implements java.io.Serializable
{ {
static final long serialVersionUID = -8343910153355041693L;
/** /**
* Initializes a new instance of <code>NetPermission</code> with the * Initializes a new instance of <code>NetPermission</code> with the
* specified name. * specified name.

View file

@ -39,6 +39,7 @@ package java.net;
import java.io.*; import java.io.*;
import java.nio.channels.SocketChannel; import java.nio.channels.SocketChannel;
import java.nio.channels.IllegalBlockingModeException;
/* Written using on-line Java Platform 1.2 API Specification. /* Written using on-line Java Platform 1.2 API Specification.
* Status: I believe all methods are implemented. * Status: I believe all methods are implemented.
@ -310,7 +311,8 @@ public class Socket
* *
* @exception IOException If an error occurs * @exception IOException If an error occurs
* @exception IllegalArgumentException If the addess type is not supported * @exception IllegalArgumentException If the addess type is not supported
* @exception IllegalBlockingModeException FIXME * @exception IllegalBlockingModeException If this socket has an associated
* channel, and the channel is in non-blocking mode
* *
* @since 1.4 * @since 1.4
*/ */
@ -320,6 +322,9 @@ public class Socket
if (! (endpoint instanceof InetSocketAddress)) if (! (endpoint instanceof InetSocketAddress))
throw new IllegalArgumentException ("Address type not supported"); throw new IllegalArgumentException ("Address type not supported");
if (ch != null && !ch.isBlocking ())
throw new IllegalBlockingModeException ();
impl.connect (endpoint, 0); impl.connect (endpoint, 0);
} }
@ -332,7 +337,8 @@ public class Socket
* *
* @exception IOException If an error occurs * @exception IOException If an error occurs
* @exception IllegalArgumentException If the address type is not supported * @exception IllegalArgumentException If the address type is not supported
* @exception IllegalBlockingModeException FIXME * @exception IllegalBlockingModeException If this socket has an associated
* channel, and the channel is in non-blocking mode
* @exception SocketTimeoutException If the timeout is reached * @exception SocketTimeoutException If the timeout is reached
* *
* @since 1.4 * @since 1.4
@ -343,6 +349,9 @@ public class Socket
if (! (endpoint instanceof InetSocketAddress)) if (! (endpoint instanceof InetSocketAddress))
throw new IllegalArgumentException ("Address type not supported"); throw new IllegalArgumentException ("Address type not supported");
if (ch != null && !ch.isBlocking ())
throw new IllegalBlockingModeException ();
impl.connect (endpoint, timeout); impl.connect (endpoint, timeout);
} }
@ -432,16 +441,10 @@ public class Socket
*/ */
public SocketAddress getLocalSocketAddress() public SocketAddress getLocalSocketAddress()
{ {
InetAddress addr; InetAddress addr = getLocalAddress ();
try if (addr == null)
{
addr = (InetAddress) impl.getOption (SocketOptions.SO_BINDADDR);
}
catch (SocketException e)
{
return null; return null;
}
return new InetSocketAddress (addr, impl.getLocalPort()); return new InetSocketAddress (addr, impl.getLocalPort());
} }
@ -454,8 +457,7 @@ public class Socket
*/ */
public SocketAddress getRemoteSocketAddress() public SocketAddress getRemoteSocketAddress()
{ {
// FIXME: Implement this return new InetSocketAddress (impl.getInetAddress (), impl.getPort ());
return null;
} }
/** /**
@ -701,7 +703,7 @@ public class Socket
* @param size The new send buffer size. * @param size The new send buffer size.
* *
* @exception SocketException If an error occurs or Socket not connected * @exception SocketException If an error occurs or Socket not connected
* @exception IllegalArgumentException FIXME * @exception IllegalArgumentException If size is 0 or negative
* *
* @since 1.2 * @since 1.2
*/ */
@ -990,4 +992,12 @@ public class Socket
impl.setOption (SocketOptions.IP_TOS, new Integer (tc)); impl.setOption (SocketOptions.IP_TOS, new Integer (tc));
} }
/**
* Checks if the socket is already bound.
*/
public boolean isBound ()
{
return getLocalAddress () != null;
}
} }

View file

@ -47,6 +47,8 @@ import java.io.*;
public abstract class SocketAddress implements Serializable public abstract class SocketAddress implements Serializable
{ {
static final long serialVersionUID = 5215720748342549866L;
public SocketAddress() public SocketAddress()
{ {
} }

View file

@ -37,6 +37,7 @@ exception statement from your version. */
package java.net; package java.net;
import java.io.Serializable;
import java.security.Permission; import java.security.Permission;
import java.security.PermissionCollection; import java.security.PermissionCollection;
@ -100,8 +101,9 @@ import java.security.PermissionCollection;
* @author Aaron M. Renn (arenn@urbanophile.com) * @author Aaron M. Renn (arenn@urbanophile.com)
*/ */
public final class SocketPermission extends Permission public final class SocketPermission extends Permission
implements java.io.Serializable implements Serializable
{ {
static final long serialVersionUID = -7204263841984476862L;
// FIXME: Needs serialization work, including readObject/writeObject methods. // FIXME: Needs serialization work, including readObject/writeObject methods.
/** /**

View file

@ -28,9 +28,12 @@ import java.util.StringTokenizer;
public final class URL implements Serializable public final class URL implements Serializable
{ {
private String protocol; private String protocol;
private String authority;
private String userInfo;
private String host; private String host;
private int port = -1; // Initialize for constructor using context. private int port = -1; // Initialize for constructor using context.
private String file; private String file;
private String query;
private String ref; private String ref;
private int hashCode = 0; private int hashCode = 0;
transient private URLStreamHandler handler; transient private URLStreamHandler handler;
@ -39,19 +42,50 @@ public final class URL implements Serializable
private static final long serialVersionUID = -7627629688361524110L; private static final long serialVersionUID = -7627629688361524110L;
/**
* Creates an URL object from the given arguments
*
* @param protocol The protocol of the URL
* @param host The host of the URL
* @param port The port of the URL
* @param file The file of the URL
*
* @exception MalformedURLException If an error occurs
*/
public URL(String protocol, String host, int port, String file) public URL(String protocol, String host, int port, String file)
throws MalformedURLException throws MalformedURLException
{ {
this(protocol, host, port, file, null); this(protocol, host, port, file, null);
} }
/**
* Creates an URL object from the given arguments
*
* @param protocol The protocol of the URL
* @param host The host of the URL
* @param file The file of the URL
*
* @exception MalformedURLException If an error occurs
*/
public URL(String protocol, String host, String file) public URL(String protocol, String host, String file)
throws MalformedURLException throws MalformedURLException
{ {
this(protocol, host, -1, file, null); this(protocol, host, -1, file, null);
} }
// JDK1.2 /**
* Creates an URL object from the given arguments
*
* @param protocol The protocol of the URL
* @param host The host of the URL
* @param port The port of the URL
* @param file The file of the URL
* @param handler The stream handler for the URL
*
* @exception MalformedURLException If an error occurs
*
* @since 1.2
*/
public URL(String protocol, String host, int port, String file, public URL(String protocol, String host, int port, String file,
URLStreamHandler handler) throws MalformedURLException URLStreamHandler handler) throws MalformedURLException
{ {
@ -76,11 +110,14 @@ public final class URL implements Serializable
this.handler = setURLStreamHandler(protocol); this.handler = setURLStreamHandler(protocol);
if (this.handler == null) if (this.handler == null)
throw new MalformedURLException("Protocol handler not found: " + protocol); throw new MalformedURLException (
"Protocol handler not found: " + protocol);
this.host = host; this.host = host;
this.port = port; this.port = port;
this.userInfo = null;
this.authority = null;
this.query = null;
int hashAt = file.indexOf('#'); int hashAt = file.indexOf('#');
if (hashAt < 0) if (hashAt < 0)
@ -96,17 +133,42 @@ public final class URL implements Serializable
hashCode = hashCode(); // Used for serialization. hashCode = hashCode(); // Used for serialization.
} }
/**
* Creates an URL object from the given arguments
*
* @param spec The string to parse an URL
*
* @exception MalformedURLException If an error occurs
*/
public URL(String spec) throws MalformedURLException public URL(String spec) throws MalformedURLException
{ {
this((URL) null, spec, (URLStreamHandler) null); this((URL) null, spec, (URLStreamHandler) null);
} }
/**
* Creates an URL object from the given arguments
*
* @param context The context on which to parse the specification
* @param spec The string to parse an URL
*
* @exception MalformedURLException If an error occurs
*/
public URL(URL context, String spec) throws MalformedURLException public URL(URL context, String spec) throws MalformedURLException
{ {
this(context, spec, (URLStreamHandler) null); this(context, spec, (URLStreamHandler) null);
} }
// JDK1.2 /**
* Creates an URL from given arguments
*
* @param context The context in which to parse the specification
* @param spec The string to parse as an URL
* @param handler The stream handler for the URL
*
* @exception MalformedURLException If an error occurs
*
* @since 1.2
*/
public URL(URL context, String spec, URLStreamHandler handler) public URL(URL context, String spec, URLStreamHandler handler)
throws MalformedURLException throws MalformedURLException
{ {
@ -142,6 +204,9 @@ public final class URL implements Serializable
host = context.host; host = context.host;
port = context.port; port = context.port;
file = context.file; file = context.file;
userInfo = context.userInfo;
authority = context.authority;
query = context.query;
} }
} }
else if (context != null) else if (context != null)
@ -153,6 +218,9 @@ public final class URL implements Serializable
host = context.host; host = context.host;
port = context.port; port = context.port;
file = context.file; file = context.file;
userInfo = context.userInfo;
authority = context.authority;
query = context.query;
} }
else // Protocol NOT specified in spec. and no context available. else // Protocol NOT specified in spec. and no context available.
throw new throw new
@ -202,14 +270,25 @@ public final class URL implements Serializable
return (port == uObj.port return (port == uObj.port
&& ((protocol == null && uObj.protocol == null) && ((protocol == null && uObj.protocol == null)
|| (protocol != null && protocol.equals(uObj.protocol))) || (protocol != null && protocol.equals(uObj.protocol)))
&& ((userInfo == null && uObj.userInfo == null)
|| (userInfo != null && userInfo.equals(uObj.userInfo)))
&& ((authority == null && uObj.authority == null)
|| (authority != null && authority.equals(uObj.authority)))
&& ((host == null && uObj.host == null) && ((host == null && uObj.host == null)
|| (host != null && host.equals(uObj.host))) || (host != null && host.equals(uObj.host)))
&& ((file == null && uObj.file == null) && ((file == null && uObj.file == null)
|| (file != null && file.equals(uObj.file))) || (file != null && file.equals(uObj.file)))
&& ((query == null && uObj.query == null)
|| (query != null && query.equals(uObj.query)))
&& ((ref == null && uObj.ref == null) && ((ref == null && uObj.ref == null)
|| (ref != null && ref.equals(uObj.ref)))); || (ref != null && ref.equals(uObj.ref))));
} }
/**
* Gets the contents of this URL
*
* @since 1.3
*/
public final Object getContent() throws IOException public final Object getContent() throws IOException
{ {
return openConnection().getContent(); return openConnection().getContent();
@ -220,22 +299,54 @@ public final class URL implements Serializable
return file; return file;
} }
/**
* Returns the path of the URL
*
* @since 1.3
*/
public String getPath() public String getPath()
{ {
int quest = file.indexOf('?'); int quest = file.indexOf('?');
return quest < 0 ? file : file.substring(0, quest); return quest < 0 ? file : file.substring(0, quest);
} }
/**
* Returns the authority of the URL
*
* @since 1.3
*/
public String getAuthority()
{
return authority;
}
/**
* Returns the host of the URL
*/
public String getHost() public String getHost()
{ {
return host; return host;
} }
/**
* Returns of port of the URL
*/
public int getPort() public int getPort()
{ {
return port; return port;
} }
/**
* Returns the default port of the URL
*/
public int getDefaultPort()
{
return 0;
}
/**
* Returns the protocol of the URL
*/
public String getProtocol() public String getProtocol()
{ {
return protocol; return protocol;
@ -246,6 +357,9 @@ public final class URL implements Serializable
return ref; return ref;
} }
/**
* Returns the user information of the URL
*/
public String getUserInfo () public String getUserInfo ()
{ {
int at = host.indexOf('@'); int at = host.indexOf('@');
@ -290,6 +404,11 @@ public final class URL implements Serializable
return handler.sameFile(this, other); return handler.sameFile(this, other);
} }
/**
* Sets the specified fields of the URL. This is not a public method so
* that only URLStreamHandlers can modify URL fields. URLs are otherwise
* constant
*/
protected void set(String protocol, String host, int port, String file, protected void set(String protocol, String host, int port, String file,
String ref) String ref)
{ {
@ -299,14 +418,23 @@ public final class URL implements Serializable
// be aware of this. // be aware of this.
this.handler = setURLStreamHandler(protocol); this.handler = setURLStreamHandler(protocol);
this.protocol = protocol; this.protocol = protocol;
this.authority = null;
this.userInfo = null;
this.port = port; this.port = port;
this.host = host; this.host = host;
this.file = file; this.file = file;
this.query = null;
this.ref = ref; this.ref = ref;
hashCode = hashCode(); // Used for serialization. hashCode = hashCode(); // Used for serialization.
} }
/** @since 1.3 */ /**
* Sets the specified fields of the URL. This is not a public method so
* that only URLStreamHandlers can modify URL fields. URLs are otherwise
* constant
*
* @since 1.3
*/
protected void set(String protocol, String host, int port, protected void set(String protocol, String host, int port,
String authority, String userInfo, String authority, String userInfo,
String path, String query, String ref) String path, String query, String ref)

View file

@ -183,6 +183,29 @@ public abstract class URLStreamHandler
u.set(protocol, host, port, file, ref); u.set(protocol, host, port, file, ref);
} }
/**
* Sets the fields of the URL argument to the indicated values
*
* @param u The URL to modify
* @param protocol The protocol to set
* @param host The host name to set
* @param port The port number to set
* @param authority The authority to set
* @param userInfo The user information to set
* @param path The path/filename to set
* @param query The query part to set
* @param ref The reference
*
* @exception SecurityException If the protocol handler of the URL is
* different from this one
*/
protected void setURL(URL u, String protocol, String host, int port,
String authority, String userInfo, String path,
String query, String ref)
{
u.set(protocol, host, port, authority, userInfo, path, query, ref);
}
/** /**
* Converts an URL of a specific protocol to a string * Converts an URL of a specific protocol to a string
* *

View file

@ -89,14 +89,14 @@ java::net::PlainDatagramSocketImpl::bind (jint, java::net::InetAddress *)
void void
java::net::PlainDatagramSocketImpl::connect (java::net::InetAddress *, jint) java::net::PlainDatagramSocketImpl::connect (java::net::InetAddress *, jint)
{ {
throw new java::io::SocketException ( throw new SocketException (
JvNewStringLatin1 ("DatagramSocketImpl.connect: unimplemented")); JvNewStringLatin1 ("DatagramSocketImpl.connect: unimplemented"));
} }
void void
java::net::PlainDatagramSocketImpl::disconnect () java::net::PlainDatagramSocketImpl::disconnect ()
{ {
throw new java::io::SocketException ( throw new SocketException (
JvNewStringLatin1 ("DatagramSocketImpl.disconnect: unimplemented")); JvNewStringLatin1 ("DatagramSocketImpl.disconnect: unimplemented"));
} }