// 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);
  virtual void EmitStringmapsChanged(const std::string &name,
                                     const Stringmaps &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_
