// 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/macros.h>
#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();

  // 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_;

  DISALLOW_COPY_AND_ASSIGN(RenameManager);
};

}  // namespace cros_disks

#endif  // CROS_DISKS_RENAME_MANAGER_H_
