15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROMEOS_DISKS_DISK_MOUNT_MANAGER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEOS_DISKS_DISK_MOUNT_MANAGER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback_forward.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/chromeos_export.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/cros_disks_client.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace disks { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Condition of mounted filesystem. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum MountCondition { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOUNT_CONDITION_NONE, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOUNT_CONDITION_UNKNOWN_FILESYSTEM, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOUNT_CONDITION_UNSUPPORTED_FILESYSTEM, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class handles the interaction with cros-disks. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Other classes can add themselves as observers. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CHROMEOS_EXPORT DiskMountManager { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Event types passed to the observers. 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum DiskEvent { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISK_ADDED, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISK_REMOVED, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISK_CHANGED, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum DeviceEvent { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DEVICE_ADDED, 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DEVICE_REMOVED, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DEVICE_SCANNED, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum MountEvent { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOUNTING, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNMOUNTING, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum FormatEvent { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FORMAT_STARTED, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FORMAT_COMPLETED 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to house an instance of each found mount device. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Disk { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Disk(const std::string& device_path, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mount_path, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& system_path, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& file_path, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_label, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& drive_label, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& vendor_id, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& vendor_name, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& product_id, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& product_name, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& fs_uuid, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& system_path_prefix, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceType device_type, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 total_size_in_bytes, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_parent, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_read_only, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_media, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool on_boot_device, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_hidden); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Disk(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The path of the device, used by devicekit-disks. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. /sys/devices/pci0000:00/.../8:0:0:0/block/sdb/sdb1) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_path() const { return device_path_; } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The path to the mount point of this device. Will be empty if not mounted. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. /media/removable/VOLUME) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mount_path() const { return mount_path_; } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The path of the device according to the udev system. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. /sys/devices/pci0000:00/.../8:0:0:0/block/sdb/sdb1) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& system_path() const { return system_path_; } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The path of the device according to filesystem. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. /dev/sdb) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& file_path() const { return file_path_; } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Device's label. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_label() const { return device_label_; } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If disk is a parent, then its label, else parents label. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. "TransMemory") 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& drive_label() const { return drive_label_; } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Vendor ID of the device (e.g. "18d1"). 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& vendor_id() const { return vendor_id_; } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Vendor name of the device (e.g. "Google Inc."). 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& vendor_name() const { return vendor_name_; } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Product ID of the device (e.g. "4e11"). 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& product_id() const { return product_id_; } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Product name of the device (e.g. "Nexus One"). 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& product_name() const { return product_name_; } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the file system uuid string. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& fs_uuid() const { return fs_uuid_; } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Path of the system device this device's block is a part of. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. /sys/devices/pci0000:00/.../8:0:0:0/) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& system_path_prefix() const { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return system_path_prefix_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Device type. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceType device_type() const { return device_type_; } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Total size of the device in bytes. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 total_size_in_bytes() const { return total_size_in_bytes_; } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is the device is a parent device (i.e. sdb rather than sdb1). 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_parent() const { return is_parent_; } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is the device read only. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_read_only() const { return is_read_only_; } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does the device contains media. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_media() const { return has_media_; } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is the device on the boot device. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool on_boot_device() const { return on_boot_device_; } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shoud the device be shown in the UI, or automounted. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_hidden() const { return is_hidden_; } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_mount_path(const std::string& mount_path) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mount_path_ = mount_path; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void clear_mount_path() { mount_path_.clear(); } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string device_path_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mount_path_; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string system_path_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string file_path_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string device_label_; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string drive_label_; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string vendor_id_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string vendor_name_; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string product_id_; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string product_name_; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string fs_uuid_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string system_path_prefix_; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceType device_type_; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 total_size_in_bytes_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_parent_; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_read_only_; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_media_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool on_boot_device_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_hidden_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<std::string, Disk*> DiskMap; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A struct to store information about mount point. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct MountPointInfo { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Device's path. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string source_path; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mounted path. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mount_path; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Type of mount. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MountType mount_type; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Condition of mount. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MountCondition mount_condition; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MountPointInfo(const std::string& source, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mount, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MountType type, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MountCondition condition) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : source_path(source), 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mount_path(mount), 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mount_type(type), 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mount_condition(condition) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MountPointMap key is mount_path. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<std::string, MountPointInfo> MountPointMap; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A callback function type which is called after UnmountDeviceRecursively 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finishes. 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(bool)> UnmountDeviceRecursivelyCallbackType; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A callback type for UnmountPath method. 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(MountError error_code)> UnmountPathCallback; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Implement this interface to be notified about disk/mount related events. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Observer { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Observer() {} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when disk mount status is changed. 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDiskEvent(DiskEvent event, const Disk* disk) = 0; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when device status is changed. 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDeviceEvent(DeviceEvent event, 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_path) = 0; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called after a mount point has been mounted or unmounted. 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnMountEvent(MountEvent event, 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MountError error_code, 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MountPointInfo& mount_info) = 0; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called on format process events. 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnFormatEvent(FormatEvent event, 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormatError error_code, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_path) = 0; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DiskMountManager() {} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds an observer. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddObserver(Observer* observer) = 0; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes an observer. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemoveObserver(Observer* observer) = 0; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the list of disks found. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const DiskMap& disks() const = 0; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns Disk object corresponding to |source_path| or NULL on failure. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const Disk* FindDiskBySourcePath( 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& source_path) const = 0; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the list of mount points. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const MountPointMap& mount_points() const = 0; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests refreshing all the information about mounted disks. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RequestMountInfoRefresh() = 0; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mounts a device. 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that the mount operation may fail. To find out the result, one should 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // observe DiskMountManager for |Observer::OnMountEvent| event, which will be 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // raised upon the mount operation completion. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void MountPath(const std::string& source_path, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& source_format, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mount_label, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MountType type) = 0; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unmounts a mounted disk. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |UnmountOptions| enum defined in chromeos/dbus/cros_disks_client.h. 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When the method is complete, |callback| will be called and observers' 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |OnMountEvent| will be raised. 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |callback| may be empty, in which case it gets ignored. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UnmountPath(const std::string& mount_path, 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UnmountOptions options, 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const UnmountPathCallback& callback) = 0; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Formats Device given its mount path. Unmounts the device. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Example: mount_path: /media/VOLUME_LABEL 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void FormatMountedDevice(const std::string& mount_path) = 0; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unmounts device_path and all of its known children. 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UnmountDeviceRecursively( 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_path, 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const UnmountDeviceRecursivelyCallbackType& callback) = 0; 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used in tests to initialize the manager's disk and mount point sets. 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Default implementation does noting. It just fails. 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool AddDiskForTest(Disk* disk); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool AddMountPointForTest(const MountPointInfo& mount_point); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns corresponding string to |type| like "device" or "file". 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string MountTypeToString(MountType type); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The inverse function of MountTypeToString. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static MountType MountTypeFromString(const std::string& type_str); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns corresponding string to |type| like "unknown_filesystem". 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string MountConditionToString(MountCondition type); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns corresponding string to |type|, like "sd", "usb". 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string DeviceTypeToString(DeviceType type); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates the global DiskMountManager instance. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Initialize(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Similar to Initialize(), but can inject an alternative 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DiskMountManager such as MockDiskMountManager for testing. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The injected object will be owned by the internal pointer and deleted 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by Shutdown(). 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void InitializeForTesting(DiskMountManager* disk_mount_manager); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys the global DiskMountManager instance if it exists. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Shutdown(); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a pointer to the global DiskMountManager instance. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize() should already have been called. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static DiskMountManager* GetInstance(); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace disks 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROMEOS_DISKS_DISK_MOUNT_MANAGER_H_ 308