blob: a8a76ccbeb4dfeb5b8cfabce19a8c1c16070c2a3 [file] [log] [blame]
// Copyright 2018 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 "diagnostics/wilco_dtc_supportd/dbus_service.h"
#include <string>
#include <base/location.h>
#include <base/logging.h>
#include <base/optional.h>
#include <brillo/errors/error_codes.h>
#include <dbus/dbus-protocol.h>
#include <dbus/object_path.h>
#include <dbus/wilco_dtc_supportd/dbus-constants.h>
#include "diagnostics/wilco_dtc_supportd/mojo_service_factory.h"
namespace diagnostics {
DBusService::DBusService(MojoServiceFactory* mojo_service_factory)
: mojo_service_factory_(mojo_service_factory) {
DCHECK(mojo_service_factory_);
}
DBusService::~DBusService() = default;
bool DBusService::BootstrapMojoConnection(brillo::ErrorPtr* error,
const base::ScopedFD& mojo_fd) {
VLOG(0) << "Received BootstrapMojoConnection D-Bus request";
const base::Optional<std::string> bootstrap_error =
mojo_service_factory_->BootstrapMojoConnection(mojo_fd);
if (bootstrap_error.has_value()) {
*error = brillo::Error::Create(FROM_HERE, brillo::errors::dbus::kDomain,
DBUS_ERROR_FAILED, bootstrap_error.value());
return false;
}
return true;
}
void DBusService::RegisterDBusObjectsAsync(
const scoped_refptr<dbus::Bus>& bus,
brillo::dbus_utils::AsyncEventSequencer* sequencer) {
DCHECK(bus);
DCHECK(!dbus_object_);
dbus_object_ = std::make_unique<brillo::dbus_utils::DBusObject>(
nullptr /* object_manager */, bus,
dbus::ObjectPath(kWilcoDtcSupportdServicePath));
brillo::dbus_utils::DBusInterface* dbus_interface =
dbus_object_->AddOrGetInterface(kWilcoDtcSupportdServiceInterface);
DCHECK(dbus_interface);
dbus_interface->AddSimpleMethodHandlerWithError(
kWilcoDtcSupportdBootstrapMojoConnectionMethod, base::Unretained(this),
&DBusService::BootstrapMojoConnection);
dbus_object_->RegisterAsync(sequencer->GetHandler(
"Failed to register D-Bus object" /* descriptive_message */,
true /* failure_is_fatal */));
}
void DBusService::ShutDown() {
dbus_object_.reset();
}
} // namespace diagnostics