// Copyright 2018 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_DBUS_DEVICE_DBUS_ADAPTOR_H_
#define SHILL_DBUS_DEVICE_DBUS_ADAPTOR_H_

#include <string>
#include <vector>

#include <base/macros.h>

#include "dbus_bindings/org.chromium.flimflam.Device.h"
#include "shill/adaptor_interfaces.h"
#include "shill/dbus/dbus_adaptor.h"

namespace shill {

class Device;

// 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::DeviceAdaptor,
                          public org::chromium::flimflam::DeviceInterface,
                          public DBusAdaptor,
                          public DeviceAdaptorInterface {
 public:
  static const char kPath[];

  DeviceDBusAdaptor(const scoped_refptr<dbus::Bus>& bus, Device* device);
  ~DeviceDBusAdaptor() override;

  // Implementation of DeviceAdaptorInterface.
  const RpcIdentifier& GetRpcIdentifier() const override;
  void EmitBoolChanged(const std::string& name, bool value) override;
  void EmitUintChanged(const std::string& name, uint32_t value) override;
  void EmitUint16Changed(const std::string& name, uint16_t value) override;
  void EmitIntChanged(const std::string& name, int value) override;
  void EmitStringChanged(const std::string& name,
                         const std::string& value) override;
  void EmitStringmapChanged(const std::string& name,
                            const Stringmap& value) override;
  void EmitStringmapsChanged(const std::string& name,
                             const Stringmaps& value) override;
  void EmitStringsChanged(const std::string& name,
                          const Strings& value) override;
  void EmitKeyValueStoreChanged(const std::string& name,
                                const KeyValueStore& value) override;
  void EmitRpcIdentifierChanged(const std::string& name,
                                const RpcIdentifier& value) override;
  void EmitRpcIdentifierArrayChanged(const std::string& name,
                                     const RpcIdentifiers& value) override;

  // Implementation of DeviceAdaptor.
  bool GetProperties(brillo::ErrorPtr* error,
                     brillo::VariantDictionary* out_properties) override;
  bool SetProperty(brillo::ErrorPtr* error,
                   const std::string& name,
                   const brillo::Any& value) override;
  bool ClearProperty(brillo::ErrorPtr* error, const std::string& name) override;
  void Enable(DBusMethodResponsePtr<> response) override;
  void Disable(DBusMethodResponsePtr<> response) override;
  void Register(DBusMethodResponsePtr<> response,
                const std::string& network_id) override;
  void RequirePin(DBusMethodResponsePtr<> response,
                  const std::string& pin,
                  bool require) override;
  void EnterPin(DBusMethodResponsePtr<> response,
                const std::string& pin) override;
  void UnblockPin(DBusMethodResponsePtr<> response,
                  const std::string& unblock_code,
                  const std::string& pin) override;
  void ChangePin(DBusMethodResponsePtr<> response,
                 const std::string& old_pin,
                 const std::string& new_pin) override;
  bool PerformTDLSOperation(brillo::ErrorPtr* error,
                            const std::string& operation,
                            const std::string& peer,
                            std::string* out_state) override;
  bool RenewDHCPLease(brillo::ErrorPtr* error) override;
  void Reset(DBusMethodResponsePtr<> response) override;
  bool ResetByteCounters(brillo::ErrorPtr* error) override;
  bool RequestRoam(brillo::ErrorPtr* error, const std::string& addr) override;
  bool AddWakeOnPacketConnection(brillo::ErrorPtr* error,
                                 const std::string& ip_endpoint) override;
  bool AddWakeOnPacketOfTypes(
      brillo::ErrorPtr* error,
      const std::vector<std::string>& packet_types) override;

  bool RemoveWakeOnPacketConnection(brillo::ErrorPtr* error,
                                    const std::string& ip_endpoint) override;
  bool RemoveWakeOnPacketOfTypes(
      brillo::ErrorPtr* error,
      const std::vector<std::string>& packet_types) override;

  bool RemoveAllWakeOnPacketConnections(brillo::ErrorPtr* error) override;

  void SetUsbEthernetMacAddressSource(DBusMethodResponsePtr<> response,
                                      const std::string& source) override;

  Device* device() const { return device_; }

 private:
  Device* device_;

  DISALLOW_COPY_AND_ASSIGN(DeviceDBusAdaptor);
};

}  // namespace shill

#endif  // SHILL_DBUS_DEVICE_DBUS_ADAPTOR_H_
