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

interface nsIDOMBlob;
interface nsIDOMEventTarget;
interface nsIInputStream;
interface nsIPresentationAvailabilityListener;
interface nsIPresentationRespondingListener;
interface nsIPresentationSessionListener;
interface nsIPresentationTransportBuilderConstructor;

%{C++
#define PRESENTATION_SERVICE_CID \
  { 0x1d9bb10c, 0xc0ab, 0x4fe8, \
    { 0x9e, 0x4f, 0x40, 0x58, 0xb8, 0x51, 0x98, 0x32 } }
#define PRESENTATION_SERVICE_CONTRACTID \
  "@mozilla.org/presentation/presentationservice;1"

#include "nsTArray.h"

class nsString;
%}

[ref] native URLArrayRef(const nsTArray<nsString>);

[scriptable, uuid(12073206-0065-4b10-9488-a6eb9b23e65b)]
interface nsIPresentationServiceCallback : nsISupports
{
  /*
   * Called when the operation succeeds.
   *
   * @param url: the selected request url used to start or reconnect a session.
   */
  void notifySuccess(in DOMString url);

  /*
   * Called when the operation fails.
   *
   * @param error: error message.
   */
  void notifyError(in nsresult error);
};

[scriptable, uuid(de42b741-5619-4650-b961-c2cebb572c95)]
interface nsIPresentationService : nsISupports
{
  const unsigned short ROLE_CONTROLLER = 0x1;
  const unsigned short ROLE_RECEIVER = 0x2;

  const unsigned short CLOSED_REASON_ERROR = 0x1;
  const unsigned short CLOSED_REASON_CLOSED = 0x2;
  const unsigned short CLOSED_REASON_WENTAWAY = 0x3;

  /*
   * Start a new presentation session and display a prompt box which asks users
   * to select a device.
   *
   * @param urls: The candidate Urls of presenting page. Only one url would be used.
   * @param sessionId: An ID to identify presentation session.
   * @param origin: The url of requesting page.
   * @param deviceId: The specified device of handling this request, null string
   *                  for prompt device selection dialog.
   * @param windowId: The inner window ID associated with the presentation
   *                  session. (0 implies no window ID since no actual window
   *                  uses 0 as its ID. Generally it's the case the window is
   *                  located in different process from this service)
   * @param eventTarget: The chrome event handler, in particular XUL browser
   *                     element in parent process, that the request was
   *                     originated in.
   * @param callback: Invoke the callback when the operation is completed.
   *                  NotifySuccess() is called with |id| if a session is
   *                  established successfully with the selected device.
   *                  Otherwise, NotifyError() is called with a error message.
   * @param constructor: The constructor for creating a transport builder.
   */
  [noscript] void startSession(in URLArrayRef urls,
                               in DOMString sessionId,
                               in DOMString origin,
                               in DOMString deviceId,
                               in unsigned long long windowId,
                               in nsIDOMEventTarget eventTarget,
                               in nsIPresentationServiceCallback callback,
                               in nsIPresentationTransportBuilderConstructor constructor);

  /*
   * Send the message to the session.
   *
   * @param sessionId: An ID to identify presentation session.
   * @param role: Identify the function called by controller or receiver.
   * @param data: the message being sent out.
   */
  void sendSessionMessage(in DOMString sessionId,
							            in uint8_t role,
                          in DOMString data);

  /*
   * Send the binary message to the session.
   *
   * @param sessionId: An ID to identify presentation session.
   * @param role: Identify the function called by controller or receiver.
   * @param data: the message being sent out.
   */
  void sendSessionBinaryMsg(in DOMString sessionId,
                            in uint8_t role,
                            in ACString data);

  /*
   * Send the blob to the session.
   *
   * @param sessionId: An ID to identify presentation session.
   * @param role: Identify the function called by controller or receiver.
   * @param blob: The input blob to be sent.
   */
  void sendSessionBlob(in DOMString sessionId,
                       in uint8_t role,
                       in nsIDOMBlob blob);

  /*
   * Close the session.
   *
   * @param sessionId: An ID to identify presentation session.
   * @param role: Identify the function called by controller or receiver.
   */
  void closeSession(in DOMString sessionId,
                    in uint8_t role,
                    in uint8_t closedReason);

