blob: 779fc4aa0506f8ee217e46de64e760612af5179e [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CHROMEOS_CROS_MOUNT_LIBRARY_H_
#define CHROME_BROWSER_CHROMEOS_CROS_MOUNT_LIBRARY_H_
#pragma once
#include <string>
#include <map>
#include "base/memory/singleton.h"
#include "base/observer_list.h"
#include "base/time.h"
#include "third_party/cros/chromeos_mount.h"
namespace chromeos {
typedef enum MountLibraryEventType {
MOUNT_DISK_ADDED,
MOUNT_DISK_REMOVED,
MOUNT_DISK_CHANGED,
MOUNT_DISK_MOUNTED,
MOUNT_DISK_UNMOUNTED,
MOUNT_DEVICE_ADDED,
MOUNT_DEVICE_REMOVED,
MOUNT_DEVICE_SCANNED
} MountLibraryEventType;
// This class handles the interaction with the ChromeOS mount library APIs.
// Classes can add themselves as observers. Users can get an instance of this
// library class like this: chromeos::CrosLibrary::Get()->GetMountLibrary()
class MountLibrary {
public:
// Used to house an instance of each found mount device.
class Disk {
public:
Disk(const std::string& device_path,
const std::string& mount_path,
const std::string& system_path,
const std::string& file_path,
const std::string& device_label,
const std::string& drive_label,
const std::string& parent_path,
DeviceType device_type,
uint64 total_size,
bool is_parent,
bool is_read_only,
bool has_media,
bool on_boot_device);
// The path of the device, used by devicekit-disks.
const std::string& device_path() const { return device_path_; }
// The path to the mount point of this device. Will be empty if not mounted.
const std::string& mount_path() const { return mount_path_; }
// The path of the device according to the udev system.
const std::string& system_path() const { return system_path_; }
// The path of the device according to filesystem.
const std::string& file_path() const { return file_path_; }
// Device's label.
const std::string& device_label() const { return device_label_; }
// If disk is a parent, then its label, else parents label.
const std::string& drive_label() const { return drive_label_; }
// Parents device path. If device has no parent, then empty string.
const std::string& parent_path() const { return parent_path_; }
// Device type.
DeviceType device_type() const { return device_type_; }
// Total size of the device.
uint64 total_size() const { return total_size_; }
// Is the device is a parent device (i.e. sdb rather than sdb1).
bool is_parent() const { return is_parent_; }
// Is the device read only.
bool is_read_only() const { return is_read_only_; }
// Does the device contains media.
bool has_media() const { return has_media_; }
// Is the device on the boot device.
bool on_boot_device() const { return on_boot_device_; }
void set_mount_path(const char* mount_path) { mount_path_ = mount_path; }
void clear_mount_path() { mount_path_.clear(); }
private:
std::string device_path_;
std::string mount_path_;
std::string system_path_;
std::string file_path_;
std::string device_label_;
std::string drive_label_;
std::string parent_path_;
DeviceType device_type_;
uint64 total_size_;
bool is_parent_;
bool is_read_only_;
bool has_media_;
bool on_boot_device_;
};
typedef std::map<std::string, Disk*> DiskMap;
class Observer {
public:
virtual ~Observer() {}
// Async API events.
virtual void DiskChanged(MountLibraryEventType event,
const Disk* disk) = 0;
virtual void DeviceChanged(MountLibraryEventType event,
const std::string& device_path ) = 0;
};
virtual ~MountLibrary() {}
virtual void AddObserver(Observer* observer) = 0;
virtual void RemoveObserver(Observer* observer) = 0;
virtual const DiskMap& disks() const = 0;
virtual void RequestMountInfoRefresh() = 0;
virtual void MountPath(const char* device_path) = 0;
virtual void UnmountPath(const char* device_path) = 0;
// Factory function, creates a new instance and returns ownership.
// For normal usage, access the singleton via CrosLibrary::Get().
static MountLibrary* GetImpl(bool stub);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_CROS_MOUNT_LIBRARY_H_