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