#ifndef SERVICES_DEVICE_PUBLIC_CPP_HID_HID_COLLECTION_H_
#define SERVICES_DEVICE_PUBLIC_CPP_HID_HID_COLLECTION_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <unordered_map>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "services/device/public/cpp/hid/hid_report_descriptor_item.h"
#include "services/device/public/cpp/hid/hid_report_item.h"
#include "services/device/public/mojom/hid.mojom.h"
namespace device {
class HidItemStateTable;
class HidCollection {
public:
using HidReport = std::vector<std::unique_ptr<HidReportItem>>;
HidCollection(HidCollection* parent,
uint32_t usage_page,
uint32_t usage,
uint32_t collection_type);
~HidCollection();
static std::vector<std::unique_ptr<HidCollection>> BuildCollections(
const std::vector<std::unique_ptr<HidReportDescriptorItem>>& items);
uint16_t GetUsagePage() const { return usage_.usage_page; }
uint16_t GetUsage() const { return usage_.usage; }
uint32_t GetCollectionType() const { return collection_type_; }
bool HasReportId() const { return !report_ids_.empty(); }
void GetMaxReportSizes(size_t* max_input_report_bits,
size_t* max_output_report_bits,
size_t* max_feature_report_bits) const;
mojom::HidCollectionInfoPtr ToMojo() const;
const HidCollection* GetParent() const { return parent_; }
const std::vector<std::unique_ptr<HidCollection>>& GetChildren() const {
return children_;
}
const std::unordered_map<uint8_t, HidReport>& GetInputReports() const {
return input_reports_;
}
const std::unordered_map<uint8_t, HidReport>& GetOutputReports() const {
return output_reports_;
}
const std::unordered_map<uint8_t, HidReport>& GetFeatureReports() const {
return feature_reports_;
}
void AddChildForTesting(std::unique_ptr<HidCollection> child);
void AddReportItem(const HidReportDescriptorItem::Tag tag,
uint32_t report_info,
const HidItemStateTable& state);
private:
static void AddCollection(
const HidReportDescriptorItem& item,
std::vector<std::unique_ptr<HidCollection>>& collections,
HidItemStateTable& state);
const raw_ptr<HidCollection> parent_;
std::vector<std::unique_ptr<HidCollection>> children_;
const mojom::HidUsageAndPage usage_;
const uint32_t collection_type_;
std::vector<uint8_t> report_ids_;
std::unordered_map<uint8_t, HidReport> input_reports_;
std::unordered_map<uint8_t, HidReport> output_reports_;
std::unordered_map<uint8_t, HidReport> feature_reports_;
};
}
#endif