/* 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 "nsISupports.idl"
#include "nsIMobileConnectionProvider.idl"

interface nsIDOMMozMobileConnectionInfo;
interface nsIDOMDOMRequest;
interface nsIDOMWindow;
interface nsIDOMMozVoicemailStatus;
interface nsISmsRequest;
interface nsIDOMMozSmsSegmentInfo;
interface nsIDOMMozCellBroadcastMessage;

[scriptable, uuid(0faabc35-644d-4ed5-b109-425280ff1cdf)]
interface nsIRILTelephonyCallback : nsISupports
{
  /**
   * Notified when a telephony call changes state.
   *
   * @param callIndex
   *        Call identifier assigned by the RIL.
   * @param callState
   *        One of the nsIRadioInterfaceLayer::CALL_STATE_* values.
   * @param number
   *        Number of the other party.
   * @param isActive
   *        Indicates whether this call is the currently active one.
   */
  void callStateChanged(in unsigned long callIndex,
                        in unsigned short callState,
                        in AString number,
                        in boolean isActive);

  /**
   * Called when nsIRILContentHelper is asked to enumerate the current
   * telephony call state (nsIRILContentHelper::enumerateCalls). This is
   * called once per call that is currently managed by the RIL.
   *
   * @param callIndex
   *        Call identifier assigned by the RIL.
   * @param callState
   *        One of the nsIRadioInterfaceLayer::CALL_STATE_* values.
   * @param number
   *        Number of the other party.
   * @param isActive
   *        Indicates whether this call is the active one.
   *
   * @return true to continue enumeration or false to cancel.
   */
  boolean enumerateCallState(in unsigned long callIndex,
                             in unsigned short callState,
                             in AString number,
                             in boolean isActive);

  /**
   * Called when RIL error occurs.
   *
   * @param callIndex
   *        Call identifier assigned by the RIL. -1 if no connection
   * @param error
   *        Error from RIL.
   */
  void notifyError(in long callIndex,
                   in AString error);
};

[scriptable, uuid(521cfe4a-bf79-4134-a9fc-e2242164d657)]
interface nsIRILVoicemailCallback : nsISupports
{
  /**
   * Called when a voicemail notification has been received by the network.
   *
   * @param status
   *        The new voicemail status
   */
  void voicemailNotification(in nsIDOMMozVoicemailStatus status);
};

[scriptable, uuid(1e602d20-d066-4399-8997-daf36b3158ef)]
interface nsIRILDataCallInfo : nsISupports
{
  /**
   * Current data call state, one of the
   * nsINetworkInterface::NETWORK_STATE_* constants.
   */
  readonly attribute unsigned long state;
  readonly attribute AString cid;
  readonly attribute AString apn;
  readonly attribute AString ifname;
  readonly attribute AString ip;
  readonly attribute AString netmask;
  readonly attribute AString broadcast;
  readonly attribute AString gw;
  readonly attribute jsval dns;
};

[scriptable, uuid(5bcac053-c245-46f0-bb45-d0039bfb89f5)]
interface nsIRILDataCallback : nsISupports
{
  /**
   * Notified when a data call changes state.
   *
   * @param dataCall
   *        A nsIRILDataCallInfo object.
   */
  void dataCallStateChanged(in nsIRILDataCallInfo dataCall);

  /**
   * Called when nsIRadioInterfaceLayer is asked to enumerate the current
   * data call state.
   *
   * @param datacalls
   *        Array of nsIRILDataCallInfo objects.
   * @param length
   *        Lenght of the aforementioned array.
   */
  void receiveDataCallList([array,size_is(length)] in nsIRILDataCallInfo dataCalls,
                           in unsigned long length);
};

[scriptable, function, uuid(a94282b6-da60-4daf-95c1-82ee6889d0df)]
interface nsIRILContactCallback : nsISupports
{
  /**
   * Called when nsIRadioInterfaceLayer is asked to provide ICC contacts.
   *
   * @param errorMsg
   *        error message from RIL.
   * @param contactType
   *        Type of the dialling number, i.e. ADN, FDN.
   * @param contacts
   *        Array of the ICC contacts of the specified type.
   */
  void receiveContactsList(in DOMString errorMsg,
                           in DOMString contactType,
                           in jsval contacts);
};

[scriptable, uuid(c5e31c2c-a6a1-44c3-a30e-7fdfb4dc1750)]
interface nsIRILCellBroadcastCallback : nsISupports
{
  /**
   * Called when a Cell Broadcast message has been received by the network.
   *
   * @param message
   *        The received Cell Broadcast Message.
   */
  void notifyMessageReceived(in nsIDOMMozCellBroadcastMessage message);
};

/**
 * Helper that runs in the content process and exposes information
 * to the DOM.
 */
[scriptable, uuid(8c35c286-7a84-410d-9b36-b15f2cadf78f)]
interface nsIRILContentHelper : nsIMobileConnectionProvider
{
  void registerTelephonyCallback(in nsIRILTelephonyCallback callback);
  void unregisterTelephonyCallback(in nsIRILTelephonyCallback callback);

  void registerVoicemailCallback(in nsIRILVoicemailCallback callback);
  void unregisterVoicemailCallback(in nsIRILVoicemailCallback callback);

  void registerCellBroadcastCallback(in nsIRILCellBroadcastCallback callback);
  void unregisterCellBroadcastCallback(in nsIRILCellBroadcastCallback callback);

  /**
   * Called when a content process registers receiving unsolicited messages from
   * RadioInterfaceLayer in the chrome process. Only a content process that has
   * the 'telephony' permission is allowed to register. Note that content
   * doesn't need to unregister because the chrome process will remove it from
   * the registration list once the chrome receives a 'child-process-shutdown'
   * message.
   */
  void registerTelephonyMsg();

