/* 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/. */

#include "nsIDOMEventTarget.idl"

interface nsIDOMEventListener;
interface nsIDOMDOMRequest;
interface nsIDOMMozMobileConnectionInfo;
interface nsIDOMMozMobileNetworkInfo;
interface nsIDOMMozMobileCellInfo;
interface nsIDOMMozMobileCFInfo;
interface nsIVariant;

[scriptable, builtinclass, uuid(389ad352-4e43-4c1a-85e9-bae745554326)]
interface nsIDOMMozMobileConnection : nsIDOMEventTarget
{
  const long ICC_SERVICE_CLASS_VOICE = (1 << 0);
  const long ICC_SERVICE_CLASS_DATA = (1 << 1);
  const long ICC_SERVICE_CLASS_FAX = (1 << 2);
  const long ICC_SERVICE_CLASS_SMS = (1 << 3);
  const long ICC_SERVICE_CLASS_DATA_SYNC = (1 << 4);
  const long ICC_SERVICE_CLASS_DATA_ASYNC = (1 << 5);
  const long ICC_SERVICE_CLASS_PACKET = (1 << 6);
  const long ICC_SERVICE_CLASS_PAD = (1 << 7);
  const long ICC_SERVICE_CLASS_MAX = (1 << 7);

  /**
   * Call barring program.
   *
   * (0) all outgoing.
   * (1) outgoing international.
   * (2) outgoing international except to home country.
   * (3) all incoming.
   * (4) incoming when roaming outside the home country.
   */
  const long CALL_BARRING_PROGRAM_ALL_OUTGOING                       = 0;
  const long CALL_BARRING_PROGRAM_OUTGOING_INTERNATIONAL             = 1;
  const long CALL_BARRING_PROGRAM_OUTGOING_INTERNATIONAL_EXCEPT_HOME = 2;
  const long CALL_BARRING_PROGRAM_ALL_INCOMING                       = 3;
  const long CALL_BARRING_PROGRAM_INCOMING_ROAMING                   = 4;

  /**
   * Calling line identification restriction constants.
   *
   * @see 3GPP TS 27.007 7.7 Defined values
   *
   * (0) Uses subscription default value.
   * (1) Restricts CLI presentation.
   * (2) Allows CLI presentation.
   */
  const long CLIR_DEFAULT     = 0;
  const long CLIR_INVOCATION  = 1;
  const long CLIR_SUPPRESSION = 2;

  /**
   * These two fields can be accessed by privileged applications with the
   * 'mobilenetwork' permission.
   */
  readonly attribute DOMString lastKnownNetwork;
  readonly attribute DOMString lastKnownHomeNetwork;

  /**
   * Information about the voice connection.
   */
  readonly attribute nsIDOMMozMobileConnectionInfo voice;

  /**
   * Information about the data connection.
   */
  readonly attribute nsIDOMMozMobileConnectionInfo data;

  /**
   * Integrated Circuit Card Identifier of the SIM this
   * mobile connection corresponds to.
   */
  readonly attribute DOMString iccId;

  /**
   * The selection mode of the voice and data networks.
   *
   * Possible values: null (unknown), 'automatic', 'manual'
   */
  readonly attribute DOMString networkSelectionMode;

  /**
   * The current radio state.
   *
   * Possible values: null (unknown), 'enabling', 'enabled', 'disabling',
   * 'disabled'
   */
  readonly attribute DOMString radioState;

  /**
   * Array of network types that are supported by this radio.
   *
   * Possible values: 'gsm', 'wcdma', 'cdma', 'evdo', 'lte'
   */
  readonly attribute nsIVariant supportedNetworkTypes;

  /**
   * Search for available networks.
   *
   * If successful, the request's onsuccess will be called, and the request's
   * result will be an array of nsIDOMMozMobileNetworkInfo.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * or 'GenericFailure'.
   */
  nsIDOMDOMRequest getNetworks();

  /**
   * Manually selects the passed in network, overriding the radio's current
   * selection.
   *
   * If successful, the request's onsuccess will be called.
   * Note: If the network was actually changed by this request,
   * the 'voicechange' and 'datachange' events will also be fired.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * 'IllegalSIMorME', or 'GenericFailure'
   */
  nsIDOMDOMRequest selectNetwork(in nsIDOMMozMobileNetworkInfo network);

  /**
   * Tell the radio to automatically select a network.
   *
   * If successful, the request's onsuccess will be called.
   * Note: If the network was actually changed by this request, the
   * 'voicechange' and 'datachange' events will also be fired.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * 'IllegalSIMorME', or 'GenericFailure'
   */
  nsIDOMDOMRequest selectNetworkAutomatically();

