Chromium Code Reviews| Index: chrome/browser/chromeos/cros/mount_library.cc |
| diff --git a/chrome/browser/chromeos/cros/mount_library.cc b/chrome/browser/chromeos/cros/mount_library.cc |
| index 2457a0912c7aacee0b38786882b95c27f57f581a..a77bba610ae6457b03c30866a4b06c5c29ff8337 100644 |
| --- a/chrome/browser/chromeos/cros/mount_library.cc |
| +++ b/chrome/browser/chromeos/cros/mount_library.cc |
| @@ -5,6 +5,7 @@ |
| #include "chrome/browser/chromeos/cros/mount_library.h" |
| #include <set> |
| +#include <vector> |
| #include "base/message_loop.h" |
| #include "base/string_util.h" |
| @@ -117,6 +118,50 @@ class MountLibraryImpl : public MountLibrary { |
| this); |
| } |
| + virtual void FormatUnmountedDevice(const char* device_path) OVERRIDE { |
|
tbarzic
2011/07/25 20:43:04
Argument name should match name in MountLibrary.h
sidor
2011/07/25 21:40:07
Done.
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + if (!CrosLibrary::Get()->EnsureLoaded()) { |
| + OnFormatDevice(device_path, |
| + false, |
| + MOUNT_METHOD_ERROR_LOCAL, |
| + kLibraryNotLoaded); |
| + return; |
| + } |
|
tbarzic
2011/07/25 20:43:04
If you leave this exposed through MountLibrary, ch
sidor
2011/07/25 21:40:07
Done.
|
| + FormatDevice(device_path, |
| + "vfat", // currently format in vfat by default |
| + &MountLibraryImpl::FormatDeviceCallback, |
| + this); |
| + } |
| + |
| + virtual void FormatMountedDevice(const char* device_mount_path) OVERRIDE { |
| + DCHECK(device_mount_path); |
|
tbarzic
2011/07/25 20:43:04
Would it be possible to pass device_path to this m
sidor
2011/07/25 21:40:07
Nope. UI, does not know the device path. At least
|
| + std::string device_path, file_path; |
| + for (MountLibrary::DiskMap::iterator it = disks_.begin(); |
| + it != disks_.end(); ++it) { |
| + if (it->second->mount_path().compare(device_mount_path) == 0) { |
| + device_path = it->second->device_path(); |
| + file_path = it->second->file_path(); |
| + } |
| + } |
| + if (device_path.empty()) { |
| + OnFormatDevice(device_path.c_str(), |
| + false, |
| + MOUNT_METHOD_ERROR_LOCAL, |
| + "Device with this mount path not found."); |
| + return; |
| + } |
| + if (to_be_formated_.find(device_path) != to_be_formated_.end()) { |
|
tbarzic
2011/07/25 20:43:04
I agree with achuith that format_pending_ would be
sidor
2011/07/25 21:40:07
Done.
|
| + OnFormatDevice(device_path.c_str(), |
| + false, |
| + MOUNT_METHOD_ERROR_LOCAL, |
| + "Formatting is already pending."); |
| + return; |
| + } |
| + // Formatting process continues, after unmounting. |
| + to_be_formated_[device_path] = file_path; |
| + UnmountPath(device_path.c_str()); |
| + } |
| + |
| virtual void UnmountDeviceRecursive(const char* device_path, |
| UnmountDeviceRecursiveCallbackType callback, void* user_data) |
| OVERRIDE { |
| @@ -207,6 +252,17 @@ class MountLibraryImpl : public MountLibrary { |
| error_message); |
| } |
| + // Callback for FormatRemovableDevice method. |
| + static void FormatDeviceCallback(void* object, |
| + const char* device_path, |
| + bool success, |
| + MountMethodErrorType error, |
| + const char* error_message) { |
| + DCHECK(object); |
| + MountLibraryImpl* self = static_cast<MountLibraryImpl*>(object); |
| + self->OnFormatDevice(device_path, success, error, error_message); |
| + } |
| + |
| // Callback for UnmountDeviceRecursive. |
| static void UnmountDeviceRecursiveCallback(void* object, |
| const char* device_path, |
| @@ -225,7 +281,7 @@ class MountLibraryImpl : public MountLibrary { |
| cb_data->success = false; |
| } else if (error == MOUNT_METHOD_ERROR_NONE) { |
| LOG(WARNING) << device_path << " unmounted."; |
| - } |
| + } |
| // This is safe as long as all callbacks are called on the same thread as |
| // UnmountDeviceRecursive. |
| @@ -314,6 +370,13 @@ class MountLibraryImpl : public MountLibrary { |
| DCHECK(disk); |
| disk->clear_mount_path(); |
| FireDiskStatusUpdate(MOUNT_DISK_UNMOUNTED, disk); |
| + // Check if there is a formatting scheduled |
| + PathMap::iterator it = to_be_formated_.find(device_path); |
| + if (it != to_be_formated_.end()) { |
| + const std::string file_path = it->second; |
| + to_be_formated_.erase(it); |
| + FormatUnmountedDevice(file_path.c_str()); |
| + } |
| } else { |
| LOG(WARNING) << "Unmount request failed for device " |
| << device_path << ", with error: " |
| @@ -321,6 +384,24 @@ class MountLibraryImpl : public MountLibrary { |
| } |
| } |
| + void OnFormatDevice(const char* device_path, |
| + bool success, |
| + MountMethodErrorType error, |
| + const char* error_message) { |
| + DCHECK(device_path); |
| + |
| + if (error == MOUNT_METHOD_ERROR_NONE && device_path && success) { |
| + FireDeviceStatusUpdate(MOUNT_FORMATTING_STARTED, device_path); |
| + } else { |
| + FireDeviceStatusUpdate(MOUNT_FORMATTING_STARTED, |
|
tbarzic
2011/07/25 20:43:04
Have you considered adding MOUNT_FORMATTING_FAILED
sidor
2011/07/25 21:40:07
Yes, I already talk about this with BenChan. There
|
| + std::string("!") + device_path); |
| + LOG(WARNING) << "Format request failed for device " |
| + << device_path << ", with error: " |
| + << (error_message ? error_message : "Unknown"); |
| + } |
| + } |
| + |
| + |
| void OnGetDiskProperties(const char* device_path, |
| const DiskInfo* disk1, |
| MountMethodErrorType error, |
| @@ -476,6 +557,10 @@ class MountLibraryImpl : public MountLibrary { |
| type = MOUNT_DEVICE_SCANNED; |
| break; |
| } |
| + case FORMATTING_FINISHED: { |
| + type = MOUNT_FORMATTING_FINISHED; |
| + break; |
| + } |
| } |
| FireDeviceStatusUpdate(type, std::string(device_path)); |
| } |
| @@ -512,6 +597,10 @@ class MountLibraryImpl : public MountLibrary { |
| // The list of disks found. |
| MountLibrary::DiskMap disks_; |
| + // Set of devices that are supposed to be formated, but are currently waiting |
| + // to be unmounted. |
| + PathMap to_be_formated_; //after unmounting |
| + |
| DISALLOW_COPY_AND_ASSIGN(MountLibraryImpl); |
| }; |
| @@ -527,6 +616,8 @@ class MountLibraryStubImpl : public MountLibrary { |
| virtual void RequestMountInfoRefresh() OVERRIDE {} |
| virtual void MountPath(const char* device_path) OVERRIDE {} |
| virtual void UnmountPath(const char* device_path) OVERRIDE {} |
| + virtual void FormatUnmountedDevice(const char* device_path) OVERRIDE {} |
| + virtual void FormatMountedDevice(const char* device_mount_path) OVERRIDE {} |
| virtual void UnmountDeviceRecursive(const char* device_path, |
| UnmountDeviceRecursiveCallbackType callback, void* user_data) |
| OVERRIDE {} |