// 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 <base/macros.h>
#include <chromeos/dbus/service_constants.h>
#include <gtest/gtest_prod.h>

namespace chromeos {

class ProcessImpl;

}  // namespace chromeos

namespace cros_disks {

class FormatManagerObserverInterface;

class FormatManager {
 public:
  FormatManager();
  ~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);

  // Handles a terminated formatting process.
  void FormattingFinished(pid_t pid, int status);

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

 private:
  // 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;

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

  // Given the pid of formatting process it finds the device path.
  std::map<pid_t, std::string> pid_to_device_path_;

  FormatManagerObserverInterface* observer_;

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

  DISALLOW_COPY_AND_ASSIGN(FormatManager);
};

}  // namespace cros_disks

#endif  // CROS_DISKS_FORMAT_MANAGER_H_
