1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_CHROMEOS_CROS_MOUNT_LIBRARY_H_
6#define CHROME_BROWSER_CHROMEOS_CROS_MOUNT_LIBRARY_H_
7#pragma once
8
9#include <string>
10#include <map>
11
12#include "base/memory/singleton.h"
13#include "base/observer_list.h"
14#include "base/time.h"
15#include "third_party/cros/chromeos_mount.h"
16
17namespace chromeos {
18
19typedef enum MountLibraryEventType {
20  MOUNT_DISK_ADDED,
21  MOUNT_DISK_REMOVED,
22  MOUNT_DISK_CHANGED,
23  MOUNT_DISK_MOUNTED,
24  MOUNT_DISK_UNMOUNTED,
25  MOUNT_DEVICE_ADDED,
26  MOUNT_DEVICE_REMOVED,
27  MOUNT_DEVICE_SCANNED
28} MountLibraryEventType;
29
30// This class handles the interaction with the ChromeOS mount library APIs.
31// Classes can add themselves as observers. Users can get an instance of this
32// library class like this: chromeos::CrosLibrary::Get()->GetMountLibrary()
33class MountLibrary {
34 public:
35  // Used to house an instance of each found mount device.
36  class Disk {
37   public:
38    Disk(const std::string& device_path,
39         const std::string& mount_path,
40         const std::string& system_path,
41         const std::string& file_path,
42         const std::string& device_label,
43         const std::string& drive_label,
44         const std::string& parent_path,
45         DeviceType device_type,
46         uint64 total_size,
47         bool is_parent,
48         bool is_read_only,
49         bool has_media,
50         bool on_boot_device);
51    // The path of the device, used by devicekit-disks.
52    const std::string& device_path() const { return device_path_; }
53    // The path to the mount point of this device. Will be empty if not mounted.
54    const std::string&  mount_path() const { return mount_path_; }
55    // The path of the device according to the udev system.
56    const std::string& system_path() const { return system_path_; }
57    // The path of the device according to filesystem.
58    const std::string& file_path() const { return file_path_; }
59    // Device's label.
60    const std::string& device_label() const { return device_label_; }
61    // If disk is a parent, then its label, else parents label.
62    const std::string& drive_label() const { return drive_label_; }
63    // Parents device path. If device has no parent, then empty string.
64    const std::string& parent_path() const { return parent_path_; }
65    // Device type.
66    DeviceType device_type() const { return device_type_; }
67    // Total size of the device.
68    uint64 total_size() const { return total_size_; }
69    // Is the device is a parent device (i.e. sdb rather than sdb1).
70    bool is_parent() const { return is_parent_; }
71    // Is the device read only.
72    bool is_read_only() const { return is_read_only_; }
73    // Does the device contains media.
74    bool has_media() const { return has_media_; }
75    // Is the device on the boot device.
76    bool on_boot_device() const { return on_boot_device_; }
77
78    void set_mount_path(const char* mount_path) { mount_path_ = mount_path; }
79    void clear_mount_path() { mount_path_.clear(); }
80
81   private:
82    std::string device_path_;
83    std::string mount_path_;
84    std::string system_path_;
85    std::string file_path_;
86    std::string device_label_;
87    std::string drive_label_;
88    std::string parent_path_;
89    DeviceType device_type_;
90    uint64 total_size_;
91    bool is_parent_;
92    bool is_read_only_;
93    bool has_media_;
94    bool on_boot_device_;
95  };
96  typedef std::map<std::string, Disk*> DiskMap;
97
98  class Observer {
99   public:
100    virtual ~Observer() {}
101    // Async API events.
102    virtual void DiskChanged(MountLibraryEventType event,
103                             const Disk* disk) = 0;
104    virtual void DeviceChanged(MountLibraryEventType event,
105                               const std::string& device_path ) = 0;
106  };
107
108  virtual ~MountLibrary() {}
109  virtual void AddObserver(Observer* observer) = 0;
110  virtual void RemoveObserver(Observer* observer) = 0;
111  virtual const DiskMap& disks() const = 0;
112
113  virtual void RequestMountInfoRefresh() = 0;
114  virtual void MountPath(const char* device_path) = 0;
115  virtual void UnmountPath(const char* device_path) = 0;
116
117  // Factory function, creates a new instance and returns ownership.
118  // For normal usage, access the singleton via CrosLibrary::Get().
119  static MountLibrary* GetImpl(bool stub);
120};
121
122}  // namespace chromeos
123
124#endif  // CHROME_BROWSER_CHROMEOS_CROS_MOUNT_LIBRARY_H_
125