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