// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Use the <code>chrome.sockets.tcpServer</code> API to create server
// applications using TCP connections. This API supersedes the TCP functionality
// previously found in the <code>chrome.socket</code> API.
namespace sockets.tcpServer {
  // The socket properties specified in the <code>create</code> or
  // <code>update</code> function. Each property is optional. If a property
  // value is not specified, a default value is used when calling
  // <code>create</code>, or the existing value if preserved when calling
  // <code>update</code>.
  dictionary SocketProperties {
    // Flag indicating if the socket remains open when the event page of the
    // application is unloaded (see
    // <a href="http://developer.chrome.com/apps/app_lifecycle.html">Manage App
    // Lifecycle</a>). The default value is "false." When the application is
    // loaded, any sockets previously opened with persistent=true can be fetched
    // with <code>getSockets</code>.
    boolean? persistent;

    // An application-defined string associated with the socket.
    DOMString? name;
  };

  // Result of <code>create</code> call.
  dictionary CreateInfo {
    // The ID of the newly created server socket. Note that socket IDs created
    // from this API are not compatible with socket IDs created from other APIs,
    // such as the deprecated <code>$(ref:socket)</code> API.
    long socketId;
  };

  // Callback from the <code>create</code> method.
  // |createInfo| : The result of the socket creation.
  callback CreateCallback = void (CreateInfo createInfo);

  // Callback from the <code>listen</code> method.
  // |result| : The result code returned from the underlying network call.
  // A negative value indicates an error.
  callback ListenCallback = void (long result);

  // Callback from the <code>disconnect</code> method.
  callback DisconnectCallback = void ();

  // Callback from the <code>close</code> method.
  callback CloseCallback = void ();

  // Callback from the <code>update</code> method.
  callback UpdateCallback = void ();

  // Callback from the <code>setPaused</code> method.
  callback SetPausedCallback = void ();

  // Result of the <code>getInfo</code> method.
  dictionary SocketInfo {
    // The socket identifier.
    long socketId;

    // Flag indicating if the socket remains open when the event page of the
    // application is unloaded (see <code>SocketProperties.persistent</code>).
    // The default value is "false".
    boolean persistent;

    // Application-defined string associated with the socket.
    DOMString? name;

    // Flag indicating whether connection requests on a listening socket are
    // dispatched through the <code>onAccept</code> event or queued up in the
    // listen queue backlog.
    // See <code>setPaused</code>. The default value is "false".
    boolean paused;

    // If the socket is listening, contains its local IPv4/6 address.
    DOMString? localAddress;

    // If the socket is listening, contains its local port.
    long? localPort;
  };

  // Callback from the <code>getInfo</code> method.
  // |socketInfo| : Object containing the socket information.
  callback GetInfoCallback = void (SocketInfo socketInfo);

  // Callback from the <code>getSockets</code> method.
  // |socketInfos| : Array of object containing socket information.
  callback GetSocketsCallback = void (SocketInfo[] socketInfos);

  // Data from an <code>onAccept</code> event.
  dictionary AcceptInfo {
    // The server socket identifier.
    long socketId;

    // The client socket identifier, i.e. the socket identifier of the newly
    // established connection. This socket identifier should be used only with
    // functions from the <code>chrome.sockets.tcp</code> namespace. Note the
    // client socket is initially paused and must be explictly un-paused by the
    // application to start receiving data.
    long clientSocketId;
  };

  // Data from an <code>onAcceptError</code> event.
  dictionary AcceptErrorInfo {
    // The server socket identifier.
    long socketId;

    // The result code returned from the underlying network call.
    long resultCode;
  };

  interface Functions {
    // Creates a TCP server socket.
    // |properties| : The socket properties (optional).
    // |callback| : Called when the socket has been created.
    static void create(optional SocketProperties properties,
                       CreateCallback callback);

    // Updates the socket properties.
    // |socketId| : The socket identifier.
    // |properties| : The properties to update.
    // |callback| : Called when the properties are updated.
    static void update(long socketId,
                       SocketProperties properties,
                       optional UpdateCallback callback);

    // Enables or disables a listening socket from accepting new connections.
    // When paused, a listening socket accepts new connections until its backlog
    // (see <code>listen</code> function) is full then refuses additional
    // connection requests. <code>onAccept</code> events are raised only when
    // the socket is un-paused.
    static void setPaused(long socketId,
                          boolean paused,
                          optional SetPausedCallback callback);

    // Listens for connections on the specified port and address.
    // If the port/address is in use, the callback indicates a failure.
    // |socketId| : The socket identifier.
    // |address| : The address of the local machine.
    // |port| : The port of the local machine.
    // |backlog| : Length of the socket's listen queue. The default value
    // depends on the Operating System (SOMAXCONN), which ensures a reasonable
    // queue length for most applications.
    // |callback| : Called when listen operation completes.
    static void listen(long socketId,
                       DOMString address,
                       long port,
                       optional long backlog,
                       ListenCallback callback);

    // Disconnects the listening socket, i.e. stops accepting new connections
    // and releases the address/port the socket is bound to. The socket
    // identifier remains valid, e.g. it can be used with <code>listen</code> to
    // accept connections on a new port and address.
    // |socketId| : The socket identifier.
    // |callback| : Called when the disconnect attempt is complete.
    static void disconnect(long socketId,
                           optional DisconnectCallback callback);

    // Disconnects and destroys the socket. Each socket created should be
    // closed after use. The socket id is no longer valid as soon at the
    // function is called. However, the socket is guaranteed to be closed only
    // when the callback is invoked.
    // |socketId| : The socket identifier.
    // |callback| : Called when the <code>close</code> operation completes.
    static void close(long socketId,
                      optional CloseCallback callback);

    // Retrieves the state of the given socket.
    // |socketId| : The socket identifier.
    // |callback| : Called when the socket state is available.
    static void getInfo(long socketId,
                        GetInfoCallback callback);

    // Retrieves the list of currently opened sockets owned by the application.
    // |callback| : Called when the list of sockets is available.
    static void getSockets(GetSocketsCallback callback);
  };

  interface Events {
    // Event raised when a connection has been made to the server socket.
    // |info| : The event data.
    static void onAccept(AcceptInfo info);

    // Event raised when a network error occured while the runtime was waiting
    // for new connections on the socket address and port. Once this event is
    // raised, the socket is set to <code>paused</code> and no more
    // <code>onAccept</code> events are raised for this socket until the socket
    // is resumed.
    // |info| : The event data.
    static void onAcceptError(AcceptErrorInfo info);
  };
};
