| 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 "device/hid/hid_service_mac.h" | 5 #include "device/hid/hid_service_mac.h" |
| 6 | 6 |
| 7 #include <CoreFoundation/CoreFoundation.h> | 7 #include <CoreFoundation/CoreFoundation.h> |
| 8 #include <IOKit/hid/IOHIDDevice.h> | 8 #include <IOKit/hid/IOHIDDevice.h> |
| 9 | 9 |
| 10 #include <set> | 10 #include <set> |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 RemoveDevice(service_path); | 252 RemoveDevice(service_path); |
| 253 } | 253 } |
| 254 | 254 |
| 255 // Release reference retained by AddDevices above. | 255 // Release reference retained by AddDevices above. |
| 256 IOObjectRelease(device); | 256 IOObjectRelease(device); |
| 257 // Release the reference retained by IOIteratorNext. | 257 // Release the reference retained by IOIteratorNext. |
| 258 IOObjectRelease(device); | 258 IOObjectRelease(device); |
| 259 } | 259 } |
| 260 } | 260 } |
| 261 | 261 |
| 262 scoped_refptr<HidConnection> HidServiceMac::Connect( | 262 void HidServiceMac::Connect(const HidDeviceId& device_id, |
| 263 const HidDeviceId& device_id) { | 263 const ConnectCallback& callback) { |
| 264 DCHECK(thread_checker_.CalledOnValidThread()); | 264 DCHECK(thread_checker_.CalledOnValidThread()); |
| 265 | 265 |
| 266 const auto& map_entry = devices().find(device_id); | 266 const auto& map_entry = devices().find(device_id); |
| 267 if (map_entry == devices().end()) { | 267 if (map_entry == devices().end()) { |
| 268 return NULL; | 268 task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
| 269 return; |
| 269 } | 270 } |
| 270 const HidDeviceInfo& device_info = map_entry->second; | 271 const HidDeviceInfo& device_info = map_entry->second; |
| 271 | 272 |
| 272 io_string_t service_path; | 273 io_string_t service_path; |
| 273 strncpy(service_path, device_id.c_str(), sizeof service_path); | 274 strncpy(service_path, device_id.c_str(), sizeof service_path); |
| 274 base::mac::ScopedIOObject<io_service_t> service( | 275 base::mac::ScopedIOObject<io_service_t> service( |
| 275 IORegistryEntryFromPath(kIOMasterPortDefault, service_path)); | 276 IORegistryEntryFromPath(kIOMasterPortDefault, service_path)); |
| 276 if (!service.get()) { | 277 if (!service.get()) { |
| 277 VLOG(1) << "IOService not found for path: " << device_id; | 278 VLOG(1) << "IOService not found for path: " << device_id; |
| 278 return NULL; | 279 task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
| 280 return; |
| 279 } | 281 } |
| 280 | 282 |
| 281 base::ScopedCFTypeRef<IOHIDDeviceRef> hid_device( | 283 base::ScopedCFTypeRef<IOHIDDeviceRef> hid_device( |
| 282 IOHIDDeviceCreate(kCFAllocatorDefault, service)); | 284 IOHIDDeviceCreate(kCFAllocatorDefault, service)); |
| 283 IOReturn result = IOHIDDeviceOpen(hid_device, kIOHIDOptionsTypeNone); | 285 IOReturn result = IOHIDDeviceOpen(hid_device, kIOHIDOptionsTypeNone); |
| 284 if (result != kIOReturnSuccess) { | 286 if (result != kIOReturnSuccess) { |
| 285 VLOG(1) << "Failed to open device: " | 287 VLOG(1) << "Failed to open device: " |
| 286 << base::StringPrintf("0x%04x", result); | 288 << base::StringPrintf("0x%04x", result); |
| 287 return NULL; | 289 task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
| 290 return; |
| 288 } | 291 } |
| 289 | 292 |
| 290 return make_scoped_refptr(new HidConnectionMac( | 293 task_runner_->PostTask( |
| 291 hid_device.release(), device_info, file_task_runner_)); | 294 FROM_HERE, |
| 295 base::Bind(callback, |
| 296 make_scoped_refptr(new HidConnectionMac( |
| 297 hid_device.release(), device_info, file_task_runner_)))); |
| 292 } | 298 } |
| 293 | 299 |
| 294 } // namespace device | 300 } // namespace device |
| OLD | NEW |