blob: c8f20a0f92168a2626aa96ff71b0ab568527dcef [file] [log] [blame]
// Copyright 2022 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 "multiply_server.h"
namespace acpi_multiply {
// Static
// Handle incoming connection requests from FIDL clients
fidl::ServerBindingRef<fuchsia_examples_acpi_multiply::Device> AcpiMultiplyServer::BindDeviceClient(
driver::Logger* logger, async_dispatcher_t* dispatcher,
std::weak_ptr<AcpiMultiplier> multiplier,
fidl::ServerEnd<fuchsia_examples_acpi_multiply::Device> request) {
// Bind each connection request to a unique FIDL server instance
auto server_impl = std::make_unique<AcpiMultiplyServer>(logger, multiplier);
return fidl::BindServer(dispatcher, std::move(request), std::move(server_impl),
std::mem_fn(&AcpiMultiplyServer::OnUnbound));
}
// This method is called when a server connection is torn down.
void AcpiMultiplyServer::OnUnbound(
fidl::UnbindInfo info, fidl::ServerEnd<fuchsia_examples_acpi_multiply::Device> server_end) {
if (info.is_peer_closed()) {
FDF_LOG(DEBUG, "Client disconnected");
} else if (!info.is_user_initiated()) {
FDF_LOG(ERROR, "Client connection unbound: %s", info.status_string());
}
}
// Protocol method in `fuchsia.examples.acpi.multiply` to execute a multiply operation
void AcpiMultiplyServer::Multiply(MultiplyRequestView request, MultiplyCompleter::Sync& completer) {
auto multiplier = multiplier_.lock();
if (!multiplier) {
FDF_LOG(ERROR, "Unable to access ACPI resources.");
completer.ReplyError(ZX_ERR_BAD_STATE);
return;
}
multiplier->QueueMultiplyOperation(AcpiMultiplier::Operation{
.a = request->a,
.b = request->b,
.callback =
[completer =
completer.ToAsync()](zx::status<AcpiMultiplier::MultiplyResult> status) mutable {
if (status.is_error()) {
completer.ReplyError(status.error_value());
return;
}
AcpiMultiplier::MultiplyResult result = status.value();
completer.ReplySuccess(result.value, result.overflow);
},
});
}
} // namespace acpi_multiply