/**
 * @file PathWatch.hpp
 * @brief Add watch for the object path for interfaces added/removed signal
 *
 * In general class users should include pathwatchimpl.hpp instead to avoid
 * link failures.
 */
#pragma once

#include "data_types.hpp"
#include "watch.hpp"

namespace phosphor
{
namespace dbus
{
namespace monitoring
{

class Callback;

/** @class PathWatch
 *  @brief Watch on object path for interfaceadded/interfaceremoved signals
 */
template <typename DBusInterfaceType>
class PathWatch : public Watch
{
  public:
    PathWatch() = delete;
    PathWatch(const PathWatch&) = delete;
    PathWatch(PathWatch&&) = default;
    PathWatch& operator=(const PathWatch&) = delete;
    PathWatch& operator=(PathWatch&&) = default;
    virtual ~PathWatch() = default;
    PathWatch(const std::string& path, Callback& callback) :
        Watch(), objectPath(path), cb(callback), alreadyRan(false)
    {
    }

    /** @brief Start the watch.
     *
     *  Watch start interface implementation for PathWatch.
     */
    void start() override;

    /** @brief Run the watch callback method.
     *
     *  Watch callback interface implementation for PathWatch.
     */
    void callback(Context ctx) override;

    /** @brief Run the watch callback method.
     *
     *  Watch callback interface implementation for PathWatch.
     */
    void callback(Context ctx, sdbusplus::message::message& msg) override;

  protected:
    /** @brief Path of the D-Bus object to watch for. */
    const std::string& objectPath;

    /** @brief Optional callback method. */
    Callback& cb;

    /** @brief The start method should only be invoked once. */
    bool alreadyRan;
};

} // namespace monitoring
} // namespace dbus
} // namespace phosphor
