Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(240)

Unified Diff: chrome/browser/chromeos/cros/mount_library.cc

Issue 7471024: Formatting feature initial commit for ChromeOS Tree (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: final. Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 f740b7ca750caa9c4f6138a50e2503e3e78162e6..c63ab4860da528d9258cbb868238172cd8983637 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"
@@ -144,6 +145,62 @@ class MountLibraryImpl : public MountLibrary {
UnmountMountPoint(path, &MountLibraryImpl::UnmountMountPointCallback, this);
}
+ virtual void FormatUnmountedDevice(const char* file_path) OVERRIDE {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ if (!CrosLibrary::Get()->EnsureLoaded()) {
+ OnFormatDevice(file_path,
+ false,
+ MOUNT_METHOD_ERROR_LOCAL,
+ kLibraryNotLoaded);
+ return;
+ }
+ for (MountLibrary::DiskMap::iterator it = disks_.begin();
+ it != disks_.end(); ++it) {
+ if (it->second->file_path().compare(file_path) == 0 &&
+ !it->second->mount_path().empty()) {
+ OnFormatDevice(file_path,
+ false,
+ MOUNT_METHOD_ERROR_LOCAL,
+ "Device is still mounted.");
+ return;
+ }
+ }
+ FormatDevice(file_path,
+ "vfat", // currently format in vfat by default
+ &MountLibraryImpl::FormatDeviceCallback,
+ this);
+ }
+
+ virtual void FormatMountedDevice(const char* mount_path) OVERRIDE {
+ DCHECK(mount_path);
+ std::string device_path, file_path;
+ for (MountLibrary::DiskMap::iterator it = disks_.begin();
+ it != disks_.end(); ++it) {
+ if (it->second->mount_path().compare(mount_path) == 0) {
+ device_path = it->second->device_path();
+ file_path = it->second->file_path();
+ break;
+ }
+ }
+ if (device_path.empty()) {
+ OnFormatDevice(device_path.c_str(),
+ false,
+ MOUNT_METHOD_ERROR_LOCAL,
+ "Device with this mount path not found.");
+ return;
+ }
+ if (formatting_pending_.find(device_path) != formatting_pending_.end()) {
+ OnFormatDevice(device_path.c_str(),
+ false,
+ MOUNT_METHOD_ERROR_LOCAL,
+ "Formatting is already pending.");
+ return;
+ }
+ // Formatting process continues, after unmounting.
+ formatting_pending_[device_path] = file_path;
+ UnmountPath(device_path.c_str());
+ }
+
virtual void UnmountDeviceRecursive(const char* device_path,
UnmountDeviceRecursiveCallbackType callback, void* user_data)
OVERRIDE {
@@ -231,6 +288,17 @@ class MountLibraryImpl : public MountLibrary {
self->OnUnmountPath(device_path, error, 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,
@@ -248,7 +316,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.
@@ -358,6 +426,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 = formatting_pending_.find(source_path);
+ if (it != formatting_pending_.end()) {
+ const std::string file_path = it->second;
+ formatting_pending_.erase(it);
+ FormatUnmountedDevice(file_path.c_str());
+ }
} else {
LOG(WARNING) << "Unmount request failed for device "
<< source_path << ", with error: "
@@ -365,6 +440,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,
+ 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,
@@ -520,6 +613,10 @@ class MountLibraryImpl : public MountLibrary {
type = MOUNT_DEVICE_SCANNED;
break;
}
+ case FORMATTING_FINISHED: {
+ type = MOUNT_FORMATTING_FINISHED;
+ break;
+ }
default: {
return;
}
@@ -571,6 +668,10 @@ class MountLibraryImpl : public MountLibrary {
MountLibrary::DiskMap disks_;
MountLibrary::MountPointMap mount_points_;
+ // Set of devices that are supposed to be formated, but are currently waiting
+ // to be unmounted. When device is in this map, the formatting process HAVEN'T
+ // started yet.
+ PathMap formatting_pending_;
DISALLOW_COPY_AND_ASSIGN(MountLibraryImpl);
};
@@ -591,6 +692,8 @@ class MountLibraryStubImpl : public MountLibrary {
virtual void MountPath(const char* source_path, MountType type,
const MountPathOptions& options) OVERRIDE {}
virtual void UnmountPath(const char* path) OVERRIDE {}
+ virtual void FormatUnmountedDevice(const char* device_path) OVERRIDE {}
+ virtual void FormatMountedDevice(const char* mount_path) OVERRIDE {}
virtual void UnmountDeviceRecursive(const char* device_path,
UnmountDeviceRecursiveCallbackType callback, void* user_data)
OVERRIDE {}
« no previous file with comments | « chrome/browser/chromeos/cros/mount_library.h ('k') | chrome/browser/chromeos/extensions/file_browser_event_router.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698