// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Use the <code>chrome.bluetooth</code> API to connect to a Bluetooth
// device.
namespace bluetooth {
  dictionary AdapterState {
    // The address of the adapter, in the format 'XX:XX:XX:XX:XX:XX'.
    DOMString address;

    // The human-readable name of the adapter.
    DOMString name;

    // Indicates whether or not the adapter has power.
    boolean powered;

    // Indicates whether or not the adapter is available (i.e. enabled).
    boolean available;

    // Indicates whether or not the adapter is currently discovering.
    boolean discovering;
  };

  dictionary Device {
    // The address of the device, in the format 'XX:XX:XX:XX:XX:XX'.
    DOMString address;

    // The human-readable name of the device.
    DOMString? name;

    // Indicates whether or not the device is paired with the system.
    boolean? paired;

    // Indicates whether the device is currently connected to the system.
    boolean? connected;
  };

  dictionary Profile {
    // Unique profile identifier, e.g. 00001401-0000-1000-8000-00805F9B23FB
    DOMString uuid;

    // Human-readable name of the Profile, e.g. "Health Device"
    DOMString? name;

    // The RFCOMM channel id, used when the profile is to be exported to remote
    // devices.
    long? channel;

    // The LS2CAP PSM number, used when the profile is to be exported to remote
    // deviecs.
    long? psm;

    // Specifies whether pairing (and encryption) is required to be able to
    // connect.
    boolean? requireAuthentication;

    // Specifies whether user authorization is required to be able to connect.
    boolean? requireAuthorization;

    // Specifies whether this profile will be automatically connected if any
    // other profile of device also exporting this profile connects to the host.
    boolean? autoConnect;

    // Specifies the implemented version of the profile.
    long? version;

    // Specifies the profile-specific bit field of features the implementation
    // supports.
    long? features;
  };

  dictionary ServiceRecord {
    // The name of the service.
    DOMString name;

    // The UUID of the service.
    DOMString? uuid;
  };

  dictionary Socket {
    // The remote Bluetooth device associated with this socket.
    Device device;

    // The remote Bluetooth profile associated with this socket.
    Profile profile;

    // An identifier for this socket that should be used with the
    // read/write/disconnect methods.
    long id;
  };

  dictionary OutOfBandPairingData {
    // Simple Pairing Hash C.
    // Always 16 octets long.
    ArrayBuffer hash;

    // Simple Pairing Randomizer R.
    // Always 16 octets long.
    ArrayBuffer randomizer;
  };

  callback AdapterStateCallback = void(AdapterState result);
  callback AddressCallback = void (DOMString result);
  callback BooleanCallback = void (boolean result);
  callback DataCallback = void (optional ArrayBuffer result);
  callback DeviceCallback = void (Device device);
  callback DevicesCallback = void (Device[] result);
  callback NameCallback = void (DOMString result);
  callback OutOfBandPairingDataCallback = void (OutOfBandPairingData data);
  callback ProfilesCallback = void(Profile[] result);
  callback ResultCallback = void ();
  callback ServicesCallback = void(ServiceRecord[] result);
  callback SizeCallback = void (long result);
  callback SocketCallback = void (Socket result);

  // Options for the getDevices function. If |profile| is not provided, all
  // devices known to the system are returned.
  dictionary GetDevicesOptions {
    // Only devices providing |profile| will be returned.
    Profile? profile;

    // Called for each matching device.  Note that a service discovery request
    // must be made to each non-matching device before it can be definitively
    // excluded.  This can take some time.
    DeviceCallback deviceCallback;
  };

  // Options for the getProfiles function.
  dictionary GetProfilesOptions {
    // The remote Bluetooth device to retrieve the exported profiles list from.
    Device device;
  };

  // Options for the getServices function.
  dictionary GetServicesOptions {
    // The address of the device to inquire about. |deviceAddress| should be
    // in the format 'XX:XX:XX:XX:XX:XX'.
    DOMString deviceAddress;
  };

  // Options for the connect function.
  dictionary ConnectOptions {
    // The connection is made to |device|.
    Device device;

    // The connection is made to |profile|.
    Profile profile;
  };

  // Options for the disconnect function.
  dictionary DisconnectOptions {
    // The socket to disconnect.
    Socket socket;
  };

  // Options for the read function.
  dictionary ReadOptions {
    // The socket to read from.
    Socket socket;
  };

