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

[scriptable, function, uuid(91824160-fb25-11e1-a21f-0800200c9a66)]
interface nsIWifiTetheringCallback : nsISupports
{
  /**
   * Callback function used to report status to WifiManager.
   *
   * @param error
   *        An error message if the operation wasn't successful,
   *        or `null` if it was.
   */
  void wifiTetheringEnabledChange(in jsval error);
};

[scriptable, function, uuid(9c128e68-5e4b-4626-bb88-84ec54cce5d8)]
interface nsINetworkStatsCallback : nsISupports
{
  void networkStatsAvailable(in boolean success,
                             in unsigned long rxBytes,
                             in unsigned long txBytes,
                             in unsigned long long timestamp);
};

[scriptable, function, uuid(0706bfa2-ac2d-11e2-9a8d-7b6d988d4767)]
interface nsINetworkUsageAlarmCallback : nsISupports
{
  void networkUsageAlarmResult(in jsval error);
};

[scriptable, function, uuid(9ede8720-f8bc-11e2-b778-0800200c9a66)]
interface nsIWifiOperationModeCallback : nsISupports
{
  /**
   * Callback function used to report result to WifiManager.
   *
   * @param error
   *        An error message if the operation wasn't successful,
   *        or `null` if it was.
   */
  void wifiOperationModeResult(in jsval error);
};

[scriptable, function, uuid(097878b0-19fc-11e3-8ffd-0800200c9a66)]
interface nsISetDhcpServerCallback : nsISupports
{
  /**
   * Callback function used to report the DHCP server set result
   *
   * @param error
   *        An error message if the operation wasn't successful,
   *        or `null` if it was.
   */
  void dhcpServerResult(in jsval error);
};

[scriptable, function, uuid(32407c50-46c7-11e3-8f96-0800200c9a66)]
interface nsIUsbTetheringCallback : nsISupports
{
  /**
   * Callback function used to report status of enabling usb tethering.
   *
   * @param error
   *        An error message if the operation wasn't successful,
   *        or `null` if it was.
   */
  void usbTetheringEnabledChange(in jsval error);
};

[scriptable, function, uuid(055fd560-46ad-11e3-8f96-0800200c9a66)]
interface nsIEnableUsbRndisCallback : nsISupports
{
  /**
   * Callback function used to report the status of enabling/disabling usb rndis.
   *
   * @param success
   *        Boolean to indicate the operation is successful or not.
   * @param enable
   *        Boolean to indicate if we are enabling or disabling usb rndis.
   */
  void enableUsbRndisResult(in boolean success, in boolean enable);
};

[scriptable, function, uuid(4f08cc30-46ad-11e3-8f96-0800200c9a66)]
interface nsIUpdateUpStreamCallback : nsISupports
{
  /**
   * Callback function used to report the result of updating upstream.
   *
   * @param success
   *        Boolean to indicate the operation is successful or not.
   * @param externalIfname
   *        The external interface name.
   */
  void updateUpStreamResult(in boolean success, in DOMString externalIfname);
};

[scriptable, function, uuid(eedca6c0-1310-11e4-9191-0800200c9a66)]
interface nsISetDnsCallback : nsISupports
{
  /**
   * Callback function used to report the result of setting DNS server.
   *
   * @param error
   *        An error message if the operation wasn't successful,
   *        or `null` if it was.
   */
  void setDnsResult(in jsval error);
};

[scriptable, function, uuid(5d0e1a60-1187-11e4-9191-0800200c9a66)]
interface nsINativeCommandCallback : nsISupports
{
  /**
   * Callback function used to report the result of a network native command.
   *
   * @param success
   *        Boolean to indicate the operation is successful or not.
   */
  void nativeCommandResult(in boolean success);
};

[scriptable, function, uuid(694abb80-1187-11e4-9191-0800200c9a66)]
interface nsIDhcpRequestCallback : nsISupports
{
  /**
   * Callback function used to report the result of DHCP client request.
   *
   * @param success
   *        Boolean to indicate the operation is successful or not.
   *
   * @param dhcpInfo
   *        An object to represent the successful DHCP request:
   *
   *          - gateway_str: string
   *          - dns1_str:    string
   *          - dns2_str:    string
   *          - mask_str:    string
   *          - server_str:  string
   *          - vendor_str:  string
   *          - lease:       long
   *          - mask:        long
   *          - ipaddr:      long
   *          - gateway:     long
   *          - dns1:        long
   *          - dns2:        long
   *          - server:      long
   */
  void dhcpRequestResult(in boolean success, in jsval dhcpInfo);
};

