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

[scriptable, function, uuid(2ae081ac-8038-11e4-a472-1ba11eb89d79)]
interface nsIGonkMobileMessageDatabaseCallback : nsISupports
{
  /**
   * |aDomMessage|: the nsI{Mms,Sms}Message
   */
  void notify(in nsresult aRv, in nsISupports aDomMessage);
};

[scriptable, function, uuid(2f7a6fde-8038-11e4-9d93-5b9ffba492fb)]
interface nsIGonkMobileMessageDatabaseRecordCallback : nsISupports
{
  /**
   * |aMessageRecord| Object: the mobile-message database record
   * |aDomMessage|: the nsI{Mms,Sms}Message. Noted, this value might be null.
   */
  void notify(in nsresult aRv, in jsval aMessageRecord, in nsISupports aDomMessage);
};

[scriptable, function, uuid(36f9732c-8038-11e4-b634-3f7e3df5232a)]
interface nsIGonkMobileMessageDatabaseConcatenationCallback : nsISupports
{
  /**
   * |aCompleteMessage|: jsval: the completely concatenated message. Noted, this value might be null.
   */
  void notify(in nsresult aRv, in jsval aCompleteMessage);
};

%{C++
#define GONK_MOBILE_MESSAGE_DATABASE_SERVICE_CID \
  { 0x7db05024, 0x8038, 0x11e4, { 0xb7, 0xfa, 0xa3, 0xed, 0xb6, 0xf1, 0xbf, 0x0c } }
#define GONK_MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID \
  "@mozilla.org/mobilemessage/gonkmobilemessagedatabaseservice;1"
%}

[scriptable, uuid(48a3c28a-8038-11e4-b7b9-0f2df5b53100)]
interface nsIGonkMobileMessageDatabaseService : nsIMobileMessageDatabaseService
{
  /**
   * |aMessage| Object: should contain the following properties for internal use:
   *   - |type| DOMString: "sms" or "mms"
   *   - |timestamp| Number: the timestamp of received message
   *   - |iccId| DOMString: [optional] the ICC ID of the SIM for receiving
   *                        message if available.
   *
   *   - If |type| == "sms", we also need:
   *     - |messageClass| DOMString: the message class of received message
   *     - |receiver| DOMString: the phone number of receiver
   *     - |pid| Number: the TP-PID field of the SMS TPDU, default 0.
   *     - |sender| DOMString: the phone number of sender
   *
   *   - If |type| == "mms", we also need:
   *     - |delivery| DOMString: the delivery state of received message
   *     - |deliveryStatus| DOMString: the delivery status of received message
   *     - |receivers| DOMString Array: the phone numbers of receivers
   *     - |phoneNumber| DOMString: [optional] my own phone number.
   */
  void saveReceivedMessage(in jsval aMessage,
                [optional] in nsIGonkMobileMessageDatabaseCallback aCallback);

  /**
   * |aMessage| Object: should contain the following properties for internal use:
   *   - |type| DOMString: "sms" or "mms"
   *   - |sender| DOMString: the phone number of sender
   *   - |timestamp| Number: the timestamp of sending message
   *   - |deliveryStatusRequested| Bool: true when the delivery report is requested.
   *   - |iccId| DOMString: the ICC ID of the SIM for sending message
   *
   *   - If |type| == "sms", we also need:
   *     - |receiver| DOMString: the phone number of receiver
   *
   *   - If |type| == "mms", we also need:
   *     - |receivers| DOMString Array: the phone numbers of receivers
   */
  void saveSendingMessage(in jsval aMessage,
               [optional] in nsIGonkMobileMessageDatabaseCallback aCallback);

  /**
   * |aMessageId| Number: the message's DB record ID.
   * |aReceiver| DOMString: the phone number of receiver (for MMS; can be null).
   * |aDelivery| DOMString: the new delivery value to update (can be null).
   * |aDeliveryStatus| DOMString: the new delivery status to update (can be null).
   * |aEnvelopeId| DOMString: the "message-id" specified in the MMS PDU headers.
   * |aCallback| nsIGonkMobileMessageDatabaseCallback: an optional callback.
   */
  void setMessageDeliveryByMessageId(in long aMessageId,
                                     in DOMString aReceiver,
                                     in DOMString aDelivery,
                                     in DOMString aDeliveryStatus,
                                     in DOMString aEnvelopeId,
                          [optional] in nsIGonkMobileMessageDatabaseCallback aCallback);

  /**
   * |aEnvelopeId| DOMString: the "message-id" specified in the MMS PDU headers.
   * |aReceiver| DOMString: the phone number of receiver (for MMS; can be null).
   * |aDeliveryStatus| DOMString: the new delivery status to be updated (can be null).
   * |aCallback| nsIGonkMobileMessageDatabaseCallback: an optional callback.
   */
  void setMessageDeliveryStatusByEnvelopeId(in DOMString aEnvelopeId,
                                            in DOMString aReceiver,
                                            in DOMString aDeliveryStatus,
                                 [optional] in nsIGonkMobileMessageDatabaseCallback aCallback);

  /**
   * |aEnvelopeId| DOMString: the "message-id" specified in the MMS PDU headers.
   * |aReceiver| DOMString: the phone number of receiver (for MMS; can be null).
   * |aReadStatus| DOMString: the new read status to be updated.
   * |aCallback| nsIGonkMobileMessageDatabaseCallback: an optional callback.
   */
  void setMessageReadStatusByEnvelopeId(in DOMString aEnvelopeId,
                                        in DOMString aReceiver,
                                        in DOMString aReadStatus,
                             [optional] in nsIGonkMobileMessageDatabaseCallback aCallback);

  /**
   * |aMessageId| Number: the message's DB record ID.
   * |aCallback| nsIGonkMobileMessageDatabaseRecordCallback: a callback which
   *   takes result flag, message record and domMessage as parameters.
   */
  void getMessageRecordById(in long aMessageId,
                            in nsIGonkMobileMessageDatabaseRecordCallback aCallback);

  /**
   * |aTransactionId| DOMString: the transaction ID of MMS PDU.
   * |aCallback| nsIGonkMobileMessageDatabaseRecordCallback: a callback which
   *   takes result flag and message record as parameters.
   */
  void getMessageRecordByTransactionId(in DOMString aTransactionId,
                                       in nsIGonkMobileMessageDatabaseRecordCallback aCallback);

  /**
   * |aCrError| nsresult: the NS_ERROR defined in Components.results.
   *
   * @returns the error code defined in nsIMobileMessageCallback
   */
  jsval translateCrErrorToMessageCallbackError(in nsresult aCrError);

  /**
   * |aSmsSegment| jsval: Decoded Single SMS PDU.
   * |aCallback| nsIGonkMobileMessageDatabaseConcatenationCallback: a callback which
   *   takes result flag, and complete mesage as parameters.
   */
  void saveSmsSegment(in jsval aSmsSegment,
                      in nsIGonkMobileMessageDatabaseConcatenationCallback aCallback);
};
