diff options
author | csharp@chromium.org <csharp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-03 17:14:13 +0000 |
---|---|---|
committer | csharp@chromium.org <csharp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-03 17:14:13 +0000 |
commit | 0eac598eeed59ebebdeb0d44e93677fbb9cb9d5a (patch) | |
tree | 6c5033490339860687bd80a6f6a663784eddd654 /device/hid/hid_report_descriptor.cc | |
parent | c9ab4198a25ff667f69acc6c9c8dad10c81bbe64 (diff) | |
download | chromium_src-0eac598eeed59ebebdeb0d44e93677fbb9cb9d5a.zip chromium_src-0eac598eeed59ebebdeb0d44e93677fbb9cb9d5a.tar.gz chromium_src-0eac598eeed59ebebdeb0d44e93677fbb9cb9d5a.tar.bz2 |
Revert 281133 "chrome.hid: enrich model with report IDs"
Speculative revert to try and fix Win browser tests.
> chrome.hid: enrich model with report IDs
>
> - add report IDs and max report size
> - don't expose sensitive usages
>
> BUG=364423
> R=rockot@chromium.org
> TESTS=run device_unittests (HidReportDescriptorTest)
>
> Review URL: https://codereview.chromium.org/317783010
TBR=jracle@logitech.com
Review URL: https://codereview.chromium.org/369923002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@281282 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'device/hid/hid_report_descriptor.cc')
-rw-r--r-- | device/hid/hid_report_descriptor.cc | 170 |
1 files changed, 29 insertions, 141 deletions
diff --git a/device/hid/hid_report_descriptor.cc b/device/hid/hid_report_descriptor.cc index a06d284..f2cb0f4 100644 --- a/device/hid/hid_report_descriptor.cc +++ b/device/hid/hid_report_descriptor.cc @@ -8,12 +8,6 @@ namespace device { -namespace { - -const int kBitsPerByte = 8; - -} // namespace - HidReportDescriptor::HidReportDescriptor(const uint8_t* bytes, size_t size) { size_t header_index = 0; HidReportDescriptorItem* item = NULL; @@ -26,148 +20,42 @@ HidReportDescriptor::HidReportDescriptor(const uint8_t* bytes, size_t size) { HidReportDescriptor::~HidReportDescriptor() {} -void HidReportDescriptor::GetDetails( - std::vector<HidCollectionInfo>* top_level_collections, - int* max_input_report_size, - int* max_output_report_size, - int* max_feature_report_size) { - DCHECK(top_level_collections); - DCHECK(max_input_report_size); - DCHECK(max_output_report_size); - DCHECK(max_feature_report_size); - STLClearObject(top_level_collections); - - *max_input_report_size = 0; - *max_output_report_size = 0; - *max_feature_report_size = 0; - - // Global tags data: - HidUsageAndPage::Page current_usage_page = HidUsageAndPage::kPageUndefined; - int current_report_count = 0; - int cached_report_count = 0; - int current_report_size = 0; - int cached_report_size = 0; - int current_input_report_size = 0; - int current_output_report_size = 0; - int current_feature_report_size = 0; - - // Local tags data: - uint16_t current_usage = 0; +void HidReportDescriptor::GetTopLevelCollections( + std::vector<HidUsageAndPage>* topLevelCollections) { + DCHECK(topLevelCollections); + STLClearObject(topLevelCollections); for (std::vector<linked_ptr<HidReportDescriptorItem> >::const_iterator items_iter = items().begin(); items_iter != items().end(); ++items_iter) { - linked_ptr<HidReportDescriptorItem> current_item = *items_iter; - - switch (current_item->tag()) { - // Main tags: - case HidReportDescriptorItem::kTagCollection: - if (!current_item->parent()) { - // This is a top-level collection. - HidCollectionInfo collection; - collection.usage = HidUsageAndPage(current_usage, current_usage_page); - top_level_collections->push_back(collection); - } - break; - case HidReportDescriptorItem::kTagInput: - current_input_report_size += current_report_count * current_report_size; - break; - case HidReportDescriptorItem::kTagOutput: - current_output_report_size += - current_report_count * current_report_size; - break; - case HidReportDescriptorItem::kTagFeature: - current_feature_report_size += - current_report_count * current_report_size; - break; - - // Global tags: - case HidReportDescriptorItem::kTagUsagePage: - current_usage_page = - (HidUsageAndPage::Page)current_item->GetShortData(); - break; - case HidReportDescriptorItem::kTagReportId: - if (top_level_collections->size() > 0) { - // Store report ID. - top_level_collections->back().report_ids.insert( - current_item->GetShortData()); - - // We need to increase report sizes by report ID field length. - if (current_input_report_size > 0) - current_input_report_size += kBitsPerByte; - if (current_output_report_size > 0) - current_output_report_size += kBitsPerByte; - if (current_feature_report_size > 0) - current_feature_report_size += kBitsPerByte; - - // Update max report sizes. - *max_input_report_size = - std::max(*max_input_report_size, current_input_report_size); - *max_output_report_size = - std::max(*max_output_report_size, current_output_report_size); - *max_feature_report_size = - std::max(*max_feature_report_size, current_feature_report_size); - - // Set report sizes to be 1-byte long (report ID field). - current_input_report_size = 0; - current_output_report_size = 0; - current_feature_report_size = 0; - } - break; - case HidReportDescriptorItem::kTagReportCount: - current_report_count = current_item->GetShortData(); - break; - case HidReportDescriptorItem::kTagReportSize: - current_report_size = current_item->GetShortData(); - break; - case HidReportDescriptorItem::kTagPush: - // Cache report count and size. - cached_report_count = current_report_count; - cached_report_size = current_report_size; - break; - case HidReportDescriptorItem::kTagPop: - // Restore cache. - current_report_count = cached_report_count; - current_report_size = cached_report_size; - // Reset cache. - cached_report_count = 0; - cached_report_size = 0; - break; - - // Local tags: - case HidReportDescriptorItem::kTagUsage: - current_usage = current_item->GetShortData(); - break; - - default: - break; + linked_ptr<HidReportDescriptorItem> item = *items_iter; + + bool isTopLevelCollection = + item->tag() == HidReportDescriptorItem::kTagCollection && + item->parent() == NULL; + + if (isTopLevelCollection) { + uint16_t collection_usage = 0; + HidUsageAndPage::Page collection_usage_page = + HidUsageAndPage::kPageUndefined; + + HidReportDescriptorItem* usage = item->previous(); + if (usage && usage->tag() == HidReportDescriptorItem::kTagUsage) { + collection_usage = usage->GetShortData(); + } + + HidReportDescriptorItem* usage_page = usage->previous(); + if (usage_page && + usage_page->tag() == HidReportDescriptorItem::kTagUsagePage) { + collection_usage_page = + (HidUsageAndPage::Page)usage_page->GetShortData(); + } + + topLevelCollections->push_back( + HidUsageAndPage(collection_usage, collection_usage_page)); } } - - if (top_level_collections->size() > 0 && - top_level_collections->back().report_ids.size() > 0) { - // We need to increase report sizes by report ID field length. - if (current_input_report_size > 0) - current_input_report_size += kBitsPerByte; - if (current_output_report_size > 0) - current_output_report_size += kBitsPerByte; - if (current_feature_report_size > 0) - current_feature_report_size += kBitsPerByte; - } - - // Update max report sizes - *max_input_report_size = - std::max(*max_input_report_size, current_input_report_size); - *max_output_report_size = - std::max(*max_output_report_size, current_output_report_size); - *max_feature_report_size = - std::max(*max_feature_report_size, current_feature_report_size); - - // Convert bits into bytes - *max_input_report_size /= kBitsPerByte; - *max_output_report_size /= kBitsPerByte; - *max_feature_report_size /= kBitsPerByte; } } // namespace device |