/* This file is part of the TDE libraries Copyright (C) 2012 Timothy Pearson (C) 2013 Golubev Alexander This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "disksHelper.h" #include "tdelocale.h" #include "tdestoragedevice.h" #if defined(WITH_UDISKS) || defined(WITH_UDISKS2) #include #include #include #include #include #include #include #include #include "tqdbusdatalist.h" #endif #ifdef WITH_UDISKS //------------------------------- // UDisks //------------------------------- TQStringVariantMap UDisksEjectDrive(TDEStorageDevice *sdevice) { TQStringVariantMap result; result["result"] = false; TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQString blockDeviceString = sdevice->deviceNode(); blockDeviceString.replace("/dev/", ""); blockDeviceString.replace("-", "_2d"); blockDeviceString = "/org/freedesktop/UDisks/devices/" + blockDeviceString; // Eject the drive! TQT_DBusError error; TQT_DBusProxy driveControl("org.freedesktop.UDisks", blockDeviceString, "org.freedesktop.UDisks.Device", dbusConn); if (driveControl.canSend()) { TQValueList params; TQT_DBusDataList options; params << TQT_DBusData::fromList(options); TQT_DBusMessage reply = driveControl.sendWithReply("DriveEject", params, &error); if (error.isValid()) { // Error! result["errStr"] = error.name() + ": " + error.message(); return result; } else { result["result"] = true; return result; } } } return result; } TQStringVariantMap UDisksMountDrive(TQString deviceNode, TQString fileSystemType, TQStringList mountOptions) { TQStringVariantMap result; result["result"] = false; result["retcode"] = -2; TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQString blockDeviceString = deviceNode; blockDeviceString.replace("/dev/", ""); blockDeviceString.replace("-", "_2d"); blockDeviceString = "/org/freedesktop/UDisks/devices/" + blockDeviceString; // Mount the drive! TQT_DBusError error; TQT_DBusProxy driveControl("org.freedesktop.UDisks", blockDeviceString, "org.freedesktop.UDisks.Device", dbusConn); if (driveControl.canSend()) { TQValueList params; params << TQT_DBusData::fromString(fileSystemType); params << TQT_DBusData::fromList(TQT_DBusDataList(mountOptions)); TQT_DBusMessage reply = driveControl.sendWithReply("FilesystemMount", params, &error); if (!error.isValid()) { // Success result["retcode"] = 0; result["result"] = true; return result; } else { // Error! if (error.name() == "org.freedesktop.DBus.Error.ServiceUnknown") { return result; // Service not installed or unavailable } else { result["errStr"] = error.name() + ": " + error.message(); result["retcode"] = -1; return result; } } } } return result; } TQStringVariantMap UDisksUnmountDrive(TQString deviceNode, TQStringList unmountOptions) { TQStringVariantMap result; result["result"] = false; result["retcode"] = -2; TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQString blockDeviceString = deviceNode; blockDeviceString.replace("/dev/", ""); blockDeviceString.replace("-", "_2d"); blockDeviceString = "/org/freedesktop/UDisks/devices/" + blockDeviceString; // Mount the drive! TQT_DBusError error; TQT_DBusProxy driveControl("org.freedesktop.UDisks", blockDeviceString, "org.freedesktop.UDisks.Device", dbusConn); if (driveControl.canSend()) { TQValueList params; params << TQT_DBusData::fromList(TQT_DBusDataList(unmountOptions)); TQT_DBusMessage reply = driveControl.sendWithReply("FilesystemUnmount", params, &error); if (!error.isValid()) { // Success result["retcode"] = 0; result["result"] = true; return result; } else { // Error! if (error.name() == "org.freedesktop.DBus.Error.ServiceUnknown") { return result; // Service not installed or unavailable } else { result["errStr"] = error.name() + ": " + error.message(); result["retcode"] = -1; return result; } } } } return result; } #endif #ifdef WITH_UDISKS2 //------------------------------- // UDisks2 //------------------------------- TQStringVariantMap UDisks2EjectDrive(TDEStorageDevice *sdevice) { TQStringVariantMap result; result["result"] = false; TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQString blockDeviceString = sdevice->deviceNode(); blockDeviceString.replace("/dev/", ""); blockDeviceString.replace("-", "_2d"); blockDeviceString = "/org/freedesktop/UDisks2/block_devices/" + blockDeviceString; TQT_DBusProxy hardwareControl("org.freedesktop.UDisks2", blockDeviceString, "org.freedesktop.DBus.Properties", dbusConn); if (hardwareControl.canSend()) { // get associated udisks2 drive path TQT_DBusError error; TQValueList params; params << TQT_DBusData::fromString("org.freedesktop.UDisks2.Block") << TQT_DBusData::fromString("Drive"); TQT_DBusMessage reply = hardwareControl.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) { TQT_DBusObjectPath driveObjectPath = reply[0].toVariant().value.toObjectPath(); if (!driveObjectPath.isValid()) { return result; } error = TQT_DBusError(); TQT_DBusProxy driveInformation("org.freedesktop.UDisks2", driveObjectPath, "org.freedesktop.DBus.Properties", dbusConn); // can eject? TQValueList params; params << TQT_DBusData::fromString("org.freedesktop.UDisks2.Drive") << TQT_DBusData::fromString("Ejectable"); 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 ejectable = reply[0].toVariant().value.toBool(); if (!ejectable) { result["errStr"] = i18n("Media not ejectable"); return result; } // Eject the drive! TQT_DBusProxy driveControl("org.freedesktop.UDisks2", driveObjectPath, "org.freedesktop.UDisks2.Drive", dbusConn); TQValueList params; TQT_DBusDataMap options(TQT_DBusData::Variant); params << TQT_DBusData::fromStringKeyMap(options); TQT_DBusMessage reply = driveControl.sendWithReply("Eject", params, &error); if (error.isValid()) { // Error! result["errStr"] = error.name() + ": " + error.message(); return result; } else { result["result"] = true; return result; } } } } } return result; } TQStringVariantMap UDisks2MountDrive(TQString deviceNode, TQString fileSystemType, TQString mountOptions) { TQStringVariantMap result; result["result"] = false; result["retcode"] = -2; TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQString blockDeviceString = deviceNode; blockDeviceString.replace("/dev/", ""); blockDeviceString.replace("-", "_2d"); blockDeviceString = "/org/freedesktop/UDisks2/block_devices/" + blockDeviceString; // Mount the drive! TQT_DBusError error; TQT_DBusProxy driveControl("org.freedesktop.UDisks2", blockDeviceString, "org.freedesktop.UDisks2.Filesystem", dbusConn); if (driveControl.canSend()) { TQValueList params; TQMap optionsMap; if (fileSystemType != "") { optionsMap["fstype"] = (TQT_DBusData::fromString(fileSystemType)).getAsVariantData(); } optionsMap["options"] = (TQT_DBusData::fromString(mountOptions)).getAsVariantData(); params << TQT_DBusData::fromStringKeyMap(TQT_DBusDataMap(optionsMap)); TQT_DBusMessage reply = driveControl.sendWithReply("Mount", params, &error); if (!error.isValid()) { // Success result["retcode"] = 0; result["result"] = true; return result; } else { // Error! if (error.name() == "org.freedesktop.DBus.Error.ServiceUnknown") { return result; // Service not installed or unavailable } else { result["errStr"] = error.name() + ": " + error.message(); result["retcode"] = -1; return result; } } } } return result; } TQStringVariantMap UDisks2UnmountDrive(TQString deviceNode, TQString unmountOptions) { TQStringVariantMap result; result["result"] = false; result["retcode"] = -2; TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQString blockDeviceString = deviceNode; blockDeviceString.replace("/dev/", ""); blockDeviceString.replace("-", "_2d"); blockDeviceString = "/org/freedesktop/UDisks2/block_devices/" + blockDeviceString; // Mount the drive! TQT_DBusError error; TQT_DBusProxy driveControl("org.freedesktop.UDisks2", blockDeviceString, "org.freedesktop.UDisks2.Filesystem", dbusConn); if (driveControl.canSend()) { TQValueList params; TQMap optionsMap; optionsMap["options"] = (TQT_DBusData::fromString(unmountOptions)).getAsVariantData(); params << TQT_DBusData::fromStringKeyMap(TQT_DBusDataMap(optionsMap)); TQT_DBusMessage reply = driveControl.sendWithReply("Unmount", params, &error); if (!error.isValid()) { // Success result["retcode"] = 0; result["result"] = true; return result; } else { // Error! if (error.name() == "org.freedesktop.DBus.Error.ServiceUnknown") { return result; // Service not installed or unavailable } else { result["errStr"] = error.name() + ": " + error.message(); result["retcode"] = -1; return result; } } } } return result; } #endif