| // 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. |
| |
| #ifndef VTPM_VTPM_SERVICE_H_ |
| #define VTPM_VTPM_SERVICE_H_ |
| |
| #include <memory> |
| #include <string> |
| |
| #include <base/memory/ref_counted.h> |
| #include <base/memory/weak_ptr.h> |
| #include <base/threading/thread_task_runner_handle.h> |
| #include <brillo/dbus/dbus_method_response.h> |
| #include <brillo/dbus/dbus_object.h> |
| #include <trunks/trunks_factory.h> |
| |
| #include "vtpm/commands/command.h" |
| #include "vtpm/dbus_interface.h" |
| #include "vtpm/vtpm_interface.pb.h" |
| |
| // Requires `vtpm/vtpm_interface.pb.h` |
| #include "vtpm/dbus_adaptors/org.chromium.Vtpm.h" |
| |
| namespace vtpm { |
| |
| class VtpmService : public org::chromium::VtpmInterface { |
| public: |
| // Creates an instance. The command execution is delegated to `command`. |
| explicit VtpmService(Command* command); |
| VtpmService(const VtpmService&) = delete; |
| VtpmService& operator=(const VtpmService&) = delete; |
| |
| ~VtpmService() override = default; |
| |
| // org::chromium::VtpmInterface overrides. |
| void SendCommand( |
| std::unique_ptr< |
| brillo::dbus_utils::DBusMethodResponse<SendCommandResponse>> response, |
| const SendCommandRequest& request) override; |
| |
| private: |
| // Simply make `response` returns `send_commnad_response` put in a |
| // `SendCommandResponse`. This helper is made so it can converts a callback |
| // that is cancelled automatically once `this` is destroyed`. |
| void RunResponseCallback( |
| std::unique_ptr< |
| brillo::dbus_utils::DBusMethodResponse<SendCommandResponse>> response, |
| const std::string& send_command_response); |
| // Posts `RunResponseCallback` to the D-Bus calling thread. The `PostTask()` |
| // operation regardless where it is called, even if it's already on the D-Bus |
| // calling thread. |
| void PostResponseCallback( |
| std::unique_ptr< |
| brillo::dbus_utils::DBusMethodResponse<SendCommandResponse>> response, |
| const std::string& send_command_response); |
| // Wraps `PostResponseCallback()` into `CommandResponseCallback` type, which |
| // `command_` can call directly. |
| CommandResponseCallback MakeCallingThreadCallback( |
| std::unique_ptr< |
| brillo::dbus_utils::DBusMethodResponse<SendCommandResponse>> |
| response); |
| |
| scoped_refptr<base::TaskRunner> origin_task_runner_ = |
| base::ThreadTaskRunnerHandle::Get(); |
| |
| // the delegate of the TPM command execution. |
| Command* const command_; |
| |
| // Declared last so any weak pointers are destroyed first. |
| base::WeakPtrFactory<VtpmService> weak_factory_{this}; |
| }; |
| |
| class VtpmServiceAdaptor : public org::chromium::VtpmAdaptor { |
| public: |
| explicit VtpmServiceAdaptor(org::chromium::VtpmInterface* vtpm_interface, |
| scoped_refptr<dbus::Bus> bus) |
| : org::chromium::VtpmAdaptor(vtpm_interface), |
| dbus_object_(nullptr, bus, dbus::ObjectPath(kVtpmServicePath)) {} |
| VtpmServiceAdaptor(const VtpmServiceAdaptor&) = delete; |
| VtpmServiceAdaptor& operator=(const VtpmServiceAdaptor&) = delete; |
| |
| void RegisterAsync( |
| const brillo::dbus_utils::AsyncEventSequencer::CompletionAction& cb) { |
| RegisterWithDBusObject(&dbus_object_); |
| dbus_object_.RegisterAsync(cb); |
| } |
| |
| private: |
| brillo::dbus_utils::DBusObject dbus_object_; |
| }; |
| |
| } // namespace vtpm |
| |
| #endif // VTPM_VTPM_SERVICE_H_ |