[scriptable, function, uuid(88e3ee22-f1b3-4fa0-8a5d-793fb827c42c)]
interface nsIGetInterfacesCallback : nsISupports
{
  /**
   * Callback function used to return the list of existing network interfaces.
   *
   * @param success
   *        Boolean to indicate the operation is successful or not.
   * @param interfaceList
   *        An array of interface name.
   */
  void getInterfacesResult(in boolean success, in jsval interfaceList);
};

[scriptable, function, uuid(064e02a3-d2c0-42c5-a293-1efa84056100)]
interface nsIGetInterfaceConfigCallback : nsISupports
{
  /**
   * Callback function used to return the network config of a given interface.
   *
   * @param success
   *        Boolean to indicate the operation is successful or not.
   * @param result
   *        .ip: Ip address.
   *        .prefix: mask length.
   *        .link: network link properties.
   *        .mac: mac address.
   */
  void getInterfaceConfigResult(in boolean success, in jsval result);
};

[scriptable, function, uuid(b370f360-6ba8-4517-a4f9-31e8f004ee91)]
interface nsISetInterfaceConfigCallback : nsISupports
{
  /**
   * Callback function used to set network config for a specified interface.
   *
   * @param success
   *        Boolean to indicate the operation is successful or not.
   */
  void setInterfaceConfigResult(in boolean success);
};

/**
 * Provide network services.
 */
[scriptable, uuid(e16fe98f-9f63-48fe-82ba-8d1a1b7c6a57)]
interface nsINetworkService : nsISupports
{
  const long MODIFY_ROUTE_ADD    = 0;
  const long MODIFY_ROUTE_REMOVE = 1;

  /**
   * Enable or disable Wifi Tethering
   *
   * @param enabled
   *        Boolean that indicates whether tethering should be enabled (true) or disabled (false).
   * @param config
   *        The Wifi Tethering configuration from settings db.
   * @param callback
   *        Callback function used to report status to WifiManager.
   */
  void setWifiTethering(in boolean enabled,
                        in jsval config,
                        in nsIWifiTetheringCallback callback);

  /**
   * Enable or disable DHCP server
   *
   * @param enabled
   *        Boolean that indicates enabling or disabling DHCP server.
   *
   * @param config
   *        Config used to enable the DHCP server. It contains
   *        .startIp    start of the ip lease range (string)
   *        .endIp      end of the ip lease range (string)
   *        .serverIp   ip of the DHCP server (string)
   *        .maskLength the length of the subnet mask
   *        .ifname     the interface name
   *
   *        As for disabling the DHCP server, put this value |null|.
   *
   * @param callback
   *        Callback function used to report status.
   */
  void setDhcpServer(in boolean enabled,
                     in jsval config,
                     in nsISetDhcpServerCallback callback);


  /**
   * Retrieve network interface stats.
   *
   * @param networkName
   *        Select the Network interface to request estats.
   *
   * @param callback
   *        Callback to notify result and provide stats, connectionType
   *        and the date when stats are retrieved
   */
  void getNetworkInterfaceStats(in DOMString networkName, in nsINetworkStatsCallback callback);

  /**
   * Set Alarm of usage per interface
   *
   * @param networkName
   *        Select the Network interface to set an alarm.
   *
   * @param threshold
   *        Amount of data that will trigger the alarm.
   *
   * @param callback
   *        Callback to notify the result.
   *
   * @return false if there is no interface registered for the networkType param.
   */
  boolean setNetworkInterfaceAlarm(in DOMString networkName,
                                   in long long threshold,
                                   in nsINetworkUsageAlarmCallback callback);

  /**
   * Reload Wifi firmware to specific operation mode.
   *
   * @param interfaceName
   *        Wifi Network interface name.
   *
   * @param mode
   *        AP  - Access pointer mode.
   *        P2P - Peer to peer connection mode.
   *        STA - Station mode.
   *
   * @param callback
   *        Callback to notify Wifi firmware reload result.
   */
  void setWifiOperationMode(in DOMString interfaceName,
                            in DOMString mode,
                            in nsIWifiOperationModeCallback callback);

