// Copyright 2017 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.
//
// This file implements DBus functionality.
// Because hammerd is not a daemon, it can only send signals to other
// processes or call methods provided by others.

#ifndef HAMMERD_DBUS_WRAPPER_H_
#define HAMMERD_DBUS_WRAPPER_H_

#include <memory>
#include <string>

#include <base/memory/ptr_util.h>
#include <base/memory/ref_counted.h>
#include <dbus/bus.h>
#include <dbus/exported_object.h>
#include <dbus/message.h>

namespace hammerd {

class DBusWrapperInterface {
 public:
  virtual ~DBusWrapperInterface() = default;

  // Send a signal without argument.
  virtual void SendSignal(const std::string& signal_name) = 0;
  // Send a signal with a binary-blob argument.
  // Currently we only have one signal with a binary-blob argument. If we need
  // other kind of arguments in the future, then switch to protobuf.
  virtual void SendSignalWithArg(const std::string& signal_name,
                                 const uint8_t* values,
                                 size_t length) = 0;
};

class DBusWrapper : public DBusWrapperInterface {
 public:
  DBusWrapper();
  DBusWrapper(const DBusWrapper&) = delete;
  DBusWrapper& operator=(const DBusWrapper&) = delete;

  virtual ~DBusWrapper() = default;

  void SendSignal(const std::string& signal_name) override;
  void SendSignalWithArg(const std::string& signal_name,
                         const uint8_t* values,
                         size_t length) override;

 protected:
  scoped_refptr<dbus::Bus> bus_;
  dbus::ExportedObject* exported_object_;
};

// The dummy class used in hammerd API.
class DummyDBusWrapper : public DBusWrapperInterface {
 public:
  DummyDBusWrapper() {}
  DummyDBusWrapper(const DummyDBusWrapper&) = delete;
  DummyDBusWrapper& operator=(const DummyDBusWrapper&) = delete;

  virtual ~DummyDBusWrapper() = default;

  void SendSignal(const std::string& signal_name) override {
    SendSignalWithArg(signal_name, NULL, 0);
  }
  void SendSignalWithArg(const std::string& signal_name,
                         const uint8_t* values,
                         size_t length) override {
    last_signal_name_ = std::string(signal_name);
    if (values == NULL)
      last_value_ = "";
    else
      last_value_ = std::string(reinterpret_cast<const char*>(values), length);
  }

  std::string GetLastSignalName() { return last_signal_name_; }
  std::string GetLastValue() { return last_value_; }

 private:
  // Record the last signal that was "sent"
  std::string last_signal_name_;
  std::string last_value_;
};

}  // namespace hammerd
#endif  // HAMMERD_DBUS_WRAPPER_H_
