// 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(const DeviceDBusAdaptor&) = delete;
  DeviceDBusAdaptor& operator=(const DeviceDBusAdaptor&) = delete;

  ~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_;
};

}  // namespace shill

#endif  // SHILL_DBUS_DEVICE_DBUS_ADAPTOR_H_
