Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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_connection_mac.h" | 5 #include "device/hid/hid_connection_mac.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/location.h" | 8 #include "base/location.h" |
| 9 #include "base/mac/foundation_util.h" | 9 #include "base/mac/foundation_util.h" |
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
| 11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 12 #include "base/thread_task_runner_handle.h" | 12 #include "base/thread_task_runner_handle.h" |
| 13 #include "components/device_event_log/device_event_log.h" | |
| 13 #include "device/hid/hid_connection_mac.h" | 14 #include "device/hid/hid_connection_mac.h" |
| 14 | 15 |
| 15 namespace device { | 16 namespace device { |
| 16 | 17 |
| 17 HidConnectionMac::HidConnectionMac( | 18 HidConnectionMac::HidConnectionMac( |
| 18 IOHIDDeviceRef device, | 19 IOHIDDeviceRef device, |
| 19 scoped_refptr<HidDeviceInfo> device_info, | 20 scoped_refptr<HidDeviceInfo> device_info, |
| 20 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) | 21 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) |
| 21 : HidConnection(device_info), | 22 : HidConnection(device_info), |
| 22 device_(device, base::scoped_policy::RETAIN), | 23 device_(device, base::scoped_policy::RETAIN), |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 52 IOHIDDeviceRegisterInputReportCallback( | 53 IOHIDDeviceRegisterInputReportCallback( |
| 53 device_.get(), &inbound_buffer_[0], inbound_buffer_.size(), NULL, this); | 54 device_.get(), &inbound_buffer_[0], inbound_buffer_.size(), NULL, this); |
| 54 // Release the reference taken when this callback was registered. | 55 // Release the reference taken when this callback was registered. |
| 55 Release(); | 56 Release(); |
| 56 } | 57 } |
| 57 | 58 |
| 58 IOHIDDeviceUnscheduleFromRunLoop( | 59 IOHIDDeviceUnscheduleFromRunLoop( |
| 59 device_.get(), CFRunLoopGetMain(), kCFRunLoopDefaultMode); | 60 device_.get(), CFRunLoopGetMain(), kCFRunLoopDefaultMode); |
| 60 IOReturn result = IOHIDDeviceClose(device_.get(), 0); | 61 IOReturn result = IOHIDDeviceClose(device_.get(), 0); |
| 61 if (result != kIOReturnSuccess) { | 62 if (result != kIOReturnSuccess) { |
| 62 VLOG(1) << "Failed to close HID device: " | 63 HID_LOG(EVENT) << "Failed to close HID device: " << base::StringPrintf( |
| 63 << base::StringPrintf("0x%04x", result); | 64 "0x%04x", result); |
|
stevenjb
2015/02/23 21:45:29
nit: We do this a lot here, maybe wrap the StringP
Reilly Grant (use Gerrit)
2015/02/23 22:40:38
Done.
| |
| 64 } | 65 } |
| 65 | 66 |
| 66 while (!pending_reads_.empty()) { | 67 while (!pending_reads_.empty()) { |
| 67 pending_reads_.front().callback.Run(false, NULL, 0); | 68 pending_reads_.front().callback.Run(false, NULL, 0); |
| 68 pending_reads_.pop(); | 69 pending_reads_.pop(); |
| 69 } | 70 } |
| 70 } | 71 } |
| 71 | 72 |
| 72 void HidConnectionMac::PlatformRead(const ReadCallback& callback) { | 73 void HidConnectionMac::PlatformRead(const ReadCallback& callback) { |
| 73 DCHECK(thread_checker().CalledOnValidThread()); | 74 DCHECK(thread_checker().CalledOnValidThread()); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 113 // static | 114 // static |
| 114 void HidConnectionMac::InputReportCallback(void* context, | 115 void HidConnectionMac::InputReportCallback(void* context, |
| 115 IOReturn result, | 116 IOReturn result, |
| 116 void* sender, | 117 void* sender, |
| 117 IOHIDReportType type, | 118 IOHIDReportType type, |
| 118 uint32_t report_id, | 119 uint32_t report_id, |
| 119 uint8_t* report_bytes, | 120 uint8_t* report_bytes, |
| 120 CFIndex report_length) { | 121 CFIndex report_length) { |
| 121 HidConnectionMac* connection = static_cast<HidConnectionMac*>(context); | 122 HidConnectionMac* connection = static_cast<HidConnectionMac*>(context); |
| 122 if (result != kIOReturnSuccess) { | 123 if (result != kIOReturnSuccess) { |
| 123 VLOG(1) << "Failed to read input report: " | 124 HID_LOG(EVENT) << "Failed to read input report: " << base::StringPrintf( |
| 124 << base::StringPrintf("0x%08x", result); | 125 "0x%08x", result); |
| 125 return; | 126 return; |
| 126 } | 127 } |
| 127 | 128 |
| 128 scoped_refptr<net::IOBufferWithSize> buffer; | 129 scoped_refptr<net::IOBufferWithSize> buffer; |
| 129 if (connection->device_info()->has_report_id()) { | 130 if (connection->device_info()->has_report_id()) { |
| 130 // report_id is already contained in report_bytes | 131 // report_id is already contained in report_bytes |
| 131 buffer = new net::IOBufferWithSize(report_length); | 132 buffer = new net::IOBufferWithSize(report_length); |
| 132 memcpy(buffer->data(), report_bytes, report_length); | 133 memcpy(buffer->data(), report_bytes, report_length); |
| 133 } else { | 134 } else { |
| 134 buffer = new net::IOBufferWithSize(report_length + 1); | 135 buffer = new net::IOBufferWithSize(report_length + 1); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 179 report_id, | 180 report_id, |
| 180 reinterpret_cast<uint8_t*>(buffer->data()), | 181 reinterpret_cast<uint8_t*>(buffer->data()), |
| 181 &report_size); | 182 &report_size); |
| 182 if (result == kIOReturnSuccess) { | 183 if (result == kIOReturnSuccess) { |
| 183 task_runner_->PostTask( | 184 task_runner_->PostTask( |
| 184 FROM_HERE, | 185 FROM_HERE, |
| 185 base::Bind(&HidConnectionMac::ReturnAsyncResult, | 186 base::Bind(&HidConnectionMac::ReturnAsyncResult, |
| 186 this, | 187 this, |
| 187 base::Bind(callback, true, buffer, report_size))); | 188 base::Bind(callback, true, buffer, report_size))); |
| 188 } else { | 189 } else { |
| 189 VLOG(1) << "Failed to get feature report: " | 190 HID_LOG(EVENT) << "Failed to get feature report: " << base::StringPrintf( |
| 190 << base::StringPrintf("0x%08x", result); | 191 "0x%08x", result); |
| 191 task_runner_->PostTask(FROM_HERE, | 192 task_runner_->PostTask(FROM_HERE, |
| 192 base::Bind(&HidConnectionMac::ReturnAsyncResult, | 193 base::Bind(&HidConnectionMac::ReturnAsyncResult, |
| 193 this, | 194 this, |
| 194 base::Bind(callback, false, nullptr, 0))); | 195 base::Bind(callback, false, nullptr, 0))); |
| 195 } | 196 } |
| 196 } | 197 } |
| 197 | 198 |
| 198 void HidConnectionMac::SetReportAsync(IOHIDReportType report_type, | 199 void HidConnectionMac::SetReportAsync(IOHIDReportType report_type, |
| 199 scoped_refptr<net::IOBuffer> buffer, | 200 scoped_refptr<net::IOBuffer> buffer, |
| 200 size_t size, | 201 size_t size, |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 215 // of this function and believe it is a simple enough wrapper around the | 216 // of this function and believe it is a simple enough wrapper around the |
| 216 // kernel API that this is safe. | 217 // kernel API that this is safe. |
| 217 IOReturn result = | 218 IOReturn result = |
| 218 IOHIDDeviceSetReport(device_.get(), report_type, report_id, data, size); | 219 IOHIDDeviceSetReport(device_.get(), report_type, report_id, data, size); |
| 219 if (result == kIOReturnSuccess) { | 220 if (result == kIOReturnSuccess) { |
| 220 task_runner_->PostTask(FROM_HERE, | 221 task_runner_->PostTask(FROM_HERE, |
| 221 base::Bind(&HidConnectionMac::ReturnAsyncResult, | 222 base::Bind(&HidConnectionMac::ReturnAsyncResult, |
| 222 this, | 223 this, |
| 223 base::Bind(callback, true))); | 224 base::Bind(callback, true))); |
| 224 } else { | 225 } else { |
| 225 VLOG(1) << "Failed to set report: " << base::StringPrintf("0x%08x", result); | 226 HID_LOG(EVENT) << "Failed to set report: " << base::StringPrintf("0x%08x", |
| 227 result); | |
| 226 task_runner_->PostTask(FROM_HERE, | 228 task_runner_->PostTask(FROM_HERE, |
| 227 base::Bind(&HidConnectionMac::ReturnAsyncResult, | 229 base::Bind(&HidConnectionMac::ReturnAsyncResult, |
| 228 this, | 230 this, |
| 229 base::Bind(callback, false))); | 231 base::Bind(callback, false))); |
| 230 } | 232 } |
| 231 } | 233 } |
| 232 | 234 |
| 233 void HidConnectionMac::ReturnAsyncResult(const base::Closure& callback) { | 235 void HidConnectionMac::ReturnAsyncResult(const base::Closure& callback) { |
| 234 callback.Run(); | 236 callback.Run(); |
| 235 } | 237 } |
| 236 | 238 |
| 237 } // namespace device | 239 } // namespace device |
| OLD | NEW |