// Copyright 2018 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_FUSE_MOUNT_MANAGER_H_
#define CROS_DISKS_FUSE_MOUNT_MANAGER_H_

#include <functional>
#include <memory>
#include <string>
#include <vector>

#include <gtest/gtest_prod.h>

#include "cros-disks/mount_manager.h"

namespace cros_disks {

class Mounter;

// Implementation of MountManager for mounting arbitrary FUSE-based filesystems.
// It essentially does dispatching of mount requests to individual FUSE helpers.
class FUSEMountManager : public MountManager {
 public:
  // |mount_root| - where mount points go.
  // |working_dirs_root| - where temporary working directories go.
  FUSEMountManager(const std::string& mount_root,
                   const std::string& working_dirs_root,
                   Platform* platform,
                   Metrics* metrics,
                   brillo::ProcessReaper* process_reaper);
  FUSEMountManager(const FUSEMountManager&) = delete;
  FUSEMountManager& operator=(const FUSEMountManager&) = delete;

  ~FUSEMountManager() override;

  bool Initialize() override;

  // Whether we know about FUSE driver able to handle this source. Note that
  // source doesn't have to be an actual file or path, it could be anything
  // identifying FUSE module and what instance to mount.
  bool CanMount(const std::string& source) const override;

  // Returns the type of mount sources supported by the manager.
  MountSourceType GetMountSourceType() const override {
    // TODO(crbug.com/831491): Introduce generic "FUSE" storage.
    return MOUNT_SOURCE_NETWORK_STORAGE;
  }

 protected:
  // Mounts |source| to |mount_path| as |fuse_type| with |options|.
  // |fuse_type| can be used to specify the type of |source|.
  // If |fuse_type| is an empty string, the type is determined based on the
  // format of the |source|. The underlying mounter may append their own mount
  // options to |options|.
  std::unique_ptr<MountPoint> DoMount(const std::string& source,
                                      const std::string& fuse_type,
                                      const std::vector<std::string>& options,
                                      const base::FilePath& mount_path,
                                      MountErrorType* error) override;

  // Returns a suggested mount path for a source.
  std::string SuggestMountPath(const std::string& source) const override;

  void RegisterHelper(std::unique_ptr<Mounter> mounter);

 private:
  FRIEND_TEST(FUSEMountManagerTest, SuggestMountPath);
  friend class FUSEMountManagerTest;

  std::vector<std::unique_ptr<Mounter>> helpers_;
  const std::string working_dirs_root_;
};

}  // namespace cros_disks

#endif  // CROS_DISKS_FUSE_MOUNT_MANAGER_H_
