autorun: prefer Safe Removal over eject/unmount if possible

Basically do what NautilusPlacesSidebar does with the drive/volume/mount
eject/unmount/stop priorities.

We follow this pattern:
- always prefer Safely Remove if available (i.e. drive.stop())
- fallback to ejecting the mount/volume/drive if that's not possible
- finally, fallback to unmounting the mount if even eject is not
  available

This also means we don't care about the distinction between
Stop/Eject/Unmount at this level. Disk Utility (or Nautilus) are
available for those who want that degree of control, but the common case
here should do the most useful action without presenting the choice.

https://bugzilla.gnome.org/show_bug.cgi?id=653520
This commit is contained in:
Cosimo Cecchi 2011-06-23 10:08:17 -04:00
parent e1c687184e
commit 5c1dd4ea18

View File

@ -205,20 +205,35 @@ AutorunManager.prototype = {
ejectMount: function(mount) { ejectMount: function(mount) {
let mountOp = new ShellMountOperation.ShellMountOperation(mount); let mountOp = new ShellMountOperation.ShellMountOperation(mount);
if (mount.can_eject()) // first, see if we have a drive
mount.eject_with_operation(0, mountOp.mountOp, null, let drive = mount.get_drive();
Lang.bind(this, this._onMountEject)); let volume = mount.get_volume();
else
mount.unmount_with_operation(0, mountOp.mountOp, null, if (drive &&
Lang.bind(this, this._onMountEject)); drive.get_start_stop_type() == Gio.DriveStartStopType.SHUTDOWN &&
drive.can_stop()) {
drive.stop(0, mountOp.mountOp, null,
Lang.bind(this, this._onStop));
} else {
if (mount.can_eject()) {
mount.eject_with_operation(0, mountOp.mountOp, null,
Lang.bind(this, this._onEject));
} else if (volume && volume.can_eject()) {
volume.eject_with_operation(0, mountOp.mountOp, null,
Lang.bind(this, this._onEject));
} else if (drive && drive.can_eject()) {
drive.eject_with_operation(0, mountOp.mountOp, null,
Lang.bind(this, this._onEject));
} else if (mount.can_unmount()) {
mount.unmount_with_operation(0, mountOp.mountOp, null,
Lang.bind(this, this._onUnmount));
}
}
}, },
_onMountEject: function(mount, res) { _onUnmount: function(mount, res) {
try { try {
if (mount.can_eject()) mount.unmount_with_operation_finish(res);
mount.eject_with_operation_finish(res);
else
mount.unmount_with_operation_finish(res);
} catch (e) { } catch (e) {
// FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here // FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here
// but we can't access the error code from JS. // but we can't access the error code from JS.
@ -227,6 +242,30 @@ AutorunManager.prototype = {
+ ': ' + e.toString()); + ': ' + e.toString());
} }
}, },
_onEject: function(source, res) {
try {
source.eject_with_operation_finish(res);
} catch (e) {
// FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here
// but we can't access the error code from JS.
// See https://bugzilla.gnome.org/show_bug.cgi?id=591480
log('Unable to eject the drive ' + source.get_name()
+ ': ' + e.toString());
}
},
_onStop: function(drive, res) {
try {
drive.stop_finish(res);
} catch (e) {
// FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here
// but we can't access the error code from JS.
// See https://bugzilla.gnome.org/show_bug.cgi?id=591480
log('Unable to stop the drive ' + drive.get_name()
+ ': ' + e.toString());
}
},
} }
function AutorunResidentSource() { function AutorunResidentSource() {