diff options
Diffstat (limited to 'chrome/browser/chromeos/cros/mount_library.cc')
-rw-r--r-- | chrome/browser/chromeos/cros/mount_library.cc | 199 |
1 files changed, 135 insertions, 64 deletions
diff --git a/chrome/browser/chromeos/cros/mount_library.cc b/chrome/browser/chromeos/cros/mount_library.cc index 79e723a..df0b2c0 100644 --- a/chrome/browser/chromeos/cros/mount_library.cc +++ b/chrome/browser/chromeos/cros/mount_library.cc @@ -16,6 +16,38 @@ const char* kDeviceNotFound = "Device could not be found"; namespace chromeos { +// static +std::string MountLibrary::MountTypeToString(MountType type) { + 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 ""; +} + +// static +MountType MountLibrary::MountTypeFromString( + const std::string& type_str) + 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; + } +} + MountLibrary::Disk::Disk(const std::string& device_path, const std::string& mount_path, const std::string& system_path, @@ -90,31 +122,27 @@ class MountLibraryImpl : public MountLibrary { observers_.RemoveObserver(observer); } - virtual void MountPath(const char* device_path) OVERRIDE { + 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, + MountPointInfo(source_path, NULL, type)); 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 +179,10 @@ class MountLibraryImpl : public MountLibrary { 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 +207,34 @@ class MountLibraryImpl : public MountLibrary { } 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), + MountPointInfo(source_path, mount_path, type)); } // 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 +242,9 @@ class MountLibraryImpl : public MountLibrary { 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 +299,26 @@ class MountLibraryImpl : public MountLibrary { } - 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 MountPointInfo& mount_info) { + DCHECK(!mount_info.source_path.empty()); - if (error == MOUNT_METHOD_ERROR_NONE && device_path && mount_path) { - std::string path(device_path); + FireMountCompleted(MOUNTING, + error_code, + mount_info); + + if (error_code == MOUNT_ERROR_NONE && + mount_points_.find(mount_info.source_path) == mount_points_.end()) { + mount_points_.insert(MountPointMap::value_type( + mount_info.source_path.c_str(), + mount_info)); + } + + if (error_code == MOUNT_ERROR_NONE && + mount_info.mount_type == MOUNT_TYPE_DEVICE && + !mount_info.source_path.empty() && + !mount_info.mount_path.empty()) { + std::string path(mount_info.source_path); DiskMap::iterator iter = disks_.find(path); if (iter == disks_.end()) { // disk might have been removed by now? @@ -290,21 +326,30 @@ class MountLibraryImpl : public MountLibrary { } Disk* disk = iter->second; DCHECK(disk); - disk->set_mount_path(mount_path); + disk->set_mount_path(mount_info.mount_path.c_str()); 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, + MountPointInfo(mount_points_it->second.source_path.c_str(), + mount_points_it->second.mount_path.c_str(), + mount_points_it->second.mount_type)); + 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 +361,7 @@ class MountLibraryImpl : public MountLibrary { 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 +521,17 @@ class MountLibraryImpl : public MountLibrary { 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 +550,17 @@ class MountLibraryImpl : public MountLibrary { Observer, observers_, DeviceChanged(evt, device_path)); } + void FireMountCompleted(MountEvent event_type, + MountError error_code, + const MountPointInfo& mount_info) { + // Make sure we run on UI thread. + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + FOR_EACH_OBSERVER( + Observer, observers_, MountCompleted(event_type, + error_code, + mount_info)); + } + // Mount event change observers. ObserverList<Observer> observers_; @@ -514,6 +571,8 @@ class MountLibraryImpl : public MountLibrary { // The list of disks found. MountLibrary::DiskMap disks_; + MountLibrary::MountPointMap mount_points_; + DISALLOW_COPY_AND_ASSIGN(MountLibraryImpl); }; @@ -526,9 +585,20 @@ class MountLibraryStubImpl : public MountLibrary { 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 +606,7 @@ class MountLibraryStubImpl : public MountLibrary { private: // The list of disks found. DiskMap disks_; + MountPointMap mount_points_; DISALLOW_COPY_AND_ASSIGN(MountLibraryStubImpl); }; |