Index: trunk/src/device/hid/hid_connection.cc |
=================================================================== |
--- trunk/src/device/hid/hid_connection.cc (revision 281281) |
+++ trunk/src/device/hid/hid_connection.cc (working copy) |
@@ -4,183 +4,8 @@ |
#include "device/hid/hid_connection.h" |
-#include <algorithm> |
- |
namespace device { |
-namespace { |
- |
-// Functor used to filter collections by report ID. |
-struct CollectionHasReportId { |
- explicit CollectionHasReportId(const uint8_t report_id) |
- : report_id_(report_id) {} |
- |
- bool operator()(const HidCollectionInfo& info) const { |
- if (info.report_ids.size() == 0 || |
- report_id_ == HidConnection::kNullReportId) |
- return false; |
- |
- if (report_id_ == HidConnection::kAnyReportId) |
- return true; |
- |
- return std::find(info.report_ids.begin(), |
- info.report_ids.end(), |
- report_id_) != info.report_ids.end(); |
- } |
- |
- private: |
- const uint8_t report_id_; |
-}; |
- |
-// Functor returning true if collection has a protected usage. |
-struct CollectionIsProtected { |
- bool operator()(const HidCollectionInfo& info) const { |
- return info.usage.IsProtected(); |
- } |
-}; |
- |
-bool FindCollectionByReportId(const HidDeviceInfo& device_info, |
- const uint8_t report_id, |
- HidCollectionInfo* collection_info) { |
- std::vector<HidCollectionInfo>::const_iterator collection_iter = |
- std::find_if(device_info.collections.begin(), |
- device_info.collections.end(), |
- CollectionHasReportId(report_id)); |
- if (collection_iter != device_info.collections.end()) { |
- if (collection_info) { |
- *collection_info = *collection_iter; |
- } |
- return true; |
- } |
- |
- return false; |
-} |
- |
-bool HasReportId(const HidDeviceInfo& device_info) { |
- return FindCollectionByReportId( |
- device_info, HidConnection::kAnyReportId, NULL); |
-} |
- |
-bool HasProtectedCollection(const HidDeviceInfo& device_info) { |
- return std::find_if(device_info.collections.begin(), |
- device_info.collections.end(), |
- CollectionIsProtected()) != device_info.collections.end(); |
-} |
- |
-} // namespace |
- |
-HidConnection::HidConnection(const HidDeviceInfo& device_info) |
- : device_info_(device_info) { |
- has_protected_collection_ = HasProtectedCollection(device_info); |
- has_report_id_ = HasReportId(device_info); |
-} |
- |
-HidConnection::~HidConnection() { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
-} |
- |
-void HidConnection::Read(scoped_refptr<net::IOBufferWithSize> buffer, |
- const IOCallback& callback) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- if (device_info_.max_input_report_size == 0) { |
- // The device does not support input reports. |
- callback.Run(false, 0); |
- return; |
- } |
- int expected_buffer_size = device_info_.max_input_report_size; |
- if (!has_report_id()) { |
- expected_buffer_size--; |
- } |
- if (buffer->size() < expected_buffer_size) { |
- // Receive buffer is too small. |
- callback.Run(false, 0); |
- return; |
- } |
- |
- PlatformRead(buffer, callback); |
-} |
- |
-void HidConnection::Write(uint8_t report_id, |
- scoped_refptr<net::IOBufferWithSize> buffer, |
- const IOCallback& callback) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- if (device_info_.max_output_report_size == 0) { |
- // The device does not support output reports. |
- callback.Run(false, 0); |
- return; |
- } |
- if (IsReportIdProtected(report_id)) { |
- callback.Run(false, 0); |
- return; |
- } |
- |
- PlatformWrite(report_id, buffer, callback); |
-} |
- |
-void HidConnection::GetFeatureReport( |
- uint8_t report_id, |
- scoped_refptr<net::IOBufferWithSize> buffer, |
- const IOCallback& callback) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- if (device_info_.max_feature_report_size == 0) { |
- // The device does not support feature reports. |
- callback.Run(false, 0); |
- return; |
- } |
- if (IsReportIdProtected(report_id)) { |
- callback.Run(false, 0); |
- return; |
- } |
- int expected_buffer_size = device_info_.max_feature_report_size; |
- if (!has_report_id()) { |
- expected_buffer_size--; |
- } |
- if (buffer->size() < expected_buffer_size) { |
- // Receive buffer is too small. |
- callback.Run(false, 0); |
- return; |
- } |
- |
- PlatformGetFeatureReport(report_id, buffer, callback); |
-} |
- |
-void HidConnection::SendFeatureReport( |
- uint8_t report_id, |
- scoped_refptr<net::IOBufferWithSize> buffer, |
- const IOCallback& callback) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- if (device_info_.max_feature_report_size == 0) { |
- // The device does not support feature reports. |
- callback.Run(false, 0); |
- return; |
- } |
- if (IsReportIdProtected(report_id)) { |
- callback.Run(false, 0); |
- return; |
- } |
- |
- PlatformSendFeatureReport(report_id, buffer, callback); |
-} |
- |
-bool HidConnection::CompleteRead(scoped_refptr<net::IOBufferWithSize> buffer, |
- const IOCallback& callback) { |
- if (buffer->size() == 0 || IsReportIdProtected(buffer->data()[0])) { |
- return false; |
- } |
- |
- callback.Run(true, buffer->size()); |
- return true; |
-} |
- |
-bool HidConnection::IsReportIdProtected(const uint8_t report_id) { |
- HidCollectionInfo collection_info; |
- if (FindCollectionByReportId(device_info_, report_id, &collection_info)) { |
- return collection_info.usage.IsProtected(); |
- } |
- |
- return has_protected_collection(); |
-} |
- |
PendingHidReport::PendingHidReport() {} |
PendingHidReport::~PendingHidReport() {} |
@@ -189,4 +14,9 @@ |
PendingHidRead::~PendingHidRead() {} |
+HidConnection::HidConnection(const HidDeviceInfo& device_info) |
+ : device_info_(device_info) {} |
+ |
+HidConnection::~HidConnection() {} |
+ |
} // namespace device |