Index: device/hid/hid_service_mac.cc |
diff --git a/device/hid/hid_service_mac.cc b/device/hid/hid_service_mac.cc |
index 0ee1ce3ee7bc71194807a51a14e702cfcb70395f..5c3f5bddd0f8a3c5140387a647009b4527c3ced0 100644 |
--- a/device/hid/hid_service_mac.cc |
+++ b/device/hid/hid_service_mac.cc |
@@ -127,57 +127,6 @@ bool GetCollectionInfos(IOHIDDeviceRef device, |
return true; |
} |
-bool PopulateDeviceInfo(io_service_t service, HidDeviceInfo* device_info) { |
- io_string_t service_path; |
- IOReturn result = |
- IORegistryEntryGetPath(service, kIOServicePlane, service_path); |
- if (result != kIOReturnSuccess) { |
- VLOG(1) << "Failed to get IOService path: " |
- << base::StringPrintf("0x%04x", result); |
- return false; |
- } |
- |
- base::ScopedCFTypeRef<IOHIDDeviceRef> hid_device( |
- IOHIDDeviceCreate(kCFAllocatorDefault, service)); |
- if (!hid_device) { |
- VLOG(1) << "Unable to create IOHIDDevice object for " << service_path |
- << "."; |
- return false; |
- } |
- |
- device_info->device_id = service_path; |
- device_info->vendor_id = |
- GetHidIntProperty(hid_device, CFSTR(kIOHIDVendorIDKey)); |
- device_info->product_id = |
- GetHidIntProperty(hid_device, CFSTR(kIOHIDProductIDKey)); |
- device_info->product_name = |
- GetHidStringProperty(hid_device, CFSTR(kIOHIDProductKey)); |
- device_info->serial_number = |
- GetHidStringProperty(hid_device, CFSTR(kIOHIDSerialNumberKey)); |
- if (!GetCollectionInfos(hid_device, &device_info->has_report_id, |
- &device_info->collections)) { |
- VLOG(1) << "Unable to get collection info for " << service_path << "."; |
- return false; |
- } |
- device_info->max_input_report_size = |
- GetHidIntProperty(hid_device, CFSTR(kIOHIDMaxInputReportSizeKey)); |
- if (device_info->has_report_id && device_info->max_input_report_size > 0) { |
- device_info->max_input_report_size--; |
- } |
- device_info->max_output_report_size = |
- GetHidIntProperty(hid_device, CFSTR(kIOHIDMaxOutputReportSizeKey)); |
- if (device_info->has_report_id && device_info->max_output_report_size > 0) { |
- device_info->max_output_report_size--; |
- } |
- device_info->max_feature_report_size = |
- GetHidIntProperty(hid_device, CFSTR(kIOHIDMaxFeatureReportSizeKey)); |
- if (device_info->has_report_id && device_info->max_feature_report_size > 0) { |
- device_info->max_feature_report_size--; |
- } |
- |
- return true; |
-} |
- |
} // namespace |
HidServiceMac::HidServiceMac( |
@@ -228,6 +177,49 @@ HidServiceMac::HidServiceMac( |
FirstEnumerationComplete(); |
} |
+void HidServiceMac::Connect(const HidDeviceId& device_id, |
+ const ConnectCallback& callback) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ const auto& map_entry = devices().find(device_id); |
+ if (map_entry == devices().end()) { |
+ task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
+ return; |
+ } |
+ scoped_refptr<HidDeviceInfo> device_info = map_entry->second; |
+ |
+ io_string_t service_path; |
+ strncpy(service_path, device_id.c_str(), sizeof service_path); |
+ base::mac::ScopedIOObject<io_service_t> service( |
+ IORegistryEntryFromPath(kIOMasterPortDefault, service_path)); |
+ if (!service.get()) { |
+ VLOG(1) << "IOService not found for path: " << device_id; |
+ task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
+ return; |
+ } |
+ |
+ base::ScopedCFTypeRef<IOHIDDeviceRef> hid_device( |
+ IOHIDDeviceCreate(kCFAllocatorDefault, service)); |
+ if (!hid_device) { |
+ VLOG(1) << "Unable to create IOHIDDevice object."; |
+ task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
+ return; |
+ } |
+ |
+ IOReturn result = IOHIDDeviceOpen(hid_device, kIOHIDOptionsTypeNone); |
+ if (result != kIOReturnSuccess) { |
+ VLOG(1) << "Failed to open device: " << base::StringPrintf("0x%04x", |
+ result); |
+ task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
+ return; |
+ } |
+ |
+ task_runner_->PostTask( |
+ FROM_HERE, base::Bind(callback, make_scoped_refptr(new HidConnectionMac( |
+ hid_device.release(), device_info, |
+ file_task_runner_)))); |
+} |
+ |
HidServiceMac::~HidServiceMac() { |
} |
@@ -252,12 +244,14 @@ void HidServiceMac::AddDevices() { |
io_service_t device; |
while ((device = IOIteratorNext(devices_added_iterator_)) != IO_OBJECT_NULL) { |
- HidDeviceInfo device_info; |
- if (PopulateDeviceInfo(device, &device_info)) { |
+ scoped_refptr<HidDeviceInfo> device_info = CreateDeviceInfo(device); |
+ if (device_info) { |
AddDevice(device_info); |
+ // The reference retained by IOIteratorNext is released below in |
+ // RemoveDevices when the device is removed. |
+ } else { |
+ IOObjectRelease(device); |
} |
- // The reference retained by IOIteratorNext is released below in |
- // RemoveDevices when the device is removed. |
} |
} |
@@ -281,48 +275,61 @@ void HidServiceMac::RemoveDevices() { |
} |
} |
-void HidServiceMac::Connect(const HidDeviceId& device_id, |
- const ConnectCallback& callback) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- |
- const auto& map_entry = devices().find(device_id); |
- if (map_entry == devices().end()) { |
- task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
- return; |
- } |
- const HidDeviceInfo& device_info = map_entry->second; |
- |
+// static |
+scoped_refptr<HidDeviceInfo> HidServiceMac::CreateDeviceInfo( |
+ io_service_t service) { |
+ scoped_refptr<HidDeviceInfo> device_info(new HidDeviceInfo()); |
io_string_t service_path; |
- strncpy(service_path, device_id.c_str(), sizeof service_path); |
- base::mac::ScopedIOObject<io_service_t> service( |
- IORegistryEntryFromPath(kIOMasterPortDefault, service_path)); |
- if (!service.get()) { |
- VLOG(1) << "IOService not found for path: " << device_id; |
- task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
- return; |
+ IOReturn result = |
+ IORegistryEntryGetPath(service, kIOServicePlane, service_path); |
+ if (result != kIOReturnSuccess) { |
+ VLOG(1) << "Failed to get IOService path: " << base::StringPrintf("0x%04x", |
+ result); |
+ return nullptr; |
} |
base::ScopedCFTypeRef<IOHIDDeviceRef> hid_device( |
IOHIDDeviceCreate(kCFAllocatorDefault, service)); |
if (!hid_device) { |
- VLOG(1) << "Unable to create IOHIDDevice object."; |
- task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
- return; |
+ VLOG(1) << "Unable to create IOHIDDevice object for " << service_path |
+ << "."; |
+ return nullptr; |
} |
- IOReturn result = IOHIDDeviceOpen(hid_device, kIOHIDOptionsTypeNone); |
- if (result != kIOReturnSuccess) { |
- VLOG(1) << "Failed to open device: " |
- << base::StringPrintf("0x%04x", result); |
- task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
- return; |
+ device_info->device_id_ = service_path; |
+ device_info->vendor_id_ = |
+ GetHidIntProperty(hid_device, CFSTR(kIOHIDVendorIDKey)); |
+ device_info->product_id_ = |
+ GetHidIntProperty(hid_device, CFSTR(kIOHIDProductIDKey)); |
+ device_info->product_name_ = |
+ GetHidStringProperty(hid_device, CFSTR(kIOHIDProductKey)); |
+ device_info->serial_number_ = |
+ GetHidStringProperty(hid_device, CFSTR(kIOHIDSerialNumberKey)); |
+ if (!GetCollectionInfos(hid_device, &device_info->has_report_id_, |
+ &device_info->collections_)) { |
+ VLOG(1) << "Unable to get collection info for " << service_path << "."; |
+ return nullptr; |
+ } |
+ device_info->max_input_report_size_ = |
+ GetHidIntProperty(hid_device, CFSTR(kIOHIDMaxInputReportSizeKey)); |
+ if (device_info->has_report_id() && |
+ device_info->max_input_report_size() > 0) { |
+ device_info->max_input_report_size_--; |
+ } |
+ device_info->max_output_report_size_ = |
+ GetHidIntProperty(hid_device, CFSTR(kIOHIDMaxOutputReportSizeKey)); |
+ if (device_info->has_report_id() && |
+ device_info->max_output_report_size_ > 0) { |
+ device_info->max_output_report_size_--; |
+ } |
+ device_info->max_feature_report_size_ = |
+ GetHidIntProperty(hid_device, CFSTR(kIOHIDMaxFeatureReportSizeKey)); |
+ if (device_info->has_report_id() && |
+ device_info->max_feature_report_size_ > 0) { |
+ device_info->max_feature_report_size_--; |
} |
- task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(callback, |
- make_scoped_refptr(new HidConnectionMac( |
- hid_device.release(), device_info, file_task_runner_)))); |
+ return device_info; |
} |
} // namespace device |