// 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_MOUNTER_H_
#define CROS_DISKS_MOUNTER_H_

#include <string>

#include <base/macros.h>
#include <chromeos/dbus/service_constants.h>

#include "cros-disks/mount_options.h"

namespace cros_disks {

// A base class for mounting a filesystem.
// This class (and its derived classes) does not handle unmounting
// of the filesystem.
class Mounter {
 public:
  Mounter(const std::string& source_path,
          const std::string& target_path,
          const std::string& filesystem_type,
          const MountOptions& mount_options);

  virtual ~Mounter() = default;

  // This method implements the common steps to mount a filesystem.
  // It internally calls MountImpl() on a derived class.
  MountErrorType Mount();

  const std::string& filesystem_type() const { return filesystem_type_; }
  const std::string& source_path() const { return source_path_; }
  const std::string& target_path() const { return target_path_; }
  const MountOptions& mount_options() const { return mount_options_; }

 protected:
  // This pure virtual method is implemented by a derived class to mount
  // a filesystem.
  virtual MountErrorType MountImpl() = 0;

 private:
  // Type of filesystem to mount.
  std::string filesystem_type_;

  // Source path to mount from.
  std::string source_path_;

  // Target path where the filesystem is mounted to.
  std::string target_path_;

  // Mount options.
  MountOptions mount_options_;

  DISALLOW_COPY_AND_ASSIGN(Mounter);
};

}  // namespace cros_disks

#endif  // CROS_DISKS_MOUNTER_H_
