// 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 "attestation_service.h"

#include <string>

#include <base/bind.h>
#include <base/time/time.h>

#include "attestation/common/dbus_interface.pb.h"

namespace attestation {

namespace {

// Passes |method_call| to |handler| and passes the response to
// |response_sender|. If |handler| returns NULL, an empty response is created
// and sent.
static void HandleSynchronousDBusMethodCall(
    const DBusMethodCallHandler& handler,
    dbus::MethodCall* method_call,
    dbus::ExportedObject::ResponseSender response_sender) {
  ResponsePtr response = handler.Run(method_call);
  if (!response) {
    response = dbus::Response::FromMethodCall(method_call);
  }

  response_sender.Run(response.Pass());
}

} // namespace

AttestationService::AttestationService()
    : start_time_(base::Time()),
      bus_(nullptr),
      attestation_dbus_object_(nullptr) {}

AttestationService::~AttestationService() {}

void AttestationService::Init() {
  dbus::Bus::Options options;
  options.bus_type = dbus::Bus::SYSTEM;
  bus_ = new dbus::Bus(options);
  CHECK(bus_->Connect());

  attestation_dbus_object_ = bus_->GetExportedObject(
      dbus::ObjectPath(kAttestationServicePath));
  CHECK(attestation_dbus_object_);

  ExportDBusMethod(kStatsMethod,
                   base::Bind(&AttestationService::HandleStatsMethod,
                              base::Unretained(this)));

  CHECK(bus_->RequestOwnershipAndBlock(kAttestationServiceName,
                                       dbus::Bus::REQUIRE_PRIMARY))
      << "Unable to take ownership of " << kAttestationServiceName;

  start_time_ = base::Time::Now();
}

void AttestationService::ExportDBusMethod(
    const std::string& method_name,
    const DBusMethodCallHandler& handler) {
  CHECK(attestation_dbus_object_->ExportMethodAndBlock(
      kAttestationInterface, method_name,
      base::Bind(&HandleSynchronousDBusMethodCall, handler)));
}

ResponsePtr AttestationService::HandleStatsMethod(
    dbus::MethodCall* method_call) {
  LOG(INFO) << "Received call to stats method.";
  StatsResponse stats;
  stats.set_uptime((base::Time::Now() - start_time_).InSeconds());
  ResponsePtr response = dbus::Response::FromMethodCall(method_call);
  dbus::MessageWriter writer(response.get());
  writer.AppendProtoAsArrayOfBytes(stats);
  return response.Pass();
}

} // namespace attestation