  /**
   * Set USB tethering.
   *
   * @param enabled
   *        Boolean to indicate we are going to enable or disable usb tethering.
   * @param config
   *        The usb tethering configuration.
   * @param callback
   *        Callback function used to report the result enabling/disabling usb tethering.
   */
  void setUSBTethering(in boolean enabled,
                       in jsval config,
                       in nsIUsbTetheringCallback callback);

  /**
   * Reset routing table.
   *
   * @param interfaceName
   *        The name of the network interface we want to remove from the routing
   *        table.
   *
   * @param callback
   *        Callback to notify the result of resetting routing table.
   */
  void resetRoutingTable(in DOMString interfaceName,
                         in nsINativeCommandCallback callback);

  /**
   * Set DNS.
   *
   * @param interfaceName
   *        The network interface name of the DNS we want to set.
   * @param dnsesCount
   *        Number of elements in dnses.
   * @param dnses
   *        Dnses to set.
   * @param gatewaysCount
   *        Number of elements in gateways.
   * @param gateways
   *        Gateways for the dnses, the most suitable, usually the one with the
   *        same address family, will be selected for each dns.
   *
   * @param callback
   *        Callback to notify the result of setting DNS server.
   */
  void setDNS(in DOMString interfaceName,
              in unsigned long dnsesCount,
              [array, size_is(dnsesCount)] in wstring dnses,
              in unsigned long gatewaysCount,
              [array, size_is(gatewaysCount)] in wstring gateways,
              in nsISetDnsCallback callback);

  /**
   * Set default route.
   *
   * @param interfaceName
   *        The network interface name of the default route we want to set.
   * @param count
   *        Number of elements in gateways.
   * @param gateways
   *        Default gateways for setting default route.
   *
   * @param callback
   *        Callback to notify the result of setting default route.
   */
  void setDefaultRoute(in DOMString interfaceName,
                       in unsigned long count,
                       [array, size_is(count)] in wstring gateways,
                       in nsINativeCommandCallback callback);

  /**
   * Remove default route.
   *
   * @param interfaceName
   *        The network interface name of the default route we want to remove.
   * @param count
   *        Number of elements in gateways.
   * @param gatways
   *        Default gateways for removing default route.
   *
   * @param callback
   *        Callback to notify the result of removing default route.
   */
  void removeDefaultRoute(in DOMString interfaceName,
                          in unsigned long count,
                          [array, size_is(count)] in wstring gateways,
                          in nsINativeCommandCallback callback);

  /**
   * Modify route.
   *
   * @param action
   *        nsINetworkService.MODIFY_ROUTE_ADD to add route and
   *        nsINetworkService.MODIFY_ROUTE_REMOVE to remove.
   * @param interfaceName
   *        Network interface name for the output of the host route.
   * @param host
   *        Host ip we want to remove route for.
   * @param prefixLength
   *        The prefix length of the route we'd like to modify.
   * @param [optional] gateway
   *        Gateway ip for the output of the host route.
   *
   * @return A deferred promise that resolves on success or rejects with a
   *         specified reason otherwise.
   */
  jsval modifyRoute(in long      action,
                    in DOMString interfaceName,
                    in DOMString host,
                    in long      prefixLength,
                    [optional] in DOMString gateway);

  /**
   * Add route to secondary routing table.
   *
   * @param interfaceName
   *        The network interface for this route.
   * @param route
   *        The route info should have the following fields:
   *        .ip: destination ip address
   *        .prefix: destination prefix
   *        .gateway: gateway ip address
   */
  void addSecondaryRoute(in DOMString interfaceName, in jsval route,
                         in nsINativeCommandCallback callback);

  /**
   * Remove route from secondary routing table.
   *
   * @param interfaceName
   *        The network interface for the route we want to remove.
   * @param route
   *        The route info should have the following fields:
   *        .ip: destination ip address
   *        .prefix: destination prefix
   *        .gateway: gateway ip address
   */
  void removeSecondaryRoute(in DOMString interfaceName, in jsval route,
                            in nsINativeCommandCallback callback);

  /**
   * Enable or disable usb rndis.
   *
   * @param enable
   *        Boolean to indicate we want enable or disable usb rndis.
   * @param callback
   *        Callback function to report the result.
   */
  void enableUsbRndis(in boolean enable,
                      in nsIEnableUsbRndisCallback callback);

