// Copyright 2014 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.usb</code> API to interact with connected USB
// devices. This API provides access to USB operations from within the context
// of an app. Using this API, apps can function as drivers for hardware devices.
namespace usb {

  // Direction, Recipient, RequestType, and TransferType all map to their
  // namesakes within the USB specification.
  enum Direction {in, out};
  enum Recipient {device, _interface, endpoint, other};
  enum RequestType {standard, class, vendor, reserved};
  enum TransferType {control, interrupt, isochronous, bulk};

  // For isochronous mode, SynchronizationType and UsageType map to their
  // namesakes within the USB specification.
  enum SynchronizationType {asynchronous, adaptive, synchronous};
  enum UsageType {data, feedback, explicitFeedback};

  // Returned by |getDevices| to identify a connected USB device.
  dictionary Device {
    // The id of the USB device. It remains unchanged until the device is
    // unplugged.
    long device;
    long vendorId;
    long productId;
  };

  // Returned by |openDevice| to be used for USB communication.
  // Every time a device is opened, a new connection handle is created.
  //
  // A connection handle represents the underlying data structure that contains
  // all the data we need to communicate with a USB device, including the status
  // of interfaces, the pending transfers, the descriptors, and etc. A connectin
  // handle id is different from a USB device id.
  //
  // All connection handles can work together if the device allows it.
  // The connection handle will be automatically closed when the app is reloaded
  // or suspended.
  //
  // When a connection handle is closed, all the interfaces it claimed will be
  // released and all the transfers in progress will be canceled immediately.
  dictionary ConnectionHandle {
    // The id of the USB connection handle.
    long handle;
    long vendorId;
    long productId;
  };

  dictionary EndpointDescriptor {
    long address;
    TransferType type;
    Direction direction;
    long maximumPacketSize;

    // Used for isochronous mode.
    SynchronizationType? synchronization;
    UsageType? usage;

    // If this is an interrupt endpoint, this will be 1-255.
    long? pollingInterval;
  };

  dictionary InterfaceDescriptor {
    long interfaceNumber;
    long alternateSetting;
    long interfaceClass;
    long interfaceSubclass;
    long interfaceProtocol;
    DOMString? description;
    EndpointDescriptor[] endpoints;
  };

  // ControlTransferInfo represents that parameters to a single USB control
  // transfer.
  dictionary ControlTransferInfo {
    // The direction of this transfer.
    Direction direction;

    // The intended recipient for this transfer.
    Recipient recipient;

    // The type of this request.
    RequestType requestType;

    long request;
    long value;
    long index;

    // If this transfer is an input transfer, then this field must be set to
    // indicate the expected data length. If this is an output transfer, then
    // this field is ignored.
    long? length;

    // The data payload carried by this transfer. If this is an output transfer
    // then this field must be set.
    ArrayBuffer? data;
  };

  // GenericTransferInfo is used by both bulk and interrupt transfers to
  // specify the parameters of the transfer.
  dictionary GenericTransferInfo {
    // The direction of this transfer.
    Direction direction;

    long endpoint;

    // If this is an input transfer then this field indicates the size of the
    // input buffer. If this is an output transfer then this field is ignored.
    long? length;

    // If this is an output transfer then this field must be populated.
    // Otherwise, it will be ignored.
    ArrayBuffer? data;
  };

  // IsochronousTransferInfo describes a single multi-packet isochronous
  // transfer.
  dictionary IsochronousTransferInfo {
    // All of the normal transfer parameters are encapsulated in the
    // transferInfo parameters. Note that the data specified in this parameter
    // block is split along packetLength boundaries to form the individual
    // packets of the transfer.
    GenericTransferInfo transferInfo;

    // The total number of packets in this transfer.
    long packets;

    // The length of each of the packets in this transfer.
    long packetLength;
  };

  dictionary TransferResultInfo {
    // A value of 0 indicates that the transfer was a success. Other values
    // indicate failure.
    long? resultCode;

    // If the transfer was an input transfer then this field will contain all
    // of the input data requested.
    ArrayBuffer? data;
  };

  // Describes the properties of devices which are found via |getDevices|.
  dictionary EnumerateDevicesOptions {
    long vendorId;
    long productId;
  };
  
  // Describes the properties of devices which are found via |findDevices|.
  dictionary EnumerateDevicesAndRequestAccessOptions {
    long vendorId;
    long productId;
    // The interface id to request access against.
    // Only available on ChromeOS. It has no effect on other platforms.
    long? interfaceId;
  };

  callback VoidCallback = void ();
  callback GetDevicesCallback = void (Device[] devices);
  callback RequestAccessCallback = void (boolean sucess);
  callback OpenDeviceCallback = void (ConnectionHandle handle);
  callback FindDevicesCallback = void (ConnectionHandle[] handles);
  callback ListInterfacesCallback = void (InterfaceDescriptor[] descriptors);
  callback CloseDeviceCallback = void ();
  callback TransferCallback = void (TransferResultInfo info);
  callback ResetDeviceCallback = void(boolean result);

  interface Functions {
    // Lists USB devices specified by vendorId/productId/interfaceId tuple.
    // |options|: The properties to search for on target devices.
    // |callback|: Invoked with a list of |Device|s on complete.
    static void getDevices(EnumerateDevicesOptions options,
                           GetDevicesCallback callback);

