/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package java.net;


/**
 * Defines an interface for socket implementations to get and set socket
 * options. It is implemented by the classes {@code SocketImpl} and {@code
 * DatagramSocketImpl}.
 * 
 * @see SocketImpl
 * @see DatagramSocketImpl
 * @since Android 1.0
 */
public interface SocketOptions {

    /**
     * This option specifies the behavior of the {@code close()} method if there
     * is still some buffered data to be sent while closing the socket. If the
     * value of this option is set to {@code 0} the method closes the TCP socket
     * forcefully and returns immediately. Is this value greater than {@code 0}
     * the method blocks this time in milliseconds. If all data could be sent
     * during this timeout the socket is closed normally otherwise forcefully.
     * Valid values for this option are in the range {@code 0 <= SO_LINGER <=
     * 65535}.
     * 
     * @since Android 1.0
     */
    public static final int SO_LINGER = 128;

    /**
     * Timeout for blocking operations. The argument value is specified in
     * milliseconds. An {@code InterruptedIOException} is thrown if this timeout
     * expires.
     * 
     * @since Android 1.0
     */
    public static final int SO_TIMEOUT = 4102;

    /**
     * This option specifies whether data is sent immediately on this socket, as
     * a side-effect though, this could lead to a low packet efficiency. The
     * socket implementation uses the Nagle's algorithm to try to reach a higher
     * packet efficiency if this option is disabled.
     * 
     * @since Android 1.0
     */
    public static final int TCP_NODELAY = 1;

    // For 5 and 6 see MulticastSocket

    // For 7 see PlainDatagramSocketImpl
    
    /**
     * This option specifies the interface which is used to send multicast
     * packets. It's only available on a {@code MulticastSocket}.
     * 
     * @since Android 1.0
     */
    public static final int IP_MULTICAST_IF = 16;

    /**
     * This option can be used to set one specific interface on a multihomed
     * host on which incoming connections are accepted. It's only available on
     * server-side sockets.
     * 
     * @since Android 1.0
     */
    public static final int SO_BINDADDR = 15;

    /**
     * This option specifies whether a reuse of a local address is allowed even
     * if an other socket is not yet removed by the operating system. It's only
     * available on a {@code MulticastSocket}.
     * 
     * @since Android 1.0
     */
    public static final int SO_REUSEADDR = 4;

    // 10 not currently used
    
    /**
     * Buffer size of the outgoing channel.
     * 
     * @since Android 1.0
     */
    public static final int SO_SNDBUF = 4097;

    /**
     * Buffer size of the incoming channel.
     * 
     * @since Android 1.0
     */
    public static final int SO_RCVBUF = 4098;

    // For 13, see DatagramSocket
    
    /**
     * This option specifies whether socket implementations can send keepalive
     * messages if no data has been sent for a longer time.
     * 
     * @since Android 1.0
     */
    public static final int SO_KEEPALIVE = 8;
    
    /**
     * This option specifies the value for the Type-of-Service (TOS) field of
     * the IP header.
     * 
     * @since Android 1.0
     */
    public static final int IP_TOS = 3;
    
    /**
     * This option specifies whether the local loopback of multicast packets is
     * enabled or disabled. This option is enabled by default on multicast
     * sockets.
     * 
     * @since Android 1.0
     */
    public static final int IP_MULTICAST_LOOP = 18;
    
    /**
     * This option can be used to enable broadcasting on datagram sockets.
     * 
     * @since Android 1.0
     */
    public static final int SO_BROADCAST = 32;
    
    /**
     * This option specifies whether sending TCP urgent data is supported on
     * this socket or not.
     * 
     * @since Android 1.0
     */
    public static final int SO_OOBINLINE = 4099;
    
    /**
     * This option can be used to set one specific interface on a multihomed
     * host on which incoming connections are accepted. It's only available on
     * server-side sockets. This option supports setting outgoing interfaces
     * with either IPv4 or IPv6 addresses.
     * 
     * @since Android 1.0
     */
    public static final int IP_MULTICAST_IF2 = 31;

    /**
     * Gets the value for the specified socket option.
     * 
     * @return the option value.
     * @param optID
     *            the option identifier.
     * @throws SocketException
     *             if an error occurs reading the option value.
     * @since Android 1.0
     */
    public Object getOption(int optID) throws SocketException;

    /**
     * Sets the value of the specified socket option.
     * 
     * @param optID
     *            the option identifier.
     * @param val
     *            the value to be set for the option.
     * @throws SocketException
     *             if an error occurs setting the option value.
     * @since Android 1.0
     */
    public void setOption(int optID, Object val) throws SocketException;
}
