Chromium Code Reviews| Index: chrome/browser/usb/usb_device_handle.h |
| diff --git a/chrome/browser/usb/usb_device_handle.h b/chrome/browser/usb/usb_device_handle.h |
| index a7288884ce7c8b13d50f24147f73105eae9267c3..6717e61de0172ad756603a028bff7a302b1658e0 100644 |
| --- a/chrome/browser/usb/usb_device_handle.h |
| +++ b/chrome/browser/usb/usb_device_handle.h |
| @@ -25,7 +25,10 @@ typedef libusb_device_handle* PlatformUsbDeviceHandle; |
| typedef libusb_iso_packet_descriptor* PlatformUsbIsoPacketDescriptor; |
| typedef libusb_transfer* PlatformUsbTransferHandle; |
| +class UsbContext; |
| +class UsbConfigDescriptor; |
| class UsbDevice; |
| +class UsbInterface; |
| namespace net { |
| class IOBuffer; |
| @@ -54,7 +57,11 @@ class UsbDeviceHandle : public base::RefCountedThreadSafe<UsbDeviceHandle> { |
| scoped_refptr<UsbDevice> device() const; |
| PlatformUsbDeviceHandle handle() const { return handle_; } |
| - // Close the USB device and release the underlying platform device. |
| + // 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(); |
| // Device manipulation operations. These methods are blocking and must be |
| @@ -65,7 +72,7 @@ class UsbDeviceHandle : public base::RefCountedThreadSafe<UsbDeviceHandle> { |
| const int interface_number, |
| const int alternate_setting); |
| virtual bool ResetDevice(); |
| - bool GetSerial(base::string16* serial); |
| + virtual bool GetSerial(base::string16* serial); |
| // Async IO. Can be called on any thread. |
| virtual void ControlTransfer(const UsbEndpointDirection direction, |
| @@ -102,18 +109,13 @@ class UsbDeviceHandle : public base::RefCountedThreadSafe<UsbDeviceHandle> { |
| const unsigned int timeout, |
| const UsbTransferCallback& callback); |
| - // Normal code should not call this function. It is called by the platform's |
| - // callback mechanism in such a way that it cannot be made private. Invokes |
| - // the callbacks associated with a given transfer, and removes it from the |
| - // in-flight transfer set. |
| - void TransferComplete(PlatformUsbTransferHandle transfer); |
| - |
| protected: |
| friend class base::RefCountedThreadSafe<UsbDeviceHandle>; |
| friend class UsbDevice; |
| // This constructor is called by UsbDevice. |
| - UsbDeviceHandle(UsbDevice* device, PlatformUsbDeviceHandle handle); |
| + UsbDeviceHandle(scoped_refptr<UsbContext> context, |
| + UsbDevice* device, PlatformUsbDeviceHandle handle); |
| // This constructor variant is for use in testing only. |
| UsbDeviceHandle(); |
| @@ -122,16 +124,44 @@ class UsbDeviceHandle : public base::RefCountedThreadSafe<UsbDeviceHandle> { |
| UsbDevice* device_; |
| private: |
| + friend void HandleTransferCompletion(PlatformUsbTransferHandle handle); |
|
pfeldman
2013/08/09 08:58:59
This can be defined in .cc
Bei Zhang
2013/08/09 16:43:55
How would you do that?
|
| + |
| + class InterfaceClaimer : public base::RefCountedThreadSafe<InterfaceClaimer> { |
|
pfeldman
2013/08/09 08:58:59
No need for it for be ref-counted. You can store i
Bei Zhang
2013/08/09 16:43:55
It will be shared, by both UsbDeviceHandle and Tra
|
| + public: |
| + InterfaceClaimer(const PlatformUsbDeviceHandle handle, |
| + const int interface_number); |
| + int alternate_setting() const { return alternate_setting_; } |
| + void set_alternate_setting(const int alternate_setting) { |
| + alternate_setting_ = alternate_setting; |
| + } |
| + |
| + private: |
| + friend class UsbDevice; |
| + friend class base::RefCountedThreadSafe<InterfaceClaimer>; |
| + ~InterfaceClaimer(); |
| + |
| + const PlatformUsbDeviceHandle handle_; |
| + const int interface_number_; |
| + int alternate_setting_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(InterfaceClaimer); |
| + }; |
| + |
| struct Transfer { |
| Transfer(); |
| ~Transfer(); |
| UsbTransferType transfer_type; |
| scoped_refptr<net::IOBuffer> buffer; |
| + scoped_refptr<InterfaceClaimer> claimed_interface; |
| size_t length; |
| UsbTransferCallback callback; |
| }; |
| + // Refresh endpoint_map_ after ClaimInterface, ReleaseInterface and |
| + // SetInterfaceAlternateSetting. |
| + void RefreshEndpointMap(); |
| + |
| // Submits a transfer and starts tracking it. Retains the buffer and copies |
| // the completion callback until the transfer finishes, whereupon it invokes |
| // the callback then releases the buffer. |
| @@ -141,16 +171,33 @@ class UsbDeviceHandle : public base::RefCountedThreadSafe<UsbDeviceHandle> { |
| const size_t length, |
| const UsbTransferCallback& callback); |
| - // Close the current device handle without inform the corresponding UsbDevice. |
| + // Normal code should not call this function. It is called by the platform's |
| + // callback mechanism in such a way that it cannot be made private. Invokes |
|
pfeldman
2013/08/09 08:58:59
It can now be private (and is such), fix the comme
Bei Zhang
2013/08/09 16:43:55
Done.
|
| + // the callbacks associated with a given transfer, and removes it from the |
| + // in-flight transfer set. |
| + void TransferComplete(PlatformUsbTransferHandle transfer); |
| + |
| + // Closes the current device handle without inform the corresponding |
| + // UsbDevice. |
| void InternalClose(); |
| PlatformUsbDeviceHandle handle_; |
| - // transfers_ tracks all in-flight transfers associated with this device, |
| - // allowing the device to retain the buffer and callback associated with a |
| - // transfer until such time that it completes. It is protected by lock_. |
| - base::Lock lock_; |
| - std::map<PlatformUsbTransferHandle, Transfer> transfers_; |
| + scoped_refptr<UsbConfigDescriptor> interfaces_; |
| + |
| + typedef std::map<int, scoped_refptr<InterfaceClaimer> > ClaimedInterfaceMap; |
| + ClaimedInterfaceMap claimed_interfaces_; |
| + |
| + typedef std::map<PlatformUsbTransferHandle, Transfer> TransferMap; |
| + TransferMap transfers_; |
| + |
| + // A map from endpoints to interfaces |
| + typedef std::map<int, int> EndpointMap; |
| + EndpointMap endpoint_map_; |
| + |
| + // Retain the UsbContext so that the platform context will not be destroyed |
| + // before this handle. |
| + scoped_refptr<UsbContext> context_; |
| base::ThreadChecker thread_checker_; |