1*1a96fba6SXin Li // Copyright 2014 The Chromium OS Authors. All rights reserved.
2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be
3*1a96fba6SXin Li // found in the LICENSE file.
4*1a96fba6SXin Li
5*1a96fba6SXin Li #include <brillo/daemons/dbus_daemon.h>
6*1a96fba6SXin Li
7*1a96fba6SXin Li #include <sysexits.h>
8*1a96fba6SXin Li
9*1a96fba6SXin Li #include <base/bind.h>
10*1a96fba6SXin Li #include <brillo/dbus/async_event_sequencer.h>
11*1a96fba6SXin Li #include <brillo/dbus/exported_object_manager.h>
12*1a96fba6SXin Li
13*1a96fba6SXin Li using brillo::dbus_utils::AsyncEventSequencer;
14*1a96fba6SXin Li using brillo::dbus_utils::ExportedObjectManager;
15*1a96fba6SXin Li
16*1a96fba6SXin Li namespace brillo {
17*1a96fba6SXin Li
DBusDaemon()18*1a96fba6SXin Li DBusDaemon::DBusDaemon() {
19*1a96fba6SXin Li }
20*1a96fba6SXin Li
OnInit()21*1a96fba6SXin Li int DBusDaemon::OnInit() {
22*1a96fba6SXin Li int exit_code = Daemon::OnInit();
23*1a96fba6SXin Li if (exit_code != EX_OK)
24*1a96fba6SXin Li return exit_code;
25*1a96fba6SXin Li
26*1a96fba6SXin Li bus_ = dbus_connection_.Connect();
27*1a96fba6SXin Li CHECK(bus_);
28*1a96fba6SXin Li
29*1a96fba6SXin Li return exit_code;
30*1a96fba6SXin Li }
31*1a96fba6SXin Li
DBusServiceDaemon(const std::string & service_name)32*1a96fba6SXin Li DBusServiceDaemon::DBusServiceDaemon(const std::string& service_name)
33*1a96fba6SXin Li : service_name_(service_name) {
34*1a96fba6SXin Li }
35*1a96fba6SXin Li
DBusServiceDaemon(const std::string & service_name,const dbus::ObjectPath & object_manager_path)36*1a96fba6SXin Li DBusServiceDaemon::DBusServiceDaemon(
37*1a96fba6SXin Li const std::string& service_name,
38*1a96fba6SXin Li const dbus::ObjectPath& object_manager_path)
39*1a96fba6SXin Li : service_name_(service_name), object_manager_path_(object_manager_path) {
40*1a96fba6SXin Li }
41*1a96fba6SXin Li
DBusServiceDaemon(const std::string & service_name,base::StringPiece object_manager_path)42*1a96fba6SXin Li DBusServiceDaemon::DBusServiceDaemon(const std::string& service_name,
43*1a96fba6SXin Li base::StringPiece object_manager_path)
44*1a96fba6SXin Li : DBusServiceDaemon(service_name,
45*1a96fba6SXin Li dbus::ObjectPath(object_manager_path.as_string())) {
46*1a96fba6SXin Li }
47*1a96fba6SXin Li
OnInit()48*1a96fba6SXin Li int DBusServiceDaemon::OnInit() {
49*1a96fba6SXin Li int exit_code = DBusDaemon::OnInit();
50*1a96fba6SXin Li if (exit_code != EX_OK)
51*1a96fba6SXin Li return exit_code;
52*1a96fba6SXin Li
53*1a96fba6SXin Li scoped_refptr<AsyncEventSequencer> sequencer(new AsyncEventSequencer());
54*1a96fba6SXin Li if (object_manager_path_.IsValid()) {
55*1a96fba6SXin Li object_manager_.reset(
56*1a96fba6SXin Li new ExportedObjectManager(bus_, object_manager_path_));
57*1a96fba6SXin Li object_manager_->RegisterAsync(
58*1a96fba6SXin Li sequencer->GetHandler("ObjectManager.RegisterAsync() failed.", true));
59*1a96fba6SXin Li }
60*1a96fba6SXin Li RegisterDBusObjectsAsync(sequencer.get());
61*1a96fba6SXin Li sequencer->OnAllTasksCompletedCall({
62*1a96fba6SXin Li base::Bind(&DBusServiceDaemon::TakeServiceOwnership,
63*1a96fba6SXin Li base::Unretained(this))
64*1a96fba6SXin Li });
65*1a96fba6SXin Li return EX_OK;
66*1a96fba6SXin Li }
67*1a96fba6SXin Li
RegisterDBusObjectsAsync(dbus_utils::AsyncEventSequencer *)68*1a96fba6SXin Li void DBusServiceDaemon::RegisterDBusObjectsAsync(
69*1a96fba6SXin Li dbus_utils::AsyncEventSequencer* /* sequencer */) {
70*1a96fba6SXin Li // Do nothing here.
71*1a96fba6SXin Li // Overload this method to export custom D-Bus objects at daemon startup.
72*1a96fba6SXin Li }
73*1a96fba6SXin Li
TakeServiceOwnership(bool success)74*1a96fba6SXin Li void DBusServiceDaemon::TakeServiceOwnership(bool success) {
75*1a96fba6SXin Li // Success should always be true since we've said that failures are fatal.
76*1a96fba6SXin Li CHECK(success) << "Init of one or more objects has failed.";
77*1a96fba6SXin Li CHECK(bus_->RequestOwnershipAndBlock(service_name_,
78*1a96fba6SXin Li dbus::Bus::REQUIRE_PRIMARY))
79*1a96fba6SXin Li << "Unable to take ownership of " << service_name_;
80*1a96fba6SXin Li }
81*1a96fba6SXin Li
82*1a96fba6SXin Li } // namespace brillo
83