summaryrefslogtreecommitdiffstats
path: root/tdecore
diff options
context:
space:
mode:
authorMichele Calgaro <michele.calgaro@yahoo.it>2022-04-20 19:24:06 +0900
committerMichele Calgaro <michele.calgaro@yahoo.it>2022-04-20 19:24:29 +0900
commit9050bd434654db32612557a63cfc4d23d401b3ef (patch)
tree2c15f1e516908e108143742f6d2d358862e7d70c /tdecore
parentd8ddbb090a47aa254fa6422a062ca89ba0d4c37e (diff)
downloadtdelibs-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 <michele.calgaro@yahoo.it>
Diffstat (limited to 'tdecore')
-rw-r--r--tdecore/tdehw/disksHelper.cpp76
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;
+ }
+ }
}
}
}