diff options
author | Michele Calgaro <[email protected]> | 2022-04-20 19:24:06 +0900 |
---|---|---|
committer | Michele Calgaro <[email protected]> | 2022-04-20 19:24:29 +0900 |
commit | 9050bd434654db32612557a63cfc4d23d401b3ef (patch) | |
tree | 2c15f1e516908e108143742f6d2d358862e7d70c /tdecore | |
parent | d8ddbb090a47aa254fa6422a062ca89ba0d4c37e (diff) | |
download | tdelibs-9050bd434654db32612557a63cfc4d23d401b3ef.tar.gz tdelibs-9050bd434654db32612557a63cfc4d23d401b3ef.zip |
tdehw lib: power off USB devices after ejecting them when udisks/udisks2 are used.
Signed-off-by: Michele Calgaro <[email protected]>
Diffstat (limited to 'tdecore')
-rw-r--r-- | tdecore/tdehw/disksHelper.cpp | 76 |
1 files changed, 70 insertions, 6 deletions
diff --git a/tdecore/tdehw/disksHelper.cpp b/tdecore/tdehw/disksHelper.cpp index 4eb3709ca..c47bc5e04 100644 --- a/tdecore/tdehw/disksHelper.cpp +++ b/tdecore/tdehw/disksHelper.cpp @@ -64,8 +64,41 @@ TQStringVariantMap udisksEjectDrive(TDEStorageDevice *sdevice) { return result; } else { - result["result"] = true; - return result; + // Eject was successful. Check if the media can be powered off and do so in case + TQT_DBusProxy driveInformation("org.freedesktop.UDisks", blockDeviceString, + "org.freedesktop.DBus.Properties", dbusConn); + params.clear(); + params << TQT_DBusData::fromString("org.freedesktop.UDisks.Drive") << TQT_DBusData::fromString("DriveCanDetach"); + TQT_DBusMessage reply = driveInformation.sendWithReply("Get", params, &error); + if (error.isValid()) { + // Error! + result["errStr"] = error.name() + ": " + error.message(); + return result; + } + + if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { + bool canPowerOff = reply[0].toVariant().value.toBool(); + if (!canPowerOff) { + // This drive does not support power off. Just return since the eject operation has finished. + result["result"] = true; + return result; + } + + // Power off the drive! + params.clear(); + TQT_DBusDataMap<TQString> options(TQT_DBusData::Variant); + params << TQT_DBusData::fromStringKeyMap(options); + TQT_DBusMessage reply = driveControl.sendWithReply("DriveDetach", params, &error); + if (error.isValid()) { + // Error! + result["errStr"] = error.name() + ": " + error.message(); + return result; + } + else { + result["result"] = true; + return result; + } + } } } } @@ -193,7 +226,7 @@ TQStringVariantMap udisks2EjectDrive(TDEStorageDevice *sdevice) { TQT_DBusProxy driveInformation("org.freedesktop.UDisks2", driveObjectPath, "org.freedesktop.DBus.Properties", dbusConn); // can eject? - TQValueList<TQT_DBusData> params; + params.clear(); params << TQT_DBusData::fromString("org.freedesktop.UDisks2.Drive") << TQT_DBusData::fromString("Ejectable"); TQT_DBusMessage reply = driveInformation.sendWithReply("Get", params, &error); if (error.isValid()) { @@ -211,7 +244,7 @@ TQStringVariantMap udisks2EjectDrive(TDEStorageDevice *sdevice) { // Eject the drive! TQT_DBusProxy driveControl("org.freedesktop.UDisks2", driveObjectPath, "org.freedesktop.UDisks2.Drive", dbusConn); - TQValueList<TQT_DBusData> params; + params.clear(); TQT_DBusDataMap<TQString> options(TQT_DBusData::Variant); params << TQT_DBusData::fromStringKeyMap(options); TQT_DBusMessage reply = driveControl.sendWithReply("Eject", params, &error); @@ -221,8 +254,39 @@ TQStringVariantMap udisks2EjectDrive(TDEStorageDevice *sdevice) { return result; } else { - result["result"] = true; - return result; + // Eject was successful. Check if the media can be powered off and do so in case + params.clear(); + params << TQT_DBusData::fromString("org.freedesktop.UDisks2.Drive") << TQT_DBusData::fromString("CanPowerOff"); + TQT_DBusMessage reply = driveInformation.sendWithReply("Get", params, &error); + if (error.isValid()) { + // Error! + result["errStr"] = error.name() + ": " + error.message(); + return result; + } + + if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { + bool canPowerOff = reply[0].toVariant().value.toBool(); + if (!canPowerOff) { + // This drive does not support power off. Just return since the eject operation has finished. + result["result"] = true; + return result; + } + + // Power off the drive! + params.clear(); + TQT_DBusDataMap<TQString> options(TQT_DBusData::Variant); + params << TQT_DBusData::fromStringKeyMap(options); + TQT_DBusMessage reply = driveControl.sendWithReply("PowerOff", params, &error); + if (error.isValid()) { + // Error! + result["errStr"] = error.name() + ": " + error.message(); + return result; + } + else { + result["result"] = true; + return result; + } + } } } } |