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

#include <set>

#include <base/files/file_path.h>
#include <base/threading/thread_task_runner_handle.h>
#include <base/time/time.h>

namespace chaps {

// Blocks shutdown signal from powerd by creating a lock file for blocked slots
// in /run/lock/power_override.
class SystemShutdownBlocker {
 public:
  // |origin_thread_task_runner| should be chapsd's origin thread task runner.
  explicit SystemShutdownBlocker(
      const scoped_refptr<base::SingleThreadTaskRunner>&
          origin_thread_task_runner);

  // Unblocks all remaining blocked slots (see |blocked_slots_|).
  ~SystemShutdownBlocker();

  // Posts an immediate call to |PerformBlock()| and a delayed call to
  // |PerformUnblock()| on the |origin_thread_task_runner_|.
  void Block(int slot_id, base::TimeDelta fallback_timeout);

  // Posts an immediate call to |PerformUnblock()| on the
  // |origin_thread_task_runner_|.
  void Unblock(int slot_id);

 private:
  // Creates a lock file readable by powerd with chapsd's PID and marks the slot
  // as blocked in |blocked_slots|.
  void PerformBlock(int slot_id);

  // Calls |PerformUnblock()| and removes the block mark if the slot is marked
  // as blocked in |blocked_slots_|, otherwise no-op.
  void PerformUnblockIfBlocked(int slot_id);

  // Deletes the lock file and returns whether or not the slot is unblocked
  // (i.e. lock file removed).
  bool PerformUnblock(int slot_id);

  // Gets the corresponding lock file path for |slot_id|
  // (/run/lock/power_override/chapsd_token_init_slot_<<<SLOT_ID>>>.lock).
  base::FilePath GetPowerdLockFilePath(int slot_id) const;

  scoped_refptr<base::SingleThreadTaskRunner> origin_thread_task_runner_;
  std::set<int> blocked_slots_;

  DISALLOW_COPY_AND_ASSIGN(SystemShutdownBlocker);
};

}  // namespace chaps

#endif  // CHAPS_SYSTEM_SHUTDOWN_BLOCKER_H_
