summaryrefslogtreecommitdiffstats
path: root/device
diff options
context:
space:
mode:
authorreillyg <reillyg@chromium.org>2015-03-23 16:21:14 -0700
committerCommit bot <commit-bot@chromium.org>2015-03-23 23:21:46 +0000
commitfab70f55e19d3090af7d6d51425abed3c8b3e039 (patch)
tree14339a0d0563c6effec2324bc7030224bf7655ac /device
parent82af6f6b968a2683de21c8dc81cf1fd72bec0322 (diff)
downloadchromium_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.cc13
-rw-r--r--device/hid/hid_device_info.cc2
-rw-r--r--device/hid/hid_device_info.h5
-rw-r--r--device/hid/hid_service_mac.cc32
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)),