// Copyright (c) 2012 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 "wimax_manager/dbus_control.h"

#include <dbus-c++/dbus.h>
#include <dbus-c++/glib-integration.h>

#include <chromeos/dbus/service_constants.h>

namespace wimax_manager {

namespace {

base::LazyInstance<DBusControl> g_dbus_control = LAZY_INSTANCE_INITIALIZER;

}  // namespace

DBusControl::DBusControl() {
  Initialize();
}

DBusControl::~DBusControl() {
  Finalize();
}

// static
DBusControl *DBusControl::GetInstance() {
  return g_dbus_control.Pointer();
}

// static
DBus::Connection *DBusControl::GetConnection() {
  return GetInstance()->connection_.get();
}

void DBusControl::Initialize() {
  bus_dispatcher_.reset(new(std::nothrow) DBus::Glib::BusDispatcher());
  CHECK(bus_dispatcher_.get());
  DBus::default_dispatcher = bus_dispatcher_.get();
  bus_dispatcher_->attach(nullptr);

  connection_.reset(
      new(std::nothrow) DBus::Connection(DBus::Connection::SystemBus()));
  CHECK(connection_.get());
  CHECK(connection_->acquire_name(kWiMaxManagerServiceName))
      << "Failed to acquire D-Bus name " << kWiMaxManagerServiceName;
}

void DBusControl::Finalize() {
  connection_.reset();
  DBus::default_dispatcher = nullptr;
  bus_dispatcher_.reset();
}

}  // namespace wimax_manager