  /*
   * Terminate the session.
   *
   * @param sessionId: An ID to identify presentation session.
   * @param role: Identify the function called by controller or receiver.
   */
  void terminateSession(in DOMString sessionId,
                        in uint8_t role);

  /*
   * Reconnect the session.
   *
   * @param url: The request Urls.
   * @param sessionId: An ID to identify presentation session.
   * @param role: Identify the function called by controller or receiver.
   * @param callback: NotifySuccess() is called when a control channel
   *                  is opened successfully.
   *                  Otherwise, NotifyError() is called with a error message.
   */
  [noscript] void reconnectSession(in URLArrayRef urls,
                                   in DOMString sessionId,
                                   in uint8_t role,
                                   in nsIPresentationServiceCallback callback);

  /*
   * Register an availability listener. Must be called from the main thread.
   *
   * @param listener: The listener to register.
   */
  void registerAvailabilityListener(in nsIPresentationAvailabilityListener listener);

  /*
   * Unregister an availability listener. Must be called from the main thread.
   * @param listener: The listener to unregister.
   */
  void unregisterAvailabilityListener(in nsIPresentationAvailabilityListener listener);

  /*
   * Register a session listener. Must be called from the main thread.
   *
   * @param sessionId: An ID to identify presentation session.
   * @param role: Identify the function called by controller or receiver.
   * @param listener: The listener to register.
   */
  void registerSessionListener(in DOMString sessionId,
                               in uint8_t role,
                               in nsIPresentationSessionListener listener);

  /*
   * Unregister a session listener. Must be called from the main thread.
   *
   * @param sessionId: An ID to identify presentation session.
   * @param role: Identify the function called by controller or receiver.
   */
  void unregisterSessionListener(in DOMString sessionId,
                                 in uint8_t role);

  /*
   * Register a responding listener. Must be called from the main thread.
   *
   * @param windowId: The window ID associated with the listener.
   * @param listener: The listener to register.
   */
  void registerRespondingListener(in unsigned long long windowId,
                                  in nsIPresentationRespondingListener listener);

  /*
   * Unregister a responding listener. Must be called from the main thread.
   * @param windowId: The window ID associated with the listener.
   */
  void unregisterRespondingListener(in unsigned long long windowId);

  /*
   * Notify the receiver page is ready for presentation use.
   *
   * @param sessionId An ID to identify presentation session.
   * @param windowId  The inner window ID associated with the presentation
   *                  session.
   * @param isLoading true if receiver page is loading successfully.
   * @param constructor: The constructor for creating a transport builder.
   */
  void notifyReceiverReady(in DOMString sessionId,
                           in unsigned long long windowId,
                           in boolean isLoading,
                           in nsIPresentationTransportBuilderConstructor constructor);

  /*
   * Notify the transport is closed
   *
   * @param sessionId: An ID to identify presentation session.
   * @param role: Identify the function called by controller or receiver.
   * @param reason: the error message. NS_OK indicates it is closed normally.
   */
  void NotifyTransportClosed(in DOMString sessionId,
                             in uint8_t role,
                             in nsresult reason);

  /*
   * Untrack the relevant info about the presentation session if there's any.
   *
   * @param sessionId: An ID to identify presentation session.
   * @param role: Identify the function called by controller or receiver.
   */
  void untrackSessionInfo(in DOMString sessionId, in uint8_t role);

  /*
   * The windowId for building RTCDataChannel session transport
   *
   * @param sessionId: An ID to identify presentation session.
   * @param role: Identify the function called by controller or receiver.
   */
  unsigned long long getWindowIdBySessionId(in DOMString sessionId,
                                            in uint8_t role);

  /*
   * Update the mapping of the session ID and window ID.
   *
   * @param sessionId: An ID to identify presentation session.
   * @param role: Identify the function called by controller or receiver.
   * @param windowId: The inner window ID associated with the presentation
   *                  session.
   */
  void updateWindowIdBySessionId(in DOMString sessionId,
                                 in uint8_t role,
                                 in unsigned long long windowId);

  /*
   * To build the session transport.
   * NOTE: This function should be only called at controller side.
   *
   * @param sessionId: An ID to identify presentation session.
   * @param role: Identify the function called by controller or receiver.
   */
  void buildTransport(in DOMString sessionId, in uint8_t role);
};
