diff options
author | reillyg <reillyg@chromium.org> | 2015-03-23 16:21:14 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-03-23 23:21:46 +0000 |
commit | fab70f55e19d3090af7d6d51425abed3c8b3e039 (patch) | |
tree | 14339a0d0563c6effec2324bc7030224bf7655ac /device | |
parent | 82af6f6b968a2683de21c8dc81cf1fd72bec0322 (diff) | |
download | chromium_src-fab70f55e19d3090af7d6d51425abed3c8b3e039.zip chromium_src-fab70f55e19d3090af7d6d51425abed3c8b3e039.tar.gz chromium_src-fab70f55e19d3090af7d6d51425abed3c8b3e039.tar.bz2 |
Switch HidDeviceId from IORegistry path to IORegistry entry ID.
As of OS X Yosemite the IORegistry paths for Bluetooth HID devices
are no longer unique. This change switches to using the entry IDs
instead, which appear to remain unique.
BUG=452172
Review URL: https://codereview.chromium.org/1025553004
Cr-Commit-Position: refs/heads/master@{#321892}
Diffstat (limited to 'device')
-rw-r--r-- | device/hid/hid_device_filter_unittest.cc | 13 | ||||
-rw-r--r-- | device/hid/hid_device_info.cc | 2 | ||||
-rw-r--r-- | device/hid/hid_device_info.h | 5 | ||||
-rw-r--r-- | device/hid/hid_service_mac.cc | 32 |
4 files changed, 34 insertions, 18 deletions
diff --git a/device/hid/hid_device_filter_unittest.cc b/device/hid/hid_device_filter_unittest.cc index 233cb2c..b829a69 100644 --- a/device/hid/hid_device_filter_unittest.cc +++ b/device/hid/hid_device_filter_unittest.cc @@ -9,11 +9,22 @@ namespace device { +namespace { + +#if defined(OS_MACOSX) +const uint64_t kTestDeviceId = 42; +#else +const char* kTestDeviceId = "device1"; +#endif + +} // namespace + class HidFilterTest : public testing::Test { public: void SetUp() override { device_info_ = new HidDeviceInfo( - "device1", 0x046d, 0xc31c, "Test Keyboard", "123ABC", kHIDBusTypeUSB, + kTestDeviceId, 0x046d, 0xc31c, "Test Keyboard", "123ABC", + kHIDBusTypeUSB, std::vector<uint8>(kKeyboard, kKeyboard + kKeyboardSize)); } diff --git a/device/hid/hid_device_info.cc b/device/hid/hid_device_info.cc index 987917b..c8e6f66 100644 --- a/device/hid/hid_device_info.cc +++ b/device/hid/hid_device_info.cc @@ -7,7 +7,9 @@ namespace device { +#if !defined(OS_MACOSX) const char kInvalidHidDeviceId[] = ""; +#endif HidDeviceInfo::HidDeviceInfo(const HidDeviceId& device_id, uint16_t vendor_id, diff --git a/device/hid/hid_device_info.h b/device/hid/hid_device_info.h index 8096546..bc89832 100644 --- a/device/hid/hid_device_info.h +++ b/device/hid/hid_device_info.h @@ -19,8 +19,13 @@ enum HidBusType { kHIDBusTypeBluetooth = 1, }; +#if defined(OS_MACOSX) +typedef uint64_t HidDeviceId; +const uint64_t kInvalidHidDeviceId = -1; +#else typedef std::string HidDeviceId; extern const char kInvalidHidDeviceId[]; +#endif class HidDeviceInfo : public base::RefCountedThreadSafe<HidDeviceInfo> { public: diff --git a/device/hid/hid_service_mac.cc b/device/hid/hid_service_mac.cc index dec4e70..fb12d96 100644 --- a/device/hid/hid_service_mac.cc +++ b/device/hid/hid_service_mac.cc @@ -140,12 +140,13 @@ void HidServiceMac::Connect(const HidDeviceId& device_id, } scoped_refptr<HidDeviceInfo> device_info = map_entry->second; - io_string_t service_path; - strncpy(service_path, device_id.c_str(), sizeof service_path); + base::ScopedCFTypeRef<CFDictionaryRef> matching_dict( + IORegistryEntryIDMatching(device_id)); + base::mac::ScopedIOObject<io_service_t> service( - IORegistryEntryFromPath(kIOMasterPortDefault, service_path)); + IOServiceGetMatchingService(kIOMasterPortDefault, matching_dict.get())); if (!service.get()) { - HID_LOG(EVENT) << "IOService not found for path: " << device_id; + HID_LOG(EVENT) << "IOService not found for ID: " << device_id; task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); return; } @@ -212,11 +213,10 @@ void HidServiceMac::RemoveDevices() { io_service_t device; while ((device = IOIteratorNext(devices_removed_iterator_)) != IO_OBJECT_NULL) { - io_string_t service_path; - IOReturn result = - IORegistryEntryGetPath(device, kIOServicePlane, service_path); + uint64_t entry_id; + IOReturn result = IORegistryEntryGetRegistryEntryID(device, &entry_id); if (result == kIOReturnSuccess) { - RemoveDevice(service_path); + RemoveDevice(entry_id); } // Release reference retained by AddDevices above. @@ -229,32 +229,30 @@ void HidServiceMac::RemoveDevices() { // static scoped_refptr<HidDeviceInfo> HidServiceMac::CreateDeviceInfo( io_service_t service) { - io_string_t service_path; - IOReturn result = - IORegistryEntryGetPath(service, kIOServicePlane, service_path); + uint64_t entry_id; + IOReturn result = IORegistryEntryGetRegistryEntryID(service, &entry_id); if (result != kIOReturnSuccess) { - HID_LOG(EVENT) << "Failed to get IOService path: " << HexErrorCode(result); + HID_LOG(EVENT) << "Failed to get IORegistryEntry ID: " + << HexErrorCode(result); return nullptr; } base::ScopedCFTypeRef<IOHIDDeviceRef> hid_device( IOHIDDeviceCreate(kCFAllocatorDefault, service)); if (!hid_device) { - HID_LOG(EVENT) << "Unable to create IOHIDDevice object for " << service_path - << "."; + HID_LOG(EVENT) << "Unable to create IOHIDDevice object for new device."; return nullptr; } std::vector<uint8> report_descriptor; if (!TryGetHidDataProperty(hid_device, CFSTR(kIOHIDReportDescriptorKey), &report_descriptor)) { - HID_LOG(EVENT) << "Unable to get report descriptor for " << service_path - << "."; + HID_LOG(EVENT) << "Unable to get report descriptor for new device."; return nullptr; } return new HidDeviceInfo( - service_path, GetHidIntProperty(hid_device, CFSTR(kIOHIDVendorIDKey)), + entry_id, GetHidIntProperty(hid_device, CFSTR(kIOHIDVendorIDKey)), GetHidIntProperty(hid_device, CFSTR(kIOHIDProductIDKey)), GetHidStringProperty(hid_device, CFSTR(kIOHIDProductKey)), GetHidStringProperty(hid_device, CFSTR(kIOHIDSerialNumberKey)), |