| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/usb_service/usb_service.h" | 5 #include "device/usb/usb_service.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| 11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
| 12 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
| 13 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
| 14 #include "components/usb_service/usb_context.h" | 14 #include "device/usb/usb_context.h" |
| 15 #include "components/usb_service/usb_device_impl.h" | 15 #include "device/usb/usb_device_impl.h" |
| 16 #include "components/usb_service/usb_error.h" | 16 #include "device/usb/usb_error.h" |
| 17 #include "third_party/libusb/src/libusb/libusb.h" | 17 #include "third_party/libusb/src/libusb/libusb.h" |
| 18 | 18 |
| 19 namespace usb_service { | 19 namespace device { |
| 20 | 20 |
| 21 namespace { | 21 namespace { |
| 22 | 22 |
| 23 base::LazyInstance<scoped_ptr<UsbService> >::Leaky g_usb_service_instance = | 23 base::LazyInstance<scoped_ptr<UsbService> >::Leaky g_usb_service_instance = |
| 24 LAZY_INSTANCE_INITIALIZER; | 24 LAZY_INSTANCE_INITIALIZER; |
| 25 | 25 |
| 26 } // namespace | 26 } // namespace |
| 27 | 27 |
| 28 typedef struct libusb_device* PlatformUsbDevice; | 28 typedef struct libusb_device* PlatformUsbDevice; |
| 29 typedef struct libusb_context* PlatformUsbContext; | 29 typedef struct libusb_context* PlatformUsbContext; |
| 30 | 30 |
| 31 class UsbServiceImpl | 31 class UsbServiceImpl : public UsbService, |
| 32 : public UsbService, | 32 private base::MessageLoop::DestructionObserver { |
| 33 private base::MessageLoop::DestructionObserver { | |
| 34 public: | 33 public: |
| 35 explicit UsbServiceImpl( | 34 explicit UsbServiceImpl( |
| 36 PlatformUsbContext context, | 35 PlatformUsbContext context, |
| 37 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); | 36 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); |
| 38 virtual ~UsbServiceImpl(); | 37 virtual ~UsbServiceImpl(); |
| 39 | 38 |
| 40 private: | 39 private: |
| 41 // usb_service::UsbService implementation | 40 // device::UsbService implementation |
| 42 virtual scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) OVERRIDE; | 41 virtual scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) OVERRIDE; |
| 43 virtual void GetDevices( | 42 virtual void GetDevices( |
| 44 std::vector<scoped_refptr<UsbDevice> >* devices) OVERRIDE; | 43 std::vector<scoped_refptr<UsbDevice> >* devices) OVERRIDE; |
| 45 | 44 |
| 46 // base::MessageLoop::DestructionObserver implementation. | 45 // base::MessageLoop::DestructionObserver implementation. |
| 47 virtual void WillDestroyCurrentMessageLoop() OVERRIDE; | 46 virtual void WillDestroyCurrentMessageLoop() OVERRIDE; |
| 48 | 47 |
| 49 // Enumerate USB devices from OS and Update devices_ map. | 48 // Enumerate USB devices from OS and Update devices_ map. |
| 50 void RefreshDevices(); | 49 void RefreshDevices(); |
| 51 | 50 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 } | 105 } |
| 107 | 106 |
| 108 void UsbServiceImpl::RefreshDevices() { | 107 void UsbServiceImpl::RefreshDevices() { |
| 109 DCHECK(CalledOnValidThread()); | 108 DCHECK(CalledOnValidThread()); |
| 110 | 109 |
| 111 libusb_device** platform_devices = NULL; | 110 libusb_device** platform_devices = NULL; |
| 112 const ssize_t device_count = | 111 const ssize_t device_count = |
| 113 libusb_get_device_list(context_->context(), &platform_devices); | 112 libusb_get_device_list(context_->context(), &platform_devices); |
| 114 if (device_count < 0) { | 113 if (device_count < 0) { |
| 115 VLOG(1) << "Failed to get device list: " | 114 VLOG(1) << "Failed to get device list: " |
| 116 << ConvertErrorToString(device_count); | 115 << ConvertPlatformUsbErrorToString(device_count); |
| 117 } | 116 } |
| 118 | 117 |
| 119 std::set<UsbDevice*> connected_devices; | 118 std::set<UsbDevice*> connected_devices; |
| 120 std::vector<PlatformUsbDevice> disconnected_devices; | 119 std::vector<PlatformUsbDevice> disconnected_devices; |
| 121 | 120 |
| 122 // Populates new devices. | 121 // Populates new devices. |
| 123 for (ssize_t i = 0; i < device_count; ++i) { | 122 for (ssize_t i = 0; i < device_count; ++i) { |
| 124 if (!ContainsKey(devices_, platform_devices[i])) { | 123 if (!ContainsKey(devices_, platform_devices[i])) { |
| 125 libusb_device_descriptor descriptor; | 124 libusb_device_descriptor descriptor; |
| 126 const int rv = | 125 const int rv = |
| 127 libusb_get_device_descriptor(platform_devices[i], &descriptor); | 126 libusb_get_device_descriptor(platform_devices[i], &descriptor); |
| 128 // This test is needed. A valid vendor/produce pair is required. | 127 // This test is needed. A valid vendor/produce pair is required. |
| 129 if (rv != LIBUSB_SUCCESS) { | 128 if (rv != LIBUSB_SUCCESS) { |
| 130 VLOG(1) << "Failed to get device descriptor: " | 129 VLOG(1) << "Failed to get device descriptor: " |
| 131 << ConvertErrorToString(rv); | 130 << ConvertPlatformUsbErrorToString(rv); |
| 132 continue; | 131 continue; |
| 133 } | 132 } |
| 134 UsbDeviceImpl* new_device = new UsbDeviceImpl(context_, | 133 UsbDeviceImpl* new_device = new UsbDeviceImpl(context_, |
| 135 ui_task_runner_, | 134 ui_task_runner_, |
| 136 platform_devices[i], | 135 platform_devices[i], |
| 137 descriptor.idVendor, | 136 descriptor.idVendor, |
| 138 descriptor.idProduct, | 137 descriptor.idProduct, |
| 139 ++next_unique_id_); | 138 ++next_unique_id_); |
| 140 devices_[platform_devices[i]] = new_device; | 139 devices_[platform_devices[i]] = new_device; |
| 141 connected_devices.insert(new_device); | 140 connected_devices.insert(new_device); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 163 | 162 |
| 164 // static | 163 // static |
| 165 UsbService* UsbService::GetInstance( | 164 UsbService* UsbService::GetInstance( |
| 166 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { | 165 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { |
| 167 UsbService* instance = g_usb_service_instance.Get().get(); | 166 UsbService* instance = g_usb_service_instance.Get().get(); |
| 168 if (!instance) { | 167 if (!instance) { |
| 169 PlatformUsbContext context = NULL; | 168 PlatformUsbContext context = NULL; |
| 170 | 169 |
| 171 const int rv = libusb_init(&context); | 170 const int rv = libusb_init(&context); |
| 172 if (rv != LIBUSB_SUCCESS) { | 171 if (rv != LIBUSB_SUCCESS) { |
| 173 VLOG(1) << "Failed to initialize libusb: " << ConvertErrorToString(rv); | 172 VLOG(1) << "Failed to initialize libusb: " |
| 173 << ConvertPlatformUsbErrorToString(rv); |
| 174 return NULL; | 174 return NULL; |
| 175 } | 175 } |
| 176 if (!context) | 176 if (!context) |
| 177 return NULL; | 177 return NULL; |
| 178 | 178 |
| 179 instance = new UsbServiceImpl(context, ui_task_runner); | 179 instance = new UsbServiceImpl(context, ui_task_runner); |
| 180 g_usb_service_instance.Get().reset(instance); | 180 g_usb_service_instance.Get().reset(instance); |
| 181 } | 181 } |
| 182 return instance; | 182 return instance; |
| 183 } | 183 } |
| 184 | 184 |
| 185 // static | 185 // static |
| 186 void UsbService::SetInstanceForTest(UsbService* instance) { | 186 void UsbService::SetInstanceForTest(UsbService* instance) { |
| 187 g_usb_service_instance.Get().reset(instance); | 187 g_usb_service_instance.Get().reset(instance); |
| 188 } | 188 } |
| 189 | 189 |
| 190 } // namespace usb_service | 190 } // namespace device |
| OLD | NEW |