// Copyright (c) 2011 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_FORMAT_MANAGER_H_
#define CROS_DISKS_FORMAT_MANAGER_H_

#include <map>
#include <string>
#include <vector>

#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 FormatManagerObserverInterface;

class FormatManager {
 public:
  explicit FormatManager(brillo::ProcessReaper* process_reaper);
  ~FormatManager();

  // Starts a formatting process of a given device.
  FormatErrorType StartFormatting(const std::string& device_path,
                                  const std::string& device_file,
                                  const std::string& filesystem,
                                  const std::vector<std::string>& options);

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

 private:
  FRIEND_TEST(FormatManagerTest, GetFormatProgramPath);
  FRIEND_TEST(FormatManagerTest, IsFilesystemSupported);

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

  // Returns the full path of an external formatting program if it is
  // found in some predefined locations. Otherwise, an empty string is
  // returned.
  std::string GetFormatProgramPath(const std::string& filesystem) const;

  // Returns true if formatting a given file system is supported.
  bool IsFilesystemSupported(const std::string& filesystem) const;

  brillo::ProcessReaper* process_reaper_;

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

  FormatManagerObserverInterface* observer_;

  base::WeakPtrFactory<FormatManager> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(FormatManager);
};

}  // namespace cros_disks

#endif  // CROS_DISKS_FORMAT_MANAGER_H_
