// Copyright (c) 2011 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 SHILL_DEVICE_DBUS_ADAPTOR_H_
#define SHILL_DEVICE_DBUS_ADAPTOR_H_

#include <map>
#include <string>

#include <base/basictypes.h>

#include "shill/adaptor_interfaces.h"
#include "shill/dbus_adaptor.h"
#include "shill/dbus_bindings/flimflam-device.h"

namespace shill {

class Device;

// Subclass of DBusAdaptor for Device objects
// There is a 1:1 mapping between Device and DeviceDBusAdaptor instances.
// Furthermore, the Device owns the DeviceDBusAdaptor and manages its lifetime,
// so we're OK with DeviceDBusAdaptor having a bare pointer to its owner device.
class DeviceDBusAdaptor : public org::chromium::flimflam::Device_adaptor,
                          public DBusAdaptor,
                          public DeviceAdaptorInterface {
 public:
  static const char kInterfaceName[];
  static const char kPath[];

  DeviceDBusAdaptor(DBus::Connection* conn, Device *device);
  virtual ~DeviceDBusAdaptor();

  // Implementation of DeviceAdaptorInterface.
  virtual const std::string &GetRpcIdentifier();
  virtual const std::string &GetRpcConnectionIdentifier();
  virtual void UpdateEnabled();
  virtual void EmitBoolChanged(const std::string& name, bool value);
  virtual void EmitUintChanged(const std::string& name, uint32 value);
  virtual void EmitIntChanged(const std::string& name, int value);
  virtual void EmitStringChanged(const std::string& name,
                                 const std::string& value);

  // Implementation of Device_adaptor.
  virtual std::map<std::string, ::DBus::Variant> GetProperties(
      ::DBus::Error &error);
  virtual void SetProperty(const std::string& name,
                           const ::DBus::Variant& value,
                           ::DBus::Error &error);
  virtual void ClearProperty(const std::string& , ::DBus::Error &error);
  virtual void ProposeScan(::DBus::Error &error);
  virtual ::DBus::Path AddIPConfig(const std::string& , ::DBus::Error &error);
  virtual void Register(const std::string &network_id, ::DBus::Error &error);
  virtual void RequirePin(const std::string &pin,
                          const bool &require,
                          ::DBus::Error &error);
  virtual void EnterPin(const std::string &pin, ::DBus::Error &error);
  virtual void UnblockPin(const std::string &unblock_code,
                          const std::string &pin,
                          ::DBus::Error &error);
  virtual void ChangePin(const std::string &old_pin,
                         const std::string &new_pin,
                         ::DBus::Error &error);

 private:
  Device *device_;
  const std::string connection_name_;
  DISALLOW_COPY_AND_ASSIGN(DeviceDBusAdaptor);
};

}  // namespace shill
#endif  // SHILL_DEVICE_DBUS_ADAPTOR_H_
