// ServerSocket.java

/* Copyright (C) 1999  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.  */

/**
  * @author Per Bothner <bothner@cygnus.com>
  * @date January 6, 1999.
  */

/** Written using on-line Java Platform 1.2 API Specification.
  * Status:  I believe all methods are implemented.
  */

package java.net;
import java.io.*;

public class ServerSocket
{
  static SocketImplFactory factory;
  SocketImpl impl;

  static final byte[] zeros = {0,0,0,0};
  /* dummy InetAddress, used to bind socket to any (all) network interfaces */
  static final InetAddress ANY_IF = new InetAddress(zeros, null);

  public ServerSocket (int port)
    throws java.io.IOException
  {
    this(port, 50);
  }

  public ServerSocket (int port, int backlog)
    throws java.io.IOException
  {
    this(port, backlog, ANY_IF);
  }

  public ServerSocket (int port, int backlog, InetAddress bindAddr)
    throws java.io.IOException
  {
    if (factory == null)
      this.impl = new PlainSocketImpl();
    else
      this.impl = factory.createSocketImpl();
    SecurityManager s = System.getSecurityManager();
    if (s != null)
      s.checkListen(port);
    impl.create(true);
    impl.bind(bindAddr == null ? ANY_IF : bindAddr, port);
    impl.listen(backlog);
  }

  public InetAddress getInetAddress()
  {
    return impl.getInetAddress();
  }

  public int getLocalPort()
  {
    return impl.getLocalPort();
  }

  public Socket accept ()  throws IOException
  {
    Socket s = new Socket(Socket.factory == null ? new PlainSocketImpl()
			  : Socket.factory.createSocketImpl());
    implAccept (s);
    return s;
  }

  protected final void implAccept (Socket s)  throws IOException
  {
    impl.accept(s.impl);
  }

  public void close () throws IOException
  {
    impl.close();
  }

  public synchronized void setSoTimeout (int timeout) throws SocketException
  {
    if (timeout < 0)
      throw new IllegalArgumentException("Invalid timeout: " + timeout);

    impl.setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout));
  }

  public synchronized int getSoTimeout () throws SocketException
  {
    Object timeout = impl.getOption(SocketOptions.SO_TIMEOUT);
    if (timeout instanceof Integer) 
      return ((Integer)timeout).intValue();
    else
      return 0;
  }

  public String toString ()
  {
    return "ServerSocket" + impl.toString();
  }

  public static synchronized void setSocketFactory (SocketImplFactory fac)
    throws IOException
  {
    factory = fac;
  }
}