  /**
   * Set preferred network type
   *
   * @param type
   *        DOMString indicates the desired preferred network type.
   *        Possible values: 'wcdma/gsm', 'gsm', 'wcdma', 'wcdma/gsm-auto',
   *                         'cdma/evdo', 'cdma', 'evdo', or
   *                         'wcdma/gsm/cdma/evdo'.
   *
   * If successful, the request's onsuccess will be called.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * 'InvalidParameter', 'ModeNotSupported' or 'GenericFailure'
   *
   * TODO: param "type" should be a WebIDL enum when this interface is converted
   *       to WebIDL
   */
  nsIDOMDOMRequest setPreferredNetworkType(in DOMString type);

  /**
   * Query current preferred network type
   *
   * If successful, the request's onsuccess will be called. And the request's
   * result will be a string indicating the current preferred network type.
   * The value will be either 'wcdma/gsm', 'gsm', 'wcdma', 'wcdma/gsm-auto',
   * 'cdma/evdo', 'cdma', 'evdo', or 'wcdma/gsm/cdma/evdo'.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * or 'GenericFailure'
   */
  nsIDOMDOMRequest getPreferredNetworkType();

  /**
   * Set roaming preference
   *
   * @param mode
   *        DOMString indicates the desired roaming preference.
   *        Possible values: 'home', 'affiliated', or 'any'.
   *
   * If successful, the request's onsuccess will be called.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * 'IllegalSIMorME', 'InvalidParameter', or 'GenericFailure'
   *
   * TODO: param "mode" should be a WebIDL enum when this interface is converted
   *       to WebIDL
   */
  nsIDOMDOMRequest setRoamingPreference(in DOMString mode);

  /**
   * Query current roaming preference
   *
   * If successful, the request's onsuccess will be called. And the request's
   * result will be a string indicating the current roaming preference.
   * The value will be either 'home', 'affiliated', or 'any'.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * 'IllegalSIMorME', or 'GenericFailure'
   */
  nsIDOMDOMRequest getRoamingPreference();

  /**
   * Set voice privacy preference.
   *
   * @param enabled
   *        Boolean indicates the preferred voice privacy mode used in voice
   *        scrambling in CDMA networks. 'True' means the enhanced voice security
   *        is required.
   *
   * If successful, the request's onsuccess will be called.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * 'IllegalSIMorME', 'InvalidParameter', or 'GenericFailure'
   */
  nsIDOMDOMRequest setVoicePrivacyMode(in bool enabled);

  /**
   * Query current voice privacy mode.
   *
   * If successful, the request's onsuccess will be called. And the request's
   * result will be a boolean indicating the current voice privacy mode.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * 'IllegalSIMorME', or 'GenericFailure'
   */
  nsIDOMDOMRequest getVoicePrivacyMode();

  /**
   * Send a MMI message.
   *
   * @param mmi
   *        DOMString containing an MMI string that can be associated to a
   *        USSD request or other RIL functionality.
   *
   * @return a nsIDOMDOMRequest
   *         The request's result will be an object containing information
   *         about the operation.
   *
   * In case that the MMI code requires sending an USSD request, the DOMrequest
   * 'success' event means that the RIL has successfully processed and sent the
   * USSD request to the network. The network reply will be reported via
   * 'onussdreceived' event. If the MMI code is not associated to a USSD but to
   * other RIL request its result, if one is needed, will be notified via the
   * returned DOMRequest 'success' or 'error' event.
   */
  nsIDOMDOMRequest sendMMI(in DOMString mmi);

  /**
   * Cancel the current MMI request if one exists.
   */
  nsIDOMDOMRequest cancelMMI();

  /**
   * Configures call forward options.
   *
   * @param CFInfo
   *        An object containing the call forward rule to set.
   *
   * If successful, the request's onsuccess will be called.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * 'IllegalSIMorME', 'InvalidParameter', or 'GenericFailure'
   */
  nsIDOMDOMRequest setCallForwardingOption(in nsIDOMMozMobileCFInfo CFInfo);

  /**
   * Queries current call forward options.
   *
   * @param reason
   *        Indicates the reason the call is being forwarded. It will be either
   *        unconditional (0), mobile busy (1), no reply (2), not reachable (3),
   *        all call forwarding (4), or all conditional call forwarding (5).
   *
   * If successful, the request's onsuccess will be called, and the request's
   * result will be an array of nsIDOMMozMobileCFInfo.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * 'InvalidParameter', or 'GenericFailure'.
   */
  nsIDOMDOMRequest getCallForwardingOption(in unsigned short reason);

