summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tdecore/tdehw/CMakeLists.txt6
-rw-r--r--tdecore/tdehw/tdegenericdevice.cpp317
-rw-r--r--tdecore/tdehw/tdegenericdevice.h388
-rw-r--r--tdecore/tdehw/tdehardwaredevices.cpp975
-rw-r--r--tdecore/tdehw/tdehardwaredevices.h680
-rw-r--r--tdecore/tdehw/tdestoragedevice.cpp721
-rw-r--r--tdecore/tdehw/tdestoragedevice.h342
7 files changed, 1779 insertions, 1650 deletions
diff --git a/tdecore/tdehw/CMakeLists.txt b/tdecore/tdehw/CMakeLists.txt
index 960158cea..af050ed0e 100644
--- a/tdecore/tdehw/CMakeLists.txt
+++ b/tdecore/tdehw/CMakeLists.txt
@@ -63,7 +63,8 @@ link_directories(
##### headers ###################################
-install( FILES tdehardwaredevices.h tdenetworkconnections.h
+install( FILES tdehardwaredevices.h tdenetworkconnections.h tdegenericdevice.h
+ tdestoragedevice.h
DESTINATION ${INCLUDE_INSTALL_DIR} )
@@ -72,7 +73,8 @@ install( FILES tdehardwaredevices.h tdenetworkconnections.h
set( target tdehw )
set( ${target}_SRCS
- tdehardwaredevices.cpp tdenetworkconnections.cpp
+ tdehardwaredevices.cpp tdenetworkconnections.cpp tdegenericdevice.cpp
+ tdestoragedevice.cpp
)
tde_add_library( ${target} STATIC_PIC AUTOMOC
diff --git a/tdecore/tdehw/tdegenericdevice.cpp b/tdecore/tdehw/tdegenericdevice.cpp
new file mode 100644
index 000000000..a2d99c310
--- /dev/null
+++ b/tdecore/tdehw/tdegenericdevice.cpp
@@ -0,0 +1,317 @@
+/* This file is part of the TDE libraries
+ Copyright (C) 2012 Timothy Pearson <kb9vqf@pearsoncomputing.net>
+ (C) 2013 Golubev Alexander <fatzer2@gmail.com>
+
+ 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 "tdegenericdevice.h"
+
+#include <tqpixmap.h>
+
+#include "tdeglobal.h"
+#include "tdelocale.h"
+
+#include "tdehardwaredevices.h"
+
+TDEGenericDevice::TDEGenericDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TQObject() {
+ m_deviceType = dt;
+ m_deviceName = dn;
+
+ m_parentDevice = 0;
+ m_friendlyName = TQString::null;
+ m_blacklistedForUpdate = false;
+}
+
+TDEGenericDevice::~TDEGenericDevice() {
+}
+
+TDEGenericDeviceType::TDEGenericDeviceType TDEGenericDevice::type() {
+ return m_deviceType;
+}
+
+TQString TDEGenericDevice::name() {
+ return m_deviceName;
+}
+
+void TDEGenericDevice::internalSetName(TQString dn) {
+ m_deviceName = dn;
+}
+
+TQString TDEGenericDevice::vendorName() {
+ return m_vendorName;
+}
+
+void TDEGenericDevice::internalSetVendorName(TQString vn) {
+ m_vendorName = vn;
+}
+
+TQString TDEGenericDevice::vendorModel() {
+ return m_vendorModel;
+}
+
+void TDEGenericDevice::internalSetVendorModel(TQString vm) {
+ m_vendorModel = vm;
+}
+
+TQString TDEGenericDevice::serialNumber() {
+ return m_serialNumber;
+}
+
+void TDEGenericDevice::internalSetSerialNumber(TQString sn) {
+ m_serialNumber = sn;
+}
+
+TQString TDEGenericDevice::systemPath() {
+ if (!m_systemPath.endsWith("/")) {
+ m_systemPath += "/";
+ }
+ return m_systemPath;
+}
+
+void TDEGenericDevice::internalSetSystemPath(TQString sp) {
+ m_systemPath = sp;
+}
+
+TQString TDEGenericDevice::deviceNode() {
+ return m_deviceNode;
+}
+
+void TDEGenericDevice::internalSetDeviceNode(TQString sn) {
+ m_deviceNode = sn;
+}
+
+TQString TDEGenericDevice::deviceBus() {
+ return m_deviceBus;
+}
+
+void TDEGenericDevice::internalSetDeviceBus(TQString db) {
+ m_deviceBus = db;
+}
+
+TQString TDEGenericDevice::uniqueID() {
+ m_uniqueID = m_systemPath+m_deviceNode;
+ return m_uniqueID;
+}
+
+TQString TDEGenericDevice::vendorID() {
+ return m_vendorID;
+}
+
+void TDEGenericDevice::internalSetVendorID(TQString id) {
+ m_vendorID = id;
+ m_vendorID.replace("0x", "");
+}
+
+TQString TDEGenericDevice::modelID() {
+ return m_modelID;
+}
+
+void TDEGenericDevice::internalSetModelID(TQString id) {
+ m_modelID = id;
+ m_modelID.replace("0x", "");
+}
+
+TQString TDEGenericDevice::vendorEncoded() {
+ return m_vendorenc;
+}
+
+void TDEGenericDevice::internalSetVendorEncoded(TQString id) {
+ m_vendorenc = id;
+}
+
+TQString TDEGenericDevice::modelEncoded() {
+ return m_modelenc;
+}
+
+void TDEGenericDevice::internalSetModelEncoded(TQString id) {
+ m_modelenc = id;
+}
+
+TQString TDEGenericDevice::subVendorID() {
+ return m_subvendorID;
+}
+
+void TDEGenericDevice::internalSetSubVendorID(TQString id) {
+ m_subvendorID = id;
+ m_subvendorID.replace("0x", "");
+}
+
+TQString TDEGenericDevice::PCIClass() {
+ return m_pciClass;
+}
+
+void TDEGenericDevice::internalSetPCIClass(TQString cl) {
+ m_pciClass = cl;
+ m_pciClass.replace("0x", "");
+}
+
+TQString TDEGenericDevice::moduleAlias() {
+ return m_modAlias;
+}
+
+void TDEGenericDevice::internalSetModuleAlias(TQString ma) {
+ m_modAlias = ma;
+}
+
+TQString TDEGenericDevice::deviceDriver() {
+ return m_deviceDriver;
+}
+
+void TDEGenericDevice::internalSetDeviceDriver(TQString dr) {
+ m_deviceDriver = dr;
+}
+
+TQString TDEGenericDevice::subsystem() {
+ return m_subsystem;
+}
+
+void TDEGenericDevice::internalSetSubsystem(TQString ss) {
+ m_subsystem = ss;
+}
+
+TQString TDEGenericDevice::subModelID() {
+ return m_submodelID;
+}
+
+void TDEGenericDevice::internalSetSubModelID(TQString id) {
+ m_submodelID = id;
+ m_submodelID.replace("0x", "");
+}
+
+void TDEGenericDevice::internalSetParentDevice(TDEGenericDevice* pd) {
+ m_parentDevice = pd;
+}
+
+TDEGenericDevice* TDEGenericDevice::parentDevice() {
+ return m_parentDevice;
+}
+
+TQPixmap TDEGenericDevice::icon(TDEIcon::StdSizes size) {
+ return TDEGlobal::hardwareDevices()->getDeviceTypeIconFromType(type(), size);
+}
+
+bool TDEGenericDevice::blacklistedForUpdate() {
+ return m_blacklistedForUpdate;
+}
+
+void TDEGenericDevice::internalSetBlacklistedForUpdate(bool bl) {
+ m_blacklistedForUpdate = bl;
+}
+
+TQString TDEGenericDevice::friendlyDeviceType() {
+ return TDEGlobal::hardwareDevices()->getFriendlyDeviceTypeStringFromType(type());
+}
+
+TQString TDEGenericDevice::busID() {
+ TQString busid = m_systemPath;
+ busid = busid.remove(0, busid.findRev("/")+1);
+ busid = busid.remove(0, busid.find(":")+1);
+ return busid;
+}
+
+TQString TDEGenericDevice::friendlyName() {
+ if (m_friendlyName.isNull()) {
+ if (type() == TDEGenericDeviceType::RootSystem) {
+ m_friendlyName = "Linux System";
+ }
+ else if (type() == TDEGenericDeviceType::Root) {
+ TQString friendlyDriverName = systemPath();
+ friendlyDriverName.truncate(friendlyDriverName.length()-1);
+ friendlyDriverName.remove(0, friendlyDriverName.findRev("/")+1);
+ m_friendlyName = friendlyDriverName;
+ }
+ else if (m_modAlias.lower().startsWith("pci")) {
+ m_friendlyName = TDEGlobal::hardwareDevices()->findPCIDeviceName(m_vendorID, m_modelID, m_subvendorID, m_submodelID);
+ }
+ else if (m_modAlias.lower().startsWith("usb")) {
+ m_friendlyName = TDEGlobal::hardwareDevices()->findUSBDeviceName(m_vendorID, m_modelID, m_subvendorID, m_submodelID);
+ }
+ else {
+ TQString acpigentype = systemPath();
+ acpigentype.truncate(acpigentype.length()-1);
+ acpigentype.remove(0, acpigentype.findRev("/")+1);
+ TQString pnpgentype = acpigentype;
+ pnpgentype.truncate(pnpgentype.find(":"));
+ if (pnpgentype.startsWith("PNP")) {
+ m_friendlyName = TDEGlobal::hardwareDevices()->findPNPDeviceName(pnpgentype);
+ }
+ else if (acpigentype.startsWith("device:")) {
+ acpigentype.remove(0, acpigentype.findRev(":")+1);
+ acpigentype.prepend("0x");
+ m_friendlyName = i18n("ACPI Node %1").arg(acpigentype.toUInt(0,0));
+ }
+ }
+ }
+
+ if (m_friendlyName.isNull()) {
+ // Could not identify based on model/vendor codes
+ // Try to construct something from the model/vendor strings if they are available
+ if (!m_vendorName.isNull() && !m_vendorModel.isNull()) {
+ m_friendlyName = m_vendorName + " " + m_vendorModel;
+ }
+ }
+
+ if (m_friendlyName.isNull()) {
+ // Could not identify based on model/vendor
+ // Guess by type
+ if (type() == TDEGenericDeviceType::CPU) {
+ m_friendlyName = name();
+ }
+ else if (type() == TDEGenericDeviceType::Event) {
+ // Use parent node name
+ if (m_parentDevice) {
+ return m_parentDevice->friendlyName();
+ }
+ else {
+ m_friendlyName = i18n("Generic Event Device");
+ }
+ }
+ else if (type() == TDEGenericDeviceType::Input) {
+ // Use parent node name
+ if (m_parentDevice) {
+ return m_parentDevice->friendlyName();
+ }
+ else {
+ m_friendlyName = i18n("Generic Input Device");
+ }
+ }
+ // Guess by driver
+ else if (!m_deviceDriver.isNull()) {
+ TQString friendlyDriverName = m_deviceDriver.lower();
+ friendlyDriverName[0] = friendlyDriverName[0].upper();
+ m_friendlyName = i18n("Generic %1 Device").arg(friendlyDriverName);
+ }
+ else if (m_systemPath.lower().startsWith("/sys/devices/virtual")) {
+ TQString friendlyDriverName = systemPath();
+ friendlyDriverName.truncate(friendlyDriverName.length()-1);
+ friendlyDriverName.remove(0, friendlyDriverName.findRev("/")+1);
+ if (!friendlyDriverName.isNull()) {
+ m_friendlyName = i18n("Virtual Device %1").arg(friendlyDriverName);
+ }
+ else {
+ m_friendlyName = i18n("Unknown Virtual Device");
+ }
+ }
+ else {
+ // I really have no idea what this peripheral is; say so!
+ m_friendlyName = i18n("Unknown Device") + " " + name();
+ }
+ }
+
+ return m_friendlyName;
+}
+
+#include "tdegenericdevice.moc"
diff --git a/tdecore/tdehw/tdegenericdevice.h b/tdecore/tdehw/tdegenericdevice.h
new file mode 100644
index 000000000..5e9958118
--- /dev/null
+++ b/tdecore/tdehw/tdegenericdevice.h
@@ -0,0 +1,388 @@
+/* This file is part of the TDE libraries
+ Copyright (C) 2012 Timothy Pearson <kb9vqf@pearsoncomputing.net>
+ (C) 2013 Golubev Alexander <fatzer2@gmail.com>
+
+ 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.
+*/
+
+#ifndef _TDEGENERICDEVICE_H
+#define _TDEGENERICDEVICE_H
+
+#include <tqobject.h>
+#include <tqstring.h>
+
+#include "tdelibs_export.h"
+#include "kicontheme.h"
+
+// Keep readGenericDeviceTypeFromString(), getFriendlyDeviceTypeStringFromType(), and getDeviceTypeIconFromType() in tdehardwaredevices.cpp in sync with this enum
+namespace TDEGenericDeviceType {
+enum TDEGenericDeviceType {
+ Root,
+ RootSystem,
+ CPU,
+ GPU,
+ RAM,
+ Bus,
+ I2C,
+ MDIO,
+ Mainboard,
+ Disk,
+ SCSI,
+ StorageController,
+ Mouse,
+ Keyboard,
+ HID,
+ Modem,
+ Monitor,
+ Network,
+ Printer,
+ Scanner,
+ Sound,
+ VideoCapture,
+ IEEE1394,
+ PCMCIA,
+ Camera,
+ TextIO,
+ Serial,
+ Parallel,
+ Peripheral,
+ Backlight,
+ Battery,
+ PowerSupply,
+ Dock,
+ ThermalSensor,
+ ThermalControl,
+ BlueTooth,
+ Bridge,
+ Platform,
+ Cryptography,
+ Event,
+ Input,
+ PNP,
+ OtherACPI,
+ OtherUSB,
+ OtherMultimedia,
+ OtherPeripheral,
+ OtherSensor,
+ OtherVirtual,
+ Other,
+ Last = Other
+};
+};
+
+class TDECORE_EXPORT TDEGenericDevice : public TQObject
+{
+ Q_OBJECT
+
+ public:
+ /**
+ * Constructor.
+ * @param Device type
+ */
+ TDEGenericDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn=TQString::null);
+
+ /**
+ * Destructor.
+ */
+ ~TDEGenericDevice();
+
+ /**
+ * @return a TDEGenericDeviceType::TDEGenericDeviceType specifying the device type
+ */
+ TDEGenericDeviceType::TDEGenericDeviceType type();
+
+ /**
+ * @return a TQString with the device name, if any
+ */
+ TQString name();
+
+ /**
+ * @return a TQString with the vendor name, if any
+ */
+ TQString vendorName();
+
+ /**
+ * @return a TQString with the vendor model, if any
+ */
+ TQString vendorModel();
+
+ /**
+ * @return a TQString with the serial number, if any
+ */
+ TQString serialNumber();
+
+ /**
+ * @return a TQString with a friendly name
+ *
+ * While TDE tries very hard to generate and return a friendly name for this device,
+ * sometimes the best it will be able to do is "Unknown Device [xxxx:yyyy]"
+ */
+ virtual TQString friendlyName();
+
+ /**
+ * @return a TQString with the device bus name, if any
+ */
+ TQString deviceBus();
+
+ /**
+ * @return a TQString with the system path, if any
+ *
+ * This method is non-portable, so be careful!
+ */
+ TQString systemPath();
+
+ /**
+ * @return a TQString with the system device node, if any
+ *
+ * This method is non-portable, so be careful!
+ */
+ TQString deviceNode();
+
+ /**
+ * @return true if this device has been blacklisted for update actions
+ */
+ bool blacklistedForUpdate();
+
+ /**
+ * @return a TQString containing a unique identifier for this device
+ */
+ TQString uniqueID();
+
+ /**
+ * @return a TQString with the vendor ID, if any
+ */
+ TQString vendorID();
+
+ /**
+ * @return a TQString with the model ID, if any
+ */
+ TQString modelID();
+
+ /**
+ * @return a TQString with the encoded vendor, if any
+ */
+ TQString vendorEncoded();
+
+ /**
+ * @return a TQString with the encoded model, if any
+ */
+ TQString modelEncoded();
+
+ /**
+ * @return a TQString with the subvendor ID, if any
+ */
+ TQString subVendorID();
+
+ /**
+ * @return a TQString with the submodel ID, if any
+ */
+ TQString subModelID();
+
+ /**
+ * @return a TQString with the PCI device class, if any
+ */
+ TQString PCIClass();
+
+ /**
+ * @return a TQString with the module alias string, if any
+ */
+ TQString moduleAlias();
+
+ /**
+ * @return a TQString with the device driver, if any
+ */
+ TQString deviceDriver();
+
+ /**
+ * @return a TQString with the subsystem type, if any
+ */
+ TQString subsystem();
+
+ /**
+ * @return a TDEGenericDevice* with the parent device, if any
+ */
+ TDEGenericDevice* parentDevice();
+
+ /**
+ * @return a TQString containing the friendly type name
+ */
+ virtual TQString friendlyDeviceType();
+
+ /**
+ * @return a TQString containing the device bus ID, if any
+ */
+ TQString busID();
+
+ /**
+ * Get an icon for this device
+ * @param size a TDEIcon::StdSizes structure specifying the desired icon size
+ * @return a TQPixmap containing the icon for the specified type
+ */
+ virtual TQPixmap icon(TDEIcon::StdSizes size);
+
+ protected:
+ /**
+ * @param a TQString with the device name, if any
+ * @internal
+ */
+ void internalSetName(TQString dn);
+
+ /**
+ * @param a TQString with the vendor name, if any
+ * @internal
+ */
+ void internalSetVendorName(TQString vn);
+
+ /**
+ * @param a TQString with the vendor model, if any
+ * @internal
+ */
+ void internalSetVendorModel(TQString vm);
+
+ /**
+ * @param a TQString with the serial number, if any
+ * @internal
+ */
+ void internalSetSerialNumber(TQString sn);
+
+ /**
+ * @param a TQString with the device bus name, if any
+ * @internal
+ */
+ void internalSetDeviceBus(TQString db);
+
+ /**
+ * @param a TQString with the system path, if any
+ * @internal
+ *
+ * This method is non-portable, so be careful!
+ */
+ void internalSetSystemPath(TQString sp);
+
+ /**
+ * @param a TQString with the system device node, if any
+ * @internal
+ *
+ * This method is non-portable, so be careful!
+ */
+ void internalSetDeviceNode(TQString sn);
+
+ /**
+ * @param bl true if this device has been blacklisted for update actions
+ * @internal
+ */
+ void internalSetBlacklistedForUpdate(bool bl);
+
+ /**
+ * @param a TQString with the vendor ID, if any
+ * @internal
+ */
+ void internalSetVendorID(TQString id);
+
+ /**
+ * @param a TQString with the model ID, if any
+ * @internal
+ */
+ void internalSetModelID(TQString id);
+
+ /**
+ * @param a TQString with the encoded vendor, if any
+ * @internal
+ */
+ void internalSetVendorEncoded(TQString id);
+
+ /**
+ * @param a TQString with the encoded model, if any
+ * @internal
+ */
+ void internalSetModelEncoded(TQString id);
+
+ /**
+ * @param a TQString with the subvendor ID, if any
+ * @internal
+ */
+ void internalSetSubVendorID(TQString id);
+
+ /**
+ * @param a TQString with the submodel ID, if any
+ * @internal
+ */
+ void internalSetSubModelID(TQString id);
+
+ /**
+ * @param a TQString with the PCI device class, if any
+ * @internal
+ */
+ void internalSetPCIClass(TQString cl);
+
+ /**
+ * @param a TQString with the module alias string, if any
+ * @internal
+ */
+ void internalSetModuleAlias(TQString ma);
+
+ /**
+ * @param a TQString with the device driver, if any
+ * @internal
+ */
+ void internalSetDeviceDriver(TQString dr);
+
+ /**
+ * @param a TQString with the subsystem type, if any
+ * @internal
+ */
+ void internalSetSubsystem(TQString ss);
+
+ /**
+ * @param a TDEGenericDevice* with the parent device, if any
+ * @internal
+ */
+ void internalSetParentDevice(TDEGenericDevice* pd);
+
+ private:
+ TDEGenericDeviceType::TDEGenericDeviceType m_deviceType;
+ TQString m_deviceName;
+ TQString m_systemPath;
+ TQString m_deviceNode;
+ TQString m_vendorName;
+ TQString m_vendorModel;
+ TQString m_serialNumber;
+ TQString m_deviceBus;
+ TQString m_uniqueID;
+ TQString m_vendorID;
+ TQString m_modelID;
+ TQString m_vendorenc;
+ TQString m_modelenc;
+ TQString m_subvendorID;
+ TQString m_submodelID;
+ TQString m_pciClass;
+ TQString m_modAlias;
+ TQString m_deviceDriver;
+ TQString m_subsystem;
+ TQString m_friendlyName;
+ bool m_blacklistedForUpdate;
+ TDEGenericDevice* m_parentDevice;
+
+ // Internal use only!
+ TQStringList m_externalSubtype;
+ TQString m_externalRulesFile;
+ TQString m_udevtype;
+ TQString m_udevdevicetypestring;
+ TQString udevdevicetypestring_alt;
+
+ friend class TDEHardwareDevices;
+};
+
+#endif // _TDEGENERICDEVICE_H
diff --git a/tdecore/tdehw/tdehardwaredevices.cpp b/tdecore/tdehw/tdehardwaredevices.cpp
index 69e7856cb..aaba9e4ed 100644
--- a/tdecore/tdehw/tdehardwaredevices.cpp
+++ b/tdecore/tdehw/tdehardwaredevices.cpp
@@ -36,11 +36,6 @@
#include <libudev.h>
#include <fcntl.h>
-#include <poll.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <linux/fs.h>
-#include <linux/cdrom.h>
// Backlight devices
#include <linux/fb.h>
@@ -67,22 +62,14 @@
#include "networkbackends/network-manager/network-manager.h"
#endif // WITH_NETWORK_MANAGER_BACKEND
-// uPower and uDisks2 integration
-#if defined(WITH_UPOWER) || defined(WITH_UDISKS) || defined(WITH_UDISKS2)
+// uPower
+#if defined(WITH_UPOWER) || defined(WITH_CONSOLEKIT)
#include <tqdbusdata.h>
#include <tqdbusmessage.h>
#include <tqdbusproxy.h>
#include <tqdbusvariant.h>
#include <tqdbusconnection.h>
-#endif // defined(WITH_UPOWER) || defined(WITH_UDISKS) || defined(WITH_UDISKS2)
-#if defined(WITH_UDISKS) || defined(WITH_UDISKS2)
- #include <tqdbuserror.h>
- #include <tqdbusdatamap.h>
- #include <tqdbusobjectpath.h>
-#endif // defined(WITH_UDISKS) || defined(WITH_UDISKS2)
-#if defined(WITH_UDISKS)
- #include "tqdbusdatalist.h"
-#endif // ddefined(WITH_UDISKS)
+#endif // defined(WITH_UPOWER)
// BEGIN BLOCK
// Copied from include/linux/genhd.h
@@ -122,962 +109,6 @@ TDESensorCluster::TDESensorCluster() {
critical = -1;
}
-TDEGenericDevice::TDEGenericDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TQObject() {
- m_deviceType = dt;
- m_deviceName = dn;
-
- m_parentDevice = 0;
- m_friendlyName = TQString::null;
- m_blacklistedForUpdate = false;
-}
-
-TDEGenericDevice::~TDEGenericDevice() {
-}
-
-TDEGenericDeviceType::TDEGenericDeviceType TDEGenericDevice::type() {
- return m_deviceType;
-}
-
-TQString TDEGenericDevice::name() {
- return m_deviceName;
-}
-
-void TDEGenericDevice::internalSetName(TQString dn) {
- m_deviceName = dn;
-}
-
-TQString TDEGenericDevice::vendorName() {
- return m_vendorName;
-}
-
-void TDEGenericDevice::internalSetVendorName(TQString vn) {
- m_vendorName = vn;
-}
-
-TQString TDEGenericDevice::vendorModel() {
- return m_vendorModel;
-}
-
-void TDEGenericDevice::internalSetVendorModel(TQString vm) {
- m_vendorModel = vm;
-}
-
-TQString TDEGenericDevice::serialNumber() {
- return m_serialNumber;
-}
-
-void TDEGenericDevice::internalSetSerialNumber(TQString sn) {
- m_serialNumber = sn;
-}
-
-TQString TDEGenericDevice::systemPath() {
- if (!m_systemPath.endsWith("/")) {
- m_systemPath += "/";
- }
- return m_systemPath;
-}
-
-void TDEGenericDevice::internalSetSystemPath(TQString sp) {
- m_systemPath = sp;
-}
-
-TQString TDEGenericDevice::deviceNode() {
- return m_deviceNode;
-}
-
-void TDEGenericDevice::internalSetDeviceNode(TQString sn) {
- m_deviceNode = sn;
-}
-
-TQString TDEGenericDevice::deviceBus() {
- return m_deviceBus;
-}
-
-void TDEGenericDevice::internalSetDeviceBus(TQString db) {
- m_deviceBus = db;
-}
-
-TQString TDEGenericDevice::uniqueID() {
- m_uniqueID = m_systemPath+m_deviceNode;
- return m_uniqueID;
-}
-
-TQString TDEGenericDevice::vendorID() {
- return m_vendorID;
-}
-
-void TDEGenericDevice::internalSetVendorID(TQString id) {
- m_vendorID = id;
- m_vendorID.replace("0x", "");
-}
-
-TQString TDEGenericDevice::modelID() {
- return m_modelID;
-}
-
-void TDEGenericDevice::internalSetModelID(TQString id) {
- m_modelID = id;
- m_modelID.replace("0x", "");
-}
-
-TQString TDEGenericDevice::vendorEncoded() {
- return m_vendorenc;
-}
-
-void TDEGenericDevice::internalSetVendorEncoded(TQString id) {
- m_vendorenc = id;
-}
-
-TQString TDEGenericDevice::modelEncoded() {
- return m_modelenc;
-}
-
-void TDEGenericDevice::internalSetModelEncoded(TQString id) {
- m_modelenc = id;
-}
-
-TQString TDEGenericDevice::subVendorID() {
- return m_subvendorID;
-}
-
-void TDEGenericDevice::internalSetSubVendorID(TQString id) {
- m_subvendorID = id;
- m_subvendorID.replace("0x", "");
-}
-
-TQString TDEGenericDevice::PCIClass() {
- return m_pciClass;
-}
-
-void TDEGenericDevice::internalSetPCIClass(TQString cl) {
- m_pciClass = cl;
- m_pciClass.replace("0x", "");
-}
-
-TQString TDEGenericDevice::moduleAlias() {
- return m_modAlias;
-}
-
-void TDEGenericDevice::internalSetModuleAlias(TQString ma) {
- m_modAlias = ma;
-}
-
-TQString TDEGenericDevice::deviceDriver() {
- return m_deviceDriver;
-}
-
-void TDEGenericDevice::internalSetDeviceDriver(TQString dr) {
- m_deviceDriver = dr;
-}
-
-TQString TDEGenericDevice::subsystem() {
- return m_subsystem;
-}
-
-void TDEGenericDevice::internalSetSubsystem(TQString ss) {
- m_subsystem = ss;
-}
-
-TQString TDEGenericDevice::subModelID() {
- return m_submodelID;
-}
-
-void TDEGenericDevice::internalSetSubModelID(TQString id) {
- m_submodelID = id;
- m_submodelID.replace("0x", "");
-}
-
-void TDEGenericDevice::internalSetParentDevice(TDEGenericDevice* pd) {
- m_parentDevice = pd;
-}
-
-TDEGenericDevice* TDEGenericDevice::parentDevice() {
- return m_parentDevice;
-}
-
-TQPixmap TDEGenericDevice::icon(TDEIcon::StdSizes size) {
- return TDEGlobal::hardwareDevices()->getDeviceTypeIconFromType(type(), size);
-}
-
-bool TDEGenericDevice::blacklistedForUpdate() {
- return m_blacklistedForUpdate;
-}
-
-void TDEGenericDevice::internalSetBlacklistedForUpdate(bool bl) {
- m_blacklistedForUpdate = bl;
-}
-
-TQString TDEGenericDevice::friendlyDeviceType() {
- return TDEGlobal::hardwareDevices()->getFriendlyDeviceTypeStringFromType(type());
-}
-
-TQString TDEGenericDevice::busID() {
- TQString busid = m_systemPath;
- busid = busid.remove(0, busid.findRev("/")+1);
- busid = busid.remove(0, busid.find(":")+1);
- return busid;
-}
-
-TQString TDEGenericDevice::friendlyName() {
- if (m_friendlyName.isNull()) {
- if (type() == TDEGenericDeviceType::RootSystem) {
- m_friendlyName = "Linux System";
- }
- else if (type() == TDEGenericDeviceType::Root) {
- TQString friendlyDriverName = systemPath();
- friendlyDriverName.truncate(friendlyDriverName.length()-1);
- friendlyDriverName.remove(0, friendlyDriverName.findRev("/")+1);
- m_friendlyName = friendlyDriverName;
- }
- else if (m_modAlias.lower().startsWith("pci")) {
- m_friendlyName = TDEGlobal::hardwareDevices()->findPCIDeviceName(m_vendorID, m_modelID, m_subvendorID, m_submodelID);
- }
- else if (m_modAlias.lower().startsWith("usb")) {
- m_friendlyName = TDEGlobal::hardwareDevices()->findUSBDeviceName(m_vendorID, m_modelID, m_subvendorID, m_submodelID);
- }
- else {
- TQString acpigentype = systemPath();
- acpigentype.truncate(acpigentype.length()-1);
- acpigentype.remove(0, acpigentype.findRev("/")+1);
- TQString pnpgentype = acpigentype;
- pnpgentype.truncate(pnpgentype.find(":"));
- if (pnpgentype.startsWith("PNP")) {
- m_friendlyName = TDEGlobal::hardwareDevices()->findPNPDeviceName(pnpgentype);
- }
- else if (acpigentype.startsWith("device:")) {
- acpigentype.remove(0, acpigentype.findRev(":")+1);
- acpigentype.prepend("0x");
- m_friendlyName = i18n("ACPI Node %1").arg(acpigentype.toUInt(0,0));
- }
- }
- }
-
- if (m_friendlyName.isNull()) {
- // Could not identify based on model/vendor codes
- // Try to construct something from the model/vendor strings if they are available
- if (!m_vendorName.isNull() && !m_vendorModel.isNull()) {
- m_friendlyName = m_vendorName + " " + m_vendorModel;
- }
- }
-
- if (m_friendlyName.isNull()) {
- // Could not identify based on model/vendor
- // Guess by type
- if (type() == TDEGenericDeviceType::CPU) {
- m_friendlyName = name();
- }
- else if (type() == TDEGenericDeviceType::Event) {
- // Use parent node name
- if (m_parentDevice) {
- return m_parentDevice->friendlyName();
- }
- else {
- m_friendlyName = i18n("Generic Event Device");
- }
- }
- else if (type() == TDEGenericDeviceType::Input) {
- // Use parent node name
- if (m_parentDevice) {
- return m_parentDevice->friendlyName();
- }
- else {
- m_friendlyName = i18n("Generic Input Device");
- }
- }
- // Guess by driver
- else if (!m_deviceDriver.isNull()) {
- TQString friendlyDriverName = m_deviceDriver.lower();
- friendlyDriverName[0] = friendlyDriverName[0].upper();
- m_friendlyName = i18n("Generic %1 Device").arg(friendlyDriverName);
- }
- else if (m_systemPath.lower().startsWith("/sys/devices/virtual")) {
- TQString friendlyDriverName = systemPath();
- friendlyDriverName.truncate(friendlyDriverName.length()-1);
- friendlyDriverName.remove(0, friendlyDriverName.findRev("/")+1);
- if (!friendlyDriverName.isNull()) {
- m_friendlyName = i18n("Virtual Device %1").arg(friendlyDriverName);
- }
- else {
- m_friendlyName = i18n("Unknown Virtual Device");
- }
- }
- else {
- // I really have no idea what this peripheral is; say so!
- m_friendlyName = i18n("Unknown Device") + " " + name();
- }
- }
-
- return m_friendlyName;
-}
-
-TDEStorageDevice::TDEStorageDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TDEGenericDevice(dt, dn), m_mediaInserted(true) {
- m_diskType = TDEDiskDeviceType::Null;
- m_diskStatus = TDEDiskDeviceStatus::Null;
-}
-
-TDEStorageDevice::~TDEStorageDevice() {
-}
-
-TDEDiskDeviceType::TDEDiskDeviceType TDEStorageDevice::diskType() {
- return m_diskType;
-}
-
-void TDEStorageDevice::internalSetDiskType(TDEDiskDeviceType::TDEDiskDeviceType dt) {
- m_diskType = dt;
-}
-
-bool TDEStorageDevice::isDiskOfType(TDEDiskDeviceType::TDEDiskDeviceType tf) {
- return ((m_diskType&tf)!=TDEDiskDeviceType::Null);
-}
-
-TDEDiskDeviceStatus::TDEDiskDeviceStatus TDEStorageDevice::diskStatus() {
- return m_diskStatus;
-}
-
-void TDEStorageDevice::internalSetDiskStatus(TDEDiskDeviceStatus::TDEDiskDeviceStatus st) {
- m_diskStatus = st;
-}
-
-bool TDEStorageDevice::checkDiskStatus(TDEDiskDeviceStatus::TDEDiskDeviceStatus sf) {
- return ((m_diskStatus&sf)!=(TDEDiskDeviceStatus::TDEDiskDeviceStatus)0);
-}
-
-bool TDEStorageDevice::lockDriveMedia(bool lock) {
- int fd = open(deviceNode().ascii(), O_RDWR | O_NONBLOCK);
- if (fd < 0) {
- return false;
- }
- if (ioctl(fd, CDROM_LOCKDOOR, (lock)?1:0) != 0) {
- close(fd);
- return false;
- }
- else {
- close(fd);
- return true;
- }
-}
-
-bool ejectDriveUDisks(TDEStorageDevice* sdevice) {
-#ifdef WITH_UDISKS
- TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
- if (dbusConn.isConnected()) {
- TQString blockDeviceString = sdevice->deviceNode();
- blockDeviceString.replace("/dev/", "");
- 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<TQT_DBusData> params;
- TQT_DBusDataList options;
- params << TQT_DBusData::fromList(options);
- TQT_DBusMessage reply = driveControl.sendWithReply("DriveEject", params, &error);
- if (error.isValid()) {
- // Error!
- printf("[ERROR] %s\n", error.name().ascii()); fflush(stdout);
- return FALSE;
- }
- else {
- return TRUE;
- }
- }
- else {
- return FALSE;
- }
- }
- else {
- return FALSE;
- }
-#else // WITH_UDISKS
- return FALSE;
-#endif // WITH_UDISKS
-}
-
-bool ejectDriveUDisks2(TDEStorageDevice* sdevice) {
-#ifdef WITH_UDISKS2
- TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
- if (dbusConn.isConnected()) {
- TQString blockDeviceString = sdevice->deviceNode();
- blockDeviceString.replace("/dev/", "");
- 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<TQT_DBusData> 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] %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<TQT_DBusData> 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] %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<TQT_DBusData> params;
- TQT_DBusDataMap<TQString> options(TQT_DBusData::Variant);
- params << TQT_DBusData::fromStringKeyMap(options);
- TQT_DBusMessage reply = driveControl.sendWithReply("Eject", params, &error);
- if (error.isValid()) {
- // Error!
- printf("[ERROR] %s\n", error.name().ascii()); fflush(stdout);
- return FALSE;
- }
- else {
- return TRUE;
- }
- }
- else {
- return FALSE;
- }
- }
- else {
- return FALSE;
- }
- }
- }
- else {
- return FALSE;
- }
- }
- else {
- return FALSE;
- }
-#else // WITH_UDISKS2
- return FALSE;
-#endif // WITH_UDISKS2
-}
-
-bool TDEStorageDevice::ejectDrive() {
- if (ejectDriveUDisks2(this)) {
- return TRUE;
- }
- else {
-#ifdef WITH_UDISKS2
- printf("[tdehwlib] Failed to eject drive '%s' via udisks2, falling back to alternate mechanism\n", deviceNode().ascii());
-#endif // WITH_UDISKS2
- if (ejectDriveUDisks(this)) {
- return TRUE;
- }
- else {
-#ifdef WITH_UDISKS
- printf("[tdehwlib] Failed to eject drive '%s' via udisks, falling back to alternate mechanism\n", deviceNode().ascii());
-#endif // WITH_UDISKS
- TQString command = TQString("eject -v '%1' 2>&1").arg(deviceNode());
-
- FILE *exepipe = popen(command.ascii(), "r");
- if (exepipe) {
- TQString pmount_output;
- char buffer[8092];
- pmount_output = fgets(buffer, sizeof(buffer), exepipe);
- int retcode = pclose(exepipe);
- if (retcode == 0) {
- return TRUE;
- }
- else {
- printf("[tdehwlib] Failed to eject drive '%s' via 'eject' command\n", deviceNode().ascii());
- return FALSE;
- }
- }
- else {
- printf("[tdehwlib] Failed to eject drive '%s' via 'eject' command\n", deviceNode().ascii());
- return FALSE;
- }
- }
- }
-}
-
-bool TDEStorageDevice::ejectDriveMedia() {
- int fd = open(deviceNode().ascii(), O_RDWR | O_NONBLOCK);
- if (fd < 0) {
- return false;
- }
- if (ioctl(fd, CDROMEJECT) != 0) {
- close(fd);
- return false;
- }
- else {
- close(fd);
- return true;
- }
-}
-
-TQString TDEStorageDevice::diskLabel() {
- return m_diskName;
-}
-
-void TDEStorageDevice::internalSetDiskLabel(TQString dn) {
- m_diskName = dn;
-}
-
-bool TDEStorageDevice::mediaInserted() {
- return m_mediaInserted;
-}
-
-void TDEStorageDevice::internalSetMediaInserted(bool inserted) {
- m_mediaInserted = inserted;
-}
-
-TQString TDEStorageDevice::fileSystemName() {
- return m_fileSystemName;
-}
-
-void TDEStorageDevice::internalSetFileSystemName(TQString fn) {
- m_fileSystemName = fn;
-}
-
-TQString TDEStorageDevice::fileSystemUsage() {
- return m_fileSystemUsage;
-}
-
-void TDEStorageDevice::internalSetFileSystemUsage(TQString fu) {
- m_fileSystemUsage = fu;
-}
-
-TQString TDEStorageDevice::diskUUID() {
- return m_diskUUID;
-}
-
-void TDEStorageDevice::internalSetDiskUUID(TQString id) {
- m_diskUUID = id;
-}
-
-TQStringList TDEStorageDevice::holdingDevices() {
- return m_holdingDevices;
-}
-
-void TDEStorageDevice::internalSetHoldingDevices(TQStringList hd) {
- m_holdingDevices = hd;
-}
-
-TQStringList TDEStorageDevice::slaveDevices() {
- return m_slaveDevices;
-}
-
-void TDEStorageDevice::internalSetSlaveDevices(TQStringList sd) {
- m_slaveDevices = sd;
-}
-
-TQString TDEStorageDevice::friendlyName() {
- // Return the actual storage device name
- TQString devicevendorid = vendorEncoded();
- TQString devicemodelid = modelEncoded();
-
- devicevendorid.replace("\\x20", " ");
- devicemodelid.replace("\\x20", " ");
-
- devicevendorid = devicevendorid.stripWhiteSpace();
- devicemodelid = devicemodelid.stripWhiteSpace();
- devicevendorid = devicevendorid.simplifyWhiteSpace();
- devicemodelid = devicemodelid.simplifyWhiteSpace();
-
- TQString devicename = devicevendorid + " " + devicemodelid;
-
- devicename = devicename.stripWhiteSpace();
- devicename = devicename.simplifyWhiteSpace();
-
- if (devicename != "") {
- return devicename;
- }
-
- if (isDiskOfType(TDEDiskDeviceType::Camera)) {
- return TDEGenericDevice::friendlyName();
- }
-
- if (isDiskOfType(TDEDiskDeviceType::Floppy)) {
- return friendlyDeviceType();
- }
-
- TQString label = diskLabel();
- if (label.isNull()) {
- if (deviceSize() > 0) {
- if (checkDiskStatus(TDEDiskDeviceStatus::Hotpluggable)) {
- label = i18n("%1 Removable Device").arg(deviceFriendlySize());
- }
- else {
- label = i18n("%1 Fixed Storage Device").arg(deviceFriendlySize());
- }
- }
- }
-
- if (!label.isNull()) {
- return label;
- }
-
- return friendlyDeviceType();
-}
-
-TQString TDEStorageDevice::friendlyDeviceType() {
- TQString ret = i18n("Hard Disk Drive");
-
- // Keep this in sync with TDEStorageDevice::icon(TDEIcon::StdSizes size) below
- if (isDiskOfType(TDEDiskDeviceType::Floppy)) {
- ret = i18n("Floppy Drive");
- }
- if (isDiskOfType(TDEDiskDeviceType::Optical)) {
- ret = i18n("Optical Drive");
- }
- if (isDiskOfType(TDEDiskDeviceType::CDROM)) {
- ret = i18n("CDROM Drive");
- }
- if (isDiskOfType(TDEDiskDeviceType::CDRW)) {
- ret = i18n("CDRW Drive");
- }
- if (isDiskOfType(TDEDiskDeviceType::DVDROM)) {
- ret = i18n("DVD Drive");
- }
- if (isDiskOfType(TDEDiskDeviceType::DVDRW)) {
- ret = i18n("DVDRW Drive");
- }
- if (isDiskOfType(TDEDiskDeviceType::DVDRAM)) {
- ret = i18n("DVDRAM Drive");
- }
- if (isDiskOfType(TDEDiskDeviceType::Zip)) {
- ret = i18n("Zip Drive");
- }
- if (isDiskOfType(TDEDiskDeviceType::Tape)) {
- ret = i18n("Tape Drive");
- }
- if (isDiskOfType(TDEDiskDeviceType::Camera)) {
- ret = i18n("Digital Camera");
- }
-
- if (isDiskOfType(TDEDiskDeviceType::HDD)) {
- ret = i18n("Hard Disk Drive");
- if (checkDiskStatus(TDEDiskDeviceStatus::Hotpluggable)) {
- ret = i18n("Removable Storage");
- }
- if (isDiskOfType(TDEDiskDeviceType::CompactFlash)) {
- ret = i18n("Compact Flash");
- }
- if (isDiskOfType(TDEDiskDeviceType::MemoryStick)) {
- ret = i18n("Memory Stick");
- }
- if (isDiskOfType(TDEDiskDeviceType::SmartMedia)) {
- ret = i18n("Smart Media");
- }
- if (isDiskOfType(TDEDiskDeviceType::SDMMC)) {
- ret = i18n("Secure Digital");
- }
- }
-
- if (isDiskOfType(TDEDiskDeviceType::RAM)) {
- ret = i18n("Random Access Memory");
- }
- if (isDiskOfType(TDEDiskDeviceType::Loop)) {
- ret = i18n("Loop Device");
- }
-
- return ret;
-}
-
-TQPixmap TDEStorageDevice::icon(TDEIcon::StdSizes size) {
- TQPixmap ret = DesktopIcon("hdd_unmount", size);
-
- if (isDiskOfType(TDEDiskDeviceType::Floppy)) {
- ret = DesktopIcon("3floppy_unmount", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::Optical)) {
- ret = DesktopIcon("cdrom_unmount", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::CDROM)) {
- ret = DesktopIcon("cdrom_unmount", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::CDRW)) {
- ret = DesktopIcon("cdwriter_unmount", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::DVDROM)) {
- ret = DesktopIcon("dvd_unmount", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::DVDRW)) {
- ret = DesktopIcon("dvd_unmount", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::DVDRAM)) {
- ret = DesktopIcon("dvd_unmount", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::Zip)) {
- ret = DesktopIcon("zip_unmount", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::Tape)) {
- ret = DesktopIcon("tape_unmount", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::Camera)) {
- ret = DesktopIcon("camera_unmount");
- }
-
- if (isDiskOfType(TDEDiskDeviceType::HDD)) {
- ret = DesktopIcon("hdd_unmount", size);
- if (checkDiskStatus(TDEDiskDeviceStatus::Hotpluggable)) {
- ret = DesktopIcon("usbpendrive_unmount", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::CompactFlash)) {
- ret = DesktopIcon("compact_flash_unmount", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::MemoryStick)) {
- ret = DesktopIcon("memory_stick_unmount", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::SmartMedia)) {
- ret = DesktopIcon("smart_media_unmount", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::SDMMC)) {
- ret = DesktopIcon("sd_mmc_unmount", size);
- }
- }
-
- if (isDiskOfType(TDEDiskDeviceType::RAM)) {
- ret = DesktopIcon("memory", size);
- }
- if (isDiskOfType(TDEDiskDeviceType::Loop)) {
- ret = DesktopIcon("blockdevice", size);
- }
-
- return ret;
-}
-
-unsigned long long TDEStorageDevice::deviceSize() {
- TQString bsnodename = systemPath();
- bsnodename.append("/queue/physical_block_size");
- TQFile bsfile( bsnodename );
- TQString blocksize;
- if ( bsfile.open( IO_ReadOnly ) ) {
- TQTextStream stream( &bsfile );
- blocksize = stream.readLine();
- bsfile.close();
- }
- else {
- // Drat, I can't get a guaranteed block size. Assume a block size of 512, as everything I have read indicates that /sys/block/<dev>/size is given in terms of a 512 byte block...
- blocksize = "512";
- }
-
- TQString dsnodename = systemPath();
- dsnodename.append("/size");
- TQFile dsfile( dsnodename );
- TQString devicesize;
- if ( dsfile.open( IO_ReadOnly ) ) {
- TQTextStream stream( &dsfile );
- devicesize = stream.readLine();
- dsfile.close();
- }
-
- return ((unsigned long long)blocksize.toULong()*(unsigned long long)devicesize.toULong());
-}
-
-TQString TDEStorageDevice::deviceFriendlySize() {
- return TDEHardwareDevices::bytesToFriendlySizeString(deviceSize());
-}
-
-TQString TDEStorageDevice::mountPath() {
- // See if this device node is mounted
- // This requires parsing /proc/mounts, looking for deviceNode()
-
- // The Device Mapper throws a monkey wrench into this
- // It likes to advertise mounts as /dev/mapper/<something>,
- // where <something> is listed in <system path>/dm/name
-
- // First, ensure that all device information (mainly holders/slaves) is accurate
- TDEGlobal::hardwareDevices()->rescanDeviceInformation(this);
-
- TQString dmnodename = systemPath();
- dmnodename.append("/dm/name");
- TQFile namefile( dmnodename );
- TQString dmaltname;
- if ( namefile.open( IO_ReadOnly ) ) {
- TQTextStream stream( &namefile );
- dmaltname = stream.readLine();
- namefile.close();
- }
- if (!dmaltname.isNull()) {
- dmaltname.prepend("/dev/mapper/");
- }
-
- TQStringList lines;
- TQFile file( "/proc/mounts" );
- if ( file.open( IO_ReadOnly ) ) {
- TQTextStream stream( &file );
- TQString line;
- while ( !stream.atEnd() ) {
- line = stream.readLine();
- TQStringList mountInfo = TQStringList::split(" ", line, true);
- TQString testNode = *mountInfo.at(0);
- // Check for match
- if ((testNode == deviceNode()) || (testNode == dmaltname) || (testNode == ("/dev/disk/by-uuid/" + diskUUID()))) {
- TQString ret = *mountInfo.at(1);
- ret.replace("\\040", " ");
- return ret;
- }
- lines += line;
- }
- file.close();
- }
-
- // While this device is not directly mounted, it could concievably be mounted via the Device Mapper
- // If so, try to retrieve the mount path...
- TQStringList slaveDeviceList = holdingDevices();
- for ( TQStringList::Iterator slavedevit = slaveDeviceList.begin(); slavedevit != slaveDeviceList.end(); ++slavedevit ) {
- // Try to locate this device path in the TDE device tree
- TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
- TDEGenericDevice *hwdevice = hwdevices->findBySystemPath(*slavedevit);
- if ((hwdevice) && (hwdevice->type() == TDEGenericDeviceType::Disk)) {
- TDEStorageDevice* sdevice = static_cast<TDEStorageDevice*>(hwdevice);
- return sdevice->mountPath();
- }
- }
-
- return TQString::null;
-}
-
-TQString TDEStorageDevice::mountDevice(TQString mediaName, TQString mountOptions, TQString* errRet, int* retcode) {
- int internal_retcode;
- if (!retcode) {
- retcode = &internal_retcode;
- }
-
- TQString ret = mountPath();
-
- if (!ret.isNull()) {
- return ret;
- }
-
- // Create dummy password file
- KTempFile passwordFile(TQString::null, "tmp", 0600);
- passwordFile.setAutoDelete(true);
-
- TQString passFileName = passwordFile.name();
- TQString devNode = deviceNode();
- passFileName.replace("'", "'\\''");
- devNode.replace("'", "'\\''");
- mediaName.replace("'", "'\\''");
- TQString command = TQString("pmount -p '%1' %2 '%3' '%4' 2>&1").arg(passFileName).arg(mountOptions).arg(devNode).arg(mediaName);
-
- FILE *exepipe = popen(command.ascii(), "r");
- if (exepipe) {
- TQString pmount_output;
- char buffer[8092];
- pmount_output = fgets(buffer, sizeof(buffer), exepipe);
- *retcode = pclose(exepipe);
- if (errRet) {
- *errRet = pmount_output;
- }
- }
-
- // Update internal mount data
- TDEGlobal::hardwareDevices()->processModifiedMounts();
-
- ret = mountPath();
-
- return ret;
-}
-
-TQString TDEStorageDevice::mountEncryptedDevice(TQString passphrase, TQString mediaName, TQString mountOptions, TQString* errRet, int* retcode) {
- int internal_retcode;
- if (!retcode) {
- retcode = &internal_retcode;
- }
-
- TQString ret = mountPath();
-
- if (!ret.isNull()) {
- return ret;
- }
-
- // Create dummy password file
- KTempFile passwordFile(TQString::null, "tmp", 0600);
- passwordFile.setAutoDelete(true);
- TQFile* pwFile = passwordFile.file();
- if (!pwFile) {
- return TQString::null;
- }
-
- pwFile->writeBlock(passphrase.ascii(), passphrase.length());
- pwFile->flush();
-
- TQString passFileName = passwordFile.name();
- TQString devNode = deviceNode();
- passFileName.replace("'", "'\\''");
- devNode.replace("'", "'\\''");
- mediaName.replace("'", "'\\''");
- TQString command = TQString("pmount -p '%1' %2 '%3' '%4' 2>&1").arg(passFileName).arg(mountOptions).arg(devNode).arg(mediaName);
-
- FILE *exepipe = popen(command.ascii(), "r");
- if (exepipe) {
- TQString pmount_output;
- char buffer[8092];
- pmount_output = fgets(buffer, sizeof(buffer), exepipe);
- *retcode = pclose(exepipe);
- if (errRet) {
- *errRet = pmount_output;
- }
- }
-
- // Update internal mount data
- TDEGlobal::hardwareDevices()->processModifiedMounts();
-
- ret = mountPath();
-
- return ret;
-}
-
-bool TDEStorageDevice::unmountDevice(TQString* errRet, int* retcode) {
- int internal_retcode;
- if (!retcode) {
- retcode = &internal_retcode;
- }
-
- TQString mountpoint = mountPath();
-
- if (mountpoint.isNull()) {
- return true;
- }
-
- mountpoint.replace("'", "'\\''");
- TQString command = TQString("pumount '%1' 2>&1").arg(mountpoint);
- FILE *exepipe = popen(command.ascii(), "r");
- if (exepipe) {
- TQString pmount_output;
- char buffer[8092];
- pmount_output = fgets(buffer, sizeof(buffer), exepipe);
- *retcode = pclose(exepipe);
- if (*retcode == 0) {
- return true;
- }
- else {
- if (errRet) {
- *errRet = pmount_output;
- }
- }
- }
-
- // Update internal mount data
- TDEGlobal::hardwareDevices()->processModifiedMounts();
-
- return false;
-}
-
TDECPUDevice::TDECPUDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TDEGenericDevice(dt, dn) {
m_frequency = -1;
m_minfrequency = -1;
diff --git a/tdecore/tdehw/tdehardwaredevices.h b/tdecore/tdehw/tdehardwaredevices.h
index fcf60533d..710d7bd8e 100644
--- a/tdecore/tdehw/tdehardwaredevices.h
+++ b/tdecore/tdehw/tdehardwaredevices.h
@@ -33,6 +33,10 @@
#include <locale.h>
#include <unistd.h>
+// FIXME delete those headers after complete porting
+#include "tdegenericdevice.h"
+#include "tdestoragedevice.h"
+
/**
* Hardware Device Access and Monitoring Library
*
@@ -53,145 +57,6 @@ enum TDEHardwareEvent {
};
};
-// Keep readGenericDeviceTypeFromString(), getFriendlyDeviceTypeStringFromType(), and getDeviceTypeIconFromType() in tdehardwaredevices.cpp in sync with this enum
-namespace TDEGenericDeviceType {
-enum TDEGenericDeviceType {
- Root,
- RootSystem,
- CPU,
- GPU,
- RAM,
- Bus,
- I2C,
- MDIO,
- Mainboard,
- Disk,
- SCSI,
- StorageController,
- Mouse,
- Keyboard,
- HID,
- Modem,
- Monitor,
- Network,
- Printer,
- Scanner,
- Sound,
- VideoCapture,
- IEEE1394,
- PCMCIA,
- Camera,
- TextIO,
- Serial,
- Parallel,
- Peripheral,
- Backlight,
- Battery,
- PowerSupply,
- Dock,
- ThermalSensor,
- ThermalControl,
- BlueTooth,
- Bridge,
- Platform,
- Cryptography,
- Event,
- Input,
- PNP,
- OtherACPI,
- OtherUSB,
- OtherMultimedia,
- OtherPeripheral,
- OtherSensor,
- OtherVirtual,
- Other,
- Last = Other
-};
-};
-
-// Keep readDiskDeviceSubtypeFromString() in tdehardwaredevices.cpp in sync with this enum
-namespace TDEDiskDeviceType {
-enum TDEDiskDeviceType {
- Null = 0x00000000,
- MediaDevice = 0x00000001,
- Floppy = 0x00000002,
- CDROM = 0x00000004,
- CDRW = 0x00000008,
- DVDROM = 0x00000010,
- DVDRAM = 0x00000020,
- DVDRW = 0x00000040,
- BDROM = 0x00000080,
- BDRW = 0x00000100,
- Zip = 0x00000200,
- Jaz = 0x00000400,
- Camera = 0x00000800,
- LUKS = 0x00001000,
- OtherCrypted = 0x00002000,
- CDAudio = 0x00004000,
- CDVideo = 0x00008000,
- DVDVideo = 0x00010000,
- BDVideo = 0x00020000,
- Flash = 0x00040000,
- USB = 0x00080000,
- Tape = 0x00100000,
- HDD = 0x00200000,
- Optical = 0x00400000,
- RAM = 0x00800000,
- Loop = 0x01000000,
- CompactFlash = 0x02000000,
- MemoryStick = 0x04000000,
- SmartMedia = 0x08000000,
- SDMMC = 0x10000000,
- UnlockedCrypt = 0x20000000,
- Other = 0x80000000
-};
-
-inline TDEDiskDeviceType operator|(TDEDiskDeviceType a, TDEDiskDeviceType b)
-{
- return static_cast<TDEDiskDeviceType>(static_cast<int>(a) | static_cast<int>(b));
-}
-
-inline TDEDiskDeviceType operator&(TDEDiskDeviceType a, TDEDiskDeviceType b)
-{
- return static_cast<TDEDiskDeviceType>(static_cast<int>(a) & static_cast<int>(b));
-}
-
-inline TDEDiskDeviceType operator~(TDEDiskDeviceType a)
-{
- return static_cast<TDEDiskDeviceType>(~static_cast<int>(a));
-}
-};
-
-namespace TDEDiskDeviceStatus {
-enum TDEDiskDeviceStatus {
- Null = 0x00000000,
- Mountable = 0x00000001,
- Removable = 0x00000002,
- Inserted = 0x00000004,
- Blank = 0x00000008,
- UsedByDevice = 0x00000010,
- UsesDevice = 0x00000020,
- ContainsFilesystem = 0x00000040,
- Hotpluggable = 0x00000080,
- Other = 0x80000000
-};
-
-inline TDEDiskDeviceStatus operator|(TDEDiskDeviceStatus a, TDEDiskDeviceStatus b)
-{
- return static_cast<TDEDiskDeviceStatus>(static_cast<int>(a) | static_cast<int>(b));
-}
-
-inline TDEDiskDeviceStatus operator&(TDEDiskDeviceStatus a, TDEDiskDeviceStatus b)
-{
- return static_cast<TDEDiskDeviceStatus>(static_cast<int>(a) & static_cast<int>(b));
-}
-
-inline TDEDiskDeviceStatus operator~(TDEDiskDeviceStatus a)
-{
- return static_cast<TDEDiskDeviceStatus>(~static_cast<int>(a));
-}
-};
-
class TDECORE_EXPORT TDESensorCluster
{
public:
@@ -208,543 +73,6 @@ class TDECORE_EXPORT TDESensorCluster
double critical;
};
-class TDECORE_EXPORT TDEGenericDevice : public TQObject
-{
- Q_OBJECT
-
- public:
- /**
- * Constructor.
- * @param Device type
- */
- TDEGenericDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn=TQString::null);
-
- /**
- * Destructor.
- */
- ~TDEGenericDevice();
-
- /**
- * @return a TDEGenericDeviceType::TDEGenericDeviceType specifying the device type
- */
- TDEGenericDeviceType::TDEGenericDeviceType type();
-
- /**
- * @return a TQString with the device name, if any
- */
- TQString name();
-
- /**
- * @return a TQString with the vendor name, if any
- */
- TQString vendorName();
-
- /**
- * @return a TQString with the vendor model, if any
- */
- TQString vendorModel();
-
- /**
- * @return a TQString with the serial number, if any
- */
- TQString serialNumber();
-
- /**
- * @return a TQString with a friendly name
- *
- * While TDE tries very hard to generate and return a friendly name for this device,
- * sometimes the best it will be able to do is "Unknown Device [xxxx:yyyy]"
- */
- virtual TQString friendlyName();
-
- /**
- * @return a TQString with the device bus name, if any
- */
- TQString deviceBus();
-
- /**
- * @return a TQString with the system path, if any
- *
- * This method is non-portable, so be careful!
- */
- TQString systemPath();
-
- /**
- * @return a TQString with the system device node, if any
- *
- * This method is non-portable, so be careful!
- */
- TQString deviceNode();
-
- /**
- * @return true if this device has been blacklisted for update actions
- */
- bool blacklistedForUpdate();
-
- /**
- * @return a TQString containing a unique identifier for this device
- */
- TQString uniqueID();
-
- /**
- * @return a TQString with the vendor ID, if any
- */
- TQString vendorID();
-
- /**
- * @return a TQString with the model ID, if any
- */
- TQString modelID();
-
- /**
- * @return a TQString with the encoded vendor, if any
- */
- TQString vendorEncoded();
-
- /**
- * @return a TQString with the encoded model, if any
- */
- TQString modelEncoded();
-
- /**
- * @return a TQString with the subvendor ID, if any
- */
- TQString subVendorID();
-
- /**
- * @return a TQString with the submodel ID, if any
- */
- TQString subModelID();
-
- /**
- * @return a TQString with the PCI device class, if any
- */
- TQString PCIClass();
-
- /**
- * @return a TQString with the module alias string, if any
- */
- TQString moduleAlias();
-
- /**
- * @return a TQString with the device driver, if any
- */
- TQString deviceDriver();
-
- /**
- * @return a TQString with the subsystem type, if any
- */
- TQString subsystem();
-
- /**
- * @return a TDEGenericDevice* with the parent device, if any
- */
- TDEGenericDevice* parentDevice();
-
- /**
- * @return a TQString containing the friendly type name
- */
- virtual TQString friendlyDeviceType();
-
- /**
- * @return a TQString containing the device bus ID, if any
- */
- TQString busID();
-
- /**
- * Get an icon for this device
- * @param size a TDEIcon::StdSizes structure specifying the desired icon size
- * @return a TQPixmap containing the icon for the specified type
- */
- virtual TQPixmap icon(TDEIcon::StdSizes size);
-
- protected:
- /**
- * @param a TQString with the device name, if any
- * @internal
- */
- void internalSetName(TQString dn);
-
- /**
- * @param a TQString with the vendor name, if any
- * @internal
- */
- void internalSetVendorName(TQString vn);
-
- /**
- * @param a TQString with the vendor model, if any
- * @internal
- */
- void internalSetVendorModel(TQString vm);
-
- /**
- * @param a TQString with the serial number, if any
- * @internal
- */
- void internalSetSerialNumber(TQString sn);
-
- /**
- * @param a TQString with the device bus name, if any
- * @internal
- */
- void internalSetDeviceBus(TQString db);
-
- /**
- * @param a TQString with the system path, if any
- * @internal
- *
- * This method is non-portable, so be careful!
- */
- void internalSetSystemPath(TQString sp);
-
- /**
- * @param a TQString with the system device node, if any
- * @internal
- *
- * This method is non-portable, so be careful!
- */
- void internalSetDeviceNode(TQString sn);
-
- /**
- * @param bl true if this device has been blacklisted for update actions
- * @internal
- */
- void internalSetBlacklistedForUpdate(bool bl);
-
- /**
- * @param a TQString with the vendor ID, if any
- * @internal
- */
- void internalSetVendorID(TQString id);
-
- /**
- * @param a TQString with the model ID, if any
- * @internal
- */
- void internalSetModelID(TQString id);
-
- /**
- * @param a TQString with the encoded vendor, if any
- * @internal
- */
- void internalSetVendorEncoded(TQString id);
-
- /**
- * @param a TQString with the encoded model, if any
- * @internal
- */
- void internalSetModelEncoded(TQString id);
-
- /**
- * @param a TQString with the subvendor ID, if any
- * @internal
- */
- void internalSetSubVendorID(TQString id);
-
- /**
- * @param a TQString with the submodel ID, if any
- * @internal
- */
- void internalSetSubModelID(TQString id);
-
- /**
- * @param a TQString with the PCI device class, if any
- * @internal
- */
- void internalSetPCIClass(TQString cl);
-
- /**
- * @param a TQString with the module alias string, if any
- * @internal
- */
- void internalSetModuleAlias(TQString ma);
-
- /**
- * @param a TQString with the device driver, if any
- * @internal
- */
- void internalSetDeviceDriver(TQString dr);
-
- /**
- * @param a TQString with the subsystem type, if any
- * @internal
- */
- void internalSetSubsystem(TQString ss);
-
- /**
- * @param a TDEGenericDevice* with the parent device, if any
- * @internal
- */
- void internalSetParentDevice(TDEGenericDevice* pd);
-
- private:
- TDEGenericDeviceType::TDEGenericDeviceType m_deviceType;
- TQString m_deviceName;
- TQString m_systemPath;
- TQString m_deviceNode;
- TQString m_vendorName;
- TQString m_vendorModel;
- TQString m_serialNumber;
- TQString m_deviceBus;
- TQString m_uniqueID;
- TQString m_vendorID;
- TQString m_modelID;
- TQString m_vendorenc;
- TQString m_modelenc;
- TQString m_subvendorID;
- TQString m_submodelID;
- TQString m_pciClass;
- TQString m_modAlias;
- TQString m_deviceDriver;
- TQString m_subsystem;
- TQString m_friendlyName;
- bool m_blacklistedForUpdate;
- TDEGenericDevice* m_parentDevice;
-
- // Internal use only!
- TQStringList m_externalSubtype;
- TQString m_externalRulesFile;
- TQString m_udevtype;
- TQString m_udevdevicetypestring;
- TQString udevdevicetypestring_alt;
-
- friend class TDEHardwareDevices;
-};
-
-class TDECORE_EXPORT TDEStorageDevice : public TDEGenericDevice
-{
- public:
- /**
- * Constructor.
- * @param Device type
- */
- TDEStorageDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn=TQString::null);
-
- /**
- * Destructor.
- */
- ~TDEStorageDevice();
-
- /**
- * @return a TQString with the disk or partition label, if any
- */
- TQString diskLabel();
-
- /**
- * @return a TQString with the disk UUID, if any
- */
- TQString diskUUID();
-
- /**
- * @return an OR-ed combination of TDEDiskDeviceType::TDEDiskDeviceType type flags
- */
- TDEDiskDeviceType::TDEDiskDeviceType diskType();
-
- /**
- * @return an OR-ed combination of TDEDiskDeviceStatus::TDEDiskDeviceStatus type flags
- */
- TDEDiskDeviceStatus::TDEDiskDeviceStatus diskStatus();
-
- /**
- * @return true if media inserted, false if no media available
- */
- bool mediaInserted();
-
- /**
- * @return a TQString with the filesystem name, if any
- */
- TQString fileSystemName();
-
- /**
- * @return a TQString with the filesystem usage string, if any
- */
- TQString fileSystemUsage();
-
- /**
- * @return a TQStringList containing system paths to all devices with a lock on this device, if any
- */
- TQStringList holdingDevices();
-
- /**
- * @return a TQStringList containing system paths to all devices locked by this device, if any
- */
- TQStringList slaveDevices();
-
- /**
- * Mounts the device if not encrypted
- *
- * @param a TQString containing a requested mount name under /media, if desired
- * @param a TQString containing any mount options for pmount, if desired
- * @param a pointer to a TQString which will be populated with any error messages from pmount, if desired
- * @param a pointer to an integer which will be populated with the return code from pmount, if desired
- *
- * @return a TQString with the mount path, if successful
- */
- TQString mountDevice(TQString mediaName=TQString::null, TQString mountOptions=TQString::null, TQString* errRet=0, int* retcode=0);
-
- /**
- * Mounts the encrypted device if the correct passphrase is given
- *
- * @param a TQString containing the passphrase
- * @param a TQString containing a requested mount name under /media, if desired
- * @param a TQString containing any mount options for pmount, if desired
- * @param a pointer to a TQString which will be populated with any error messages from pmount, if desired
- * @param a pointer to an integer which will be populated with the return code from pmount, if desired
- *
- * @return a TQString with the mount path, if successful
- */
- TQString mountEncryptedDevice(TQString passphrase, TQString mediaName=TQString::null, TQString mountOptions=TQString::null, TQString* errRet=0, int* retcode=0);
-
- /**
- * Unmounts the device
- *
- * @param a pointer to a TQString which will be populated with any error messages from pmount, if desired
- * @param a pointer to an integer which will be populated with the return code from pmount, if desired
- *
- * @return TRUE if unmount was successful
- */
- bool unmountDevice(TQString* errRet, int* retcode=0);
-
- /**
- * @return a TQString with the mount path, if mounted
- */
- TQString mountPath();
-
- /**
- * @return an unsigned long with the device size in bytes
- */
- unsigned long long deviceSize();
-
- /**
- * @return a TQString with the device size in human readable form
- */
- TQString deviceFriendlySize();
-
- /**
- * Get an icon for this device
- * @param size a TDEIcon::StdSizes structure specifying the desired icon size
- * @return a TQPixmap containing the icon for the specified type
- *
- * This method overrides TDEGenericDevice::icon(TDEIcon::StdSizes size)
- */
- TQPixmap icon(TDEIcon::StdSizes size);
-
- /**
- * @return a TQString with a friendly name
- *
- * This method overrides TDEGenericDevice::friendlyName()
- */
- TQString friendlyName();
-
- /**
- * @return a TQString containing the friendly type name
- *
- * This method overrides TDEGenericDevice::friendlyDeviceType()
- */
- TQString friendlyDeviceType();
-
- /**
- * @param an OR-ed combination of TDEDiskDeviceType::TDEDiskDeviceType type flags
- */
- bool isDiskOfType(TDEDiskDeviceType::TDEDiskDeviceType tf);
-
- /**
- * @param an OR-ed combination of TDEDiskDeviceStatus::TDEDiskDeviceStatus type flags
- */
- bool checkDiskStatus(TDEDiskDeviceStatus::TDEDiskDeviceStatus sf);
-
- /**
- * @param TRUE to engage media lock, FALSE to disable it
- * @return TRUE on success, FALSE on failure
- *
- * This method currently works on CD-ROM drives and similar devices
- */
- bool lockDriveMedia(bool lock);
-
- /**
- * @return TRUE on success, FALSE on failure
- *
- * This method currently works on CD-ROM drives and similar devices
- */
- bool ejectDriveMedia();
-
- /**
- * @return TRUE on success, FALSE on failure
- *
- * This method currently works on all removable storage devices
- */
- bool ejectDrive();
-
- protected:
- /**
- * @param a TQString with the disk or partition label, if any
- * @internal
- */
- void internalSetDiskLabel(TQString dn);
-
- /**
- * @param a TQString with the disk UUID, if any
- * @internal
- */
- void internalSetDiskUUID(TQString id);
-
- /**
- * @param an OR-ed combination of TDEDiskDeviceType::TDEDiskDeviceType type flags
- * @internal
- */
- void internalSetDiskType(TDEDiskDeviceType::TDEDiskDeviceType tf);
-
- /**
- * @param an OR-ed combination of TDEDiskDeviceStatus::TDEDiskDeviceStatus type flags
- * @internal
- */
- void internalSetDiskStatus(TDEDiskDeviceStatus::TDEDiskDeviceStatus st);
-
- /**
- * @param a bool with the media status
- * @internal
- */
- void internalSetMediaInserted(bool inserted);
-
- /**
- * @param a TQString with the filesystem name, if any
- * @internal
- */
- void internalSetFileSystemName(TQString fn);
-
- /**
- * @param a TQString with the filesystem usage string, if any
- * @internal
- */
- void internalSetFileSystemUsage(TQString fu);
-
- /**
- * @param a TQStringList containing system paths to all devices with a lock on this device, if any
- * @internal
- */
- void internalSetHoldingDevices(TQStringList hd);
-
- /**
- * @param a TQStringList containing system paths to all devices locked by this device, if any
- * @internal
- */
- void internalSetSlaveDevices(TQStringList sd);
-
- private:
- TDEDiskDeviceType::TDEDiskDeviceType m_diskType;
- TDEDiskDeviceStatus::TDEDiskDeviceStatus m_diskStatus;
- TQString m_diskName;
- TQString m_diskUUID;
- TQString m_fileSystemName;
- TQString m_fileSystemUsage;
- bool m_mediaInserted;
- TQString m_mountPath;
- TQStringList m_holdingDevices;
- TQStringList m_slaveDevices;
-
- friend class TDEHardwareDevices;
-};
-
class TDECORE_EXPORT TDECPUDevice : public TDEGenericDevice
{
public:
diff --git a/tdecore/tdehw/tdestoragedevice.cpp b/tdecore/tdehw/tdestoragedevice.cpp
new file mode 100644
index 000000000..8c3538ade
--- /dev/null
+++ b/tdecore/tdehw/tdestoragedevice.cpp
@@ -0,0 +1,721 @@
+/* This file is part of the TDE libraries
+ Copyright (C) 2012 Timothy Pearson <kb9vqf@pearsoncomputing.net>
+ (C) 2013 Golubev Alexander <fatzer2@gmail.com>
+
+ 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 "tdestoragedevice.h"
+
+#include <unistd.h>
+#include <fcntl.h>
+
+#include <sys/ioctl.h>
+#include <linux/cdrom.h>
+
+// uDisks2 integration
+#if defined(WITH_UDISKS) || defined(WITH_UDISKS2)
+ #include <tqdbusdata.h>
+ #include <tqdbusmessage.h>
+ #include <tqdbusproxy.h>
+ #include <tqdbusvariant.h>
+ #include <tqdbusconnection.h>
+ #include <tqdbuserror.h>
+ #include <tqdbusdatamap.h>
+ #include <tqdbusobjectpath.h>
+#endif // defined(WITH_UDISKS) || defined(WITH_UDISKS2)
+#if defined(WITH_UDISKS)
+ #include "tqdbusdatalist.h"
+#endif // ddefined(WITH_UDISKS)
+
+#include <tqpixmap.h>
+#include <tqfile.h>
+
+#include "tdelocale.h"
+#include "tdeglobal.h"
+#include "kiconloader.h"
+#include "tdetempfile.h"
+
+#include "tdehardwaredevices.h"
+
+TDEStorageDevice::TDEStorageDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TDEGenericDevice(dt, dn), m_mediaInserted(true) {
+ m_diskType = TDEDiskDeviceType::Null;
+ m_diskStatus = TDEDiskDeviceStatus::Null;
+}
+
+TDEStorageDevice::~TDEStorageDevice() {
+}
+
+TDEDiskDeviceType::TDEDiskDeviceType TDEStorageDevice::diskType() {
+ return m_diskType;
+}
+
+void TDEStorageDevice::internalSetDiskType(TDEDiskDeviceType::TDEDiskDeviceType dt) {
+ m_diskType = dt;
+}
+
+bool TDEStorageDevice::isDiskOfType(TDEDiskDeviceType::TDEDiskDeviceType tf) {
+ return ((m_diskType&tf)!=TDEDiskDeviceType::Null);
+}
+
+TDEDiskDeviceStatus::TDEDiskDeviceStatus TDEStorageDevice::diskStatus() {
+ return m_diskStatus;
+}
+
+void TDEStorageDevice::internalSetDiskStatus(TDEDiskDeviceStatus::TDEDiskDeviceStatus st) {
+ m_diskStatus = st;
+}
+
+bool TDEStorageDevice::checkDiskStatus(TDEDiskDeviceStatus::TDEDiskDeviceStatus sf) {
+ return ((m_diskStatus&sf)!=(TDEDiskDeviceStatus::TDEDiskDeviceStatus)0);
+}
+
+bool TDEStorageDevice::lockDriveMedia(bool lock) {
+ int fd = open(deviceNode().ascii(), O_RDWR | O_NONBLOCK);
+ if (fd < 0) {
+ return false;
+ }
+ if (ioctl(fd, CDROM_LOCKDOOR, (lock)?1:0) != 0) {
+ close(fd);
+ return false;
+ }
+ else {
+ close(fd);
+ return true;
+ }
+}
+
+bool ejectDriveUDisks(TDEStorageDevice* sdevice) {
+#ifdef WITH_UDISKS
+ TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
+ if (dbusConn.isConnected()) {
+ TQString blockDeviceString = sdevice->deviceNode();
+ blockDeviceString.replace("/dev/", "");
+ 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<TQT_DBusData> params;
+ TQT_DBusDataList options;
+ params << TQT_DBusData::fromList(options);
+ TQT_DBusMessage reply = driveControl.sendWithReply("DriveEject", params, &error);
+ if (error.isValid()) {
+ // Error!
+ printf("[ERROR] %s\n", error.name().ascii()); fflush(stdout);
+ return FALSE;
+ }
+ else {
+ return TRUE;
+ }
+ }
+ else {
+ return FALSE;
+ }
+ }
+ else {
+ return FALSE;
+ }
+#else // WITH_UDISKS
+ return FALSE;
+#endif // WITH_UDISKS
+}
+
+bool ejectDriveUDisks2(TDEStorageDevice* sdevice) {
+#ifdef WITH_UDISKS2
+ TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
+ if (dbusConn.isConnected()) {
+ TQString blockDeviceString = sdevice->deviceNode();
+ blockDeviceString.replace("/dev/", "");
+ 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<TQT_DBusData> 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] %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<TQT_DBusData> 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] %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<TQT_DBusData> params;
+ TQT_DBusDataMap<TQString> options(TQT_DBusData::Variant);
+ params << TQT_DBusData::fromStringKeyMap(options);
+ TQT_DBusMessage reply = driveControl.sendWithReply("Eject", params, &error);
+ if (error.isValid()) {
+ // Error!
+ printf("[ERROR] %s\n", error.name().ascii()); fflush(stdout);
+ return FALSE;
+ }
+ else {
+ return TRUE;
+ }
+ }
+ else {
+ return FALSE;
+ }
+ }
+ else {
+ return FALSE;
+ }
+ }
+ }
+ else {
+ return FALSE;
+ }
+ }
+ else {
+ return FALSE;
+ }
+#else // WITH_UDISKS2
+ return FALSE;
+#endif // WITH_UDISKS2
+}
+
+bool TDEStorageDevice::ejectDrive() {
+ if (ejectDriveUDisks2(this)) {
+ return TRUE;
+ }
+ else {
+#ifdef WITH_UDISKS2
+ printf("[tdehwlib] Failed to eject drive '%s' via udisks2, falling back to alternate mechanism\n", deviceNode().ascii());
+#endif // WITH_UDISKS2
+ if (ejectDriveUDisks(this)) {
+ return TRUE;
+ }
+ else {
+#ifdef WITH_UDISKS
+ printf("[tdehwlib] Failed to eject drive '%s' via udisks, falling back to alternate mechanism\n", deviceNode().ascii());
+#endif // WITH_UDISKS
+ TQString command = TQString("eject -v '%1' 2>&1").arg(deviceNode());
+
+ FILE *exepipe = popen(command.ascii(), "r");
+ if (exepipe) {
+ TQString pmount_output;
+ char buffer[8092];
+ pmount_output = fgets(buffer, sizeof(buffer), exepipe);
+ int retcode = pclose(exepipe);
+ if (retcode == 0) {
+ return TRUE;
+ }
+ else {
+ printf("[tdehwlib] Failed to eject drive '%s' via 'eject' command\n", deviceNode().ascii());
+ return FALSE;
+ }
+ }
+ else {
+ printf("[tdehwlib] Failed to eject drive '%s' via 'eject' command\n", deviceNode().ascii());
+ return FALSE;
+ }
+ }
+ }
+}
+
+bool TDEStorageDevice::ejectDriveMedia() {
+ int fd = open(deviceNode().ascii(), O_RDWR | O_NONBLOCK);
+ if (fd < 0) {
+ return false;
+ }
+ if (ioctl(fd, CDROMEJECT) != 0) {
+ close(fd);
+ return false;
+ }
+ else {
+ close(fd);
+ return true;
+ }
+}
+
+TQString TDEStorageDevice::diskLabel() {
+ return m_diskName;
+}
+
+void TDEStorageDevice::internalSetDiskLabel(TQString dn) {
+ m_diskName = dn;
+}
+
+bool TDEStorageDevice::mediaInserted() {
+ return m_mediaInserted;
+}
+
+void TDEStorageDevice::internalSetMediaInserted(bool inserted) {
+ m_mediaInserted = inserted;
+}
+
+TQString TDEStorageDevice::fileSystemName() {
+ return m_fileSystemName;
+}
+
+void TDEStorageDevice::internalSetFileSystemName(TQString fn) {
+ m_fileSystemName = fn;
+}
+
+TQString TDEStorageDevice::fileSystemUsage() {
+ return m_fileSystemUsage;
+}
+
+void TDEStorageDevice::internalSetFileSystemUsage(TQString fu) {
+ m_fileSystemUsage = fu;
+}
+
+TQString TDEStorageDevice::diskUUID() {
+ return m_diskUUID;
+}
+
+void TDEStorageDevice::internalSetDiskUUID(TQString id) {
+ m_diskUUID = id;
+}
+
+TQStringList TDEStorageDevice::holdingDevices() {
+ return m_holdingDevices;
+}
+
+void TDEStorageDevice::internalSetHoldingDevices(TQStringList hd) {
+ m_holdingDevices = hd;
+}
+
+TQStringList TDEStorageDevice::slaveDevices() {
+ return m_slaveDevices;
+}
+
+void TDEStorageDevice::internalSetSlaveDevices(TQStringList sd) {
+ m_slaveDevices = sd;
+}
+
+TQString TDEStorageDevice::friendlyName() {
+ // Return the actual storage device name
+ TQString devicevendorid = vendorEncoded();
+ TQString devicemodelid = modelEncoded();
+
+ devicevendorid.replace("\\x20", " ");
+ devicemodelid.replace("\\x20", " ");
+
+ devicevendorid = devicevendorid.stripWhiteSpace();
+ devicemodelid = devicemodelid.stripWhiteSpace();
+ devicevendorid = devicevendorid.simplifyWhiteSpace();
+ devicemodelid = devicemodelid.simplifyWhiteSpace();
+
+ TQString devicename = devicevendorid + " " + devicemodelid;
+
+ devicename = devicename.stripWhiteSpace();
+ devicename = devicename.simplifyWhiteSpace();
+
+ if (devicename != "") {
+ return devicename;
+ }
+
+ if (isDiskOfType(TDEDiskDeviceType::Camera)) {
+ return TDEGenericDevice::friendlyName();
+ }
+
+ if (isDiskOfType(TDEDiskDeviceType::Floppy)) {
+ return friendlyDeviceType();
+ }
+
+ TQString label = diskLabel();
+ if (label.isNull()) {
+ if (deviceSize() > 0) {
+ if (checkDiskStatus(TDEDiskDeviceStatus::Hotpluggable)) {
+ label = i18n("%1 Removable Device").arg(deviceFriendlySize());
+ }
+ else {
+ label = i18n("%1 Fixed Storage Device").arg(deviceFriendlySize());
+ }
+ }
+ }
+
+ if (!label.isNull()) {
+ return label;
+ }
+
+ return friendlyDeviceType();
+}
+
+TQString TDEStorageDevice::friendlyDeviceType() {
+ TQString ret = i18n("Hard Disk Drive");
+
+ // Keep this in sync with TDEStorageDevice::icon(TDEIcon::StdSizes size) below
+ if (isDiskOfType(TDEDiskDeviceType::Floppy)) {
+ ret = i18n("Floppy Drive");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::Optical)) {
+ ret = i18n("Optical Drive");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::CDROM)) {
+ ret = i18n("CDROM Drive");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::CDRW)) {
+ ret = i18n("CDRW Drive");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::DVDROM)) {
+ ret = i18n("DVD Drive");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::DVDRW)) {
+ ret = i18n("DVDRW Drive");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::DVDRAM)) {
+ ret = i18n("DVDRAM Drive");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::Zip)) {
+ ret = i18n("Zip Drive");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::Tape)) {
+ ret = i18n("Tape Drive");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::Camera)) {
+ ret = i18n("Digital Camera");
+ }
+
+ if (isDiskOfType(TDEDiskDeviceType::HDD)) {
+ ret = i18n("Hard Disk Drive");
+ if (checkDiskStatus(TDEDiskDeviceStatus::Hotpluggable)) {
+ ret = i18n("Removable Storage");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::CompactFlash)) {
+ ret = i18n("Compact Flash");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::MemoryStick)) {
+ ret = i18n("Memory Stick");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::SmartMedia)) {
+ ret = i18n("Smart Media");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::SDMMC)) {
+ ret = i18n("Secure Digital");
+ }
+ }
+
+ if (isDiskOfType(TDEDiskDeviceType::RAM)) {
+ ret = i18n("Random Access Memory");
+ }
+ if (isDiskOfType(TDEDiskDeviceType::Loop)) {
+ ret = i18n("Loop Device");
+ }
+
+ return ret;
+}
+
+TQPixmap TDEStorageDevice::icon(TDEIcon::StdSizes size) {
+ TQPixmap ret = DesktopIcon("hdd_unmount", size);
+
+ if (isDiskOfType(TDEDiskDeviceType::Floppy)) {
+ ret = DesktopIcon("3floppy_unmount", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::Optical)) {
+ ret = DesktopIcon("cdrom_unmount", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::CDROM)) {
+ ret = DesktopIcon("cdrom_unmount", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::CDRW)) {
+ ret = DesktopIcon("cdwriter_unmount", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::DVDROM)) {
+ ret = DesktopIcon("dvd_unmount", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::DVDRW)) {
+ ret = DesktopIcon("dvd_unmount", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::DVDRAM)) {
+ ret = DesktopIcon("dvd_unmount", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::Zip)) {
+ ret = DesktopIcon("zip_unmount", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::Tape)) {
+ ret = DesktopIcon("tape_unmount", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::Camera)) {
+ ret = DesktopIcon("camera_unmount");
+ }
+
+ if (isDiskOfType(TDEDiskDeviceType::HDD)) {
+ ret = DesktopIcon("hdd_unmount", size);
+ if (checkDiskStatus(TDEDiskDeviceStatus::Hotpluggable)) {
+ ret = DesktopIcon("usbpendrive_unmount", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::CompactFlash)) {
+ ret = DesktopIcon("compact_flash_unmount", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::MemoryStick)) {
+ ret = DesktopIcon("memory_stick_unmount", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::SmartMedia)) {
+ ret = DesktopIcon("smart_media_unmount", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::SDMMC)) {
+ ret = DesktopIcon("sd_mmc_unmount", size);
+ }
+ }
+
+ if (isDiskOfType(TDEDiskDeviceType::RAM)) {
+ ret = DesktopIcon("memory", size);
+ }
+ if (isDiskOfType(TDEDiskDeviceType::Loop)) {
+ ret = DesktopIcon("blockdevice", size);
+ }
+
+ return ret;
+}
+
+unsigned long long TDEStorageDevice::deviceSize() {
+ TQString bsnodename = systemPath();
+ bsnodename.append("/queue/physical_block_size");
+ TQFile bsfile( bsnodename );
+ TQString blocksize;
+ if ( bsfile.open( IO_ReadOnly ) ) {
+ TQTextStream stream( &bsfile );
+ blocksize = stream.readLine();
+ bsfile.close();
+ }
+ else {
+ // Drat, I can't get a guaranteed block size. Assume a block size of 512, as everything I have read indicates that /sys/block/<dev>/size is given in terms of a 512 byte block...
+ blocksize = "512";
+ }
+
+ TQString dsnodename = systemPath();
+ dsnodename.append("/size");
+ TQFile dsfile( dsnodename );
+ TQString devicesize;
+ if ( dsfile.open( IO_ReadOnly ) ) {
+ TQTextStream stream( &dsfile );
+ devicesize = stream.readLine();
+ dsfile.close();
+ }
+
+ return ((unsigned long long)blocksize.toULong()*(unsigned long long)devicesize.toULong());
+}
+
+TQString TDEStorageDevice::deviceFriendlySize() {
+ return TDEHardwareDevices::bytesToFriendlySizeString(deviceSize());
+}
+
+TQString TDEStorageDevice::mountPath() {
+ // See if this device node is mounted
+ // This requires parsing /proc/mounts, looking for deviceNode()
+
+ // The Device Mapper throws a monkey wrench into this
+ // It likes to advertise mounts as /dev/mapper/<something>,
+ // where <something> is listed in <system path>/dm/name
+
+ // First, ensure that all device information (mainly holders/slaves) is accurate
+ TDEGlobal::hardwareDevices()->rescanDeviceInformation(this);
+
+ TQString dmnodename = systemPath();
+ dmnodename.append("/dm/name");
+ TQFile namefile( dmnodename );
+ TQString dmaltname;
+ if ( namefile.open( IO_ReadOnly ) ) {
+ TQTextStream stream( &namefile );
+ dmaltname = stream.readLine();
+ namefile.close();
+ }
+ if (!dmaltname.isNull()) {
+ dmaltname.prepend("/dev/mapper/");
+ }
+
+ TQStringList lines;
+ TQFile file( "/proc/mounts" );
+ if ( file.open( IO_ReadOnly ) ) {
+ TQTextStream stream( &file );
+ TQString line;
+ while ( !stream.atEnd() ) {
+ line = stream.readLine();
+ TQStringList mountInfo = TQStringList::split(" ", line, true);
+ TQString testNode = *mountInfo.at(0);
+ // Check for match
+ if ((testNode == deviceNode()) || (testNode == dmaltname) || (testNode == ("/dev/disk/by-uuid/" + diskUUID()))) {
+ TQString ret = *mountInfo.at(1);
+ ret.replace("\\040", " ");
+ return ret;
+ }
+ lines += line;
+ }
+ file.close();
+ }
+
+ // While this device is not directly mounted, it could concievably be mounted via the Device Mapper
+ // If so, try to retrieve the mount path...
+ TQStringList slaveDeviceList = holdingDevices();
+ for ( TQStringList::Iterator slavedevit = slaveDeviceList.begin(); slavedevit != slaveDeviceList.end(); ++slavedevit ) {
+ // Try to locate this device path in the TDE device tree
+ TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
+ TDEGenericDevice *hwdevice = hwdevices->findBySystemPath(*slavedevit);
+ if ((hwdevice) && (hwdevice->type() == TDEGenericDeviceType::Disk)) {
+ TDEStorageDevice* sdevice = static_cast<TDEStorageDevice*>(hwdevice);
+ return sdevice->mountPath();
+ }
+ }
+
+ return TQString::null;
+}
+
+TQString TDEStorageDevice::mountDevice(TQString mediaName, TQString mountOptions, TQString* errRet, int* retcode) {
+ int internal_retcode;
+ if (!retcode) {
+ retcode = &internal_retcode;
+ }
+
+ TQString ret = mountPath();
+
+ if (!ret.isNull()) {
+ return ret;
+ }
+
+ // Create dummy password file
+ KTempFile passwordFile(TQString::null, "tmp", 0600);
+ passwordFile.setAutoDelete(true);
+
+ TQString passFileName = passwordFile.name();
+ TQString devNode = deviceNode();
+ passFileName.replace("'", "'\\''");
+ devNode.replace("'", "'\\''");
+ mediaName.replace("'", "'\\''");
+ TQString command = TQString("pmount -p '%1' %2 '%3' '%4' 2>&1").arg(passFileName).arg(mountOptions).arg(devNode).arg(mediaName);
+
+ FILE *exepipe = popen(command.ascii(), "r");
+ if (exepipe) {
+ TQString pmount_output;
+ char buffer[8092];
+ pmount_output = fgets(buffer, sizeof(buffer), exepipe);
+ *retcode = pclose(exepipe);
+ if (errRet) {
+ *errRet = pmount_output;
+ }
+ }
+
+ // Update internal mount data
+ TDEGlobal::hardwareDevices()->processModifiedMounts();
+
+ ret = mountPath();
+
+ return ret;
+}
+
+TQString TDEStorageDevice::mountEncryptedDevice(TQString passphrase, TQString mediaName, TQString mountOptions, TQString* errRet, int* retcode) {
+ int internal_retcode;
+ if (!retcode) {
+ retcode = &internal_retcode;
+ }
+
+ TQString ret = mountPath();
+
+ if (!ret.isNull()) {
+ return ret;
+ }
+
+ // Create dummy password file
+ KTempFile passwordFile(TQString::null, "tmp", 0600);
+ passwordFile.setAutoDelete(true);
+ TQFile* pwFile = passwordFile.file();
+ if (!pwFile) {
+ return TQString::null;
+ }
+
+ pwFile->writeBlock(passphrase.ascii(), passphrase.length());
+ pwFile->flush();
+
+ TQString passFileName = passwordFile.name();
+ TQString devNode = deviceNode();
+ passFileName.replace("'", "'\\''");
+ devNode.replace("'", "'\\''");
+ mediaName.replace("'", "'\\''");
+ TQString command = TQString("pmount -p '%1' %2 '%3' '%4' 2>&1").arg(passFileName).arg(mountOptions).arg(devNode).arg(mediaName);
+
+ FILE *exepipe = popen(command.ascii(), "r");
+ if (exepipe) {
+ TQString pmount_output;
+ char buffer[8092];
+ pmount_output = fgets(buffer, sizeof(buffer), exepipe);
+ *retcode = pclose(exepipe);
+ if (errRet) {
+ *errRet = pmount_output;
+ }
+ }
+
+ // Update internal mount data
+ TDEGlobal::hardwareDevices()->processModifiedMounts();
+
+ ret = mountPath();
+
+ return ret;
+}
+
+bool TDEStorageDevice::unmountDevice(TQString* errRet, int* retcode) {
+ int internal_retcode;
+ if (!retcode) {
+ retcode = &internal_retcode;
+ }
+
+ TQString mountpoint = mountPath();
+
+ if (mountpoint.isNull()) {
+ return true;
+ }
+
+ mountpoint.replace("'", "'\\''");
+ TQString command = TQString("pumount '%1' 2>&1").arg(mountpoint);
+ FILE *exepipe = popen(command.ascii(), "r");
+ if (exepipe) {
+ TQString pmount_output;
+ char buffer[8092];
+ pmount_output = fgets(buffer, sizeof(buffer), exepipe);
+ *retcode = pclose(exepipe);
+ if (*retcode == 0) {
+ return true;
+ }
+ else {
+ if (errRet) {
+ *errRet = pmount_output;
+ }
+ }
+ }
+
+ // Update internal mount data
+ TDEGlobal::hardwareDevices()->processModifiedMounts();
+
+ return false;
+}
+
+#include "tdestoragedevice.moc"
diff --git a/tdecore/tdehw/tdestoragedevice.h b/tdecore/tdehw/tdestoragedevice.h
new file mode 100644
index 000000000..0f33b03dc
--- /dev/null
+++ b/tdecore/tdehw/tdestoragedevice.h
@@ -0,0 +1,342 @@
+/* This file is part of the TDE libraries
+ Copyright (C) 2012 Timothy Pearson <kb9vqf@pearsoncomputing.net>
+ (C) 2013 Golubev Alexander <fatzer2@gmail.com>
+
+ 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.
+*/
+
+#ifndef _TDESTORAGEDEVICE_H
+#define _TDESTORAGEDEVICE_H
+
+#include "tdegenericdevice.h"
+
+// Keep readDiskDeviceSubtypeFromString() in tdehardwaredevices.cpp in sync with this enum
+namespace TDEDiskDeviceType {
+enum TDEDiskDeviceType {
+ Null = 0x00000000,
+ MediaDevice = 0x00000001,
+ Floppy = 0x00000002,
+ CDROM = 0x00000004,
+ CDRW = 0x00000008,
+ DVDROM = 0x00000010,
+ DVDRAM = 0x00000020,
+ DVDRW = 0x00000040,
+ BDROM = 0x00000080,
+ BDRW = 0x00000100,
+ Zip = 0x00000200,
+ Jaz = 0x00000400,
+ Camera = 0x00000800,
+ LUKS = 0x00001000,
+ OtherCrypted = 0x00002000,
+ CDAudio = 0x00004000,
+ CDVideo = 0x00008000,
+ DVDVideo = 0x00010000,
+ BDVideo = 0x00020000,
+ Flash = 0x00040000,
+ USB = 0x00080000,
+ Tape = 0x00100000,
+ HDD = 0x00200000,
+ Optical = 0x00400000,
+ RAM = 0x00800000,
+ Loop = 0x01000000,
+ CompactFlash = 0x02000000,
+ MemoryStick = 0x04000000,
+ SmartMedia = 0x08000000,
+ SDMMC = 0x10000000,
+ UnlockedCrypt = 0x20000000,
+ Other = 0x80000000
+};
+
+inline TDEDiskDeviceType operator|(TDEDiskDeviceType a, TDEDiskDeviceType b)
+{
+ return static_cast<TDEDiskDeviceType>(static_cast<int>(a) | static_cast<int>(b));
+}
+
+inline TDEDiskDeviceType operator&(TDEDiskDeviceType a, TDEDiskDeviceType b)
+{
+ return static_cast<TDEDiskDeviceType>(static_cast<int>(a) & static_cast<int>(b));
+}
+
+inline TDEDiskDeviceType operator~(TDEDiskDeviceType a)
+{
+ return static_cast<TDEDiskDeviceType>(~static_cast<int>(a));
+}
+};
+
+namespace TDEDiskDeviceStatus {
+enum TDEDiskDeviceStatus {
+ Null = 0x00000000,
+ Mountable = 0x00000001,
+ Removable = 0x00000002,
+ Inserted = 0x00000004,
+ Blank = 0x00000008,
+ UsedByDevice = 0x00000010,
+ UsesDevice = 0x00000020,
+ ContainsFilesystem = 0x00000040,
+ Hotpluggable = 0x00000080,
+ Other = 0x80000000
+};
+
+inline TDEDiskDeviceStatus operator|(TDEDiskDeviceStatus a, TDEDiskDeviceStatus b)
+{
+ return static_cast<TDEDiskDeviceStatus>(static_cast<int>(a) | static_cast<int>(b));
+}
+
+inline TDEDiskDeviceStatus operator&(TDEDiskDeviceStatus a, TDEDiskDeviceStatus b)
+{
+ return static_cast<TDEDiskDeviceStatus>(static_cast<int>(a) & static_cast<int>(b));
+}
+
+inline TDEDiskDeviceStatus operator~(TDEDiskDeviceStatus a)
+{
+ return static_cast<TDEDiskDeviceStatus>(~static_cast<int>(a));
+}
+};
+
+class TDECORE_EXPORT TDEStorageDevice : public TDEGenericDevice
+{
+ public:
+ /**
+ * Constructor.
+ * @param Device type
+ */
+ TDEStorageDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn=TQString::null);
+
+ /**
+ * Destructor.
+ */
+ ~TDEStorageDevice();
+
+ /**
+ * @return a TQString with the disk or partition label, if any
+ */
+ TQString diskLabel();
+
+ /**
+ * @return a TQString with the disk UUID, if any
+ */
+ TQString diskUUID();
+
+ /**
+ * @return an OR-ed combination of TDEDiskDeviceType::TDEDiskDeviceType type flags
+ */
+ TDEDiskDeviceType::TDEDiskDeviceType diskType();
+
+ /**
+ * @return an OR-ed combination of TDEDiskDeviceStatus::TDEDiskDeviceStatus type flags
+ */
+ TDEDiskDeviceStatus::TDEDiskDeviceStatus diskStatus();
+
+ /**
+ * @return true if media inserted, false if no media available
+ */
+ bool mediaInserted();
+
+ /**
+ * @return a TQString with the filesystem name, if any
+ */
+ TQString fileSystemName();
+
+ /**
+ * @return a TQString with the filesystem usage string, if any
+ */
+ TQString fileSystemUsage();
+
+ /**
+ * @return a TQStringList containing system paths to all devices with a lock on this device, if any
+ */
+ TQStringList holdingDevices();
+
+ /**
+ * @return a TQStringList containing system paths to all devices locked by this device, if any
+ */
+ TQStringList slaveDevices();
+
+ /**
+ * Mounts the device if not encrypted
+ *
+ * @param a TQString containing a requested mount name under /media, if desired
+ * @param a TQString containing any mount options for pmount, if desired
+ * @param a pointer to a TQString which will be populated with any error messages from pmount, if desired
+ * @param a pointer to an integer which will be populated with the return code from pmount, if desired
+ *
+ * @return a TQString with the mount path, if successful
+ */
+ TQString mountDevice(TQString mediaName=TQString::null, TQString mountOptions=TQString::null, TQString* errRet=0, int* retcode=0);
+
+ /**
+ * Mounts the encrypted device if the correct passphrase is given
+ *
+ * @param a TQString containing the passphrase
+ * @param a TQString containing a requested mount name under /media, if desired
+ * @param a TQString containing any mount options for pmount, if desired
+ * @param a pointer to a TQString which will be populated with any error messages from pmount, if desired
+ * @param a pointer to an integer which will be populated with the return code from pmount, if desired
+ *
+ * @return a TQString with the mount path, if successful
+ */
+ TQString mountEncryptedDevice(TQString passphrase, TQString mediaName=TQString::null, TQString mountOptions=TQString::null, TQString* errRet=0, int* retcode=0);
+
+ /**
+ * Unmounts the device
+ *
+ * @param a pointer to a TQString which will be populated with any error messages from pmount, if desired
+ * @param a pointer to an integer which will be populated with the return code from pmount, if desired
+ *
+ * @return TRUE if unmount was successful
+ */
+ bool unmountDevice(TQString* errRet, int* retcode=0);
+
+ /**
+ * @return a TQString with the mount path, if mounted
+ */
+ TQString mountPath();
+
+ /**
+ * @return an unsigned long with the device size in bytes
+ */
+ unsigned long long deviceSize();
+
+ /**
+ * @return a TQString with the device size in human readable form
+ */
+ TQString deviceFriendlySize();
+
+ /**
+ * Get an icon for this device
+ * @param size a TDEIcon::StdSizes structure specifying the desired icon size
+ * @return a TQPixmap containing the icon for the specified type
+ *
+ * This method overrides TDEGenericDevice::icon(TDEIcon::StdSizes size)
+ */
+ TQPixmap icon(TDEIcon::StdSizes size);
+
+ /**
+ * @return a TQString with a friendly name
+ *
+ * This method overrides TDEGenericDevice::friendlyName()
+ */
+ TQString friendlyName();
+
+ /**
+ * @return a TQString containing the friendly type name
+ *
+ * This method overrides TDEGenericDevice::friendlyDeviceType()
+ */
+ TQString friendlyDeviceType();
+
+ /**
+ * @param an OR-ed combination of TDEDiskDeviceType::TDEDiskDeviceType type flags
+ */
+ bool isDiskOfType(TDEDiskDeviceType::TDEDiskDeviceType tf);
+
+ /**
+ * @param an OR-ed combination of TDEDiskDeviceStatus::TDEDiskDeviceStatus type flags
+ */
+ bool checkDiskStatus(TDEDiskDeviceStatus::TDEDiskDeviceStatus sf);
+
+ /**
+ * @param TRUE to engage media lock, FALSE to disable it
+ * @return TRUE on success, FALSE on failure
+ *
+ * This method currently works on CD-ROM drives and similar devices
+ */
+ bool lockDriveMedia(bool lock);
+
+ /**
+ * @return TRUE on success, FALSE on failure
+ *
+ * This method currently works on CD-ROM drives and similar devices
+ */
+ bool ejectDriveMedia();
+
+ /**
+ * @return TRUE on success, FALSE on failure
+ *
+ * This method currently works on all removable storage devices
+ */
+ bool ejectDrive();
+
+ protected:
+ /**
+ * @param a TQString with the disk or partition label, if any
+ * @internal
+ */
+ void internalSetDiskLabel(TQString dn);
+
+ /**
+ * @param a TQString with the disk UUID, if any
+ * @internal
+ */
+ void internalSetDiskUUID(TQString id);
+
+ /**
+ * @param an OR-ed combination of TDEDiskDeviceType::TDEDiskDeviceType type flags
+ * @internal
+ */
+ void internalSetDiskType(TDEDiskDeviceType::TDEDiskDeviceType tf);
+
+ /**
+ * @param an OR-ed combination of TDEDiskDeviceStatus::TDEDiskDeviceStatus type flags
+ * @internal
+ */
+ void internalSetDiskStatus(TDEDiskDeviceStatus::TDEDiskDeviceStatus st);
+
+ /**
+ * @param a bool with the media status
+ * @internal
+ */
+ void internalSetMediaInserted(bool inserted);
+
+ /**
+ * @param a TQString with the filesystem name, if any
+ * @internal
+ */
+ void internalSetFileSystemName(TQString fn);
+
+ /**
+ * @param a TQString with the filesystem usage string, if any
+ * @internal
+ */
+ void internalSetFileSystemUsage(TQString fu);
+
+ /**
+ * @param a TQStringList containing system paths to all devices with a lock on this device, if any
+ * @internal
+ */
+ void internalSetHoldingDevices(TQStringList hd);
+
+ /**
+ * @param a TQStringList containing system paths to all devices locked by this device, if any
+ * @internal
+ */
+ void internalSetSlaveDevices(TQStringList sd);
+
+ private:
+ TDEDiskDeviceType::TDEDiskDeviceType m_diskType;
+ TDEDiskDeviceStatus::TDEDiskDeviceStatus m_diskStatus;
+ TQString m_diskName;
+ TQString m_diskUUID;
+ TQString m_fileSystemName;
+ TQString m_fileSystemUsage;
+ bool m_mediaInserted;
+ TQString m_mountPath;
+ TQStringList m_holdingDevices;
+ TQStringList m_slaveDevices;
+
+ friend class TDEHardwareDevices;
+};
+
+#endif // _TDESTORAGEDEVICE_H