// 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