  /**
   * Configures call barring option.
   *
   * @param option
   *        An object containing the call barring rule to set.
   * @see MozCallBarringOption for the detail of info.
   *
   * If successful, the request's onsuccess will be called.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * 'IllegalSIMorME', 'InvalidParameter', or 'GenericFailure'
   */
  nsIDOMDOMRequest setCallBarringOption(in jsval option);

  /**
   * Queries current call barring status.
   *
   * @param info
   *        An object containing the call barring rule to query. No need to
   *        specify 'enabled' property.
   * @see MozCallBarringOption for the detail of info.
   *
   * If successful, the request's onsuccess will be called, and the request's
   * result will be an object of MozCallBarringOption with correct 'enabled'
   * property indicating the status of this rule.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * 'InvalidParameter', or 'GenericFailure'.
   */
  nsIDOMDOMRequest getCallBarringOption(in jsval option);

  /**
   * Change call barring facility password.
   *
   * @param info
   *        An object containing information about pin and newPin, and,
   *        this object must have both "pin" and "newPin" attributes
   *        to change the call barring facility password.
   *
   * Example:
   *
   *   changeCallBarringPassword({pin: "...",
   *                              newPin: "..."});
   */
  nsIDOMDOMRequest changeCallBarringPassword(in jsval info);

  /**
   * Configures call waiting options.
   *
   * @param enabled
   *        Value containing the desired call waiting status.
   *
   * If successful, the request's onsuccess will be called.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * 'IllegalSIMorME', or 'GenericFailure'
   */
  nsIDOMDOMRequest setCallWaitingOption(in bool enabled);

  /**
   * Queries current call waiting options.
   *
   * If successful, the request's onsuccess will be called, and the request's
   * result will be a boolean indicating the call waiting status.
   *
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * or 'GenericFailure'.
   */
  nsIDOMDOMRequest getCallWaitingOption();

  /**
   * Enables or disables the presentation of the calling line identity (CLI) to
   * the called party when originating a call.
   *
   * @param clirMode
   *        Is one of the CLIR_* constants.
   *
   * If successful, the request's onsuccess will be called.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   */
  nsIDOMDOMRequest setCallingLineIdRestriction(in unsigned short clirMode);

  /**
   * Queries current CLIR status.
   *
   * If successful, the request's onsuccess will be called, and the request's
   * result will be a DOMCLIRStatus dictionary containing CLIR 'n' and 'm'
   * parameter.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RadioNotAvailable', 'RequestNotSupported',
   * or 'GenericFailure'.
   */
  nsIDOMDOMRequest getCallingLineIdRestriction();

  /**
   * Exit emergency callback mode.
   *
   * If successful, the request's onsuccess will be called.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'RequestNotSupported'  or 'GenericFailure'.
   */
  nsIDOMDOMRequest exitEmergencyCbMode();

  /**
   * Set radio enabled/disabled.
   *
   * @param enabled
   *        True to enable the radio.
   *
   * If successful, the request's onsuccess will be called.
   *
   * Otherwise, the request's onerror will be called, and the request's error
   * will be either 'InvalidStateError', 'RadioNotAvailable', or
   * 'GenericFailure'.
   *
   * Note: Request is not available when radioState is null, 'enabling', or
   *       'disabling'. Calling the function in above conditions will receive
   *       'InvalidStateError' error.
   */
  nsIDOMDOMRequest setRadioEnabled(in boolean enabled);

  /**
   * The 'voicechange' event is notified whenever the voice connection object
   * changes.
   */
  [implicit_jscontext] attribute jsval onvoicechange;

  /**
   * The 'datachange' event is notified whenever the data connection object
   * changes values.
   */
  [implicit_jscontext] attribute jsval ondatachange;

  /**
   * The 'ussdreceived' event is notified whenever a new USSD message is
   * received.
   */
  [implicit_jscontext] attribute jsval onussdreceived;

  /**
   * The 'dataerror' event is notified whenever the data connection object
   * receives an error from the RIL
   */
  [implicit_jscontext] attribute jsval ondataerror;

  /**
   * The 'oncfstatechange' event is notified whenever the call forwarding
   * state changes.
   */
  [implicit_jscontext] attribute jsval oncfstatechange;

  /**
   * The 'emergencycbmodechange' event is notified whenever the emergency
   * callback mode changes.
   */
  [implicit_jscontext] attribute jsval onemergencycbmodechange;

  /**
   * The 'onotastatuschange' event is notified whenever the ota provision status
   * changes.
   */
  [implicit_jscontext] attribute jsval onotastatuschange;

