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