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

#ifndef WIMAX_MANAGER_DEVICE_DBUS_ADAPTOR_H_
#define WIMAX_MANAGER_DEVICE_DBUS_ADAPTOR_H_

#include <map>
#include <string>

#include <base/macros.h>

#include "wimax_manager/dbus_adaptor.h"
#include "wimax_manager/dbus_adaptors/org.chromium.WiMaxManager.Device.h"
#include "wimax_manager/network.h"

namespace wimax_manager {

class Device;

class DeviceDBusAdaptor : public org::chromium::WiMaxManager::Device_adaptor,
                          public DBusAdaptor {
 public:
  DeviceDBusAdaptor(DBus::Connection* connection, Device* device);
  virtual ~DeviceDBusAdaptor() = default;

  static std::string GetDeviceObjectPath(const Device& device);

  virtual void Enable(DBus::Error& error);        // NOLINT
  virtual void Disable(DBus::Error& error);       // NOLINT
  virtual void ScanNetworks(DBus::Error& error);  // NOLINT
  virtual void Connect(const DBus::Path& network_object_path,
                       const std::map<std::string, DBus::Variant>& parameters,
                       DBus::Error& error);     // NOLINT
  virtual void Disconnect(DBus::Error& error);  // NOLINT

  void UpdateMACAddress();
  void UpdateNetworks();
  void UpdateRFInfo();
  void UpdateStatus();

 private:
  NetworkRefPtr FindNetworkByDBusObjectPath(
      const DBus::Path& network_object_path) const;

  // Overrides PropertiesAdaptor::on_set_property to handle
  // org.freedesktop.DBus.Properties.Set calls.
  virtual void on_set_property(DBus::InterfaceAdaptor& interface,  // NOLINT
                               const std::string& property,
                               const DBus::Variant& value);

  Device* device_;

  DISALLOW_COPY_AND_ASSIGN(DeviceDBusAdaptor);
};

}  // namespace wimax_manager

#endif  // WIMAX_MANAGER_DEVICE_DBUS_ADAPTOR_H_
