Home | History | Annotate | Download | only in usb
      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.
      4 
      5 #ifndef DEVICE_USB_USB_DEVICE_HANDLE_IMPL_H_
      6 #define DEVICE_USB_USB_DEVICE_HANDLE_IMPL_H_
      7 
      8 #include <map>
      9 #include <vector>
     10 
     11 #include "base/callback.h"
     12 #include "base/memory/ref_counted.h"
     13 #include "base/strings/string16.h"
     14 #include "base/threading/thread_checker.h"
     15 #include "device/usb/usb_device_handle.h"
     16 #include "net/base/io_buffer.h"
     17 #include "third_party/libusb/src/libusb/libusb.h"
     18 
     19 namespace base {
     20 class SingleThreadTaskRunner;
     21 }
     22 
     23 namespace device {
     24 
     25 class UsbContext;
     26 struct UsbConfigDescriptor;
     27 class UsbDeviceImpl;
     28 
     29 typedef libusb_device_handle* PlatformUsbDeviceHandle;
     30 typedef libusb_iso_packet_descriptor* PlatformUsbIsoPacketDescriptor;
     31 typedef libusb_transfer* PlatformUsbTransferHandle;
     32 
     33 // UsbDeviceHandle class provides basic I/O related functionalities.
     34 class UsbDeviceHandleImpl : public UsbDeviceHandle {
     35  public:
     36   virtual scoped_refptr<UsbDevice> GetDevice() const OVERRIDE;
     37   virtual void Close() OVERRIDE;
     38   virtual bool ClaimInterface(int interface_number) OVERRIDE;
     39   virtual bool ReleaseInterface(int interface_number) OVERRIDE;
     40   virtual bool SetInterfaceAlternateSetting(int interface_number,
     41                                             int alternate_setting) OVERRIDE;
     42   virtual bool ResetDevice() OVERRIDE;
     43   virtual bool GetStringDescriptor(uint8 string_id,
     44                                    base::string16* string) OVERRIDE;
     45 
     46   virtual void ControlTransfer(UsbEndpointDirection direction,
     47                                TransferRequestType request_type,
     48                                TransferRecipient recipient,
     49                                uint8 request,
     50                                uint16 value,
     51                                uint16 index,
     52                                net::IOBuffer* buffer,
     53                                size_t length,
     54                                unsigned int timeout,
     55                                const UsbTransferCallback& callback) OVERRIDE;
     56 
     57   virtual void BulkTransfer(UsbEndpointDirection direction,
     58                             uint8 endpoint,
     59                             net::IOBuffer* buffer,
     60                             size_t length,
     61                             unsigned int timeout,
     62                             const UsbTransferCallback& callback) OVERRIDE;
     63 
     64   virtual void InterruptTransfer(UsbEndpointDirection direction,
     65                                  uint8 endpoint,
     66                                  net::IOBuffer* buffer,
     67                                  size_t length,
     68                                  unsigned int timeout,
     69                                  const UsbTransferCallback& callback) OVERRIDE;
     70 
     71   virtual void IsochronousTransfer(
     72       UsbEndpointDirection direction,
     73       uint8 endpoint,
     74       net::IOBuffer* buffer,
     75       size_t length,
     76       unsigned int packets,
     77       unsigned int packet_length,
     78       unsigned int timeout,
     79       const UsbTransferCallback& callback) OVERRIDE;
     80 
     81   PlatformUsbDeviceHandle handle() const { return handle_; }
     82 
     83  protected:
     84   friend class UsbDeviceImpl;
     85 
     86   // This constructor is called by UsbDevice.
     87   UsbDeviceHandleImpl(scoped_refptr<UsbContext> context,
     88                       UsbDeviceImpl* device,
     89                       PlatformUsbDeviceHandle handle,
     90                       const UsbConfigDescriptor& config);
     91 
     92   virtual ~UsbDeviceHandleImpl();
     93 
     94  private:
     95   class InterfaceClaimer;
     96   struct Transfer;
     97 
     98   // Refresh endpoint_map_ after ClaimInterface, ReleaseInterface and
     99   // SetInterfaceAlternateSetting.
    100   void RefreshEndpointMap();
    101 
    102   // Look up the claimed interface by endpoint. Return NULL if the interface
    103   // of the endpoint is not found.
    104   scoped_refptr<InterfaceClaimer> GetClaimedInterfaceForEndpoint(
    105       unsigned char endpoint);
    106 
    107   // If the device's task runner is on the current thread then the transfer will
    108   // be submitted directly, otherwise a task to do so it posted. The callback
    109   // will be called on the current message loop of the thread where this
    110   // function was called.
    111   void PostOrSubmitTransfer(PlatformUsbTransferHandle handle,
    112                             UsbTransferType transfer_type,
    113                             net::IOBuffer* buffer,
    114                             size_t length,
    115                             const UsbTransferCallback& callback);
    116 
    117   // Submits a transfer and starts tracking it. Retains the buffer and copies
    118   // the completion callback until the transfer finishes, whereupon it invokes
    119   // the callback then releases the buffer.
    120   void SubmitTransfer(PlatformUsbTransferHandle handle,
    121                       UsbTransferType transfer_type,
    122                       net::IOBuffer* buffer,
    123                       const size_t length,
    124                       scoped_refptr<base::SingleThreadTaskRunner> task_runner,
    125                       const UsbTransferCallback& callback);
    126 
    127   static void LIBUSB_CALL
    128       PlatformTransferCallback(PlatformUsbTransferHandle handle);
    129 
    130   // Invokes the callbacks associated with a given transfer, and removes it from
    131   // the in-flight transfer set.
    132   void CompleteTransfer(PlatformUsbTransferHandle transfer);
    133 
    134   bool GetSupportedLanguages();
    135 
    136   // Informs the object to drop internal references.
    137   void InternalClose();
    138 
    139   UsbDeviceImpl* device_;
    140 
    141   PlatformUsbDeviceHandle handle_;
    142 
    143   const UsbConfigDescriptor& config_;
    144 
    145   std::vector<uint16> languages_;
    146   std::map<uint8, base::string16> strings_;
    147 
    148   typedef std::map<int, scoped_refptr<InterfaceClaimer> > ClaimedInterfaceMap;
    149   ClaimedInterfaceMap claimed_interfaces_;
    150 
    151   typedef std::map<PlatformUsbTransferHandle, Transfer> TransferMap;
    152   TransferMap transfers_;
    153 
    154   // A map from endpoints to interfaces
    155   typedef std::map<int, int> EndpointMap;
    156   EndpointMap endpoint_map_;
    157 
    158   // Retain the UsbContext so that the platform context will not be destroyed
    159   // before this handle.
    160   scoped_refptr<UsbContext> context_;
    161 
    162   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
    163 
    164   base::ThreadChecker thread_checker_;
    165 
    166   DISALLOW_COPY_AND_ASSIGN(UsbDeviceHandleImpl);
    167 };
    168 
    169 }  // namespace device
    170 
    171 #endif  // DEVICE_USB_USB_DEVICE_HANDLE_IMPL_H_
    172