/* 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 "tdestoragedevice.h" #include #include #include #include #include #include #include #include #include "tqdbusdatalist.h" //------------------------------- // UDisks //------------------------------- bool ejectDriveUDisks(TDEStorageDevice* sdevice) { 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! printf("[ERROR][tdehwlib] ejectDriveUDisks: %s\n", error.name().ascii()); fflush(stdout); return false; } else { return true; } } } return false; } int mountDriveUDisks(TQString deviceNode, TQString fileSystemType, TQStringList mountOptions, TQString* errStr) { 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()) { // Error! if (error.name() == "org.freedesktop.DBus.Error.ServiceUnknown") { // Service not installed or unavailable return -2; } if (errStr) { *errStr = error.name() + ": " + error.message(); } else { printf("[ERROR][tdehwlib] mountDriveUDisks: %s\n", error.name().ascii()); fflush(stdout); } return -1; } else { return 0; } } else { return -2; } } return -2; } int unMountDriveUDisks(TQString deviceNode, TQStringList unMountOptions, TQString* errStr) { 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()) { // Error! if (error.name() == "org.freedesktop.DBus.Error.ServiceUnknown") { // Service not installed or unavailable return -2; } if (errStr) { *errStr = error.name() + ": " + error.message(); } else { printf("[ERROR][tdehwlib] unMountDriveUDisks: %s\n", error.name().ascii()); fflush(stdout); } return -1; } else { return 0; } } else { return -2; } } return -2; } //------------------------------- // UDisks2 //------------------------------- bool ejectDriveUDisks2(TDEStorageDevice* sdevice) { 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! printf("[ERROR][tdehwlib] ejectDriveUDisks2: %s\n", error.name().ascii()); fflush(stdout); return false; } else { if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { TQT_DBusObjectPath driveObjectPath = reply[0].toVariant().value.toObjectPath(); if (!driveObjectPath.isValid()) { return false; } 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! printf("[ERROR][tdehwlib] ejectDriveUDisks2: %s\n", error.name().ascii()); fflush(stdout); return false; } if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { bool ejectable = reply[0].toVariant().value.toBool(); if (!ejectable) { return false; } // 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! printf("[ERROR][tdehwlib] ejectDriveUDisks2: %s\n", error.name().ascii()); fflush(stdout); return false; } else { return true; } } } } } } return false; } int mountDriveUDisks2(TQString deviceNode, TQString fileSystemType, TQString mountOptions, TQString* errStr) { 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()) { // Error! if (error.name() == "org.freedesktop.DBus.Error.ServiceUnknown") { // Service not installed or unavailable return -2; } if (errStr) { *errStr = error.name() + ": " + error.message(); } else { printf("[ERROR][tdehwlib] mountDriveUDisks2: %s\n", error.name().ascii()); fflush(stdout); } return -1; } else { return 0; } } else { return -2; } } return -2; } int unMountDriveUDisks2(TQString deviceNode, TQString unMountOptions, TQString* errStr) { 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()) { // Error! if (error.name() == "org.freedesktop.DBus.Error.ServiceUnknown") { // Service not installed or unavailable return -2; } if (errStr) { *errStr = error.name() + ": " + error.message(); } else { printf("[ERROR][tdehwlib] unMountDriveUDisks2: %s\n", error.name().ascii()); fflush(stdout); } return -1; } else { return 0; } } else { return -2; } } return -2; }