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 + (C) 2013 Golubev Alexander + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "tdegenericdevice.h" + +#include + +#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 + (C) 2013 Golubev Alexander + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef _TDEGENERICDEVICE_H +#define _TDEGENERICDEVICE_H + +#include +#include + +#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 #include -#include -#include -#include -#include -#include // Backlight devices #include @@ -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 #include #include #include #include -#endif // defined(WITH_UPOWER) || defined(WITH_UDISKS) || defined(WITH_UDISKS2) -#if defined(WITH_UDISKS) || defined(WITH_UDISKS2) - #include - #include - #include -#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 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 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 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 params; - TQT_DBusDataMap options(TQT_DBusData::Variant); - params << TQT_DBusData::fromStringKeyMap(options); - TQT_DBusMessage reply = driveControl.sendWithReply("Eject", params, &error); - if (error.isValid()) { - // Error! - printf("[ERROR] %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//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/, - // where is listed in /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(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 #include +// 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(static_cast(a) | static_cast(b)); -} - -inline TDEDiskDeviceType operator&(TDEDiskDeviceType a, TDEDiskDeviceType b) -{ - return static_cast(static_cast(a) & static_cast(b)); -} - -inline TDEDiskDeviceType operator~(TDEDiskDeviceType a) -{ - return static_cast(~static_cast(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(static_cast(a) | static_cast(b)); -} - -inline TDEDiskDeviceStatus operator&(TDEDiskDeviceStatus a, TDEDiskDeviceStatus b) -{ - return static_cast(static_cast(a) & static_cast(b)); -} - -inline TDEDiskDeviceStatus operator~(TDEDiskDeviceStatus a) -{ - return static_cast(~static_cast(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 + (C) 2013 Golubev Alexander + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "tdestoragedevice.h" + +#include +#include + +#include +#include + +// uDisks2 integration +#if defined(WITH_UDISKS) || defined(WITH_UDISKS2) + #include + #include + #include + #include + #include + #include + #include + #include +#endif // defined(WITH_UDISKS) || defined(WITH_UDISKS2) +#if defined(WITH_UDISKS) + #include "tqdbusdatalist.h" +#endif // ddefined(WITH_UDISKS) + +#include +#include + +#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 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 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 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 params; + TQT_DBusDataMap options(TQT_DBusData::Variant); + params << TQT_DBusData::fromStringKeyMap(options); + TQT_DBusMessage reply = driveControl.sendWithReply("Eject", params, &error); + if (error.isValid()) { + // Error! + printf("[ERROR] %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//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/, + // where is listed in /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(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 + (C) 2013 Golubev Alexander + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#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(static_cast(a) | static_cast(b)); +} + +inline TDEDiskDeviceType operator&(TDEDiskDeviceType a, TDEDiskDeviceType b) +{ + return static_cast(static_cast(a) & static_cast(b)); +} + +inline TDEDiskDeviceType operator~(TDEDiskDeviceType a) +{ + return static_cast(~static_cast(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(static_cast(a) | static_cast(b)); +} + +inline TDEDiskDeviceStatus operator&(TDEDiskDeviceStatus a, TDEDiskDeviceStatus b) +{ + return static_cast(static_cast(a) & static_cast(b)); +} + +inline TDEDiskDeviceStatus operator~(TDEDiskDeviceStatus a) +{ + return static_cast(~static_cast(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