/*
 * Copyright 2020 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 CAMERA_HAL_USB_CAMERA_PRIVACY_SWITCH_MONITOR_H_
#define CAMERA_HAL_USB_CAMERA_PRIVACY_SWITCH_MONITOR_H_

#include <memory>
#include <string>
#include <vector>

#include <base/callback.h>
#include <base/containers/flat_map.h>
#include <base/files/scoped_file.h>
#include <base/synchronization/lock.h>
#include <base/threading/thread.h>

#include "cros-camera/cros_camera_hal.h"

namespace cros {

// CameraPrivacySwitchMonitor is a monitor for the status change of camera
// privacy switch.
class CameraPrivacySwitchMonitor final {
 public:
  CameraPrivacySwitchMonitor();
  CameraPrivacySwitchMonitor(const CameraPrivacySwitchMonitor&) = delete;
  CameraPrivacySwitchMonitor& operator=(const CameraPrivacySwitchMonitor&) =
      delete;
  ~CameraPrivacySwitchMonitor();

  void RegisterCallback(PrivacySwitchStateChangeCallback callback);

  // Try to activate the event loop to subscribe the privacy event if it hasn't
  // been started by given |camera_id| and its corresponding |device_path|.
  void TrySubscribe(int camera_id, const std::string& device_path);

  // Remove the |camera_id| from the subscription list.
  void Unsubscribe(int camera_id);

 private:
  void OnStatusChanged(int camera_id, PrivacySwitchState state);

  // Subscribe the camera privacy switch status changed as privacy v4l2-event
  // with given |camera_id| and |device_fd|.
  void SubscribeEvent(int camera_id, base::ScopedFD device_fd);

  // Unsubscribe the camera privacy switch status changed as privacy v4l2-event.
  void UnsubscribeEvents();

  // Keep dequeuing the v4l2-events from device.
  void RunDequeueEventsLoop();

  // Triggers the event thread to restart the loop.
  void RestartEventLoop();

  PrivacySwitchState state_;

  PrivacySwitchStateChangeCallback callback_;

  // The thread for dequeing v4l2-events.
  base::Thread event_thread_;

  base::Lock camera_id_lock_;
  // The map for subscribed camera ids and their file descriptors.
  base::flat_map<int, base::ScopedFD> subscribed_camera_id_to_fd_
      GUARDED_BY(camera_id_lock_);

  // The endpoint for writing of the pipe to control the event loop. Writing
  // things into the pipe can restart the event loop. Closing the pipe will stop
  // the event loop.
  base::ScopedFD control_pipe_;

  // The endpoint for reading of the pipe to control the event loop.
  base::ScopedFD control_fd_;
};

}  // namespace cros

#endif  // CAMERA_HAL_USB_CAMERA_PRIVACY_SWITCH_MONITOR_H_
