blob: d4bafd8ed38835d36427beeeb43a9ab1439d9d4b [file] [log] [blame]
// Copyright 2020 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/testing/fake_input_report_device/fake.h"
#include <fbl/auto_lock.h>
#include "lib/fidl/cpp/clone.h"
namespace fake_input_report_device {
void FakeInputDevice::SetDescriptor(fuchsia::input::report::DeviceDescriptorPtr descriptor) {
fbl::AutoLock lock(&lock_);
descriptor_ = std::move(descriptor);
}
void FakeInputDevice::GetDescriptor(GetDescriptorCallback callback) {
fbl::AutoLock lock(&lock_);
fuchsia::input::report::DeviceDescriptor desc;
fidl::Clone(*descriptor_, &desc);
callback(std::move(desc));
}
void FakeInputDevice::GetInputReportsReader(
fidl::InterfaceRequest<fuchsia::input::report::InputReportsReader> reader) {
fbl::AutoLock lock(&lock_);
if (reader_) {
reader.Close(ZX_ERR_ALREADY_BOUND);
return;
}
reader_.emplace(std::move(reader), binding_.dispatcher(), this);
}
void FakeInputDevice::SendOutputReport(fuchsia::input::report::OutputReport report,
SendOutputReportCallback callback) {
callback(
fuchsia::input::report::InputDevice_SendOutputReport_Result::WithErr(ZX_ERR_NOT_SUPPORTED));
}
void FakeInputDevice::GetInputReport(::fuchsia::input::report::DeviceType device_type,
GetInputReportCallback callback) {
fbl::AutoLock lock(&lock_);
if (reports_.empty()) {
callback(
fuchsia::input::report::InputDevice_GetInputReport_Result::WithErr(ZX_ERR_NOT_SUPPORTED));
} else {
fuchsia::input::report::InputDevice_GetInputReport_Response response(std::move(reports_[0]));
callback(fuchsia::input::report::InputDevice_GetInputReport_Result::WithResponse(
std::move(response)));
reports_.erase(reports_.begin());
}
}
void FakeInputDevice::GetFeatureReport(GetFeatureReportCallback callback) {
fbl::AutoLock lock(&lock_);
if (feature_reports_.empty()) {
callback(
fuchsia::input::report::InputDevice_GetFeatureReport_Result::WithErr(ZX_ERR_NOT_SUPPORTED));
} else {
fuchsia::input::report::InputDevice_GetFeatureReport_Response response(
std::move(feature_reports_[0]));
callback(fuchsia::input::report::InputDevice_GetFeatureReport_Result::WithResponse(
std::move(response)));
feature_reports_.erase(feature_reports_.begin());
}
}
void FakeInputDevice::SetReports(std::vector<fuchsia::input::report::InputReport> reports) {
fbl::AutoLock lock(&lock_);
reports_ = std::move(reports);
if (reader_) {
reader_->QueueCallback();
}
}
void FakeInputDevice::SetReports(std::vector<fuchsia::input::report::FeatureReport> reports) {
fbl::AutoLock lock(&lock_);
feature_reports_ = std::move(reports);
}
std::vector<fuchsia::input::report::InputReport> FakeInputDevice::ReadReports() {
fbl::AutoLock lock(&lock_);
return std::move(reports_);
}
} // namespace fake_input_report_device