blob: 92d94a336c31c2ad03f5f43da5943b03cf52b9e1 [file] [log] [blame] [edit]
// 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.
#ifndef EXTENSIONS_BROWSER_API_USB_USB_API_H_
#define EXTENSIONS_BROWSER_API_USB_USB_API_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <string>
#include <vector>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "extensions/browser/api/api_resource_manager.h"
#include "extensions/browser/api/usb/usb_device_manager.h"
#include "extensions/browser/extension_function.h"
#include "extensions/common/api/usb.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/device/public/mojom/usb_device.mojom.h"
namespace extensions {
class DevicePermissionEntry;
class DevicePermissionsPrompt;
class DevicePermissionsManager;
class UsbDeviceResource;
class UsbExtensionFunction : public ExtensionFunction {
protected:
UsbExtensionFunction();
~UsbExtensionFunction() override;
UsbDeviceManager* usb_device_manager();
private:
UsbDeviceManager* usb_device_manager_ = nullptr;
};
class UsbPermissionCheckingFunction : public UsbExtensionFunction {
protected:
UsbPermissionCheckingFunction();
~UsbPermissionCheckingFunction() override;
bool HasDevicePermission(const device::mojom::UsbDeviceInfo& device);
void RecordDeviceLastUsed();
private:
DevicePermissionsManager* device_permissions_manager_;
scoped_refptr<DevicePermissionEntry> permission_entry_;
};
class UsbConnectionFunction : public UsbExtensionFunction {
protected:
UsbConnectionFunction();
~UsbConnectionFunction() override;
UsbDeviceResource* GetResourceFromHandle(
const api::usb::ConnectionHandle& handle);
device::mojom::UsbDevice* GetDeviceFromHandle(
const api::usb::ConnectionHandle& handle);
const device::mojom::UsbDeviceInfo* GetDeviceInfoFromHandle(
const api::usb::ConnectionHandle& handle);
void ReleaseDeviceResource(const api::usb::ConnectionHandle& handle);
};
class UsbTransferFunction : public UsbConnectionFunction {
protected:
UsbTransferFunction();
~UsbTransferFunction() override;
void OnCompleted(device::mojom::UsbTransferStatus status,
std::unique_ptr<base::DictionaryValue> transfer_info);
void OnTransferInCompleted(device::mojom::UsbTransferStatus status,
const std::vector<uint8_t>& data);
void OnTransferOutCompleted(device::mojom::UsbTransferStatus status);
void OnDisconnect();
};
class UsbGenericTransferFunction : public UsbTransferFunction {
protected:
UsbGenericTransferFunction();
~UsbGenericTransferFunction() override;
// InterruptTransfer::Params and BulkTransfer::Params
template <typename T>
ExtensionFunction::ResponseAction DoTransfer(T params);
};
class UsbFindDevicesFunction : public UsbExtensionFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.findDevices", USB_FINDDEVICES)
UsbFindDevicesFunction();
private:
~UsbFindDevicesFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
void OnGetDevicesComplete(
std::vector<device::mojom::UsbDeviceInfoPtr> devices);
void OnDeviceOpened(const std::string& guid,
mojo::Remote<device::mojom::UsbDevice> device_ptr,
device::mojom::UsbOpenDeviceError error);
void OpenComplete();
void OnDisconnect();
uint16_t vendor_id_;
uint16_t product_id_;
std::unique_ptr<base::ListValue> result_;
base::RepeatingClosure barrier_;
DISALLOW_COPY_AND_ASSIGN(UsbFindDevicesFunction);
};
class UsbGetDevicesFunction : public UsbPermissionCheckingFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.getDevices", USB_GETDEVICES)
UsbGetDevicesFunction();
private:
~UsbGetDevicesFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
void OnGetDevicesComplete(
std::vector<device::mojom::UsbDeviceInfoPtr> devices);
std::vector<device::mojom::UsbDeviceFilterPtr> filters_;
DISALLOW_COPY_AND_ASSIGN(UsbGetDevicesFunction);
};
class UsbGetUserSelectedDevicesFunction : public UsbExtensionFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.getUserSelectedDevices",
USB_GETUSERSELECTEDDEVICES)
UsbGetUserSelectedDevicesFunction();
private:
~UsbGetUserSelectedDevicesFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
void OnDevicesChosen(std::vector<device::mojom::UsbDeviceInfoPtr> devices);
std::unique_ptr<DevicePermissionsPrompt> prompt_;
DISALLOW_COPY_AND_ASSIGN(UsbGetUserSelectedDevicesFunction);
};
class UsbGetConfigurationsFunction : public UsbPermissionCheckingFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.getConfigurations", USB_GETCONFIGURATIONS)
UsbGetConfigurationsFunction();
private:
~UsbGetConfigurationsFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
DISALLOW_COPY_AND_ASSIGN(UsbGetConfigurationsFunction);
};
class UsbRequestAccessFunction : public ExtensionFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.requestAccess", USB_REQUESTACCESS)
UsbRequestAccessFunction();
private:
~UsbRequestAccessFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
DISALLOW_COPY_AND_ASSIGN(UsbRequestAccessFunction);
};
class UsbOpenDeviceFunction : public UsbPermissionCheckingFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.openDevice", USB_OPENDEVICE)
UsbOpenDeviceFunction();
private:
~UsbOpenDeviceFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
void OnDeviceOpened(std::string guid,
mojo::Remote<device::mojom::UsbDevice> device,
device::mojom::UsbOpenDeviceError error);
void OnDisconnect();
DISALLOW_COPY_AND_ASSIGN(UsbOpenDeviceFunction);
};
class UsbSetConfigurationFunction : public UsbConnectionFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.setConfiguration", USB_SETCONFIGURATION)
UsbSetConfigurationFunction();
private:
~UsbSetConfigurationFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
void OnComplete(const std::string& guid, uint8_t config_value, bool success);
DISALLOW_COPY_AND_ASSIGN(UsbSetConfigurationFunction);
};
class UsbGetConfigurationFunction : public UsbConnectionFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.getConfiguration", USB_GETCONFIGURATION)
UsbGetConfigurationFunction();
private:
~UsbGetConfigurationFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
DISALLOW_COPY_AND_ASSIGN(UsbGetConfigurationFunction);
};
class UsbListInterfacesFunction : public UsbConnectionFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.listInterfaces", USB_LISTINTERFACES)
UsbListInterfacesFunction();
private:
~UsbListInterfacesFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
DISALLOW_COPY_AND_ASSIGN(UsbListInterfacesFunction);
};
class UsbCloseDeviceFunction : public UsbConnectionFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.closeDevice", USB_CLOSEDEVICE)
UsbCloseDeviceFunction();
private:
~UsbCloseDeviceFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
DISALLOW_COPY_AND_ASSIGN(UsbCloseDeviceFunction);
};
class UsbClaimInterfaceFunction : public UsbConnectionFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.claimInterface", USB_CLAIMINTERFACE)
UsbClaimInterfaceFunction();
private:
~UsbClaimInterfaceFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
void OnComplete(device::mojom::UsbClaimInterfaceResult result);
DISALLOW_COPY_AND_ASSIGN(UsbClaimInterfaceFunction);
};
class UsbReleaseInterfaceFunction : public UsbConnectionFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.releaseInterface", USB_RELEASEINTERFACE)
UsbReleaseInterfaceFunction();
private:
~UsbReleaseInterfaceFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
void OnComplete(bool success);
DISALLOW_COPY_AND_ASSIGN(UsbReleaseInterfaceFunction);
};
class UsbSetInterfaceAlternateSettingFunction : public UsbConnectionFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.setInterfaceAlternateSetting",
USB_SETINTERFACEALTERNATESETTING)
UsbSetInterfaceAlternateSettingFunction();
private:
~UsbSetInterfaceAlternateSettingFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
void OnComplete(bool success);
DISALLOW_COPY_AND_ASSIGN(UsbSetInterfaceAlternateSettingFunction);
};
class UsbControlTransferFunction : public UsbTransferFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.controlTransfer", USB_CONTROLTRANSFER)
UsbControlTransferFunction();
private:
~UsbControlTransferFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
DISALLOW_COPY_AND_ASSIGN(UsbControlTransferFunction);
};
class UsbBulkTransferFunction : public UsbGenericTransferFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.bulkTransfer", USB_BULKTRANSFER)
UsbBulkTransferFunction();
private:
~UsbBulkTransferFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
DISALLOW_COPY_AND_ASSIGN(UsbBulkTransferFunction);
};
class UsbInterruptTransferFunction : public UsbGenericTransferFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.interruptTransfer", USB_INTERRUPTTRANSFER)
UsbInterruptTransferFunction();
private:
~UsbInterruptTransferFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
DISALLOW_COPY_AND_ASSIGN(UsbInterruptTransferFunction);
};
class UsbIsochronousTransferFunction : public UsbTransferFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.isochronousTransfer", USB_ISOCHRONOUSTRANSFER)
UsbIsochronousTransferFunction();
private:
~UsbIsochronousTransferFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
void OnTransferInCompleted(
const std::vector<uint8_t>& data,
std::vector<device::mojom::UsbIsochronousPacketPtr> packets);
void OnTransferOutCompleted(
std::vector<device::mojom::UsbIsochronousPacketPtr> packets);
DISALLOW_COPY_AND_ASSIGN(UsbIsochronousTransferFunction);
};
class UsbResetDeviceFunction : public UsbConnectionFunction {
public:
DECLARE_EXTENSION_FUNCTION("usb.resetDevice", USB_RESETDEVICE)
UsbResetDeviceFunction();
private:
~UsbResetDeviceFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
void OnComplete(bool success);
std::unique_ptr<api::usb::ResetDevice::Params> parameters_;
DISALLOW_COPY_AND_ASSIGN(UsbResetDeviceFunction);
};
} // namespace extensions
#endif // EXTENSIONS_BROWSER_API_USB_USB_API_H_