mount_library.h revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2009 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_ 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/observer_list.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/singleton.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "cros/chromeos_mount.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos { 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class handles the interaction with the ChromeOS mount library APIs. 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Classes can add themselves as observers. Users can get an instance of this 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// library class like this: MountLibrary::Get(). 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MountLibrary { 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Used to house an instance of each found mount device. 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct Disk { 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Disk() {} 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Disk(const std::string& devicepath, 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& mountpath, 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& systempath, 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool isparent, 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool hasmedia) 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : device_path(devicepath), 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mount_path(mountpath), 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch system_path(systempath), 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch is_parent(isparent), 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch has_media(hasmedia) {} 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The path of the device, used by devicekit-disks. 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string device_path; 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The path to the mount point of this device. Will be empty if not mounted. 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string mount_path; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The path of the device according to the udev system. 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string system_path; 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // if the device is a parent device (i.e. sdb rather than sdb1) 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_parent; 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // if the device has media currently 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool has_media; 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::vector<Disk> DiskVector; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class Observer { 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void MountChanged(MountLibrary* obj, 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MountEventType evt, 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& path) = 0; 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~MountLibrary() {} 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void AddObserver(Observer* observer) = 0; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void RemoveObserver(Observer* observer) = 0; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const DiskVector& disks() const = 0; 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool MountPath(const char* device_path) = 0; 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class handles the interaction with the ChromeOS mount library APIs. 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Classes can add themselves as observers. Users can get an instance of this 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// library class like this: MountLibrary::Get(). 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MountLibraryImpl : public MountLibrary { 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MountLibraryImpl(); 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~MountLibraryImpl(); 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // MountLibrary overrides. 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void AddObserver(Observer* observer); 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void RemoveObserver(Observer* observer); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const DiskVector& disks() const { return disks_; } 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool MountPath(const char* device_path); 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ParseDisks(const MountStatus& status); 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This method is called when there's a change in mount status. 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This method is called the UI Thread. 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void MountStatusChangedHandler(void* object, 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const MountStatus& status, 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MountEventType evt, 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* path); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This methods starts the monitoring of mount changes. 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // It should be called on the UI Thread. 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Init(); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called by the handler to update the mount status. 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This will notify all the Observers. 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void UpdateMountStatus(const MountStatus& status, 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MountEventType evt, 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& path); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ObserverList<Observer> observers_; 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A reference to the mount api, to allow callbacks when the mount 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // status changes. 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MountStatusConnection mount_status_connection_; 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The list of disks found. 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DiskVector disks_; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(MountLibraryImpl); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace chromeos 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_CHROMEOS_CROS_MOUNT_LIBRARY_H_ 111