  /**
   * Called when a content process registers receiving unsolicited messages from
   * RadioInterfaceLayer in the chrome process. Only a content process that has
   * the 'voicemail' permission is allowed to register. Note that content
   * doesn't need to unregister because the chrome process will remove it from
   * the registration list once the chrome receives a 'child-process-shutdown'
   * message.
   */
  void registerVoicemailMsg();

  /**
   * Called when a content process registers receiving unsolicited messages from
   * RadioInterfaceLayer in the chrome process. Only a content process that has
   * the 'cellbroadcast' permission is allowed to register. Note that content
   * doesn't need to unregister because the chrome process will remove it from
   * the registration list once the chrome receives a 'child-process-shutdown'
   * message.
   */
  void registerCellBroadcastMsg();

  /**
   * Will continue calling callback.enumerateCallState until the callback
   * returns false.
   */
  void enumerateCalls(in nsIRILTelephonyCallback callback);

  /**
   * Functionality for making and managing phone calls.
   */
  void dial(in DOMString number);
  void dialEmergency(in DOMString number);
  void hangUp(in unsigned long callIndex);

  void startTone(in DOMString dtmfChar);
  void stopTone();

  void answerCall(in unsigned long callIndex);
  void rejectCall(in unsigned long callIndex);
  void holdCall(in unsigned long callIndex);
  void resumeCall(in unsigned long callIndex);

  attribute bool microphoneMuted;
  attribute bool speakerEnabled;

  readonly attribute nsIDOMMozVoicemailStatus voicemailStatus;
  readonly attribute DOMString voicemailNumber;
  readonly attribute DOMString voicemailDisplayName;
};

[scriptable, uuid(4efdb1d4-1e49-4f5d-a656-44e6180062a7)]
interface nsIICCRecords : nsISupports
{
  /**
   * Mobile Subscriber ISDN Number
   */
  readonly attribute DOMString msisdn;

  /**
   * Administrative Data
   */
  readonly attribute jsval ad;

  /**
   * International Mobile Subscriber Identity
   */
  readonly attribute DOMString imsi;

  /**
   * Mobile Country Code
   */
  readonly attribute unsigned short mcc;

  /**
   * Mobile Network Code
   */
  readonly attribute unsigned short mnc;

  /**
   * Abbreviated dialling numbers
   */
  readonly attribute jsval adn;

  /**
   * Fixed Dialling Numbers
   */
  readonly attribute jsval fdn;
};

[scriptable, uuid(c0c5cb9f-6372-4b5a-b74c-baacc2da5e4f)]
interface nsIVoicemailInfo : nsISupports
{
  readonly attribute DOMString number;

  readonly attribute DOMString displayName;
};

[scriptable, uuid(e6dc89f2-0d4e-46fc-902c-cfeeaee15e40)]
interface nsIRilContext : nsISupports
{
  readonly attribute DOMString radioState;

  readonly attribute DOMString cardState;

  readonly attribute nsIICCRecords icc;

  readonly attribute nsIDOMMozMobileConnectionInfo voice;

  readonly attribute nsIDOMMozMobileConnectionInfo data;
};

[scriptable, uuid(8526675d-2be7-4289-9d97-71e30c712010)]
interface nsIRadioInterfaceLayer : nsISupports
{
  const unsigned short CALL_STATE_UNKNOWN = 0;
  const unsigned short CALL_STATE_DIALING = 1;
  const unsigned short CALL_STATE_ALERTING = 2;
  const unsigned short CALL_STATE_BUSY = 3;
  const unsigned short CALL_STATE_CONNECTING = 4;
  const unsigned short CALL_STATE_CONNECTED = 5;
  const unsigned short CALL_STATE_HOLDING = 6;
  const unsigned short CALL_STATE_HELD = 7;
  const unsigned short CALL_STATE_RESUMING = 8;
  const unsigned short CALL_STATE_DISCONNECTING = 9;
  const unsigned short CALL_STATE_DISCONNECTED = 10;
  const unsigned short CALL_STATE_INCOMING = 11;

  /**
   * Activates or deactivates radio power.
   */
  void setRadioEnabled(in bool value);

  readonly attribute nsIRilContext rilContext;

  readonly attribute nsIVoicemailInfo voicemailInfo;

  /**
   * PDP APIs
   */
  void setupDataCallByType(in DOMString apntype);
  void deactivateDataCallByType(in DOMString apntype);
  long getDataCallStateByType(in DOMString apntype);
  void setupDataCall(in long radioTech,
                     in DOMString apn,
                     in DOMString user,
                     in DOMString passwd,
                     in long chappap,
                     in DOMString pdptype);
  void deactivateDataCall(in DOMString cid,
                          in DOMString reason);
  void getDataCallList();

  void registerDataCallCallback(in nsIRILDataCallback callback);
  void unregisterDataCallCallback(in nsIRILDataCallback callback);

  /**
   * SMS-related functionality.
   */
  nsIDOMMozSmsSegmentInfo getSegmentInfoForText(in DOMString text);

  void sendSMS(in DOMString number,
               in DOMString message,
               in nsISmsRequest request);

  /**
   * ICC-related functionality.
   */

  /**
   * Get ICC Contact List.
   *
   * @param contactType One of the values below.
   *                    "ADN" (Abbreviated Dialling Numbers)
   *                    "FDN" (Fixed Dialling Numbers)
   * @param callback  A nsIRILContactCallback object.
   */
  void getICCContacts(in DOMString contactType,
                      in nsIRILContactCallback callback);
};