    // This method is ChromeOS specific. Calling this method on other platforms
    // will fail.
    // Requests access from the permission broker to an OS claimed device if the
    // given interface on the device is not claimed.
    //
    // |device|: The device to request access to.
    // |interfaceId|: 
    static void requestAccess(Device device,
                              long interfaceId,
                              RequestAccessCallback callback);

    // Opens a USB device returned by |getDevices|.
    // |device|: The device to open.
    // |callback|: Invoked with the created ConnectionHandle on complete.
    static void openDevice(Device device, OpenDeviceCallback callback);

    // Finds USB devices specified by the vendorId/productId/interfaceId tuple
    // and, if permissions allow, opens them for use.
    //
    // On Chrome OS, you can specify the interfaceId. In that case the method
    // will request access from permission broker in the same way as in
    // |requestUsbAcess|.
    //
    // If the access request is rejected, or the device is failed to be opened,
    // its connection handle will not be created or returned.
    //
    // Calling this method is equivalent to calling |getDevices| followed by
    // a series of |requestAccess| (if it is on ChromeOs) and |openDevice|
    // calls, and returning all the successfully opened connection handles.
    //
    // |options|: The properties to search for on target devices.
    // |callback|: Invoked with the opened ConnectionHandle on complete.
    static void findDevices(EnumerateDevicesAndRequestAccessOptions options,
                            FindDevicesCallback callback);

    // Closes a connection handle. Invoking operations on a device after it
    // has been closed is a safe operation, but causes no action to be taken.
    // |handle|: The connection handle to close.
    // |callback|: The callback to invoke once the device is closed.
    static void closeDevice(ConnectionHandle handle,
                            optional CloseDeviceCallback callback);

    // Lists all the interfaces on the USB device.
    // |handle|: The device from which the interfaces should be listed.
    // |callback|: The callback to invoke when the interfaces are enumerated.
    static void listInterfaces(ConnectionHandle handle,
                               ListInterfacesCallback callback);

    // Claims an interface on the specified USB device.
    // Before you can transfer data with endpoints, you must claim their parent
    // interfaces. Only one connection handle on the same host can claim each
    // interface. If the interface is already claimed, this call will fail.
    //
    // You shall call releaseInterface when the interface is not needed anymore.
    //
    // |handle|: The device on which the interface is to be claimed.
    // |interface|: The interface number to be claimed.
    // |callback|: The callback to invoke once the interface is claimed.
    static void claimInterface(ConnectionHandle handle, long interfaceNumber,
                               VoidCallback callback);

    // Releases a claim to an interface on the provided device.
    // |handle|: The device on which the interface is to be released.
    // |interface|: The interface number to be released.
    // |callback|: The callback to invoke once the interface is released.
    static void releaseInterface(ConnectionHandle handle, long interfaceNumber,
                                 VoidCallback callback);

    // Selects an alternate setting on a previously claimed interface on a
    // device.
    // |handle|: The device on which the interface settings are to be set.
    // |interface|: The interface number to be set.
    // |alternateSetting|: The alternate setting to set.
    // |callback|: The callback to invoke once the interface setting is set.
    static void setInterfaceAlternateSetting(ConnectionHandle handle,
                                             long interfaceNumber,
                                             long alternateSetting,
                                             VoidCallback callback);

    // Performs a control transfer on the specified device. See the
    // ControlTransferInfo structure for the parameters required to make a
    // transfer.
    //
    // Conceptually control transfer talks to the device itself. You do not need
    // to claim interface 0 to perform a control transfer.
    //
    // |handle|: A connection handle to make the transfer on.
    // |transferInfo|: The parameters to the transfer. See ControlTransferInfo.
    // |callback|: Invoked once the transfer has completed.
    static void controlTransfer(ConnectionHandle handle,
                                ControlTransferInfo transferInfo,
                                TransferCallback callback);

    // Performs a bulk transfer on the specified device.
    // |handle|: A connection handle to make the transfer on.
    // |transferInfo|: The parameters to the transfer. See GenericTransferInfo.
    // |callback|: Invoked once the transfer has completed.
    static void bulkTransfer(ConnectionHandle handle,
                             GenericTransferInfo transferInfo,
                             TransferCallback callback);

    // Performs an interrupt transfer on the specified device.
    // |handle|: A connection handle to make the transfer on.
    // |transferInfo|: The parameters to the transfer. See GenericTransferInfo.
    // |callback|: Invoked once the transfer has completed.
    static void interruptTransfer(ConnectionHandle handle,
                                  GenericTransferInfo transferInfo,
                                  TransferCallback callback);

    // Performs an isochronous transfer on the specific device.
    // |handle|: A connection handle to make the transfer on.
    // |transferInfo|: The parameters to the transfer. See
    // IsochronousTransferInfo.
    // |callback|: Invoked once the transfer has been completed.
    static void isochronousTransfer(ConnectionHandle handle,
                                    IsochronousTransferInfo transferInfo,
                                    TransferCallback callback);

    // Tries to reset the USB device and restores it to the previous status.
    // If the reset fails, the given connection handle will be closed and the 
    // USB device will appear to be disconnected then reconnected. 
    // In that case you must call |getDevices| or |findDevices| again to acquire
    // the device.
    //
    // |handle|: A connection handle to reset.
    // |callback|: Invoked once the device is reset with a boolean indicating
    // whether the reset is completed successfully.
    static void resetDevice(ConnectionHandle handle,
                            ResetDeviceCallback callback);
  };
};
