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); |
}; |