+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>
* java/nio/channels/spi/AbstractSelectableChannel.java: New file.
DatagramChannel ch;
+ private InetAddress remoteAddress;
+ private int remotePort;
+
/**
* Creates a DatagramSocket
*
protected DatagramSocket (DatagramSocketImpl impl)
{
this.impl = impl;
+ this.remoteAddress = null;
+ this.remotePort = -1;
}
/**
impl.setOption(SocketOptions.SO_REUSEADDR, new Boolean(true));
impl.bind(port, laddr == null ? InetAddress.ANY_IF : laddr);
+
+ remoteAddress = null;
+ remotePort = -1;
}
/**
public void close()
{
impl.close();
+ remoteAddress = null;
+ remotePort = -1;
}
/**
*/
public InetAddress getLocalAddress()
{
- SecurityManager s = System.getSecurityManager();
// FIXME: JCL p. 510 says this should call checkConnect. But what
// string should be used as the hostname? Maybe this is just a side
// effect of calling InetAddress.getLocalHost.
*/
public int getLocalPort()
{
+ if (!isBound ())
+ return -1;
+
return impl.getLocalPort();
}
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
* or null if the socket is not connected
*/
public InetAddress getInetAddress()
{
- // FIXME:
- return null;
+ if (!isConnected ())
+ 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
*/
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);
}
/**
* either case this describes just the jar file itself. */
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;
// Cached JarURLConnection's
{
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;
+ }
}
public final class NetPermission extends BasicPermission
implements java.io.Serializable
{
+ static final long serialVersionUID = -8343910153355041693L;
+
/**
* Initializes a new instance of <code>NetPermission</code> with the
* specified name.
import java.io.*;
import java.nio.channels.SocketChannel;
+import java.nio.channels.IllegalBlockingModeException;
/* Written using on-line Java Platform 1.2 API Specification.
* Status: I believe all methods are implemented.
SocketImpl impl;
SocketChannel ch; // this field must have been set if created by SocketChannel
-
+
// Constructors
/**
*
* @exception IOException If an error occurs
* @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
*/
if (! (endpoint instanceof InetSocketAddress))
throw new IllegalArgumentException ("Address type not supported");
+ if (ch != null && !ch.isBlocking ())
+ throw new IllegalBlockingModeException ();
+
impl.connect (endpoint, 0);
}
*
* @exception IOException If an error occurs
* @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
*
* @since 1.4
if (! (endpoint instanceof InetSocketAddress))
throw new IllegalArgumentException ("Address type not supported");
+ if (ch != null && !ch.isBlocking ())
+ throw new IllegalBlockingModeException ();
+
impl.connect (endpoint, timeout);
}
*/
public SocketAddress getLocalSocketAddress()
{
- InetAddress addr;
+ InetAddress addr = getLocalAddress ();
- try
- {
- addr = (InetAddress) impl.getOption (SocketOptions.SO_BINDADDR);
- }
- catch (SocketException e)
- {
- return null;
- }
+ if (addr == null)
+ return null;
return new InetSocketAddress (addr, impl.getLocalPort());
}
*/
public SocketAddress getRemoteSocketAddress()
{
- // FIXME: Implement this
- return null;
+ return new InetSocketAddress (impl.getInetAddress (), impl.getPort ());
}
/**
* @param size The new send buffer size.
*
* @exception SocketException If an error occurs or Socket not connected
- * @exception IllegalArgumentException FIXME
+ * @exception IllegalArgumentException If size is 0 or negative
*
* @since 1.2
*/
impl.setOption (SocketOptions.IP_TOS, new Integer (tc));
}
+
+ /**
+ * Checks if the socket is already bound.
+ */
+ public boolean isBound ()
+ {
+ return getLocalAddress () != null;
+ }
}
public abstract class SocketAddress implements Serializable
{
- public SocketAddress()
- {
- }
+ static final long serialVersionUID = 5215720748342549866L;
+
+ public SocketAddress()
+ {
+ }
}
package java.net;
+import java.io.Serializable;
import java.security.Permission;
import java.security.PermissionCollection;
* @author Aaron M. Renn (arenn@urbanophile.com)
*/
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.
/**
public final class URL implements Serializable
{
private String protocol;
+ private String authority;
+ private String userInfo;
private String host;
private int port = -1; // Initialize for constructor using context.
private String file;
+ private String query;
private String ref;
private int hashCode = 0;
transient private URLStreamHandler handler;
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)
throws MalformedURLException
{
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)
throws MalformedURLException
{
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,
URLStreamHandler handler) throws MalformedURLException
{
this.handler = setURLStreamHandler(protocol);
if (this.handler == null)
- throw new MalformedURLException("Protocol handler not found: " + protocol);
+ throw new MalformedURLException (
+ "Protocol handler not found: " + protocol);
this.host = host;
-
this.port = port;
+ this.userInfo = null;
+ this.authority = null;
+ this.query = null;
int hashAt = file.indexOf('#');
if (hashAt < 0)
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
{
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
{
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)
throws MalformedURLException
{
host = context.host;
port = context.port;
file = context.file;
+ userInfo = context.userInfo;
+ authority = context.authority;
+ query = context.query;
}
}
else if (context != null)
host = context.host;
port = context.port;
file = context.file;
+ userInfo = context.userInfo;
+ authority = context.authority;
+ query = context.query;
}
else // Protocol NOT specified in spec. and no context available.
throw new
return (port == uObj.port
&& ((protocol == null && uObj.protocol == null)
|| (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 && host.equals(uObj.host)))
&& ((file == null && uObj.file == null)
|| (file != null && file.equals(uObj.file)))
+ && ((query == null && uObj.query == null)
+ || (query != null && query.equals(uObj.query)))
&& ((ref == null && uObj.ref == null)
|| (ref != null && ref.equals(uObj.ref))));
}
+ /**
+ * Gets the contents of this URL
+ *
+ * @since 1.3
+ */
public final Object getContent() throws IOException
{
return openConnection().getContent();
return file;
}
+ /**
+ * Returns the path of the URL
+ *
+ * @since 1.3
+ */
public String getPath()
{
int quest = file.indexOf('?');
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()
{
return host;
}
+ /**
+ * Returns of port of the URL
+ */
public int getPort()
{
return port;
}
+ /**
+ * Returns the default port of the URL
+ */
+ public int getDefaultPort()
+ {
+ return 0;
+ }
+
+ /**
+ * Returns the protocol of the URL
+ */
public String getProtocol()
{
return protocol;
return ref;
}
+ /**
+ * Returns the user information of the URL
+ */
public String getUserInfo ()
{
int at = host.indexOf('@');
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,
String ref)
{
// be aware of this.
this.handler = setURLStreamHandler(protocol);
this.protocol = protocol;
+ this.authority = null;
+ this.userInfo = null;
this.port = port;
this.host = host;
this.file = file;
+ this.query = null;
this.ref = ref;
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,
String authority, String userInfo,
String path, String query, String 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
*
void
java::net::PlainDatagramSocketImpl::connect (java::net::InetAddress *, jint)
{
- throw new java::io::SocketException (
+ throw new SocketException (
JvNewStringLatin1 ("DatagramSocketImpl.connect: unimplemented"));
}
void
java::net::PlainDatagramSocketImpl::disconnect ()
{
- throw new java::io::SocketException (
+ throw new SocketException (
JvNewStringLatin1 ("DatagramSocketImpl.disconnect: unimplemented"));
}