/* SSLSocket.java -- an SSL client socket.
   Copyright (C) 2004 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., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 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 javax.net.ssl;

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * A socket that communicates over the secure socket layer protocol.
 */
public abstract class SSLSocket extends Socket
{

  // Constructors.
  // -------------------------------------------------------------------------

  protected SSLSocket()
  {
    super();
  }

  protected SSLSocket(String host, int port)
    throws IOException, UnknownHostException
  {
    super(host, port);
  }

  protected SSLSocket(InetAddress address, int port) throws IOException
  {
    super(address, port);
  }

  protected SSLSocket(String host, int port,
                      InetAddress localAddr, int localPort)
    throws IOException, UnknownHostException
  {
    super(host, port, localAddr, localPort);
  }

  protected SSLSocket(InetAddress address, int port,
                      InetAddress localAddr, int localPort)
    throws IOException
  {
    super(address, port, localAddr, localPort);
  }

  // Abstract methods.
  // -------------------------------------------------------------------------

  /**
   * Adds a handshake completed listener that wants to be notified when the
   * SSL handshake completes.
   *
   * @param listener The listener to add.
   */
  public abstract void
    addHandshakeCompletedListener(HandshakeCompletedListener listener);

  /**
   * Removes a handshake listener from this socket.
   *
   * @param listener The listener to remove.
   */
  public abstract void
    removeHandshakeCompletedListener(HandshakeCompletedListener listener);

  /**
   * Returns the list of currently enabled cipher suites.
   *
   * @return The list of enabled cipher suites.
   */
  public abstract String[] getEnabledCipherSuites();

  /**
   * Sets the list of enabled cipher suites.
   *
   * @param suites The list of suites to enable.
   */
  public abstract void setEnabledCipherSuites(String[] suites);

  /**
   * Returns the list of enabled SSL protocols.
   *
   * @return The list of enabled protocols.
   */
  public abstract String[] getEnabledProtocols();

  /**
   * Sets the list of enabled SSL protocols.
   *
   * @param protocols The list of protocols to enable.
   */
  public abstract void setEnabledProtocols(String[] protocols);

  /**
   * Returns whether or not sessions will be created by this socket, and thus
   * allow sessions to be continued later.
   *
   * @return Whether or not sessions will be created.
   */
  public abstract boolean getEnableSessionCreation();

  /**
   * Sets whether or not sessions will be created by this socket.
   *
   * @param enable The new value.
   */
  public abstract void setEnableSessionCreation(boolean enable);

  /**
   * Returns whether or not this socket will require connecting clients to
   * authenticate themselves. This value only applies to sockets in server
   * mode.
   *
   * @return Whether or not this socket requires client authentication.
   */
  public abstract boolean getNeedClientAuth();

  /**
   * Sets whether or not this socket will require connecting clients to
   * authenticate themselves. This value only applies to sockets in server
   * mode.
   *
   * @param needAuth The new need auth value.
   */
  public abstract void setNeedClientAuth(boolean needAuth);

  /**
   * Returns this socket's session object.
   *
   * @return The session.
   */
  public abstract SSLSession getSession();

  /**
   * Returns the list of cipher suites supported by this socket.
   *
   * @return The list of supported cipher suites.
   */
  public abstract String[] getSupportedCipherSuites();

  /**
   * Returns the list of protocols supported by this socket.
   *
   * @return The list of supported protocols.
   */
  public abstract String[] getSupportedProtocols();

  /**
   * Returns whether or not this socket will connect in client mode.
   *
   * @return True if this is a client socket.
   */
  public abstract boolean getUseClientMode();

  /**
   * Sets whether or not this socket will connect in client mode.
   *
   * @param clientMode The new value.
   */
  public abstract void setUseClientMode(boolean clientMode);

  /**
   * Returns whether or not this socket will request that connecting clients
   * authenticate themselves. This value only applies to sockets in server
   * mode.
   *
   * @return The want client auth value.
   */
  public abstract boolean getWantClientAuth();

  /**
   * Sets whether or not this socket will request that connecting clients
   * authenticate themselves. This value only applies to sockets in server
   * mode.
   *
   * @param wantAuth The new want auth value.
   */
  public abstract void setWantClientAuth(boolean wantAuth);

  /**
   * Explicitly begins the handshake, or, if the handshake has already
   * completed, requests that the handshake be repeated.
   *
   * <p>The handshake will begin implicitly when any attempt to read or
   * write to the socket is made.</p>
   *
   * @throws IOException If an I/O or SSL error occurs.
   */
  public abstract void startHandshake() throws IOException;
}
