/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

enum WPSMethod {
  "pbc",
  "keypad",
  "display"
};

dictionary WPSInfo {
  WPSMethod method;
  DOMString pin;
};

[JSImplementation="@mozilla.org/wifip2pgroupowner;1",
 Func="Navigator::HasWifiManagerSupport"]
interface MozWifiP2pGroupOwner {
  readonly attribute DOMString groupName;
  readonly attribute DOMString macAddress;
  readonly attribute DOMString ipAddress;
  readonly attribute DOMString passphrase;
  readonly attribute DOMString ssid;
  readonly attribute any wpsCapabilities;
  readonly attribute unsigned long freq;
  readonly attribute boolean isLocal;
};

[JSImplementation="@mozilla.org/wifip2pmanager;1",
 NavigatorProperty="mozWifiP2pManager",
 Func="Navigator::HasWifiManagerSupport"]
interface MozWifiP2pManager : EventTarget
{
  /**
   * Enable/Disable wifi direct scan.
   *
   * onsuccess: Succeeded in starting/stopping wifi direct scan.
   * onerror:   Failed to start/stop wifi direct scan.
   *
   */
  DOMRequest setScanEnabled(boolean enabled);

  /**
   * Connect to a peer with given configuration.
   *
   * @param address The peer MAC address we are going to connect.
   * @param wpsMethod The WPS method we want to use.
   * @param goIntent Number from 0 ~ 15 to indicate how much we want to be
   *                 the group owner.
   *
   * onsuccess: Succeeded in issueing a 'connect' request. It doesn't mean we
   *            have connected to the peer.
   *
   * onerror:   Failed to issue a 'connect' request, probably due to an
   *            invalid peer address, unsupported wps method or any
   *            preliminary error.
   *
   **/
  DOMRequest connect(DOMString address, WPSMethod wpsMethod, optional byte goIntent);

  /**
   * Disconnect with a peer.
   *
   * @param address The mac address of the peer.
   *
   * onsuccess: Succeeded to issue a 'disconnect' request. It doesn't mean we
   *            have disconnected with the peer.
   *
   * onerror:   Failed to issue a 'disconnect' request, probably due to the
   *            invalid peer address or any preliminary error.
   *
   */
  DOMRequest disconnect(DOMString address);

  /**
   * Get peer list
   *
   * onsuccess: Command success, req.result contains an array of peer objects.
   * onerror: Command failed.
   *
   * Peer object format:
   *   .address          MAC address of the peer (string)
   *   .name             the peer's device name (string)
   *   .isGroupOwner     if the peer is the group owner (boolean)
   *   .wpsCapabilities  array of the supported |WPSMethod|
   *   .connectionStatus one of { "disconnected", "connecting", "connected", "disconnecting" }
   *
   */
  DOMRequest getPeerList();

  /**
   * Set pairing confirmation result.
   *
   * @param accepted Boolean to indicate whether we accepted the request or not.
   * @param pin The user input pin number if the wps method is keypad.
   *
   * onsuccess: Command succeeded.
   * onerror:   Command failed.
   *
   */
  DOMRequest setPairingConfirmation(boolean accepted, optional DOMString pin);

  /**
   * Set device name.
   *
   * @param devieName The new device name we are going to set.
   *
   * onsuccess: Command succeeded.
   * onerror:   Command failed.
   *
   */
  DOMRequest setDeviceName(DOMString deviceName);

  /**
   * Returns if Wifi Direct is enabled.
   *
   */
  readonly attribute boolean enabled;

  /**
   * The current group owner, null if none.
   */
  readonly attribute MozWifiP2pGroupOwner? groupOwner;

  /**
   * An event listener that is called whenever the Wifi Direct peer list is
   * updated. Use getPeerList() to get the up-to-date peer list.
   */
  attribute EventHandler onpeerinfoupdate;

  /**
   * An event listener that is called whenever Wifi Direct status changed.
   * The address of the changed peer will be stored in event.peerList.
   * See MozWifiP2pStatusChangeEvent.webidl.
   */
  attribute EventHandler onstatuschange;

  /**
   * An event listener that is called whenever Wifi Direct is enabled.
   */
  attribute EventHandler onenabled;

  /**
   * An event listener that is called whenever Wifi Direct is disabled.
   */
  attribute EventHandler ondisabled;
};