// Copyright (c) 2014 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 LOGIN_MANAGER_DBUS_SIGNAL_EMITTER_H_
#define LOGIN_MANAGER_DBUS_SIGNAL_EMITTER_H_

#include <string>
#include <vector>

#include <base/compiler_specific.h>
#include <base/macros.h>

namespace dbus {
class ExportedObject;
}

namespace login_manager {

// Simple mockable interface for emitting DBus signals.
class DBusSignalEmitterInterface {
 public:
  // Strings for encoding boolean status in signals.
  static const char kSignalSuccess[];
  static const char kSignalFailure[];

  virtual ~DBusSignalEmitterInterface();

  // Broadcasts |signal_name| from the session manager DBus interface.
  virtual void EmitSignal(const std::string& signal_name) = 0;

  // Broadcasts |signal_name| from the session manager DBus interface,
  // with kSignalSuccess if |success| is true, kSignalFailure otherwise.
  virtual void EmitSignalWithSuccessFailure(const std::string& signal_name,
                                            const bool success) = 0;

  // Broadcasts |signal_name| from the session manager DBus interface,
  // optionally adding |payload| as args if it is not empty.
  virtual void EmitSignalWithString(const std::string& signal_name,
                                    const std::string& payload) = 0;
};

// Simple mockable interface for emitting DBus signals.
class DBusSignalEmitter : public DBusSignalEmitterInterface {
 public:
  DBusSignalEmitter(dbus::ExportedObject* object, const std::string& interface);
  virtual ~DBusSignalEmitter();

  void EmitSignal(const std::string& signal_name) override;
  void EmitSignalWithSuccessFailure(const std::string& signal_name,
                                    const bool success) override;
  void EmitSignalWithString(const std::string& signal_name,
                            const std::string& payload) override;

 private:
  dbus::ExportedObject* object_;  // Weak, owned by caller.
  const std::string interface_;
  DISALLOW_COPY_AND_ASSIGN(DBusSignalEmitter);
};

}  // namespace login_manager

#endif  // LOGIN_MANAGER_DBUS_SIGNAL_EMITTER_H_
