Home | History | Annotate | Download | only in usb
      1 // Copyright 2013 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 
      6 #ifndef CHROME_BROWSER_USB_USB_DEVICE_H_
      7 #define CHROME_BROWSER_USB_USB_DEVICE_H_
      8 
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/memory/ref_counted.h"
     13 #include "base/threading/thread_checker.h"
     14 #include "chrome/browser/usb/usb_interface.h"
     15 
     16 struct libusb_device;
     17 class UsbDeviceHandle;
     18 class UsbContext;
     19 
     20 typedef libusb_device* PlatformUsbDevice;
     21 
     22 // A UsbDevice object represents a detected USB device, providing basic
     23 // information about it. For further manipulation of the device, a
     24 // UsbDeviceHandle must be created from Open() method.
     25 class UsbDevice : public base::RefCountedThreadSafe<UsbDevice> {
     26  public:
     27   // Accessors to basic information.
     28   PlatformUsbDevice platform_device() const { return platform_device_; }
     29   uint16 vendor_id() const { return vendor_id_; }
     30   uint16 product_id() const { return product_id_; }
     31 
     32   // Creates a UsbDeviceHandle for further manipulation.
     33   // Blocking method. Must be called on FILE thread.
     34   virtual scoped_refptr<UsbDeviceHandle> Open();
     35 
     36   // Explicitly closes a device handle. This method will be automatically called
     37   // by the destructor of a UsbDeviceHandle as well.
     38   // Closing a closed handle is a safe
     39   // Blocking method. Must be called on FILE thread.
     40   virtual bool Close(scoped_refptr<UsbDeviceHandle> handle);
     41 
     42   // Lists the interfaces provided by the device and fills the given
     43   // UsbConfigDescriptor.
     44   // Blocking method. Must be called on FILE thread.
     45   virtual bool ListInterfaces(UsbConfigDescriptor* config);
     46 
     47  protected:
     48   friend class UsbService;
     49   friend class base::RefCountedThreadSafe<UsbDevice>;
     50 
     51   // Called by UsbService only;
     52   UsbDevice(scoped_refptr<UsbContext> context,
     53             PlatformUsbDevice platform_device,
     54             uint16 vendor_id,
     55             uint16 product_id);
     56 
     57   // Constructor called in test only.
     58   UsbDevice();
     59   virtual ~UsbDevice();
     60 
     61   // Called only be UsbService.
     62   virtual void OnDisconnect();
     63 
     64  private:
     65   PlatformUsbDevice platform_device_;
     66   uint16 vendor_id_;
     67   uint16 product_id_;
     68 
     69   // Retain the context so that it will not be released before UsbDevice.
     70   scoped_refptr<UsbContext> context_;
     71 
     72   // Opened handles.
     73   typedef std::vector<scoped_refptr<UsbDeviceHandle> > HandlesVector;
     74   HandlesVector handles_;
     75 
     76   base::ThreadChecker thread_checker_;
     77 
     78   DISALLOW_COPY_AND_ASSIGN(UsbDevice);
     79 };
     80 
     81 #endif  // CHROME_BROWSER_USB_USB_DEVICE_H_
     82