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 "device/hid/hid_connection_mac.h" | 13 #include "device/hid/hid_connection_mac.h" |
14 | 14 |
15 namespace device { | 15 namespace device { |
16 | 16 |
17 HidConnectionMac::HidConnectionMac( | 17 HidConnectionMac::HidConnectionMac( |
18 IOHIDDeviceRef device, | 18 IOHIDDeviceRef device, |
19 HidDeviceInfo device_info, | 19 scoped_refptr<HidDeviceInfo> device_info, |
20 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) | 20 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) |
21 : HidConnection(device_info), | 21 : HidConnection(device_info), |
22 device_(device, base::scoped_policy::RETAIN), | 22 device_(device, base::scoped_policy::RETAIN), |
23 file_task_runner_(file_task_runner) { | 23 file_task_runner_(file_task_runner) { |
24 task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 24 task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
25 DCHECK(task_runner_.get()); | 25 DCHECK(task_runner_.get()); |
26 | 26 |
27 IOHIDDeviceScheduleWithRunLoop( | 27 IOHIDDeviceScheduleWithRunLoop( |
28 device_.get(), CFRunLoopGetMain(), kCFRunLoopDefaultMode); | 28 device_.get(), CFRunLoopGetMain(), kCFRunLoopDefaultMode); |
29 | 29 |
30 size_t expected_report_size = device_info.max_input_report_size; | 30 size_t expected_report_size = device_info->max_input_report_size(); |
31 if (device_info.has_report_id) { | 31 if (device_info->has_report_id()) { |
32 expected_report_size++; | 32 expected_report_size++; |
33 } | 33 } |
34 inbound_buffer_.resize(expected_report_size); | 34 inbound_buffer_.resize(expected_report_size); |
35 | 35 |
36 if (inbound_buffer_.size() > 0) { | 36 if (inbound_buffer_.size() > 0) { |
37 AddRef(); // Hold a reference to this while this callback is registered. | 37 AddRef(); // Hold a reference to this while this callback is registered. |
38 IOHIDDeviceRegisterInputReportCallback( | 38 IOHIDDeviceRegisterInputReportCallback( |
39 device_.get(), | 39 device_.get(), |
40 &inbound_buffer_[0], | 40 &inbound_buffer_[0], |
41 inbound_buffer_.size(), | 41 inbound_buffer_.size(), |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 uint8_t* report_bytes, | 119 uint8_t* report_bytes, |
120 CFIndex report_length) { | 120 CFIndex report_length) { |
121 HidConnectionMac* connection = static_cast<HidConnectionMac*>(context); | 121 HidConnectionMac* connection = static_cast<HidConnectionMac*>(context); |
122 if (result != kIOReturnSuccess) { | 122 if (result != kIOReturnSuccess) { |
123 VLOG(1) << "Failed to read input report: " | 123 VLOG(1) << "Failed to read input report: " |
124 << base::StringPrintf("0x%08x", result); | 124 << base::StringPrintf("0x%08x", result); |
125 return; | 125 return; |
126 } | 126 } |
127 | 127 |
128 scoped_refptr<net::IOBufferWithSize> buffer; | 128 scoped_refptr<net::IOBufferWithSize> buffer; |
129 if (connection->device_info().has_report_id) { | 129 if (connection->device_info()->has_report_id()) { |
130 // report_id is already contained in report_bytes | 130 // report_id is already contained in report_bytes |
131 buffer = new net::IOBufferWithSize(report_length); | 131 buffer = new net::IOBufferWithSize(report_length); |
132 memcpy(buffer->data(), report_bytes, report_length); | 132 memcpy(buffer->data(), report_bytes, report_length); |
133 } else { | 133 } else { |
134 buffer = new net::IOBufferWithSize(report_length + 1); | 134 buffer = new net::IOBufferWithSize(report_length + 1); |
135 buffer->data()[0] = 0; | 135 buffer->data()[0] = 0; |
136 memcpy(buffer->data() + 1, report_bytes, report_length); | 136 memcpy(buffer->data() + 1, report_bytes, report_length); |
137 } | 137 } |
138 | 138 |
139 connection->ProcessInputReport(buffer); | 139 connection->ProcessInputReport(buffer); |
(...skipping 18 matching lines...) Expand all Loading... |
158 pending_reports_.pop(); | 158 pending_reports_.pop(); |
159 if (CompleteRead(report.buffer, report.size, read.callback)) { | 159 if (CompleteRead(report.buffer, report.size, read.callback)) { |
160 pending_reads_.pop(); | 160 pending_reads_.pop(); |
161 } | 161 } |
162 } | 162 } |
163 } | 163 } |
164 | 164 |
165 void HidConnectionMac::GetFeatureReportAsync(uint8_t report_id, | 165 void HidConnectionMac::GetFeatureReportAsync(uint8_t report_id, |
166 const ReadCallback& callback) { | 166 const ReadCallback& callback) { |
167 scoped_refptr<net::IOBufferWithSize> buffer( | 167 scoped_refptr<net::IOBufferWithSize> buffer( |
168 new net::IOBufferWithSize(device_info().max_feature_report_size + 1)); | 168 new net::IOBufferWithSize(device_info()->max_feature_report_size() + 1)); |
169 CFIndex report_size = buffer->size(); | 169 CFIndex report_size = buffer->size(); |
170 | 170 |
171 // The IOHIDDevice object is shared with the UI thread and so this function | 171 // The IOHIDDevice object is shared with the UI thread and so this function |
172 // should probably be called there but it may block and the asynchronous | 172 // should probably be called there but it may block and the asynchronous |
173 // version is NOT IMPLEMENTED. I've examined the open source implementation | 173 // version is NOT IMPLEMENTED. I've examined the open source implementation |
174 // of this function and believe it is a simple enough wrapper around the | 174 // of this function and believe it is a simple enough wrapper around the |
175 // kernel API that this is safe. | 175 // kernel API that this is safe. |
176 IOReturn result = | 176 IOReturn result = |
177 IOHIDDeviceGetReport(device_.get(), | 177 IOHIDDeviceGetReport(device_.get(), |
178 kIOHIDReportTypeFeature, | 178 kIOHIDReportTypeFeature, |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 this, | 228 this, |
229 base::Bind(callback, false))); | 229 base::Bind(callback, false))); |
230 } | 230 } |
231 } | 231 } |
232 | 232 |
233 void HidConnectionMac::ReturnAsyncResult(const base::Closure& callback) { | 233 void HidConnectionMac::ReturnAsyncResult(const base::Closure& callback) { |
234 callback.Run(); | 234 callback.Run(); |
235 } | 235 } |
236 | 236 |
237 } // namespace device | 237 } // namespace device |
OLD | NEW |