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