blob: e2b758c4d3eeef668342f5ac73f81e59ecf99c32 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/ui/input/drivers/goldfish_sensor/input_device_dispatcher.h"
namespace goldfish::sensor {
bool InputDeviceDispatcher::AddDevice(InputDevice* device, const std::string& name) {
if (name_map_.find(name) != name_map_.end() || ptr_map_.find(device) != ptr_map_.end()) {
return false;
}
devices_.push_back({
.device = device,
.name = name,
});
name_map_[name] = ptr_map_[device] = --devices_.end();
return true;
}
bool InputDeviceDispatcher::RemoveDevice(InputDevice* device) {
if (ptr_map_.find(device) == ptr_map_.end()) {
return false;
}
DeviceEntry entry_to_delete = *ptr_map_[device];
devices_.erase(ptr_map_[device]);
name_map_.erase(entry_to_delete.name);
ptr_map_.erase(entry_to_delete.device);
return true;
}
bool InputDeviceDispatcher::RemoveDevice(const std::string& name) {
if (name_map_.find(name) == name_map_.end()) {
return false;
}
DeviceEntry entry_to_delete = *name_map_[name];
devices_.erase(name_map_[name]);
name_map_.erase(entry_to_delete.name);
ptr_map_.erase(entry_to_delete.device);
return true;
}
InputDevice* InputDeviceDispatcher::GetDevice(const std::string& name) {
if (name_map_.find(name) == name_map_.end()) {
return nullptr;
}
return name_map_[name]->device;
}
zx_status_t InputDeviceDispatcher::DispatchReportToDevice(const std::string& name,
const SensorReport& rpt) {
if (name_map_.find(name) == name_map_.end()) {
return ZX_ERR_NOT_FOUND;
}
return name_map_[name]->device->OnReport(rpt);
}
void InputDeviceDispatcher::DispatchReportToAllDevices(const SensorReport& rpt) {
for (const auto& kv : name_map_) {
auto status = kv.second->device->OnReport(rpt);
if (status != ZX_OK) {
zxlogf(ERROR, "Cannot dispatch report to device \"%s\": %d", kv.first.c_str(), status);
}
}
}
} // namespace goldfish::sensor