hid_device_info.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef SERVICES_DEVICE_HID_HID_DEVICE_INFO_H_
  5. #define SERVICES_DEVICE_HID_HID_DEVICE_INFO_H_
  6. #include <stddef.h>
  7. #include <stdint.h>
  8. #include <string>
  9. #include <vector>
  10. #include "base/containers/flat_set.h"
  11. #include "base/containers/span.h"
  12. #include "base/memory/ref_counted.h"
  13. #include "build/build_config.h"
  14. #include "services/device/hid/hid_report_type.h"
  15. #include "services/device/public/mojom/hid.mojom.h"
  16. #include "third_party/abseil-cpp/absl/types/optional.h"
  17. namespace device {
  18. #if BUILDFLAG(IS_MAC)
  19. typedef uint64_t HidPlatformDeviceId;
  20. #elif BUILDFLAG(IS_WIN)
  21. typedef std::wstring HidPlatformDeviceId;
  22. #else
  23. typedef std::string HidPlatformDeviceId;
  24. #endif
  25. class HidDeviceInfo : public base::RefCountedThreadSafe<HidDeviceInfo> {
  26. public:
  27. // PlatformDeviceIdMap defines a mapping from report IDs to the
  28. // HidPlatformDeviceId responsible for handling those reports.
  29. struct PlatformDeviceIdEntry {
  30. PlatformDeviceIdEntry(base::flat_set<uint8_t> report_ids,
  31. HidPlatformDeviceId platform_device_id);
  32. PlatformDeviceIdEntry(const PlatformDeviceIdEntry& entry);
  33. PlatformDeviceIdEntry& operator=(const PlatformDeviceIdEntry& entry);
  34. ~PlatformDeviceIdEntry();
  35. base::flat_set<uint8_t> report_ids;
  36. HidPlatformDeviceId platform_device_id;
  37. };
  38. using PlatformDeviceIdMap = std::vector<PlatformDeviceIdEntry>;
  39. HidDeviceInfo(HidPlatformDeviceId platform_device_id,
  40. const std::string& physical_device_id,
  41. uint16_t vendor_id,
  42. uint16_t product_id,
  43. const std::string& product_name,
  44. const std::string& serial_number,
  45. mojom::HidBusType bus_type,
  46. base::span<const uint8_t> report_descriptor,
  47. std::string device_node = "");
  48. HidDeviceInfo(HidPlatformDeviceId platform_device_id,
  49. const std::string& physical_device_id,
  50. const std::string& interface_id,
  51. uint16_t vendor_id,
  52. uint16_t product_id,
  53. const std::string& product_name,
  54. const std::string& serial_number,
  55. mojom::HidBusType bus_type,
  56. mojom::HidCollectionInfoPtr collection,
  57. size_t max_input_report_size,
  58. size_t max_output_report_size,
  59. size_t max_feature_report_size);
  60. HidDeviceInfo(const HidDeviceInfo& entry) = delete;
  61. HidDeviceInfo& operator=(const HidDeviceInfo& entry) = delete;
  62. const mojom::HidDeviceInfoPtr& device() { return device_; }
  63. // Device identification.
  64. const std::string& device_guid() const { return device_->guid; }
  65. const PlatformDeviceIdMap& platform_device_id_map() const {
  66. return platform_device_id_map_;
  67. }
  68. const absl::optional<std::string>& interface_id() const {
  69. return interface_id_;
  70. }
  71. const std::string& physical_device_id() const {
  72. return device_->physical_device_id;
  73. }
  74. uint16_t vendor_id() const { return device_->vendor_id; }
  75. uint16_t product_id() const { return device_->product_id; }
  76. const std::string& product_name() const { return device_->product_name; }
  77. const std::string& serial_number() const { return device_->serial_number; }
  78. mojom::HidBusType bus_type() const { return device_->bus_type; }
  79. // Top-Level Collections information.
  80. const std::vector<mojom::HidCollectionInfoPtr>& collections() const {
  81. return device_->collections;
  82. }
  83. bool has_report_id() const { return device_->has_report_id; }
  84. uint64_t max_input_report_size() const {
  85. return device_->max_input_report_size;
  86. }
  87. uint64_t max_output_report_size() const {
  88. return device_->max_output_report_size;
  89. }
  90. uint64_t max_feature_report_size() const {
  91. return device_->max_feature_report_size;
  92. }
  93. // The raw HID report descriptor is not available on Windows.
  94. const std::vector<uint8_t>& report_descriptor() const {
  95. return device_->report_descriptor;
  96. }
  97. const std::string& device_node() const { return device_->device_node; }
  98. // Merge the device information in |device_info| into this object.
  99. // |device_info| must be part of the same HID interface.
  100. void AppendDeviceInfo(scoped_refptr<HidDeviceInfo> device_info);
  101. // Returns the collection in `device_` containing a report with ID `report_id`
  102. // and type `report_type`, or nullptr if no collection contains a matching
  103. // report.
  104. const mojom::HidCollectionInfo* FindCollectionWithReport(
  105. uint8_t report_id,
  106. HidReportType report_type);
  107. protected:
  108. virtual ~HidDeviceInfo();
  109. private:
  110. friend class base::RefCountedThreadSafe<HidDeviceInfo>;
  111. PlatformDeviceIdMap platform_device_id_map_;
  112. // On platforms where the system enumerates top-level HID collections as
  113. // separate logical devices, |interface_id_| is an identifier for the HID
  114. // interface and is used to associate HidDeviceInfo objects generated from
  115. // the same HID interface. May be absl::nullopt if the system does not split
  116. // top-level collections during enumeration.
  117. absl::optional<std::string> interface_id_;
  118. mojom::HidDeviceInfoPtr device_;
  119. };
  120. } // namespace device
  121. #endif // SERVICES_DEVICE_HID_HID_DEVICE_INFO_H_