| Index: chrome/browser/chromeos/cros/mount_library.cc
|
| ===================================================================
|
| --- chrome/browser/chromeos/cros/mount_library.cc (revision 93731)
|
| +++ chrome/browser/chromeos/cros/mount_library.cc (working copy)
|
| @@ -90,31 +90,58 @@
|
| observers_.RemoveObserver(observer);
|
| }
|
|
|
| - virtual void MountPath(const char* device_path) OVERRIDE {
|
| + virtual std::string MountTypeToString(MountType type) const OVERRIDE {
|
| + switch (type) {
|
| + case MOUNT_TYPE_DEVICE:
|
| + return "device";
|
| + case MOUNT_TYPE_ARCHIVE:
|
| + return "file";
|
| + case MOUNT_TYPE_NETWORK_STORAGE:
|
| + return "network";
|
| + case MOUNT_TYPE_INVALID:
|
| + return "invalid";
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| + return "";
|
| + }
|
| +
|
| + virtual MountType MountTypeFromString(const std::string& type_str) const
|
| + OVERRIDE {
|
| + if (type_str == "device") {
|
| + return MOUNT_TYPE_DEVICE;
|
| + } else if (type_str == "network") {
|
| + return MOUNT_TYPE_NETWORK_STORAGE;
|
| + } else if (type_str == "file") {
|
| + return MOUNT_TYPE_ARCHIVE;
|
| + } else {
|
| + return MOUNT_TYPE_INVALID;
|
| + }
|
| + }
|
| +
|
| + virtual void MountPath(const char* source_path,
|
| + MountType type,
|
| + const MountPathOptions& options) OVERRIDE {
|
| CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| if (!CrosLibrary::Get()->EnsureLoaded()) {
|
| - OnMountRemovableDevice(device_path,
|
| - NULL,
|
| - MOUNT_METHOD_ERROR_LOCAL,
|
| - kLibraryNotLoaded);
|
| + OnMountCompleted(MOUNT_ERROR_LIBRARY_NOT_LOADED,
|
| + source_path,
|
| + type,
|
| + NULL);
|
| return;
|
| }
|
| - MountRemovableDevice(device_path,
|
| - &MountLibraryImpl::MountRemovableDeviceCallback,
|
| - this);
|
| + MountSourcePath(source_path, type, options, &MountCompletedHandler, this);
|
| }
|
|
|
| - virtual void UnmountPath(const char* device_path) OVERRIDE {
|
| + virtual void UnmountPath(const char* path) OVERRIDE {
|
| CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| if (!CrosLibrary::Get()->EnsureLoaded()) {
|
| - OnUnmountRemovableDevice(device_path,
|
| - MOUNT_METHOD_ERROR_LOCAL,
|
| - kLibraryNotLoaded);
|
| + OnUnmountPath(path,
|
| + MOUNT_METHOD_ERROR_LOCAL,
|
| + kLibraryNotLoaded);
|
| return;
|
| }
|
| - UnmountRemovableDevice(device_path,
|
| - &MountLibraryImpl::UnmountRemovableDeviceCallback,
|
| - this);
|
| + UnmountMountPoint(path, &MountLibraryImpl::UnmountMountPointCallback, this);
|
| }
|
|
|
| virtual void UnmountDeviceRecursive(const char* device_path,
|
| @@ -151,9 +178,10 @@
|
| cb_data = new UnmountDeviceRecursiveCallbackData(this, user_data,
|
| callback, devices_to_unmount.size());
|
| for (std::vector<const char*>::iterator it = devices_to_unmount.begin();
|
| - it != devices_to_unmount.end();
|
| - ++it) {
|
| - UnmountRemovableDevice(*it,
|
| + it != devices_to_unmount.end();
|
| + ++it) {
|
| + UnmountMountPoint(
|
| + *it,
|
| &MountLibraryImpl::UnmountDeviceRecursiveCallback,
|
| cb_data);
|
| }
|
| @@ -178,39 +206,36 @@
|
| }
|
|
|
| const DiskMap& disks() const OVERRIDE { return disks_; }
|
| + const MountPointMap& mount_points() const OVERRIDE { return mount_points_; }
|
|
|
| private:
|
| - // Callback for MountRemovableDevice method.
|
| - static void MountRemovableDeviceCallback(void* object,
|
| - const char* device_path,
|
| - const char* mount_path,
|
| - MountMethodErrorType error,
|
| - const char* error_message) {
|
| + // Callback for MountComplete signal and MountSourcePath method.
|
| + static void MountCompletedHandler(void* object,
|
| + MountError error_code,
|
| + const char* source_path,
|
| + MountType type,
|
| + const char* mount_path) {
|
| DCHECK(object);
|
| MountLibraryImpl* self = static_cast<MountLibraryImpl*>(object);
|
| - self->OnMountRemovableDevice(device_path,
|
| - mount_path,
|
| - error,
|
| - error_message);
|
| + self->OnMountCompleted(static_cast<MountError>(error_code),
|
| + source_path,
|
| + static_cast<MountType>(type),
|
| + mount_path);
|
| }
|
|
|
| // Callback for UnmountRemovableDevice method.
|
| - static void UnmountRemovableDeviceCallback(void* object,
|
| - const char* device_path,
|
| - const char* mount_path,
|
| - MountMethodErrorType error,
|
| - const char* error_message) {
|
| + static void UnmountMountPointCallback(void* object,
|
| + const char* device_path,
|
| + MountMethodErrorType error,
|
| + const char* error_message) {
|
| DCHECK(object);
|
| MountLibraryImpl* self = static_cast<MountLibraryImpl*>(object);
|
| - self->OnUnmountRemovableDevice(device_path,
|
| - error,
|
| - error_message);
|
| + self->OnUnmountPath(device_path, error, error_message);
|
| }
|
|
|
| // Callback for UnmountDeviceRecursive.
|
| static void UnmountDeviceRecursiveCallback(void* object,
|
| const char* device_path,
|
| - const char* mount_path,
|
| MountMethodErrorType error,
|
| const char* error_message) {
|
| DCHECK(object);
|
| @@ -218,9 +243,9 @@
|
| static_cast<UnmountDeviceRecursiveCallbackData*>(object);
|
|
|
| // Do standard processing for Unmount event.
|
| - cb_data->object->OnUnmountRemovableDevice(device_path,
|
| - error,
|
| - error_message);
|
| + cb_data->object->OnUnmountPath(device_path,
|
| + error,
|
| + error_message);
|
| if (error == MOUNT_METHOD_ERROR_LOCAL) {
|
| cb_data->success = false;
|
| } else if (error == MOUNT_METHOD_ERROR_NONE) {
|
| @@ -275,14 +300,23 @@
|
| }
|
|
|
|
|
| - void OnMountRemovableDevice(const char* device_path,
|
| - const char* mount_path,
|
| - MountMethodErrorType error,
|
| - const char* error_message) {
|
| - DCHECK(device_path);
|
| + void OnMountCompleted(MountError error_code,
|
| + const char* source_path,
|
| + MountType type,
|
| + const char* mount_path) {
|
| + DCHECK(source_path);
|
|
|
| - if (error == MOUNT_METHOD_ERROR_NONE && device_path && mount_path) {
|
| - std::string path(device_path);
|
| + FireMountCompleted(MOUNTING, error_code, source_path, type, mount_path);
|
| +
|
| + if (error_code == MOUNT_ERROR_NONE &&
|
| + mount_points_.find(source_path) == mount_points_.end()) {
|
| + mount_points_.insert(MountPointMap::value_type(source_path,
|
| + MountPointInfo(source_path, mount_path, type)));
|
| + }
|
| +
|
| + if (error_code == MOUNT_ERROR_NONE && type == MOUNT_TYPE_DEVICE &&
|
| + source_path && mount_path) {
|
| + std::string path(source_path);
|
| DiskMap::iterator iter = disks_.find(path);
|
| if (iter == disks_.end()) {
|
| // disk might have been removed by now?
|
| @@ -292,19 +326,27 @@
|
| DCHECK(disk);
|
| disk->set_mount_path(mount_path);
|
| FireDiskStatusUpdate(MOUNT_DISK_MOUNTED, disk);
|
| - } else {
|
| - LOG(WARNING) << "Mount request failed for device "
|
| - << device_path << ", with error: "
|
| - << (error_message ? error_message : "Unknown");
|
| }
|
| }
|
|
|
| - void OnUnmountRemovableDevice(const char* device_path,
|
| - MountMethodErrorType error,
|
| - const char* error_message) {
|
| - DCHECK(device_path);
|
| - if (error == MOUNT_METHOD_ERROR_NONE && device_path) {
|
| - std::string path(device_path);
|
| + void OnUnmountPath(const char* source_path,
|
| + MountMethodErrorType error,
|
| + const char* error_message) {
|
| + DCHECK(source_path);
|
| +
|
| + if (error == MOUNT_METHOD_ERROR_NONE && source_path) {
|
| + MountPointMap::iterator mount_points_it = mount_points_.find(source_path);
|
| + if (mount_points_it == mount_points_.end())
|
| + return;
|
| + // TODO(tbarzic): Add separate, PathUnmounted event to Observer.
|
| + FireMountCompleted(UNMOUNTING,
|
| + MOUNT_ERROR_NONE,
|
| + mount_points_it->second.source_path.c_str(),
|
| + mount_points_it->second.mount_type,
|
| + mount_points_it->second.mount_path.c_str());
|
| + mount_points_.erase(mount_points_it);
|
| +
|
| + std::string path(source_path);
|
| DiskMap::iterator iter = disks_.find(path);
|
| if (iter == disks_.end()) {
|
| // disk might have been removed by now?
|
| @@ -316,7 +358,7 @@
|
| FireDiskStatusUpdate(MOUNT_DISK_UNMOUNTED, disk);
|
| } else {
|
| LOG(WARNING) << "Unmount request failed for device "
|
| - << device_path << ", with error: "
|
| + << source_path << ", with error: "
|
| << (error_message ? error_message : "Unknown");
|
| }
|
| }
|
| @@ -476,16 +518,17 @@
|
| type = MOUNT_DEVICE_SCANNED;
|
| break;
|
| }
|
| - default:
|
| + default: {
|
| return;
|
| + }
|
| }
|
| FireDeviceStatusUpdate(type, std::string(device_path));
|
| }
|
|
|
| void Init() {
|
| // Getting the monitor status so that the daemon starts up.
|
| - mount_status_connection_ = MonitorMountEvents(
|
| - &MonitorMountEventsHandler, this);
|
| + mount_status_connection_ = MonitorAllMountEvents(
|
| + &MonitorMountEventsHandler, &MountCompletedHandler, this);
|
| }
|
|
|
| void FireDiskStatusUpdate(MountLibraryEventType evt,
|
| @@ -504,6 +547,21 @@
|
| Observer, observers_, DeviceChanged(evt, device_path));
|
| }
|
|
|
| + void FireMountCompleted(MountEvent event_type,
|
| + MountError error_code,
|
| + const char* source_path,
|
| + MountType mount_type,
|
| + const char* mount_path) {
|
| + // Make sure we run on UI thread.
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + FOR_EACH_OBSERVER(
|
| + Observer, observers_, MountCompleted(event_type,
|
| + error_code,
|
| + source_path,
|
| + mount_type,
|
| + mount_path));
|
| + }
|
| +
|
| // Mount event change observers.
|
| ObserverList<Observer> observers_;
|
|
|
| @@ -514,6 +572,8 @@
|
| // The list of disks found.
|
| MountLibrary::DiskMap disks_;
|
|
|
| + MountLibrary::MountPointMap mount_points_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(MountLibraryImpl);
|
| };
|
|
|
| @@ -526,9 +586,20 @@
|
| virtual void AddObserver(Observer* observer) OVERRIDE {}
|
| virtual void RemoveObserver(Observer* observer) OVERRIDE {}
|
| virtual const DiskMap& disks() const OVERRIDE { return disks_; }
|
| + virtual const MountPointMap& mount_points() const OVERRIDE {
|
| + return mount_points_;
|
| + }
|
| + virtual std::string MountTypeToString(MountType type) const OVERRIDE {
|
| + return "";
|
| + }
|
| + virtual MountType MountTypeFromString(const std::string& type_str) const
|
| + OVERRIDE {
|
| + return MOUNT_TYPE_INVALID;
|
| + }
|
| virtual void RequestMountInfoRefresh() OVERRIDE {}
|
| - virtual void MountPath(const char* device_path) OVERRIDE {}
|
| - virtual void UnmountPath(const char* device_path) OVERRIDE {}
|
| + virtual void MountPath(const char* source_path, MountType type,
|
| + const MountPathOptions& options) OVERRIDE {}
|
| + virtual void UnmountPath(const char* path) OVERRIDE {}
|
| virtual void UnmountDeviceRecursive(const char* device_path,
|
| UnmountDeviceRecursiveCallbackType callback, void* user_data)
|
| OVERRIDE {}
|
| @@ -536,6 +607,7 @@
|
| private:
|
| // The list of disks found.
|
| DiskMap disks_;
|
| + MountPointMap mount_points_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(MountLibraryStubImpl);
|
| };
|
|
|