blob: 5d47538b887c223b1b51f89e4f86f855f2ff3d29 [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ASH_FILE_MANAGER_VOLUME_H_
#define CHROME_BROWSER_ASH_FILE_MANAGER_VOLUME_H_
#include <memory>
#include <optional>
#include <string>
#include "base/files/file_path.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ash/file_system_provider/icon_set.h"
#include "chrome/browser/ash/file_system_provider/provided_file_system_info.h"
#include "chrome/browser/ash/guest_os/public/types.h"
#include "chromeos/ash/components/disks/disk_mount_manager.h"
namespace file_manager {
// TODO(b/304383409): convert to enum class.
// Identifiers for volume types managed by Chrome OS file manager.
// The enum values must be kept in sync with FileManagerVolumeType and
// OfficeFilesSourceVolume defined in tools/metrics/histograms/enums.xml.
enum VolumeType {
VOLUME_TYPE_TESTING = -1, // Used only in tests.
VOLUME_TYPE_GOOGLE_DRIVE = 0,
VOLUME_TYPE_DOWNLOADS_DIRECTORY = 1,
VOLUME_TYPE_REMOVABLE_DISK_PARTITION = 2,
VOLUME_TYPE_MOUNTED_ARCHIVE_FILE = 3,
VOLUME_TYPE_PROVIDED = 4, // File system provided by FileSystemProvider API.
VOLUME_TYPE_MTP = 5,
VOLUME_TYPE_MEDIA_VIEW = 6,
VOLUME_TYPE_CROSTINI = 7,
VOLUME_TYPE_ANDROID_FILES = 8,
VOLUME_TYPE_DOCUMENTS_PROVIDER = 9,
VOLUME_TYPE_SMB = 10,
VOLUME_TYPE_SYSTEM_INTERNAL = 11, // Internal volume never exposed to users.
VOLUME_TYPE_GUEST_OS = 12, // Guest OS volumes (Crostini, Bruschetta, etc)
// Append new values here.
NUM_VOLUME_TYPE,
};
// Output operator for logging.
std::ostream& operator<<(std::ostream& out, VolumeType type);
// Says how was the mount performed, whether due to user interaction, or
// automatic. User interaction includes both hardware (pluggins a USB stick)
// or software (mounting a ZIP archive) interaction.
enum MountContext {
MOUNT_CONTEXT_USER,
MOUNT_CONTEXT_AUTO,
MOUNT_CONTEXT_UNKNOWN
};
// Source of a volume's data.
enum Source { SOURCE_FILE, SOURCE_DEVICE, SOURCE_NETWORK, SOURCE_SYSTEM };
// Represents a volume (mount point) in the volume manager. Validity of the data
// is guaranteed by the weak pointer. Simply saying, the weak pointer should be
// valid as long as the volume is mounted.
class Volume {
public:
Volume(const Volume&) = delete;
Volume& operator=(const Volume&) = delete;
~Volume();
// Factory static methods for different volume types.
static std::unique_ptr<Volume> CreateForDrive(base::FilePath drive_path);
static std::unique_ptr<Volume> CreateForDownloads(
base::FilePath downloads_path,
base::FilePath optional_fusebox_path = {},
const char* optional_fusebox_volume_label = nullptr,
bool read_only = false);
static std::unique_ptr<Volume> CreateForRemovable(
const ash::disks::DiskMountManager::MountPoint& mount_point,
const ash::disks::Disk* disk);
static std::unique_ptr<Volume> CreateForProvidedFileSystem(
const ash::file_system_provider::ProvidedFileSystemInfo& file_system_info,
MountContext mount_context,
base::FilePath optional_fusebox_path = {});
static std::unique_ptr<Volume> CreateForMTP(base::FilePath mount_path,
std::string label,
bool read_only,
bool use_fusebox = false);
static std::unique_ptr<Volume> CreateForMediaView(const std::string& root_id);
static std::unique_ptr<Volume> CreateMediaViewForTesting(
base::FilePath mount_path,
const std::string& root_id);
static std::unique_ptr<Volume> CreateForSshfsCrostini(
base::FilePath crostini_path,
base::FilePath remote_mount_path);
static std::unique_ptr<Volume> CreateForSftpGuestOs(
std::string display_name,
base::FilePath sftp_mount_path,
base::FilePath remote_mount_path,
const guest_os::VmType vm_type);
static std::unique_ptr<Volume> CreateForAndroidFiles(
base::FilePath mount_path);
static std::unique_ptr<Volume> CreateForDocumentsProvider(
const std::string& authority,
const std::string& root_id,
const std::string& title,
const std::string& summary,
const GURL& icon_url,
bool read_only,
const std::string& optional_fusebox_subdir);
static std::unique_ptr<Volume> CreateForSmb(base::FilePath mount_point,
std::string display_name);
static std::unique_ptr<Volume> CreateForShareCache(base::FilePath mount_path);
static std::unique_ptr<Volume> CreateForTesting(
base::FilePath path,
VolumeType volume_type,
ash::DeviceType device_type,
bool read_only,
base::FilePath device_path,
std::string drive_label,
std::string file_system_type = {},
bool hidden = false,
bool watchable = false);
static std::unique_ptr<Volume> CreateForTesting(base::FilePath device_path,
base::FilePath mount_path);
// Create a volume at `path` with the specified `volume_type`.
// For `volume_type`==VOLUME_TYPE_GUEST_OS, `vm_type` should also be
// specified. For `volume_type`==VOLUME_TYPE_MOUNTED_ARCHIVE_FILE,
// `source_path` has to be specified and point to the (not necessarily
// existing) path of the archive file.
static std::unique_ptr<Volume> CreateForTesting(
base::FilePath path,
VolumeType volume_type,
std::optional<guest_os::VmType> vm_type,
base::FilePath source_path = {});
// Getters for all members. See below for details.
const std::string& volume_id() const { return volume_id_; }
const std::string& file_system_id() const { return file_system_id_; }
const ash::file_system_provider::ProviderId& provider_id() const {
return provider_id_;
}
Source source() const { return source_; }
VolumeType type() const { return type_; }
ash::DeviceType device_type() const { return device_type_; }
const base::FilePath& source_path() const { return source_path_; }
const base::FilePath& mount_path() const { return mount_path_; }
const base::FilePath& remote_mount_path() const { return remote_mount_path_; }
ash::MountError mount_condition() const { return mount_condition_; }
MountContext mount_context() const { return mount_context_; }
const base::FilePath& storage_device_path() const {
return storage_device_path_;
}
const std::string& volume_label() const { return volume_label_; }
bool is_parent() const { return is_parent_; }
// Whether the applications can write to the volume. True if not writable.
// For example, when write access to external storage is restricted by the
// policy (ExternalStorageReadOnly), is_read_only() will be true even when
// is_read_only_removable_device() is false.
bool is_read_only() const { return is_read_only_; }
// Whether the device is write-protected by hardware. This field is valid
// only when device_type is VOLUME_TYPE_REMOVABLE_DISK_PARTITION and
// source is SOURCE_DEVICE.
// When this value is true, is_read_only() is also true.
bool is_read_only_removable_device() const {
return is_read_only_removable_device_;
}
bool has_media() const { return has_media_; }
bool configurable() const { return configurable_; }
bool watchable() const { return watchable_; }
const std::string& file_system_type() const { return file_system_type_; }
const std::string& drive_label() const { return drive_label_; }
const ash::file_system_provider::IconSet& icon_set() const {
return icon_set_;
}
bool hidden() const { return hidden_; }
std::optional<guest_os::VmType> vm_type() const { return vm_type_; }
base::WeakPtr<Volume> AsWeakPtr() { return weak_ptr_factory_.GetWeakPtr(); }
private:
Volume();
// The ID of the volume.
std::string volume_id_;
// The ID for provided file systems. If other type, then empty string. Unique
// per providing extension or native provider.
std::string file_system_id_;
// The ID of an extension or native provider providing the file system. If
// other type, then equal to a ProviderId of the type INVALID.
ash::file_system_provider::ProviderId provider_id_;
// The source of the volume's data.
Source source_ = SOURCE_FILE;
// The type of mounted volume.
VolumeType type_ = VOLUME_TYPE_GOOGLE_DRIVE;
// The type of device. (e.g. USB, SD card, DVD etc.)
ash::DeviceType device_type_ = ash::DeviceType::kUnknown;
// The source path of the volume.
// E.g.:
// - /home/chronos/user/MyFiles/Downloads/zipfile_path.zip
base::FilePath source_path_;
// The mount path of the volume.
// E.g.:
// - /media/removable/usb1
// - /media/archive/zip1
base::FilePath mount_path_;
// The path on the remote host where this volume is mounted, for crostini this
// is the user's homedir (/home/<username>).
base::FilePath remote_mount_path_;
// The mounting condition. See the enum for the details.
ash::MountError mount_condition_ = ash::MountError::kSuccess;
// The context of the mount. Whether mounting was performed due to a user
// interaction or not.
MountContext mount_context_ = MOUNT_CONTEXT_UNKNOWN;
// Path of the storage device this device's block is a part of.
// (e.g. /sys/devices/pci0000:00/.../8:0:0:0/)
base::FilePath storage_device_path_;
// Label for the volume if the volume is either removable or a provided file
// system. In case of removables, if disk is a parent, then its label, else
// parents label (e.g. "TransMemory").
std::string volume_label_;
// Identifier for the file system type
std::string file_system_type_;
// Volume icon set.
ash::file_system_provider::IconSet icon_set_;
// Device label of a physical removable device. Removable partitions belonging
// to the same device share the same device label.
std::string drive_label_;
// Is the device is a parent device (i.e. sdb rather than sdb1).
bool is_parent_ = false;
// True if the volume is not writable by applications.
bool is_read_only_ = false;
// True if the volume is made read_only due to its hardware.
// This implies is_read_only_.
bool is_read_only_removable_device_ = false;
// True if the volume contains media.
bool has_media_ = false;
// True if the volume is configurable.
bool configurable_ = false;
// True if the volume notifies about changes via file/directory watchers.
//
// Requests to add file watchers for paths on the volume will fail when
// set to false and Files app will add a "Refresh" icon to the toolbar
// so that the directory contents can be manually refreshed.
bool watchable_ = false;
// True if the volume is hidden and never shown to the user through File
// Manager.
bool hidden_ = false;
// Only set for VOLUME_TYPE_GUEST_OS, identifies the type of Guest OS VM.
std::optional<guest_os::VmType> vm_type_;
base::WeakPtrFactory<Volume> weak_ptr_factory_{this};
};
} // namespace file_manager
#endif // CHROME_BROWSER_ASH_FILE_MANAGER_VOLUME_H_