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, 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool on_removable_device, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_hidden); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Disk(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The path of the device, used by devicekit-disks. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. /sys/devices/pci0000:00/.../8:0:0:0/block/sdb/sdb1) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_path() const { return device_path_; } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The path to the mount point of this device. Will be empty if not mounted. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. /media/removable/VOLUME) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mount_path() const { return mount_path_; } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The path of the device according to the udev system. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. /sys/devices/pci0000:00/.../8:0:0:0/block/sdb/sdb1) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& system_path() const { return system_path_; } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The path of the device according to filesystem. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. /dev/sdb) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& file_path() const { return file_path_; } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Device's label. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_label() const { return device_label_; } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If disk is a parent, then its label, else parents label. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. "TransMemory") 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& drive_label() const { return drive_label_; } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Vendor ID of the device (e.g. "18d1"). 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& vendor_id() const { return vendor_id_; } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Vendor name of the device (e.g. "Google Inc."). 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& vendor_name() const { return vendor_name_; } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Product ID of the device (e.g. "4e11"). 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& product_id() const { return product_id_; } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Product name of the device (e.g. "Nexus One"). 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& product_name() const { return product_name_; } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the file system uuid string. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& fs_uuid() const { return fs_uuid_; } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Path of the system device this device's block is a part of. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. /sys/devices/pci0000:00/.../8:0:0:0/) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& system_path_prefix() const { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return system_path_prefix_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Device type. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceType device_type() const { return device_type_; } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Total size of the device in bytes. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 total_size_in_bytes() const { return total_size_in_bytes_; } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is the device is a parent device (i.e. sdb rather than sdb1). 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_parent() const { return is_parent_; } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is the device read only. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_read_only() const { return is_read_only_; } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does the device contains media. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_media() const { return has_media_; } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is the device on the boot device. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool on_boot_device() const { return on_boot_device_; } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Is the device on the removable device. 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool on_removable_device() const { return on_removable_device_; } 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shoud the device be shown in the UI, or automounted. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_hidden() const { return is_hidden_; } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_mount_path(const std::string& mount_path) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mount_path_ = mount_path; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void clear_mount_path() { mount_path_.clear(); } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string device_path_; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mount_path_; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string system_path_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string file_path_; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string device_label_; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string drive_label_; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string vendor_id_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string vendor_name_; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string product_id_; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string product_name_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string fs_uuid_; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string system_path_prefix_; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceType device_type_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 total_size_in_bytes_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_parent_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_read_only_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_media_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool on_boot_device_; 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool on_removable_device_; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_hidden_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<std::string, Disk*> DiskMap; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A struct to store information about mount point. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct MountPointInfo { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Device's path. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string source_path; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mounted path. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mount_path; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Type of mount. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MountType mount_type; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Condition of mount. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MountCondition mount_condition; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MountPointInfo(const std::string& source, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mount, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MountType type, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MountCondition condition) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : source_path(source), 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mount_path(mount), 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mount_type(type), 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mount_condition(condition) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MountPointMap key is mount_path. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<std::string, MountPointInfo> MountPointMap; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A callback function type which is called after UnmountDeviceRecursively 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finishes. 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(bool)> UnmountDeviceRecursivelyCallbackType; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A callback type for UnmountPath method. 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(MountError error_code)> UnmountPathCallback; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // A callback type for EnsureMountInfoRefreshed method. 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef base::Callback<void(bool success)> EnsureMountInfoRefreshedCallback; 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Implement this interface to be notified about disk/mount related events. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Observer { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Observer() {} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when disk mount status is changed. 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDiskEvent(DiskEvent event, const Disk* disk) = 0; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when device status is changed. 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDeviceEvent(DeviceEvent event, 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_path) = 0; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called after a mount point has been mounted or unmounted. 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnMountEvent(MountEvent event, 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MountError error_code, 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MountPointInfo& mount_info) = 0; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called on format process events. 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnFormatEvent(FormatEvent event, 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormatError error_code, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_path) = 0; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DiskMountManager() {} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds an observer. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddObserver(Observer* observer) = 0; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes an observer. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemoveObserver(Observer* observer) = 0; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the list of disks found. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const DiskMap& disks() const = 0; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns Disk object corresponding to |source_path| or NULL on failure. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const Disk* FindDiskBySourcePath( 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& source_path) const = 0; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the list of mount points. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const MountPointMap& mount_points() const = 0; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Refreshes all the information about mounting if it is not yet done and 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // invokes |callback| when finished. If the information is already refreshed 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // It just runs |callback| immediately. 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void EnsureMountInfoRefreshed( 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const EnsureMountInfoRefreshedCallback& callback) = 0; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mounts a device. 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that the mount operation may fail. To find out the result, one should 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // observe DiskMountManager for |Observer::OnMountEvent| event, which will be 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // raised upon the mount operation completion. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void MountPath(const std::string& source_path, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& source_format, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mount_label, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MountType type) = 0; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unmounts a mounted disk. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |UnmountOptions| enum defined in chromeos/dbus/cros_disks_client.h. 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When the method is complete, |callback| will be called and observers' 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |OnMountEvent| will be raised. 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |callback| may be empty, in which case it gets ignored. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UnmountPath(const std::string& mount_path, 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UnmountOptions options, 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const UnmountPathCallback& callback) = 0; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Formats Device given its mount path. Unmounts the device. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Example: mount_path: /media/VOLUME_LABEL 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void FormatMountedDevice(const std::string& mount_path) = 0; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unmounts device_path and all of its known children. 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UnmountDeviceRecursively( 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_path, 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const UnmountDeviceRecursivelyCallbackType& callback) = 0; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used in tests to initialize the manager's disk and mount point sets. 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Default implementation does noting. It just fails. 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool AddDiskForTest(Disk* disk); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool AddMountPointForTest(const MountPointInfo& mount_point); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns corresponding string to |type| like "unknown_filesystem". 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string MountConditionToString(MountCondition type); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns corresponding string to |type|, like "sd", "usb". 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string DeviceTypeToString(DeviceType type); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates the global DiskMountManager instance. 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Initialize(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Similar to Initialize(), but can inject an alternative 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DiskMountManager such as MockDiskMountManager for testing. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The injected object will be owned by the internal pointer and deleted 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by Shutdown(). 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void InitializeForTesting(DiskMountManager* disk_mount_manager); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys the global DiskMountManager instance if it exists. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Shutdown(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a pointer to the global DiskMountManager instance. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize() should already have been called. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static DiskMountManager* GetInstance(); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace disks 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROMEOS_DISKS_DISK_MOUNT_MANAGER_H_ 313