diff options
Diffstat (limited to 'brillo/daemons/dbus_daemon.cc')
-rw-r--r-- | brillo/daemons/dbus_daemon.cc | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/brillo/daemons/dbus_daemon.cc b/brillo/daemons/dbus_daemon.cc new file mode 100644 index 0000000..ebbfd94 --- /dev/null +++ b/brillo/daemons/dbus_daemon.cc @@ -0,0 +1,90 @@ +// 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 <brillo/daemons/dbus_daemon.h> + +#include <sysexits.h> + +#include <base/bind.h> +#include <brillo/dbus/async_event_sequencer.h> +#include <brillo/dbus/exported_object_manager.h> + +using brillo::dbus_utils::AsyncEventSequencer; +using brillo::dbus_utils::ExportedObjectManager; + +namespace brillo { + +DBusDaemon::DBusDaemon() { +} + +DBusDaemon::~DBusDaemon() { + if (bus_) + bus_->ShutdownAndBlock(); +} + +int DBusDaemon::OnInit() { + int exit_code = Daemon::OnInit(); + if (exit_code != EX_OK) + return exit_code; + + dbus::Bus::Options options; + options.bus_type = dbus::Bus::SYSTEM; + + bus_ = new dbus::Bus(options); + CHECK(bus_->Connect()); + + return exit_code; +} + +DBusServiceDaemon::DBusServiceDaemon(const std::string& service_name) + : service_name_(service_name) { +} + +DBusServiceDaemon::DBusServiceDaemon( + const std::string& service_name, + const dbus::ObjectPath& object_manager_path) + : service_name_(service_name), object_manager_path_(object_manager_path) { +} + +DBusServiceDaemon::DBusServiceDaemon(const std::string& service_name, + base::StringPiece object_manager_path) + : DBusServiceDaemon(service_name, + dbus::ObjectPath(object_manager_path.as_string())) { +} + +int DBusServiceDaemon::OnInit() { + int exit_code = DBusDaemon::OnInit(); + if (exit_code != EX_OK) + return exit_code; + + scoped_refptr<AsyncEventSequencer> sequencer(new AsyncEventSequencer()); + if (object_manager_path_.IsValid()) { + object_manager_.reset( + new ExportedObjectManager(bus_, object_manager_path_)); + object_manager_->RegisterAsync( + sequencer->GetHandler("ObjectManager.RegisterAsync() failed.", true)); + } + RegisterDBusObjectsAsync(sequencer.get()); + sequencer->OnAllTasksCompletedCall({ + base::Bind(&DBusServiceDaemon::TakeServiceOwnership, + base::Unretained(this)) + }); + return EX_OK; +} + +void DBusServiceDaemon::RegisterDBusObjectsAsync( + dbus_utils::AsyncEventSequencer* sequencer) { + // Do nothing here. + // Overload this method to export custom D-Bus objects at daemon startup. +} + +void DBusServiceDaemon::TakeServiceOwnership(bool success) { + // Success should always be true since we've said that failures are fatal. + CHECK(success) << "Init of one or more objects has failed."; + CHECK(bus_->RequestOwnershipAndBlock(service_name_, + dbus::Bus::REQUIRE_PRIMARY)) + << "Unable to take ownership of " << service_name_; +} + +} // namespace brillo |