From 9050bd434654db32612557a63cfc4d23d401b3ef Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Wed, 20 Apr 2022 19:24:06 +0900 Subject: tdehw lib: power off USB devices after ejecting them when udisks/udisks2 are used. Signed-off-by: Michele Calgaro --- tdecore/tdehw/disksHelper.cpp | 76 +++++++++++++++++++++++++++++++++++++++---- 1 file 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 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 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 params; + params.clear(); TQT_DBusDataMap 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 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; + } + } } } } -- cgit v1.2.1