Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Side by Side Diff: device/usb/usb_device_impl.cc

Issue 809743006: Add an Observer interface to UsbService for device add/remove. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Clarify comment. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « device/usb/usb_device.h ('k') | device/usb/usb_service.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "device/usb/usb_device_impl.h" 5 #include "device/usb/usb_device_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 case LIBUSB_ISO_USAGE_TYPE_IMPLICIT: 97 case LIBUSB_ISO_USAGE_TYPE_IMPLICIT:
98 return USB_USAGE_EXPLICIT_FEEDBACK; 98 return USB_USAGE_EXPLICIT_FEEDBACK;
99 default: 99 default:
100 NOTREACHED(); 100 NOTREACHED();
101 return USB_USAGE_DATA; 101 return USB_USAGE_DATA;
102 } 102 }
103 } 103 }
104 104
105 } // namespace 105 } // namespace
106 106
107 UsbDevice::UsbDevice(uint16 vendor_id, uint16 product_id, uint32 unique_id)
108 : vendor_id_(vendor_id), product_id_(product_id), unique_id_(unique_id) {
109 }
110
111 UsbDevice::~UsbDevice() {
112 }
113
114 void UsbDevice::NotifyDisconnect() {
115 FOR_EACH_OBSERVER(Observer, observer_list_, OnDisconnect(this));
116 }
117
118 UsbDeviceImpl::UsbDeviceImpl( 107 UsbDeviceImpl::UsbDeviceImpl(
119 scoped_refptr<UsbContext> context, 108 scoped_refptr<UsbContext> context,
120 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, 109 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
121 PlatformUsbDevice platform_device, 110 PlatformUsbDevice platform_device,
122 uint16 vendor_id, 111 uint16 vendor_id,
123 uint16 product_id, 112 uint16 product_id,
124 uint32 unique_id) 113 uint32 unique_id)
125 : UsbDevice(vendor_id, product_id, unique_id), 114 : UsbDevice(vendor_id, product_id, unique_id),
126 platform_device_(platform_device), 115 platform_device_(platform_device),
127 current_configuration_cached_(false), 116 current_configuration_cached_(false),
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 } 166 }
178 break; 167 break;
179 } 168 }
180 } 169 }
181 #else 170 #else
182 strings_cached_ = false; 171 strings_cached_ = false;
183 #endif 172 #endif
184 } 173 }
185 174
186 UsbDeviceImpl::~UsbDeviceImpl() { 175 UsbDeviceImpl::~UsbDeviceImpl() {
187 DCHECK(thread_checker_.CalledOnValidThread()); 176 // The destructor must be safe to call from any thread.
188 for (HandlesVector::iterator it = handles_.begin(); it != handles_.end();
189 ++it) {
190 (*it)->InternalClose();
191 }
192 STLClearObject(&handles_);
193 libusb_unref_device(platform_device_); 177 libusb_unref_device(platform_device_);
194 } 178 }
195 179
196 #if defined(OS_CHROMEOS) 180 #if defined(OS_CHROMEOS)
197 181
198 void UsbDeviceImpl::RequestUsbAccess( 182 void UsbDeviceImpl::RequestUsbAccess(
199 int interface_id, 183 int interface_id,
200 const base::Callback<void(bool success)>& callback) { 184 const base::Callback<void(bool success)>& callback) {
201 DCHECK(thread_checker_.CalledOnValidThread()); 185 DCHECK(thread_checker_.CalledOnValidThread());
202 186
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 CacheStrings(); 354 CacheStrings();
371 } 355 }
372 #endif 356 #endif
373 357
374 *serial_number = serial_number_; 358 *serial_number = serial_number_;
375 return !serial_number_.empty(); 359 return !serial_number_.empty();
376 } 360 }
377 361
378 void UsbDeviceImpl::OnDisconnect() { 362 void UsbDeviceImpl::OnDisconnect() {
379 DCHECK(thread_checker_.CalledOnValidThread()); 363 DCHECK(thread_checker_.CalledOnValidThread());
364
365 // Swap the list of handles into a local variable because closing all open
366 // handles may release the last reference to this object.
380 HandlesVector handles; 367 HandlesVector handles;
381 swap(handles, handles_); 368 swap(handles, handles_);
382 for (HandlesVector::iterator it = handles.begin(); it != handles.end(); ++it) 369
383 (*it)->InternalClose(); 370 for (const scoped_refptr<UsbDeviceHandleImpl>& handle : handles_) {
371 handle->InternalClose();
372 }
384 } 373 }
385 374
386 #if !defined(USE_UDEV) 375 #if !defined(USE_UDEV)
387 void UsbDeviceImpl::CacheStrings() { 376 void UsbDeviceImpl::CacheStrings() {
388 DCHECK(thread_checker_.CalledOnValidThread()); 377 DCHECK(thread_checker_.CalledOnValidThread());
389 // This is a non-blocking call as libusb has the descriptor in memory. 378 // This is a non-blocking call as libusb has the descriptor in memory.
390 libusb_device_descriptor desc; 379 libusb_device_descriptor desc;
391 const int rv = libusb_get_device_descriptor(platform_device_, &desc); 380 const int rv = libusb_get_device_descriptor(platform_device_, &desc);
392 if (rv == LIBUSB_SUCCESS) { 381 if (rv == LIBUSB_SUCCESS) {
393 scoped_refptr<UsbDeviceHandle> device_handle = Open(); 382 scoped_refptr<UsbDeviceHandle> device_handle = Open();
(...skipping 13 matching lines...) Expand all
407 } 396 }
408 } else { 397 } else {
409 VLOG(1) << "Failed to read device descriptor to cache string descriptors: " 398 VLOG(1) << "Failed to read device descriptor to cache string descriptors: "
410 << ConvertPlatformUsbErrorToString(rv); 399 << ConvertPlatformUsbErrorToString(rv);
411 } 400 }
412 strings_cached_ = true; 401 strings_cached_ = true;
413 } 402 }
414 #endif // !defined(USE_UDEV) 403 #endif // !defined(USE_UDEV)
415 404
416 } // namespace device 405 } // namespace device
OLDNEW
« no previous file with comments | « device/usb/usb_device.h ('k') | device/usb/usb_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698