| // Copyright 2014 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 "trunks/trunks_service.h" |
| |
| #include <base/bind.h> |
| #include <base/logging.h> |
| #include <base/stl_util.h> |
| |
| #include "trunks/command_transceiver.h" |
| #include "trunks/dbus_interface.h" |
| #include "trunks/dbus_interface.pb.h" |
| #include "trunks/error_codes.h" |
| |
| namespace trunks { |
| |
| TrunksService::TrunksService(CommandTransceiver* transceiver) |
| : bus_(nullptr), |
| trunks_dbus_object_(nullptr), |
| transceiver_(transceiver), |
| weak_factory_(this) {} |
| |
| TrunksService::~TrunksService() {} |
| |
| void TrunksService::Init() { |
| InitDBusService(); |
| } |
| |
| void TrunksService::HandleSendCommand( |
| dbus::MethodCall* method_call, |
| dbus::ExportedObject::ResponseSender response_sender) { |
| scoped_ptr<dbus::Response> response( |
| dbus::Response::FromMethodCall(method_call)); |
| base::Callback<void(const std::string& response)> callback = |
| base::Bind(&TrunksService::OnResponse, |
| GetWeakPtr(), |
| response_sender, |
| base::Passed(&response)); |
| dbus::MessageReader reader(method_call); |
| SendCommandRequest tpm_command_proto; |
| if (!reader.PopArrayOfBytesAsProto(&tpm_command_proto) || |
| !tpm_command_proto.has_command() || |
| tpm_command_proto.command().empty()) { |
| LOG(ERROR) << "TrunksService: Invalid request."; |
| callback.Run(CreateErrorResponse(SAPI_RC_BAD_PARAMETER)); |
| return; |
| } |
| transceiver_->SendCommand(tpm_command_proto.command(), callback); |
| } |
| |
| void TrunksService::OnResponse( |
| dbus::ExportedObject::ResponseSender response_sender, |
| scoped_ptr<dbus::Response> dbus_response, |
| const std::string& response_from_tpm) { |
| SendCommandResponse tpm_response_proto; |
| tpm_response_proto.set_response(response_from_tpm); |
| dbus::MessageWriter writer(dbus_response.get()); |
| writer.AppendProtoAsArrayOfBytes(tpm_response_proto); |
| response_sender.Run(dbus_response.Pass()); |
| } |
| |
| void TrunksService::InitDBusService() { |
| dbus::Bus::Options options; |
| options.bus_type = dbus::Bus::SYSTEM; |
| bus_ = new dbus::Bus(options); |
| CHECK(bus_->Connect()); |
| |
| trunks_dbus_object_ = bus_->GetExportedObject( |
| dbus::ObjectPath(kTrunksServicePath)); |
| CHECK(trunks_dbus_object_); |
| |
| trunks_dbus_object_->ExportMethodAndBlock(kTrunksInterface, kSendCommand, |
| base::Bind(&TrunksService::HandleSendCommand, GetWeakPtr())); |
| |
| CHECK(bus_->RequestOwnershipAndBlock(kTrunksServiceName, |
| dbus::Bus::REQUIRE_PRIMARY)) |
| << "Unable to take ownership of " << kTrunksServiceName; |
| } |
| |
| } // namespace trunks |