/* Copyright (c) 2012 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.
 */

/**
 * This file defines the <code>PPB_NetworkList</code> interface.
 */

[generate_thunk]

label Chrome {
  M31 = 1.0
};

/**
 * Type of a network interface.
 */
[assert_size(4)]
enum PP_NetworkList_Type {
  /**
   * Type of the network interface is not known.
   */
  PP_NETWORKLIST_TYPE_UNKNOWN = 0,

  /**
   * Wired Ethernet network.
   */
  PP_NETWORKLIST_TYPE_ETHERNET = 1,

  /**
   * Wireless Wi-Fi network.
   */
  PP_NETWORKLIST_TYPE_WIFI = 2,

  /**
   * Cellular network (e.g. LTE).
   */
  PP_NETWORKLIST_TYPE_CELLULAR = 3
};

/**
 * State of a network interface.
 */
[assert_size(4)]
enum PP_NetworkList_State  {
  /**
   * Network interface is down.
   */
  PP_NETWORKLIST_STATE_DOWN = 0,

  /**
   * Network interface is up.
   */
  PP_NETWORKLIST_STATE_UP = 1
};

/**
 * The <code>PPB_NetworkList</code> is used to represent a list of
 * network interfaces and their configuration. The content of the list
 * is immutable.  The current networks configuration can be received
 * using the <code>PPB_NetworkMonitor</code> interface.
 */
interface PPB_NetworkList {
  /**
   * Determines if the specified <code>resource</code> is a
   * <code>NetworkList</code> object.
   *
   * @param[in] resource A <code>PP_Resource</code> resource.
   *
   * @return Returns <code>PP_TRUE</code> if <code>resource</code> is
   * a <code>PPB_NetworkList</code>, <code>PP_FALSE</code>
   * otherwise.
   */
  PP_Bool IsNetworkList([in] PP_Resource resource);

  /**
   * Gets number of interfaces in the list.
   *
   * @param[in] resource A <code>PP_Resource</code> corresponding to a
   * network list.
   *
   * @return Returns number of available network interfaces or 0 if
   * the list has never been updated.
   */
  uint32_t GetCount([in] PP_Resource resource);

  /**
   * Gets name of a network interface.
   *
   * @param[in] resource A <code>PP_Resource</code> corresponding to a
   * network list.
   * @param[in] index Index of the network interface.
   *
   * @return Returns name for the network interface with the specified
   * <code>index</code>.
   */
  PP_Var GetName([in] PP_Resource resource,
                 [in] uint32_t index);

  /**
   * Gets type of a network interface.
   *
   * @param[in] resource A <code>PP_Resource</code> corresponding to a
   * network list.
   * @param[in] index Index of the network interface.
   *
   * @return Returns type of the network interface with the specified
   * <code>index</code>.
   */
  [on_failure=PP_NETWORKLIST_TYPE_UNKNOWN]
  PP_NetworkList_Type GetType([in] PP_Resource resource,
                              [in] uint32_t index);

  /**
   * Gets state of a network interface.
   *
   * @param[in] resource A <code>PP_Resource</code> corresponding to a
   * network list.
   * @param[in] index Index of the network interface.
   *
   * @return Returns current state of the network interface with the
   * specified <code>index</code>.
   */
  [on_failure=PP_NETWORKLIST_STATE_DOWN]
  PP_NetworkList_State GetState([in] PP_Resource resource,
                                [in] uint32_t index);

  /**
   * Gets list of IP addresses for a network interface.
   *
   * @param[in] resource A <code>PP_Resource</code> corresponding to a
   * network list.
   * @param[in] index Index of the network interface.
   * @param[in] output An output array which will receive
   * <code>PPB_NetAddress</code> resources on success. Please note that the
   * ref count of those resources has already been increased by 1 for the
   * caller.
   *
   * @return An error code from <code>pp_errors.h</code>.
   */
  int32_t GetIpAddresses([in] PP_Resource resource,
                         [in] uint32_t index,
                         [in] PP_ArrayOutput output);

  /**
   * Gets display name of a network interface.
   *
   * @param[in] resource A <code>PP_Resource</code> corresponding to a
   * network list.
   * @param[in] index Index of the network interface.
   *
   * @return Returns display name for the network interface with the
   * specified <code>index</code>.
   */
  PP_Var GetDisplayName([in] PP_Resource resource,
                        [in] uint32_t index);

  /**
   * Gets MTU (Maximum Transmission Unit) of a network interface.
   *
   * @param[in] resource A <code>PP_Resource</code> corresponding to a
   * network list.
   * @param[in] index Index of the network interface.
   *
   * @return Returns MTU for the network interface with the specified
   * <code>index</code> or 0 if MTU is unknown.
   */
  uint32_t GetMTU([in] PP_Resource resource,
                  [in] uint32_t index);

};
