| 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 |
| 18 namespace { |
| 19 |
| 20 std::string HexErrorCode(IOReturn error_code) { |
| 21 return base::StringPrintf("0x%04x", error_code); |
| 22 } |
| 23 |
| 24 } // namespace |
| 25 |
| 17 HidConnectionMac::HidConnectionMac( | 26 HidConnectionMac::HidConnectionMac( |
| 18 IOHIDDeviceRef device, | 27 IOHIDDeviceRef device, |
| 19 scoped_refptr<HidDeviceInfo> device_info, | 28 scoped_refptr<HidDeviceInfo> device_info, |
| 20 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) | 29 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) |
| 21 : HidConnection(device_info), | 30 : HidConnection(device_info), |
| 22 device_(device, base::scoped_policy::RETAIN), | 31 device_(device, base::scoped_policy::RETAIN), |
| 23 file_task_runner_(file_task_runner) { | 32 file_task_runner_(file_task_runner) { |
| 24 task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 33 task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| 25 DCHECK(task_runner_.get()); | 34 DCHECK(task_runner_.get()); |
| 26 | 35 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 52 IOHIDDeviceRegisterInputReportCallback( | 61 IOHIDDeviceRegisterInputReportCallback( |
| 53 device_.get(), &inbound_buffer_[0], inbound_buffer_.size(), NULL, this); | 62 device_.get(), &inbound_buffer_[0], inbound_buffer_.size(), NULL, this); |
| 54 // Release the reference taken when this callback was registered. | 63 // Release the reference taken when this callback was registered. |
| 55 Release(); | 64 Release(); |
| 56 } | 65 } |
| 57 | 66 |
| 58 IOHIDDeviceUnscheduleFromRunLoop( | 67 IOHIDDeviceUnscheduleFromRunLoop( |
| 59 device_.get(), CFRunLoopGetMain(), kCFRunLoopDefaultMode); | 68 device_.get(), CFRunLoopGetMain(), kCFRunLoopDefaultMode); |
| 60 IOReturn result = IOHIDDeviceClose(device_.get(), 0); | 69 IOReturn result = IOHIDDeviceClose(device_.get(), 0); |
| 61 if (result != kIOReturnSuccess) { | 70 if (result != kIOReturnSuccess) { |
| 62 VLOG(1) << "Failed to close HID device: " | 71 HID_LOG(EVENT) << "Failed to close HID device: " << HexErrorCode(result); |
| 63 << base::StringPrintf("0x%04x", result); | |
| 64 } | 72 } |
| 65 | 73 |
| 66 while (!pending_reads_.empty()) { | 74 while (!pending_reads_.empty()) { |
| 67 pending_reads_.front().callback.Run(false, NULL, 0); | 75 pending_reads_.front().callback.Run(false, NULL, 0); |
| 68 pending_reads_.pop(); | 76 pending_reads_.pop(); |
| 69 } | 77 } |
| 70 } | 78 } |
| 71 | 79 |
| 72 void HidConnectionMac::PlatformRead(const ReadCallback& callback) { | 80 void HidConnectionMac::PlatformRead(const ReadCallback& callback) { |
| 73 DCHECK(thread_checker().CalledOnValidThread()); | 81 DCHECK(thread_checker().CalledOnValidThread()); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 // static | 121 // static |
| 114 void HidConnectionMac::InputReportCallback(void* context, | 122 void HidConnectionMac::InputReportCallback(void* context, |
| 115 IOReturn result, | 123 IOReturn result, |
| 116 void* sender, | 124 void* sender, |
| 117 IOHIDReportType type, | 125 IOHIDReportType type, |
| 118 uint32_t report_id, | 126 uint32_t report_id, |
| 119 uint8_t* report_bytes, | 127 uint8_t* report_bytes, |
| 120 CFIndex report_length) { | 128 CFIndex report_length) { |
| 121 HidConnectionMac* connection = static_cast<HidConnectionMac*>(context); | 129 HidConnectionMac* connection = static_cast<HidConnectionMac*>(context); |
| 122 if (result != kIOReturnSuccess) { | 130 if (result != kIOReturnSuccess) { |
| 123 VLOG(1) << "Failed to read input report: " | 131 HID_LOG(EVENT) << "Failed to read input report: " << HexErrorCode(result); |
| 124 << base::StringPrintf("0x%08x", result); | |
| 125 return; | 132 return; |
| 126 } | 133 } |
| 127 | 134 |
| 128 scoped_refptr<net::IOBufferWithSize> buffer; | 135 scoped_refptr<net::IOBufferWithSize> buffer; |
| 129 if (connection->device_info()->has_report_id()) { | 136 if (connection->device_info()->has_report_id()) { |
| 130 // report_id is already contained in report_bytes | 137 // report_id is already contained in report_bytes |
| 131 buffer = new net::IOBufferWithSize(report_length); | 138 buffer = new net::IOBufferWithSize(report_length); |
| 132 memcpy(buffer->data(), report_bytes, report_length); | 139 memcpy(buffer->data(), report_bytes, report_length); |
| 133 } else { | 140 } else { |
| 134 buffer = new net::IOBufferWithSize(report_length + 1); | 141 buffer = new net::IOBufferWithSize(report_length + 1); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 report_id, | 186 report_id, |
| 180 reinterpret_cast<uint8_t*>(buffer->data()), | 187 reinterpret_cast<uint8_t*>(buffer->data()), |
| 181 &report_size); | 188 &report_size); |
| 182 if (result == kIOReturnSuccess) { | 189 if (result == kIOReturnSuccess) { |
| 183 task_runner_->PostTask( | 190 task_runner_->PostTask( |
| 184 FROM_HERE, | 191 FROM_HERE, |
| 185 base::Bind(&HidConnectionMac::ReturnAsyncResult, | 192 base::Bind(&HidConnectionMac::ReturnAsyncResult, |
| 186 this, | 193 this, |
| 187 base::Bind(callback, true, buffer, report_size))); | 194 base::Bind(callback, true, buffer, report_size))); |
| 188 } else { | 195 } else { |
| 189 VLOG(1) << "Failed to get feature report: " | 196 HID_LOG(EVENT) << "Failed to get feature report: " << HexErrorCode(result); |
| 190 << base::StringPrintf("0x%08x", result); | |
| 191 task_runner_->PostTask(FROM_HERE, | 197 task_runner_->PostTask(FROM_HERE, |
| 192 base::Bind(&HidConnectionMac::ReturnAsyncResult, | 198 base::Bind(&HidConnectionMac::ReturnAsyncResult, |
| 193 this, | 199 this, |
| 194 base::Bind(callback, false, nullptr, 0))); | 200 base::Bind(callback, false, nullptr, 0))); |
| 195 } | 201 } |
| 196 } | 202 } |
| 197 | 203 |
| 198 void HidConnectionMac::SetReportAsync(IOHIDReportType report_type, | 204 void HidConnectionMac::SetReportAsync(IOHIDReportType report_type, |
| 199 scoped_refptr<net::IOBuffer> buffer, | 205 scoped_refptr<net::IOBuffer> buffer, |
| 200 size_t size, | 206 size_t size, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 215 // of this function and believe it is a simple enough wrapper around the | 221 // of this function and believe it is a simple enough wrapper around the |
| 216 // kernel API that this is safe. | 222 // kernel API that this is safe. |
| 217 IOReturn result = | 223 IOReturn result = |
| 218 IOHIDDeviceSetReport(device_.get(), report_type, report_id, data, size); | 224 IOHIDDeviceSetReport(device_.get(), report_type, report_id, data, size); |
| 219 if (result == kIOReturnSuccess) { | 225 if (result == kIOReturnSuccess) { |
| 220 task_runner_->PostTask(FROM_HERE, | 226 task_runner_->PostTask(FROM_HERE, |
| 221 base::Bind(&HidConnectionMac::ReturnAsyncResult, | 227 base::Bind(&HidConnectionMac::ReturnAsyncResult, |
| 222 this, | 228 this, |
| 223 base::Bind(callback, true))); | 229 base::Bind(callback, true))); |
| 224 } else { | 230 } else { |
| 225 VLOG(1) << "Failed to set report: " << base::StringPrintf("0x%08x", result); | 231 HID_LOG(EVENT) << "Failed to set report: " << HexErrorCode(result); |
| 226 task_runner_->PostTask(FROM_HERE, | 232 task_runner_->PostTask(FROM_HERE, |
| 227 base::Bind(&HidConnectionMac::ReturnAsyncResult, | 233 base::Bind(&HidConnectionMac::ReturnAsyncResult, |
| 228 this, | 234 this, |
| 229 base::Bind(callback, false))); | 235 base::Bind(callback, false))); |
| 230 } | 236 } |
| 231 } | 237 } |
| 232 | 238 |
| 233 void HidConnectionMac::ReturnAsyncResult(const base::Closure& callback) { | 239 void HidConnectionMac::ReturnAsyncResult(const base::Closure& callback) { |
| 234 callback.Run(); | 240 callback.Run(); |
| 235 } | 241 } |
| 236 | 242 |
| 237 } // namespace device | 243 } // namespace device |
| OLD | NEW |