1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef EXTENSIONS_BROWSER_API_USB_USB_API_H_
6 #define EXTENSIONS_BROWSER_API_USB_USB_API_H_
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "device/usb/usb_device.h"
14 #include "device/usb/usb_device_filter.h"
15 #include "device/usb/usb_device_handle.h"
16 #include "extensions/browser/api/api_resource_manager.h"
17 #include "extensions/browser/api/async_api_function.h"
18 #include "extensions/browser/api/device_permissions_prompt.h"
19 #include "extensions/common/api/usb.h"
20 #include "net/base/io_buffer.h"
22 namespace extensions
{
24 class DevicePermissionEntry
;
25 class DevicePermissions
;
26 class DevicePermissionsManager
;
27 class UsbDeviceResource
;
29 class UsbAsyncApiFunction
: public AsyncApiFunction
{
31 UsbAsyncApiFunction();
34 ~UsbAsyncApiFunction() override
;
37 bool PrePrepare() override
;
38 bool Respond() override
;
40 bool HasDevicePermission(scoped_refptr
<device::UsbDevice
> device
);
41 scoped_refptr
<device::UsbDeviceHandle
> GetDeviceHandleOrCompleteWithError(
42 const extensions::core_api::usb::ConnectionHandle
& input_device_handle
);
43 void RemoveUsbDeviceResource(int api_resource_id
);
44 void CompleteWithError(const std::string
& error
);
46 ApiResourceManager
<UsbDeviceResource
>* manager_
;
47 scoped_ptr
<DevicePermissions
> device_permissions_
;
48 scoped_refptr
<DevicePermissionEntry
> permission_entry_
;
51 class UsbAsyncApiTransferFunction
: public UsbAsyncApiFunction
{
53 UsbAsyncApiTransferFunction();
54 ~UsbAsyncApiTransferFunction() override
;
56 bool ConvertDirectionSafely(const extensions::core_api::usb::Direction
& input
,
57 device::UsbEndpointDirection
* output
);
58 bool ConvertRequestTypeSafely(
59 const extensions::core_api::usb::RequestType
& input
,
60 device::UsbDeviceHandle::TransferRequestType
* output
);
61 bool ConvertRecipientSafely(
62 const extensions::core_api::usb::Recipient
& input
,
63 device::UsbDeviceHandle::TransferRecipient
* output
);
65 void OnCompleted(device::UsbTransferStatus status
,
66 scoped_refptr
<net::IOBuffer
> data
,
70 class UsbFindDevicesFunction
: public UsbAsyncApiFunction
{
72 DECLARE_EXTENSION_FUNCTION("usb.findDevices", USB_FINDDEVICES
)
74 UsbFindDevicesFunction();
77 ~UsbFindDevicesFunction() override
;
80 bool Prepare() override
;
81 void AsyncWorkStart() override
;
85 scoped_ptr
<std::vector
<scoped_refptr
<device::UsbDevice
> > > devices
);
87 std::vector
<scoped_refptr
<device::UsbDeviceHandle
> > device_handles_
;
88 scoped_ptr
<extensions::core_api::usb::FindDevices::Params
> parameters_
;
91 class UsbGetDevicesFunction
: public UsbAsyncApiFunction
{
93 DECLARE_EXTENSION_FUNCTION("usb.getDevices", USB_GETDEVICES
)
95 UsbGetDevicesFunction();
98 bool Prepare() override
;
99 void AsyncWorkStart() override
;
102 ~UsbGetDevicesFunction() override
;
105 scoped_ptr
<extensions::core_api::usb::GetDevices::Params
> parameters_
;
108 class UsbGetUserSelectedDevicesFunction
109 : public UIThreadExtensionFunction
,
110 public DevicePermissionsPrompt::Delegate
{
112 DECLARE_EXTENSION_FUNCTION("usb.getUserSelectedDevices",
113 USB_GETUSERSELECTEDDEVICES
)
115 UsbGetUserSelectedDevicesFunction();
118 ~UsbGetUserSelectedDevicesFunction() override
;
120 // ExtensionFunction:
121 ResponseAction
Run() override
;
124 void OnUsbDevicesChosen(
125 const std::vector
<scoped_refptr
<device::UsbDevice
>>& devices
) override
;
127 scoped_ptr
<DevicePermissionsPrompt
> prompt_
;
128 std::vector
<uint32
> device_ids_
;
129 std::vector
<scoped_refptr
<device::UsbDevice
>> devices_
;
130 std::vector
<base::string16
> serial_numbers_
;
133 class UsbRequestAccessFunction
: public UsbAsyncApiFunction
{
135 DECLARE_EXTENSION_FUNCTION("usb.requestAccess", USB_REQUESTACCESS
)
137 UsbRequestAccessFunction();
140 bool Prepare() override
;
141 void AsyncWorkStart() override
;
144 ~UsbRequestAccessFunction() override
;
147 scoped_ptr
<extensions::core_api::usb::RequestAccess::Params
> parameters_
;
150 class UsbOpenDeviceFunction
: public UsbAsyncApiFunction
{
152 DECLARE_EXTENSION_FUNCTION("usb.openDevice", USB_OPENDEVICE
)
154 UsbOpenDeviceFunction();
157 bool Prepare() override
;
158 void AsyncWorkStart() override
;
159 bool Respond() override
;
162 ~UsbOpenDeviceFunction() override
;
165 void OnRequestAccessComplete(bool success
);
167 DevicePermissionsManager
* device_permissions_manager_
;
168 scoped_refptr
<device::UsbDevice
> device_
;
169 scoped_ptr
<extensions::core_api::usb::OpenDevice::Params
> parameters_
;
172 class UsbSetConfigurationFunction
: public UsbAsyncApiFunction
{
174 DECLARE_EXTENSION_FUNCTION("usb.setConfiguration", USB_SETCONFIGURATION
)
176 UsbSetConfigurationFunction();
179 ~UsbSetConfigurationFunction() override
;
182 bool Prepare() override
;
183 void AsyncWorkStart() override
;
186 scoped_ptr
<extensions::core_api::usb::SetConfiguration::Params
> parameters_
;
189 class UsbGetConfigurationFunction
: public UsbAsyncApiFunction
{
191 DECLARE_EXTENSION_FUNCTION("usb.getConfiguration", USB_GETCONFIGURATION
)
193 UsbGetConfigurationFunction();
196 ~UsbGetConfigurationFunction() override
;
199 bool Prepare() override
;
200 void AsyncWorkStart() override
;
203 scoped_ptr
<extensions::core_api::usb::GetConfiguration::Params
> parameters_
;
206 class UsbListInterfacesFunction
: public UsbAsyncApiFunction
{
208 DECLARE_EXTENSION_FUNCTION("usb.listInterfaces", USB_LISTINTERFACES
)
210 UsbListInterfacesFunction();
213 ~UsbListInterfacesFunction() override
;
216 bool Prepare() override
;
217 void AsyncWorkStart() override
;
220 scoped_ptr
<extensions::core_api::usb::ListInterfaces::Params
> parameters_
;
223 class UsbCloseDeviceFunction
: public UsbAsyncApiFunction
{
225 DECLARE_EXTENSION_FUNCTION("usb.closeDevice", USB_CLOSEDEVICE
)
227 UsbCloseDeviceFunction();
230 ~UsbCloseDeviceFunction() override
;
233 bool Prepare() override
;
234 void AsyncWorkStart() override
;
237 scoped_ptr
<extensions::core_api::usb::CloseDevice::Params
> parameters_
;
240 class UsbClaimInterfaceFunction
: public UsbAsyncApiFunction
{
242 DECLARE_EXTENSION_FUNCTION("usb.claimInterface", USB_CLAIMINTERFACE
)
244 UsbClaimInterfaceFunction();
247 ~UsbClaimInterfaceFunction() override
;
250 bool Prepare() override
;
251 void AsyncWorkStart() override
;
254 scoped_ptr
<extensions::core_api::usb::ClaimInterface::Params
> parameters_
;
257 class UsbReleaseInterfaceFunction
: public UsbAsyncApiFunction
{
259 DECLARE_EXTENSION_FUNCTION("usb.releaseInterface", USB_RELEASEINTERFACE
)
261 UsbReleaseInterfaceFunction();
264 ~UsbReleaseInterfaceFunction() override
;
267 bool Prepare() override
;
268 void AsyncWorkStart() override
;
271 scoped_ptr
<extensions::core_api::usb::ReleaseInterface::Params
> parameters_
;
274 class UsbSetInterfaceAlternateSettingFunction
: public UsbAsyncApiFunction
{
276 DECLARE_EXTENSION_FUNCTION("usb.setInterfaceAlternateSetting",
277 USB_SETINTERFACEALTERNATESETTING
)
279 UsbSetInterfaceAlternateSettingFunction();
282 ~UsbSetInterfaceAlternateSettingFunction() override
;
285 bool Prepare() override
;
286 void AsyncWorkStart() override
;
288 scoped_ptr
<extensions::core_api::usb::SetInterfaceAlternateSetting::Params
>
292 class UsbControlTransferFunction
: public UsbAsyncApiTransferFunction
{
294 DECLARE_EXTENSION_FUNCTION("usb.controlTransfer", USB_CONTROLTRANSFER
)
296 UsbControlTransferFunction();
299 ~UsbControlTransferFunction() override
;
302 bool Prepare() override
;
303 void AsyncWorkStart() override
;
306 scoped_ptr
<extensions::core_api::usb::ControlTransfer::Params
> parameters_
;
309 class UsbBulkTransferFunction
: public UsbAsyncApiTransferFunction
{
311 DECLARE_EXTENSION_FUNCTION("usb.bulkTransfer", USB_BULKTRANSFER
)
313 UsbBulkTransferFunction();
316 ~UsbBulkTransferFunction() override
;
319 bool Prepare() override
;
320 void AsyncWorkStart() override
;
323 scoped_ptr
<extensions::core_api::usb::BulkTransfer::Params
> parameters_
;
326 class UsbInterruptTransferFunction
: public UsbAsyncApiTransferFunction
{
328 DECLARE_EXTENSION_FUNCTION("usb.interruptTransfer", USB_INTERRUPTTRANSFER
)
330 UsbInterruptTransferFunction();
333 ~UsbInterruptTransferFunction() override
;
336 bool Prepare() override
;
337 void AsyncWorkStart() override
;
340 scoped_ptr
<extensions::core_api::usb::InterruptTransfer::Params
> parameters_
;
343 class UsbIsochronousTransferFunction
: public UsbAsyncApiTransferFunction
{
345 DECLARE_EXTENSION_FUNCTION("usb.isochronousTransfer", USB_ISOCHRONOUSTRANSFER
)
347 UsbIsochronousTransferFunction();
350 ~UsbIsochronousTransferFunction() override
;
353 bool Prepare() override
;
354 void AsyncWorkStart() override
;
357 scoped_ptr
<extensions::core_api::usb::IsochronousTransfer::Params
>
361 class UsbResetDeviceFunction
: public UsbAsyncApiFunction
{
363 DECLARE_EXTENSION_FUNCTION("usb.resetDevice", USB_RESETDEVICE
)
365 UsbResetDeviceFunction();
368 ~UsbResetDeviceFunction() override
;
371 bool Prepare() override
;
372 void AsyncWorkStart() override
;
375 scoped_ptr
<extensions::core_api::usb::ResetDevice::Params
> parameters_
;
377 } // namespace extensions
379 #endif // EXTENSIONS_BROWSER_API_USB_USB_API_H_