// Copyright 2017 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 CROS_DISKS_RENAME_MANAGER_H_
#define CROS_DISKS_RENAME_MANAGER_H_

#include <map>
#include <string>

#include <base/memory/weak_ptr.h>
#include <brillo/process/process_reaper.h>
#include <chromeos/dbus/service_constants.h>
#include <gtest/gtest_prod.h>

#include "cros-disks/sandboxed_process.h"

namespace cros_disks {

class Platform;
class RenameManagerObserverInterface;

class RenameManager {
 public:
  RenameManager(Platform* platform, brillo::ProcessReaper* process_reaper);
  RenameManager(const RenameManager&) = delete;
  RenameManager& operator=(const RenameManager&) = delete;

  ~RenameManager();

  // Starts a renaming process of a given device.
  RenameErrorType StartRenaming(const std::string& device_path,
                                const std::string& device_file,
                                const std::string& volume_name,
                                const std::string& filesystem_type);

  void set_observer(RenameManagerObserverInterface* observer) {
    observer_ = observer;
  }

 private:
  FRIEND_TEST(RenameManagerTest, CanRename);

  void OnRenameProcessTerminated(const std::string& device_path,
                                 const siginfo_t& info);

  // Returns true if renaming |source_path| is supported.
  bool CanRename(const std::string& source_path) const;

  // Platform service
  Platform* platform_;

  brillo::ProcessReaper* process_reaper_;

  // A list of outstanding renaming processes indexed by device path.
  std::map<std::string, SandboxedProcess> rename_process_;

  RenameManagerObserverInterface* observer_;

  base::WeakPtrFactory<RenameManager> weak_ptr_factory_;
};

}  // namespace cros_disks

#endif  // CROS_DISKS_RENAME_MANAGER_H_
