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