| 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 | 
|---|