  /**
   * The 'oniccchange' event is notified whenever the iccid value
   * changes.
   */
  [implicit_jscontext] attribute jsval oniccchange;

  /**
   * The 'onradiostatechange' event is notified whenever the radio state
   * changes.
   */
  [implicit_jscontext] attribute jsval onradiostatechange;
};

[scriptable, uuid(49706beb-a160-40b7-b745-50f62e389a2c)]
interface nsIDOMMozMobileConnectionInfo : nsISupports
{
  /**
   * State of the connection.
   *
   * Possible values: 'notSearching', 'searching', 'denied', 'registered'.
   * null if the state is unknown.
   */
  readonly attribute DOMString state;

  /**
   * Indicates whether the connection is ready. This may be different
   */
  readonly attribute bool connected;

  /**
   * Indicates whether only emergency calls are possible.
   *
   * This flag is only relevant to voice connections and when 'connected' is
   * false.
   */
  readonly attribute bool emergencyCallsOnly;

  /**
   * Indicates whether the connection is going through a foreign operator
   * (roaming) or not.
   */
  readonly attribute bool roaming;

  /**
   * Network operator
   */
  readonly attribute nsIDOMMozMobileNetworkInfo network;

  /**
   * Type of connection.
   *
   * Possible values: 'gsm', 'cdma', gprs', 'edge', 'umts', 'hsdpa', 'evdo0',
   * 'evdoa', 'evdob', etc.
   */
  readonly attribute DOMString type;

  /**
   * Signal strength in dBm, or null if no service is available.
   */
  readonly attribute jsval signalStrength;

  /**
   * Signal strength, represented linearly as a number between 0 (weakest
   * signal) and 100 (full signal).
   */
  readonly attribute jsval relSignalStrength;

  /**
   * Cell location.
   */
  readonly attribute nsIDOMMozMobileCellInfo cell;

};

[scriptable, uuid(40018fc7-4c42-47b6-8de6-3591a9c622bc)]
interface nsIDOMMozMobileNetworkInfo: nsISupports
{
  /**
   * Short name of the network operator
   */
  readonly attribute DOMString shortName;

  /**
   * Long name of the network operator
   */
  readonly attribute DOMString longName;

  /**
   * Mobile Country Code (MCC) of the network operator
   */
  readonly attribute DOMString mcc;

  /**
   * Mobile Network Code (MNC) of the network operator
   */
  readonly attribute DOMString mnc;

  /**
   * State of this network operator.
   *
   * Possible values: 'available', 'connected', 'forbidden', or null (unknown)
   */
  readonly attribute DOMString state;
};

[scriptable, uuid(9750b3a7-d913-436e-95d4-7ef2973ec6a1)]
interface nsIDOMMozMobileCellInfo: nsISupports
{
  /**
   * Mobile Location Area Code (LAC) for GSM/WCDMA networks.
   *
   * Possible ranges from 0x0000 to 0xffff.
   * -1 if the LAC is unknown.
   */
  readonly attribute long gsmLocationAreaCode;

  /**
   * Mobile Cell ID for GSM/WCDMA networks.
   *
   * Possible ranges from 0x00000000 to 0xffffffff.
   * -1 if the cell id is unknown.
   */
  readonly attribute long long gsmCellId;

  /**
   * Base Station ID for CDMA networks.
   *
   * Possible ranges from 0 to 65535
   * -1 if the base station id is unknown.
   */
  readonly attribute long cdmaBaseStationId;

  /**
   * Base Station Latitude for CDMA networks.
   *
   * Possible ranges from -1296000 to 1296000.
   * -2147483648 if the latitude is unknown.
   *
   * @see 3GPP2 C.S0005-A v6.0.
   */
  readonly attribute long cdmaBaseStationLatitude;

  /**
   * Base Station Longitude for CDMA networks.
   *
   * Possible ranges from -2592000 to 2592000.
   * -2147483648 if the longitude is unknown.
   *
   * @see 3GPP2 C.S0005-A v6.0.
   */
  readonly attribute long cdmaBaseStationLongitude;

  /**
   * System ID for CDMA networks.
   *
   * Possible ranges from 0 to 32767.
   * -1 if the system id is unknown.
   */
  readonly attribute long cdmaSystemId;

  /**
   * Network ID for CDMA networks.
   *
   * Possible ranges from 0 to 65535.
   * -1 if the network id is unknown.
   */
  readonly attribute long cdmaNetworkId;
};

