| // Copyright 2022 The Chromium OS 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 "vtpm/vtpm_service.h" |
| |
| #include <memory> |
| #include <string> |
| #include <utility> |
| |
| #include <base/bind.h> |
| #include <base/logging.h> |
| #include <brillo/dbus/dbus_method_response.h> |
| |
| #include "vtpm/vtpm_interface.pb.h" |
| |
| namespace vtpm { |
| |
| namespace { |
| |
| // Makes a `SendCommandResponse` with `response` as the TPM response. |
| SendCommandResponse MakeResponseProto(const std::string& response) { |
| SendCommandResponse response_proto; |
| response_proto.set_response(response); |
| return response_proto; |
| } |
| |
| } // namespace |
| |
| VtpmService::VtpmService(Command* command) : command_(command) { |
| CHECK(command_); |
| } |
| |
| void VtpmService::SendCommand( |
| std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<SendCommandResponse>> |
| response, |
| const SendCommandRequest& request) { |
| VLOG(1) << __func__; |
| // Delegates the command execution to `command_`. |
| command_->Run(request.command(), |
| MakeCallingThreadCallback(std::move(response))); |
| } |
| |
| void VtpmService::RunResponseCallback( |
| std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<SendCommandResponse>> |
| response, |
| const std::string& send_command_response) { |
| response->Return(MakeResponseProto(send_command_response)); |
| } |
| |
| void VtpmService::PostResponseCallback( |
| std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<SendCommandResponse>> |
| response, |
| const std::string& send_command_response) { |
| origin_task_runner_->PostTask( |
| FROM_HERE, |
| base::BindOnce(&VtpmService::RunResponseCallback, base::Unretained(this), |
| std::move(response), send_command_response)); |
| } |
| |
| CommandResponseCallback VtpmService::MakeCallingThreadCallback( |
| std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<SendCommandResponse>> |
| response) { |
| return base::BindOnce(&VtpmService::PostResponseCallback, |
| base::Unretained(this), std::move(response)); |
| } |
| |
| } // namespace vtpm |