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