12a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo// Copyright 2016 The Chromium OS Authors. All rights reserved.
22a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo// Use of this source code is governed by a BSD-style license that can be
32a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo// found in the LICENSE file.
42a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
52a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo#include <brillo/dbus/dbus_connection.h>
62a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
72a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo#include <sysexits.h>
82a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
92a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo#include <base/bind.h>
102a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo#include <brillo/dbus/async_event_sequencer.h>
112a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo#include <brillo/dbus/exported_object_manager.h>
122a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
132a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymousing brillo::dbus_utils::AsyncEventSequencer;
142a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymousing brillo::dbus_utils::ExportedObjectManager;
152a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
162a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymonamespace brillo {
172a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
182a25190ea741023a3753e7f381a8a2b1465c43c1Alex DeymoDBusConnection::DBusConnection() {
192a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo}
202a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
212a25190ea741023a3753e7f381a8a2b1465c43c1Alex DeymoDBusConnection::~DBusConnection() {
222a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo  if (bus_)
232a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo    bus_->ShutdownAndBlock();
242a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo}
252a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
262a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymoscoped_refptr<dbus::Bus> DBusConnection::Connect() {
272a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo  return ConnectWithTimeout(base::TimeDelta());
282a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo}
292a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
302a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymoscoped_refptr<dbus::Bus> DBusConnection::ConnectWithTimeout(
312a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo    base::TimeDelta timeout) {
322a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo  if (bus_)
332a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo    return bus_;
342a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
352a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo  base::TimeTicks deadline = base::TimeTicks::Now() + timeout;
362a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
372a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo  dbus::Bus::Options options;
382a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo  options.bus_type = dbus::Bus::SYSTEM;
392a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
402a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo  scoped_refptr<dbus::Bus> bus = new dbus::Bus(options);
412a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
422a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo  do {
432a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo    if (bus->Connect()) {
442a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo      bus_ = bus;
452a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo      return bus_;
462a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo    }
472a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo    LOG(WARNING) << "Failed to get system bus.";
482a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo    // Wait 1 second to prevent trashing the device while waiting for the
492a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo    // dbus-daemon to start.
502a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo    sleep(1);
512a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo  } while (base::TimeTicks::Now() < deadline);
522a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
532a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo  LOG(ERROR) << "Failed to get system bus after " << timeout.InSeconds()
542a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo             << " seconds.";
552a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo  return nullptr;
562a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo}
572a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo
582a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo}  // namespace brillo
59