1//
2// Copyright (C) 2014 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#include "trunks/trunks_dbus_service.h"
18
19#include <base/bind.h>
20#include <brillo/bind_lambda.h>
21
22#include "trunks/dbus_interface.h"
23#include "trunks/error_codes.h"
24#include "trunks/interface.pb.h"
25
26namespace trunks {
27
28using brillo::dbus_utils::AsyncEventSequencer;
29using brillo::dbus_utils::DBusMethodResponse;
30
31TrunksDBusService::TrunksDBusService()
32    : brillo::DBusServiceDaemon(trunks::kTrunksServiceName) {}
33
34void TrunksDBusService::RegisterDBusObjectsAsync(
35    AsyncEventSequencer* sequencer) {
36  trunks_dbus_object_.reset(new brillo::dbus_utils::DBusObject(
37      nullptr, bus_, dbus::ObjectPath(kTrunksServicePath)));
38  brillo::dbus_utils::DBusInterface* dbus_interface =
39      trunks_dbus_object_->AddOrGetInterface(kTrunksInterface);
40  dbus_interface->AddMethodHandler(kSendCommand, base::Unretained(this),
41                                   &TrunksDBusService::HandleSendCommand);
42  trunks_dbus_object_->RegisterAsync(
43      sequencer->GetHandler("Failed to register D-Bus object.", true));
44}
45
46void TrunksDBusService::HandleSendCommand(
47    std::unique_ptr<DBusMethodResponse<const SendCommandResponse&>>
48        response_sender,
49    const SendCommandRequest& request) {
50  // Convert |response_sender| to a shared_ptr so |transceiver_| can safely
51  // copy the callback.
52  using SharedResponsePointer =
53      std::shared_ptr<DBusMethodResponse<const SendCommandResponse&>>;
54  // A callback that constructs the response protobuf and sends it.
55  auto callback = [](const SharedResponsePointer& response,
56                     const std::string& response_from_tpm) {
57    SendCommandResponse tpm_response_proto;
58    tpm_response_proto.set_response(response_from_tpm);
59    response->Return(tpm_response_proto);
60  };
61  if (!request.has_command() || request.command().empty()) {
62    LOG(ERROR) << "TrunksDBusService: Invalid request.";
63    callback(SharedResponsePointer(std::move(response_sender)),
64             CreateErrorResponse(SAPI_RC_BAD_PARAMETER));
65    return;
66  }
67  transceiver_->SendCommand(
68      request.command(),
69      base::Bind(callback, SharedResponsePointer(std::move(response_sender))));
70}
71
72}  // namespace trunks
73