1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef DEVICE_USB_USB_DEVICE_IMPL_H_
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define DEVICE_USB_USB_DEVICE_IMPL_H_
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <vector>
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/basictypes.h"
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/callback.h"
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/threading/thread_checker.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "device/usb/usb_descriptors.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "device/usb/usb_device.h"
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)struct libusb_device;
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct libusb_config_descriptor;
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace base {
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SingleThreadTaskRunner;
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace device {
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class UsbDeviceHandleImpl;
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class UsbContext;
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)typedef libusb_device* PlatformUsbDevice;
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)typedef libusb_config_descriptor* PlatformUsbConfigDescriptor;
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class UsbDeviceImpl : public UsbDevice {
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// UsbDevice implementation:
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_CHROMEOS)
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void RequestUsbAccess(
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      int interface_id,
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const base::Callback<void(bool success)>& callback) OVERRIDE;
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif  // OS_CHROMEOS
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual scoped_refptr<UsbDeviceHandle> Open() OVERRIDE;
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool Close(scoped_refptr<UsbDeviceHandle> handle) OVERRIDE;
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual const UsbConfigDescriptor& GetConfiguration() OVERRIDE;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool GetManufacturer(base::string16* manufacturer) OVERRIDE;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool GetProduct(base::string16* product) OVERRIDE;
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool GetSerialNumber(base::string16* serial_number) OVERRIDE;
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected:
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  friend class UsbServiceImpl;
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Called by UsbServiceImpl only;
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  UsbDeviceImpl(scoped_refptr<UsbContext> context,
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                PlatformUsbDevice platform_device,
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                uint16 vendor_id,
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                uint16 product_id,
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                uint32 unique_id);
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~UsbDeviceImpl();
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Called only be UsbService.
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnDisconnect();
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::ThreadChecker thread_checker_;
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PlatformUsbDevice platform_device_;
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_UDEV)
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // On Linux these properties are read from sysfs when the device is enumerated
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // to avoid hitting the permission broker on Chrome OS for a real string
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // descriptor request.
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string manufacturer_;
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string product_;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string serial_number_;
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The active configuration descriptor is not read immediately but cached for
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // later use.
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool current_configuration_cached_;
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UsbConfigDescriptor current_configuration_;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Retain the context so that it will not be released before UsbDevice.
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<UsbContext> context_;
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Opened handles.
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef std::vector<scoped_refptr<UsbDeviceHandleImpl> > HandlesVector;
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  HandlesVector handles_;
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Reference to the UI thread for permission-broker calls.
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UsbDeviceImpl);
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace device
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // DEVICE_USB_USB_DEVICE_IMPL_H_
96