[scriptable, uuid(d1b35ad8-99aa-47cc-ab49-2e72b00e39df)]
interface nsIDOMMozMobileCFInfo : nsISupports
{
  /**
   * Call forwarding rule status.
   *
   * It will be either not active (false), or active (true).
   *
   * Note: Unused for setting call forwarding options. It reports
   *       the status of the rule when getting how the rule is
   *       configured.
   *
   * @see 3GPP TS 27.007 7.11 "status".
   */
  readonly attribute bool active;

  const long CALL_FORWARD_ACTION_DISABLE = 0;
  const long CALL_FORWARD_ACTION_ENABLE = 1;
  const long CALL_FORWARD_ACTION_QUERY_STATUS = 2;
  const long CALL_FORWARD_ACTION_REGISTRATION = 3;
  const long CALL_FORWARD_ACTION_ERASURE = 4;

  /**
   * Indicates what to do with the rule.
   *
   * One of the CALL_FORWARD_ACTION_* constants. It will be either disable (0),
   * enable (1), query status (2), registration (3), or erasure (4).
   *
   * @see 3GPP TS 27.007 7.11 "mode".
   */
  readonly attribute unsigned short action;

  const long CALL_FORWARD_REASON_UNCONDITIONAL = 0;
  const long CALL_FORWARD_REASON_MOBILE_BUSY = 1;
  const long CALL_FORWARD_REASON_NO_REPLY = 2;
  const long CALL_FORWARD_REASON_NOT_REACHABLE = 3;
  const long CALL_FORWARD_REASON_ALL_CALL_FORWARDING = 4;
  const long CALL_FORWARD_REASON_ALL_CONDITIONAL_CALL_FORWARDING = 5;

  /**
   * Indicates the reason the call is being forwarded.
   *
   * One of the CALL_FORWARD_REASON_* constants. It will be either
   * unconditional (0), mobile busy (1), no reply (2), not reachable (3),
   * all call forwarding (4), or all conditional call forwarding (5).
   *
   * @see 3GPP TS 27.007 7.11 "reason".
   */
  readonly attribute unsigned short reason;

  /**
   * Phone number of forwarding address.
   */
  readonly attribute DOMString number;

  /**
   * When "no reply" is enabled or queried, this gives the time in
   * seconds to wait before call is forwarded.
   */
  readonly attribute unsigned short timeSeconds;

  /**
   * Service for which the call forward is set up. It should be one of the
   * nsIDOMMozMobileConnection.ICC_SERVICE_CLASS_* values.
   */
  readonly attribute unsigned short serviceClass;
};


dictionary MozCallBarringOption
{
  /**
   * Indicates the program the call is being barred.
   *
   * It shall be one of the nsIDOMMozMobileConnection.CALL_BARRING_PROGRAM_*
   * values.
   */
   unsigned short program;

  /**
   * Enable or disable the call barring program.
   */
  boolean enabled;

  /**
   * Barring password. Use "" if no password specified.
   */
  DOMString password;

  /**
   * Service for which the call barring is set up.
   *
   * It shall be one of the nsIDOMMozMobileConnection.ICC_SERVICE_CLASS_*
   * values.
   */
  unsigned short serviceClass;
};

dictionary DOMMMIResult
{
  /**
   * String key that identifies the service associated with the MMI code
   * request. The UI is supposed to handle the localization of the strings
   * associated with this string key.
   */
  DOMString serviceCode;

  /**
   * String key containing the status message of the associated MMI request.
   * The UI is supposed to handle the localization of the strings associated
   * with this string key.
   */
  DOMString statusMessage;

  /**
   * Some MMI requests like call forwarding or PIN/PIN2/PUK/PUK2 related
   * requests provide extra information along with the status message, this
   * information can be a number, a string key or an array of string keys.
   */
  jsval additionalInformation;
};

dictionary DOMCLIRStatus
{
  /**
   * CLIR parameter 'n': parameter sets the adjustment for outgoing calls.
   *
   * 0 Presentation indicator is used according to the subscription of the
   *   CLIR service (uses subscription default value).
   * 1 CLIR invocation (restricts CLI presentation).
   * 2 CLIR suppression (allows CLI presentation).
   */
  unsigned short n;

  /**
   * CLIR parameter 'm': parameter shows the subscriber CLIR service status in
   *                     the network.
   * 0 CLIR not provisioned.
   * 1 CLIR provisioned in permanent mode.
   * 2 unknown (e.g. no network, etc.).
   * 3 CLIR temporary mode presentation restricted.
   *
   * @see 3GPP TS 27.007 7.7 Defined values
   */
  unsigned short m;
};