  // Options for the write function.
  dictionary WriteOptions {
    // The socket to write to.
    Socket socket;

    // The data to write.
    ArrayBuffer data;
  };

  // Options for the setOutOfBandPairingData function.
  dictionary SetOutOfBandPairingDataOptions {
    // The address of the remote device that the data should be associated
    // with. |deviceAddress| should be in the format 'XX:XX:XX:XX:XX:XX'.
    DOMString address;

    // The Out Of Band Pairing Data. If this is omitted, the data for the
    // device is cleared instead.
    OutOfBandPairingData? data;
  };

  // Options for the startDiscovery function.
  dictionary StartDiscoveryOptions {
    // Called for each device that is discovered.
    DeviceCallback deviceCallback;
  };

  // These functions all report failures via chrome.runtime.lastError.
  interface Functions {
    // Registers the JavaScript application as an implementation for the given
    // Profile; if a channel or PSM is specified, the profile will be exported
    // in the host's SDP and GATT tables and advertised to other devices.
    static void addProfile(Profile profile, ResultCallback callback);

    // Unregisters the JavaScript application as an implementation for the given
    // Profile; only the uuid field of the Profile object is used.
    static void removeProfile(Profile profile, ResultCallback callback);

    // Get information about the Bluetooth adapter.
    // |callback| : Called with an AdapterState object describing the adapter
    //              state.
    static void getAdapterState(AdapterStateCallback callback);

    // Get a bluetooth devices known to the system.  Known devices are either
    // currently paired, or have been paired in the past.
    // |options|  : Controls which devices are returned and provides
    //              |deviceCallback|, which is called for each matching device.
    // |callback| : Called when the search is completed.
    //              |options.deviceCallback| will not be called after
    //              |callback| has been called.
    static void getDevices(GetDevicesOptions options,
                           ResultCallback callback);

    // Returns the set of exported profiles for the device specified in options.
    // This function will not initiate a connection to the remote device.
    static void getProfiles(GetProfilesOptions options,
                            ProfilesCallback callback);

    // Get a list of services provided by a device.
    static void getServices(GetServicesOptions options,
                            ServicesCallback callback);

    // Connect to a service on a device.
    // |options|  : The options for the connection.
    // |callback| : Called to indicate success or failure.
    static void connect(ConnectOptions options,
                        ResultCallback callback);

    // Close a Bluetooth connection.
    // |options|  : The options for this function.
    // |callback| : Called to indicate success or failure.
    static void disconnect(DisconnectOptions options,
                           optional ResultCallback callback);

    // Read data from a Bluetooth connection.
    // |options|  : The options for this function.
    // |callback| : Called with the data when it is available.
    static void read(ReadOptions options,
                     DataCallback callback);

    // Write data to a Bluetooth connection.
    // |options|  : The options for this function.
    // |callback| : Called with the number of bytes written.
    static void write(WriteOptions options,
                      optional SizeCallback callback);

    // Get the local Out of Band Pairing data.
    // |callback| : Called with the data.
    static void getLocalOutOfBandPairingData(
        OutOfBandPairingDataCallback callback);

    // Set the Out of Band Pairing data for a remote device.
    // Any previous Out Of Band Pairing Data for this device is overwritten.
    // |options|  : The options for this function.
    // |callback| : Called to indicate success or failure.
    static void setOutOfBandPairingData(SetOutOfBandPairingDataOptions options,
                                        optional ResultCallback callback);

    // Start discovery. Discovered devices will be returned via the
    // |onDeviceDiscovered| callback.  Discovery will fail to start if it is
    // already in progress.  Discovery can be resource intensive: stopDiscovery
    // should be called as soon as possible.
    // |options|  : The options for this function.
    // |callback| : Called to indicate success or failure.
    static void startDiscovery(
        StartDiscoveryOptions options,
        optional ResultCallback callback);

    // Stop discovery.
    // |callback| : Called to indicate success or failure.
    static void stopDiscovery(
        optional ResultCallback callback);
  };

  interface Events {
    // Fired when the state of the Bluetooth adapter changes.
    // |state| : The new state of the adapter.
    static void onAdapterStateChanged(AdapterState state);

    // Fired when a connection has been made for a registered profile.
    // |socket| : The socket for the connection.
    static void onConnection(Socket socket);
  };
};