  /**
   * Update upstream.
   *
   * @param previous
   *        The previous internal and external interface.
   * @param current
   *        The current internal and external interface.
   * @param callback
   *        Callback function to report the result.
   */
  void updateUpStream(in jsval previous,
                      in jsval current,
                      in nsIUpdateUpStreamCallback callback);

  /*
   * Obtain interfaces list.
   *
   * @param callback
   *        Callback function to return the result.
   */
  void getInterfaces(in nsIGetInterfacesCallback callback);

  /**
   * Get config of a network interface.
   *
   * @param ifname
   *        Target interface.
   * @param callback
   *        Callback function to report the result.
   */
  void getInterfaceConfig(in DOMString ifname, in nsIGetInterfaceConfigCallback callback);

  /**
   * Set config for a network interface.
   *
   * @param config
   *        .ifname: Target interface.
   *        .ip: Ip address.
   *        .prefix: mask length.
   *        .link: network link properties.
   * @param callback
   *        Callback function to report the result.
   */
  void setInterfaceConfig(in jsval config, in nsISetInterfaceConfigCallback callback);

  /**
   * Configure a network interface.
   *
   * @param config
   *        An object containing the detail that we want to configure the interface:
   *
   *          - ifname:  string
   *          - ipaddr:  long
   *          - mask:    long
   *          - gateway: long
   *          - dns1:    long
   *          - dns2:    long
   *
   * @param callback
   *        Callback to notify the result of configurating network interface.
   */
  void configureInterface(in jsval config,
                          in nsINativeCommandCallback callback);

  /**
   * Issue a DHCP client request.
   *
   * @param networkInterface
   *        The network interface which we wnat to do the DHCP request on.
   *
   * @param callback
   *        Callback to notify the result of the DHCP request.
   */
  void dhcpRequest(in DOMString interfaceName,
                   in nsIDhcpRequestCallback callback);

  /**
   * Stop Dhcp daemon.
   *
   * @param ifname
   *        Target interface.
   *
   * @param callback
   *        Callback to notify the result of stopping dhcp request.
   */
  void stopDhcp(in DOMString ifname,
                in nsINativeCommandCallback callback);

  /**
   * Enable a network interface.
   *
   * @param networkInterface
   *        The network interface name which we want to enable.
   *
   * @param callback
   *        Callback to notify the result of disabling network interface.
   */
  void enableInterface(in DOMString interfaceName,
                       in nsINativeCommandCallback callback);

  /**
   * Disable a network interface.
   *
   * @param networkInterface
   *        The network interface name which we want to disable.
   *
   * @param callback
   *        Callback to notify the result of disabling network interface.
   */
  void disableInterface(in DOMString interfaceName,
                        in nsINativeCommandCallback callback);

  /**
   * Reset all connections on a specified network interface.
   *
   * @param interfaceName
   *        The network interface name which we want to reset.
   *
   * @param callback
   *        Callback to notify the result of resetting connections.
   */
  void resetConnections(in DOMString interfaceName,
                        in nsINativeCommandCallback callback);

  /**
   * Create network (required to call prior to any networking operation).
   *
   * @param interfaceName
   *        The network interface name which we want to create network for.
   *
   * @param callback
   *        Callback to notify the result of creating network.
   */
  void createNetwork(in DOMString interfaceName,
                     in nsINativeCommandCallback callback);

  /**
   * Destroy network.
   *
   * @param interfaceName
   *        The network interface name of the network we want to destroy.
   *
   * @param callback
   *        Callback to notify the result of destroying network.
   */
  void destroyNetwork(in DOMString interfaceName,
                      in nsINativeCommandCallback callback);

  /**
   * Query the netId associated with given network interface name.
   *
   * @param interfaceName
   *        The network interface name which we want to query.
   *
   * @return A deferred promise that resolves with a string to indicate.
   *         the queried netId on success and rejects if the interface name
   *         is invalid.
   *
   */
  jsval getNetId(in DOMString interfaceName);

  /**
   * Set maximum transmission unit on a network interface.
   *
   * @param interfaceName
   *        The name of the network interface that we want to set mtu.
   * @param mtu
   *        Size of maximum tranmission unit.
   *
   * @param callback
   *        Callback to notify the result of setting mtu.
   */
  void setMtu(in DOMString interfaceName, in long mtu,
              in nsINativeCommandCallback callback);
};
