| // Copyright 2016 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/dbus/dbus_connection.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 { |
| |
| DBusConnection::DBusConnection() { |
| } |
| |
| DBusConnection::~DBusConnection() { |
| if (bus_) |
| bus_->ShutdownAndBlock(); |
| } |
| |
| scoped_refptr<dbus::Bus> DBusConnection::Connect() { |
| return ConnectWithTimeout(base::TimeDelta()); |
| } |
| |
| scoped_refptr<dbus::Bus> DBusConnection::ConnectWithTimeout( |
| base::TimeDelta timeout) { |
| if (bus_) |
| return bus_; |
| |
| base::TimeTicks deadline = base::TimeTicks::Now() + timeout; |
| |
| dbus::Bus::Options options; |
| options.bus_type = dbus::Bus::SYSTEM; |
| |
| scoped_refptr<dbus::Bus> bus = new dbus::Bus(options); |
| |
| do { |
| if (bus->Connect()) { |
| bus_ = bus; |
| return bus_; |
| } |
| LOG(WARNING) << "Failed to get system bus."; |
| // Wait 1 second to prevent trashing the device while waiting for the |
| // dbus-daemon to start. |
| sleep(1); |
| } while (base::TimeTicks::Now() < deadline); |
| |
| LOG(ERROR) << "Failed to get system bus after " << timeout.InSeconds() |
| << " seconds."; |
| return nullptr; |
| } |
| |
| } // namespace brillo |