| // 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 DEVICE_USB_USB_DEVICE_HANDLE_H_ |
| #define DEVICE_USB_USB_DEVICE_HANDLE_H_ |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include <map> |
| #include <vector> |
| |
| #include "base/callback_forward.h" |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/strings/string16.h" |
| #include "device/usb/public/mojom/device.mojom.h" |
| #include "device/usb/usb_descriptors.h" |
| |
| namespace base { |
| class RefCountedBytes; |
| } |
| |
| namespace device { |
| |
| class UsbDevice; |
| |
| using UsbTransferStatus = mojom::UsbTransferStatus; |
| using UsbControlTransferType = mojom::UsbControlTransferType; |
| using UsbControlTransferRecipient = mojom::UsbControlTransferRecipient; |
| |
| // UsbDeviceHandle class provides basic I/O related functionalities. |
| class UsbDeviceHandle : public base::RefCountedThreadSafe<UsbDeviceHandle> { |
| public: |
| struct IsochronousPacket { |
| uint32_t length; |
| uint32_t transferred_length; |
| UsbTransferStatus status; |
| }; |
| |
| using ResultCallback = base::OnceCallback<void(bool)>; |
| using TransferCallback = base::OnceCallback< |
| void(UsbTransferStatus, scoped_refptr<base::RefCountedBytes>, size_t)>; |
| using IsochronousTransferCallback = |
| base::OnceCallback<void(scoped_refptr<base::RefCountedBytes>, |
| const std::vector<IsochronousPacket>& packets)>; |
| |
| virtual scoped_refptr<UsbDevice> GetDevice() const = 0; |
| |
| // Notifies UsbDevice to drop the reference of this object; cancels all the |
| // flying transfers. |
| // It is possible that the object has no other reference after this call. So |
| // if it is called using a raw pointer, it could be invalidated. |
| // The platform device handle will be closed when UsbDeviceHandle destructs. |
| virtual void Close() = 0; |
| |
| // Device manipulation operations. |
| virtual void SetConfiguration(int configuration_value, |
| ResultCallback callback) = 0; |
| virtual void ClaimInterface(int interface_number, |
| ResultCallback callback) = 0; |
| virtual void ReleaseInterface(int interface_number, |
| ResultCallback callback) = 0; |
| virtual void SetInterfaceAlternateSetting(int interface_number, |
| int alternate_setting, |
| ResultCallback callback) = 0; |
| virtual void ResetDevice(ResultCallback callback) = 0; |
| virtual void ClearHalt(uint8_t endpoint, ResultCallback callback) = 0; |
| |
| virtual void ControlTransfer(UsbTransferDirection direction, |
| UsbControlTransferType request_type, |
| UsbControlTransferRecipient recipient, |
| uint8_t request, |
| uint16_t value, |
| uint16_t index, |
| scoped_refptr<base::RefCountedBytes> buffer, |
| unsigned int timeout, |
| TransferCallback callback) = 0; |
| |
| virtual void IsochronousTransferIn( |
| uint8_t endpoint_number, |
| const std::vector<uint32_t>& packet_lengths, |
| unsigned int timeout, |
| IsochronousTransferCallback callback) = 0; |
| |
| virtual void IsochronousTransferOut( |
| uint8_t endpoint_number, |
| scoped_refptr<base::RefCountedBytes> buffer, |
| const std::vector<uint32_t>& packet_lengths, |
| unsigned int timeout, |
| IsochronousTransferCallback callback) = 0; |
| |
| virtual void GenericTransfer(UsbTransferDirection direction, |
| uint8_t endpoint_number, |
| scoped_refptr<base::RefCountedBytes> buffer, |
| unsigned int timeout, |
| TransferCallback callback) = 0; |
| |
| // Gets the interface containing |endpoint_address|. Returns nullptr if no |
| // claimed interface contains that endpoint. |
| virtual const UsbInterfaceDescriptor* FindInterfaceByEndpoint( |
| uint8_t endpoint_address) = 0; |
| |
| protected: |
| friend class base::RefCountedThreadSafe<UsbDeviceHandle>; |
| |
| UsbDeviceHandle(); |
| virtual ~UsbDeviceHandle(); |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(UsbDeviceHandle); |
| }; |
| |
| } // namespace device |
| |
| #endif // DEVICE_USB_USB_DEVICE_HANDLE_H_ |