// 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 CECSERVICE_UDEV_H_
#define CECSERVICE_UDEV_H_

#include <libudev.h>

#include <memory>
#include <vector>

#include <base/callback.h>
#include <base/files/file_path.h>
#include <base/macros.h>
#include <base/memory/weak_ptr.h>
#include <brillo/message_loops/message_loop.h>

namespace cecservice {

// Simple wrapper around libudev.
class Udev {
 public:
  using DeviceCallback = base::Callback<void(const base::FilePath&)>;

  virtual ~Udev() = default;

  // Enumerates /dev/cec* nodes, returns false if the enumeration failed.
  virtual bool EnumerateDevices(
      std::vector<base::FilePath>* devices_out) const = 0;
};

// Actual implementation of udev wrapper.
class UdevImpl : public Udev {
 public:
  UdevImpl();
  ~UdevImpl() override;

  // Initializes the object, configuring provided callbacks. False return value
  // indicates that the object's initialization failed and the object is
  // unusable.
  bool Init(const DeviceCallback& device_added_callback,
            const DeviceCallback& device_removed_callback);

  // Udev:
  bool EnumerateDevices(
      std::vector<base::FilePath>* devices_out) const override;

 private:
  struct UdevDeleter {
    void operator()(udev* udev) const;
  };

  struct UdevMonitorDeleter {
    void operator()(udev_monitor*) const;
  };

  // Callback receiving events from udev.
  void OnDeviceAction();

  DeviceCallback device_added_callback_;
  DeviceCallback device_removed_callback_;

  std::unique_ptr<udev, UdevDeleter> udev_;
  std::unique_ptr<udev_monitor, UdevMonitorDeleter> monitor_;

  brillo::MessageLoop::TaskId taskid_;

  base::WeakPtrFactory<UdevImpl> weak_factory_{this};

  DISALLOW_COPY_AND_ASSIGN(UdevImpl);
};

// Factory for udev object.
class UdevFactory {
 public:
  virtual ~UdevFactory();

  // Creates an Udev object. Provided callbacks are invoked whenever a CEC
  // device is added/removed.
  virtual std::unique_ptr<Udev> Create(
      const Udev::DeviceCallback& device_added_callback,
      const Udev::DeviceCallback& device_removed_callback) const = 0;
};

// Factory for udev object.
class UdevFactoryImpl : public UdevFactory {
 public:
  UdevFactoryImpl();
  ~UdevFactoryImpl() override;

  // Udev:
  std::unique_ptr<Udev> Create(
      const Udev::DeviceCallback& device_added_callback,
      const Udev::DeviceCallback& device_removed_callback) const override;

  DISALLOW_COPY_AND_ASSIGN(UdevFactoryImpl);
};

}  // namespace cecservice

#endif  // CECSERVICE_UDEV_H_
