| 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 "extensions/browser/api/hid/hid_device_manager.h" | 5 #include "extensions/browser/api/hid/hid_device_manager.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <utility> | 10 #include <utility> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "base/lazy_instance.h" | 13 #include "base/lazy_instance.h" |
| 14 #include "base/memory/ptr_util.h" |
| 14 #include "device/core/device_client.h" | 15 #include "device/core/device_client.h" |
| 15 #include "device/hid/hid_device_filter.h" | 16 #include "device/hid/hid_device_filter.h" |
| 16 #include "device/hid/hid_service.h" | 17 #include "device/hid/hid_service.h" |
| 17 #include "extensions/browser/api/device_permissions_manager.h" | 18 #include "extensions/browser/api/device_permissions_manager.h" |
| 18 #include "extensions/common/permissions/permissions_data.h" | 19 #include "extensions/common/permissions/permissions_data.h" |
| 19 #include "extensions/common/permissions/usb_device_permission.h" | 20 #include "extensions/common/permissions/usb_device_permission.h" |
| 20 | 21 |
| 21 namespace hid = extensions::api::hid; | 22 namespace hid = extensions::api::hid; |
| 22 | 23 |
| 23 using device::HidDeviceFilter; | 24 using device::HidDeviceFilter; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 } | 115 } |
| 115 | 116 |
| 116 void HidDeviceManager::GetApiDevices( | 117 void HidDeviceManager::GetApiDevices( |
| 117 const Extension* extension, | 118 const Extension* extension, |
| 118 const std::vector<HidDeviceFilter>& filters, | 119 const std::vector<HidDeviceFilter>& filters, |
| 119 const GetApiDevicesCallback& callback) { | 120 const GetApiDevicesCallback& callback) { |
| 120 DCHECK(thread_checker_.CalledOnValidThread()); | 121 DCHECK(thread_checker_.CalledOnValidThread()); |
| 121 LazyInitialize(); | 122 LazyInitialize(); |
| 122 | 123 |
| 123 if (enumeration_ready_) { | 124 if (enumeration_ready_) { |
| 124 scoped_ptr<base::ListValue> devices = | 125 std::unique_ptr<base::ListValue> devices = |
| 125 CreateApiDeviceList(extension, filters); | 126 CreateApiDeviceList(extension, filters); |
| 126 base::MessageLoop::current()->PostTask( | 127 base::MessageLoop::current()->PostTask( |
| 127 FROM_HERE, base::Bind(callback, base::Passed(&devices))); | 128 FROM_HERE, base::Bind(callback, base::Passed(&devices))); |
| 128 } else { | 129 } else { |
| 129 pending_enumerations_.push_back( | 130 pending_enumerations_.push_back(base::WrapUnique( |
| 130 make_scoped_ptr(new GetApiDevicesParams(extension, filters, callback))); | 131 new GetApiDevicesParams(extension, filters, callback))); |
| 131 } | 132 } |
| 132 } | 133 } |
| 133 | 134 |
| 134 scoped_ptr<base::ListValue> HidDeviceManager::GetApiDevicesFromList( | 135 std::unique_ptr<base::ListValue> HidDeviceManager::GetApiDevicesFromList( |
| 135 const std::vector<scoped_refptr<HidDeviceInfo>>& devices) { | 136 const std::vector<scoped_refptr<HidDeviceInfo>>& devices) { |
| 136 DCHECK(thread_checker_.CalledOnValidThread()); | 137 DCHECK(thread_checker_.CalledOnValidThread()); |
| 137 scoped_ptr<base::ListValue> device_list(new base::ListValue()); | 138 std::unique_ptr<base::ListValue> device_list(new base::ListValue()); |
| 138 for (const auto& device : devices) { | 139 for (const auto& device : devices) { |
| 139 const auto device_entry = resource_ids_.find(device->device_id()); | 140 const auto device_entry = resource_ids_.find(device->device_id()); |
| 140 DCHECK(device_entry != resource_ids_.end()); | 141 DCHECK(device_entry != resource_ids_.end()); |
| 141 | 142 |
| 142 hid::HidDeviceInfo device_info; | 143 hid::HidDeviceInfo device_info; |
| 143 device_info.device_id = device_entry->second; | 144 device_info.device_id = device_entry->second; |
| 144 PopulateHidDeviceInfo(&device_info, device); | 145 PopulateHidDeviceInfo(&device_info, device); |
| 145 device_list->Append(device_info.ToValue().release()); | 146 device_list->Append(device_info.ToValue().release()); |
| 146 } | 147 } |
| 147 return device_list; | 148 return device_list; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 resource_ids_[device_info->device_id()] = new_id; | 218 resource_ids_[device_info->device_id()] = new_id; |
| 218 device_ids_[new_id] = device_info->device_id(); | 219 device_ids_[new_id] = device_info->device_id(); |
| 219 | 220 |
| 220 // Don't generate events during the initial enumeration. | 221 // Don't generate events during the initial enumeration. |
| 221 if (enumeration_ready_ && event_router_) { | 222 if (enumeration_ready_ && event_router_) { |
| 222 api::hid::HidDeviceInfo api_device_info; | 223 api::hid::HidDeviceInfo api_device_info; |
| 223 api_device_info.device_id = new_id; | 224 api_device_info.device_id = new_id; |
| 224 PopulateHidDeviceInfo(&api_device_info, device_info); | 225 PopulateHidDeviceInfo(&api_device_info, device_info); |
| 225 | 226 |
| 226 if (api_device_info.collections.size() > 0) { | 227 if (api_device_info.collections.size() > 0) { |
| 227 scoped_ptr<base::ListValue> args( | 228 std::unique_ptr<base::ListValue> args( |
| 228 hid::OnDeviceAdded::Create(api_device_info)); | 229 hid::OnDeviceAdded::Create(api_device_info)); |
| 229 DispatchEvent(events::HID_ON_DEVICE_ADDED, hid::OnDeviceAdded::kEventName, | 230 DispatchEvent(events::HID_ON_DEVICE_ADDED, hid::OnDeviceAdded::kEventName, |
| 230 std::move(args), device_info); | 231 std::move(args), device_info); |
| 231 } | 232 } |
| 232 } | 233 } |
| 233 } | 234 } |
| 234 | 235 |
| 235 void HidDeviceManager::OnDeviceRemoved( | 236 void HidDeviceManager::OnDeviceRemoved( |
| 236 scoped_refptr<HidDeviceInfo> device_info) { | 237 scoped_refptr<HidDeviceInfo> device_info) { |
| 237 DCHECK(thread_checker_.CalledOnValidThread()); | 238 DCHECK(thread_checker_.CalledOnValidThread()); |
| 238 const auto& resource_entry = resource_ids_.find(device_info->device_id()); | 239 const auto& resource_entry = resource_ids_.find(device_info->device_id()); |
| 239 DCHECK(resource_entry != resource_ids_.end()); | 240 DCHECK(resource_entry != resource_ids_.end()); |
| 240 int resource_id = resource_entry->second; | 241 int resource_id = resource_entry->second; |
| 241 const auto& device_entry = device_ids_.find(resource_id); | 242 const auto& device_entry = device_ids_.find(resource_id); |
| 242 DCHECK(device_entry != device_ids_.end()); | 243 DCHECK(device_entry != device_ids_.end()); |
| 243 resource_ids_.erase(resource_entry); | 244 resource_ids_.erase(resource_entry); |
| 244 device_ids_.erase(device_entry); | 245 device_ids_.erase(device_entry); |
| 245 | 246 |
| 246 if (event_router_) { | 247 if (event_router_) { |
| 247 DCHECK(enumeration_ready_); | 248 DCHECK(enumeration_ready_); |
| 248 scoped_ptr<base::ListValue> args(hid::OnDeviceRemoved::Create(resource_id)); | 249 std::unique_ptr<base::ListValue> args( |
| 250 hid::OnDeviceRemoved::Create(resource_id)); |
| 249 DispatchEvent(events::HID_ON_DEVICE_REMOVED, | 251 DispatchEvent(events::HID_ON_DEVICE_REMOVED, |
| 250 hid::OnDeviceRemoved::kEventName, std::move(args), | 252 hid::OnDeviceRemoved::kEventName, std::move(args), |
| 251 device_info); | 253 device_info); |
| 252 } | 254 } |
| 253 } | 255 } |
| 254 | 256 |
| 255 void HidDeviceManager::LazyInitialize() { | 257 void HidDeviceManager::LazyInitialize() { |
| 256 DCHECK(thread_checker_.CalledOnValidThread()); | 258 DCHECK(thread_checker_.CalledOnValidThread()); |
| 257 | 259 |
| 258 if (initialized_) { | 260 if (initialized_) { |
| 259 return; | 261 return; |
| 260 } | 262 } |
| 261 | 263 |
| 262 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); | 264 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); |
| 263 DCHECK(hid_service); | 265 DCHECK(hid_service); |
| 264 hid_service->GetDevices(base::Bind(&HidDeviceManager::OnEnumerationComplete, | 266 hid_service->GetDevices(base::Bind(&HidDeviceManager::OnEnumerationComplete, |
| 265 weak_factory_.GetWeakPtr())); | 267 weak_factory_.GetWeakPtr())); |
| 266 | 268 |
| 267 hid_service_observer_.Add(hid_service); | 269 hid_service_observer_.Add(hid_service); |
| 268 initialized_ = true; | 270 initialized_ = true; |
| 269 } | 271 } |
| 270 | 272 |
| 271 scoped_ptr<base::ListValue> HidDeviceManager::CreateApiDeviceList( | 273 std::unique_ptr<base::ListValue> HidDeviceManager::CreateApiDeviceList( |
| 272 const Extension* extension, | 274 const Extension* extension, |
| 273 const std::vector<HidDeviceFilter>& filters) { | 275 const std::vector<HidDeviceFilter>& filters) { |
| 274 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); | 276 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); |
| 275 DCHECK(hid_service); | 277 DCHECK(hid_service); |
| 276 | 278 |
| 277 scoped_ptr<base::ListValue> api_devices(new base::ListValue()); | 279 std::unique_ptr<base::ListValue> api_devices(new base::ListValue()); |
| 278 for (const ResourceIdToDeviceIdMap::value_type& map_entry : device_ids_) { | 280 for (const ResourceIdToDeviceIdMap::value_type& map_entry : device_ids_) { |
| 279 int resource_id = map_entry.first; | 281 int resource_id = map_entry.first; |
| 280 const HidDeviceId& device_id = map_entry.second; | 282 const HidDeviceId& device_id = map_entry.second; |
| 281 | 283 |
| 282 scoped_refptr<HidDeviceInfo> device_info = | 284 scoped_refptr<HidDeviceInfo> device_info = |
| 283 hid_service->GetDeviceInfo(device_id); | 285 hid_service->GetDeviceInfo(device_id); |
| 284 if (!device_info) { | 286 if (!device_info) { |
| 285 continue; | 287 continue; |
| 286 } | 288 } |
| 287 | 289 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 310 void HidDeviceManager::OnEnumerationComplete( | 312 void HidDeviceManager::OnEnumerationComplete( |
| 311 const std::vector<scoped_refptr<HidDeviceInfo>>& devices) { | 313 const std::vector<scoped_refptr<HidDeviceInfo>>& devices) { |
| 312 DCHECK(resource_ids_.empty()); | 314 DCHECK(resource_ids_.empty()); |
| 313 DCHECK(device_ids_.empty()); | 315 DCHECK(device_ids_.empty()); |
| 314 for (const scoped_refptr<HidDeviceInfo>& device_info : devices) { | 316 for (const scoped_refptr<HidDeviceInfo>& device_info : devices) { |
| 315 OnDeviceAdded(device_info); | 317 OnDeviceAdded(device_info); |
| 316 } | 318 } |
| 317 enumeration_ready_ = true; | 319 enumeration_ready_ = true; |
| 318 | 320 |
| 319 for (const auto& params : pending_enumerations_) { | 321 for (const auto& params : pending_enumerations_) { |
| 320 scoped_ptr<base::ListValue> devices = | 322 std::unique_ptr<base::ListValue> devices = |
| 321 CreateApiDeviceList(params->extension, params->filters); | 323 CreateApiDeviceList(params->extension, params->filters); |
| 322 params->callback.Run(std::move(devices)); | 324 params->callback.Run(std::move(devices)); |
| 323 } | 325 } |
| 324 pending_enumerations_.clear(); | 326 pending_enumerations_.clear(); |
| 325 } | 327 } |
| 326 | 328 |
| 327 void HidDeviceManager::DispatchEvent(events::HistogramValue histogram_value, | 329 void HidDeviceManager::DispatchEvent( |
| 328 const std::string& event_name, | 330 events::HistogramValue histogram_value, |
| 329 scoped_ptr<base::ListValue> event_args, | 331 const std::string& event_name, |
| 330 scoped_refptr<HidDeviceInfo> device_info) { | 332 std::unique_ptr<base::ListValue> event_args, |
| 331 scoped_ptr<Event> event( | 333 scoped_refptr<HidDeviceInfo> device_info) { |
| 334 std::unique_ptr<Event> event( |
| 332 new Event(histogram_value, event_name, std::move(event_args))); | 335 new Event(histogram_value, event_name, std::move(event_args))); |
| 333 event->will_dispatch_callback = base::Bind( | 336 event->will_dispatch_callback = base::Bind( |
| 334 &WillDispatchDeviceEvent, weak_factory_.GetWeakPtr(), device_info); | 337 &WillDispatchDeviceEvent, weak_factory_.GetWeakPtr(), device_info); |
| 335 event_router_->BroadcastEvent(std::move(event)); | 338 event_router_->BroadcastEvent(std::move(event)); |
| 336 } | 339 } |
| 337 | 340 |
| 338 } // namespace extensions | 341 } // namespace extensions |
| OLD | NEW |