xref: /aosp_15_r20/external/libbrillo/brillo/daemons/dbus_daemon.cc (revision 1a96fba65179ea7d3f56207137718607415c5953)
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