Repair quite a few bugs in the TDE hw library

Add methods needed for kpowersave
pull/16/head
Timothy Pearson 13 years ago
parent f146da840f
commit c1fcbb1852

@ -30,6 +30,9 @@
#include <ksimpledirwatch.h> #include <ksimpledirwatch.h>
#include <kstandarddirs.h> #include <kstandarddirs.h>
#include <kapplication.h>
#include <dcopclient.h>
#include <libudev.h> #include <libudev.h>
#include <fcntl.h> #include <fcntl.h>
@ -103,7 +106,7 @@ TDEGenericDeviceType::TDEGenericDeviceType TDEGenericDevice::type() {
return m_deviceType; return m_deviceType;
} }
TQString &TDEGenericDevice::name() { TQString TDEGenericDevice::name() {
return m_deviceName; return m_deviceName;
} }
@ -111,7 +114,7 @@ void TDEGenericDevice::internalSetName(TQString dn) {
m_deviceName = dn; m_deviceName = dn;
} }
TQString &TDEGenericDevice::vendorName() { TQString TDEGenericDevice::vendorName() {
return m_vendorName; return m_vendorName;
} }
@ -119,7 +122,7 @@ void TDEGenericDevice::internalSetVendorName(TQString vn) {
m_vendorName = vn; m_vendorName = vn;
} }
TQString &TDEGenericDevice::vendorModel() { TQString TDEGenericDevice::vendorModel() {
return m_vendorModel; return m_vendorModel;
} }
@ -127,7 +130,7 @@ void TDEGenericDevice::internalSetVendorModel(TQString vm) {
m_vendorModel = vm; m_vendorModel = vm;
} }
TQString &TDEGenericDevice::serialNumber() { TQString TDEGenericDevice::serialNumber() {
return m_serialNumber; return m_serialNumber;
} }
@ -135,7 +138,10 @@ void TDEGenericDevice::internalSetSerialNumber(TQString sn) {
m_serialNumber = sn; m_serialNumber = sn;
} }
TQString &TDEGenericDevice::systemPath() { TQString TDEGenericDevice::systemPath() {
if (!m_systemPath.endsWith("/")) {
m_systemPath += "/";
}
return m_systemPath; return m_systemPath;
} }
@ -143,7 +149,7 @@ void TDEGenericDevice::internalSetSystemPath(TQString sp) {
m_systemPath = sp; m_systemPath = sp;
} }
TQString &TDEGenericDevice::deviceNode() { TQString TDEGenericDevice::deviceNode() {
return m_deviceNode; return m_deviceNode;
} }
@ -151,7 +157,7 @@ void TDEGenericDevice::internalSetDeviceNode(TQString sn) {
m_deviceNode = sn; m_deviceNode = sn;
} }
TQString &TDEGenericDevice::deviceBus() { TQString TDEGenericDevice::deviceBus() {
return m_deviceBus; return m_deviceBus;
} }
@ -164,7 +170,7 @@ TQString TDEGenericDevice::uniqueID() {
return m_uniqueID; return m_uniqueID;
} }
TQString &TDEGenericDevice::vendorID() { TQString TDEGenericDevice::vendorID() {
return m_vendorID; return m_vendorID;
} }
@ -173,7 +179,7 @@ void TDEGenericDevice::internalSetVendorID(TQString id) {
m_vendorID.replace("0x", ""); m_vendorID.replace("0x", "");
} }
TQString &TDEGenericDevice::modelID() { TQString TDEGenericDevice::modelID() {
return m_modelID; return m_modelID;
} }
@ -182,7 +188,7 @@ void TDEGenericDevice::internalSetModelID(TQString id) {
m_modelID.replace("0x", ""); m_modelID.replace("0x", "");
} }
TQString &TDEGenericDevice::vendorEncoded() { TQString TDEGenericDevice::vendorEncoded() {
return m_vendorenc; return m_vendorenc;
} }
@ -190,7 +196,7 @@ void TDEGenericDevice::internalSetVendorEncoded(TQString id) {
m_vendorenc = id; m_vendorenc = id;
} }
TQString &TDEGenericDevice::modelEncoded() { TQString TDEGenericDevice::modelEncoded() {
return m_modelenc; return m_modelenc;
} }
@ -198,7 +204,7 @@ void TDEGenericDevice::internalSetModelEncoded(TQString id) {
m_modelenc = id; m_modelenc = id;
} }
TQString &TDEGenericDevice::subVendorID() { TQString TDEGenericDevice::subVendorID() {
return m_subvendorID; return m_subvendorID;
} }
@ -207,7 +213,7 @@ void TDEGenericDevice::internalSetSubVendorID(TQString id) {
m_subvendorID.replace("0x", ""); m_subvendorID.replace("0x", "");
} }
TQString &TDEGenericDevice::PCIClass() { TQString TDEGenericDevice::PCIClass() {
return m_pciClass; return m_pciClass;
} }
@ -216,7 +222,7 @@ void TDEGenericDevice::internalSetPCIClass(TQString cl) {
m_pciClass.replace("0x", ""); m_pciClass.replace("0x", "");
} }
TQString &TDEGenericDevice::moduleAlias() { TQString TDEGenericDevice::moduleAlias() {
return m_modAlias; return m_modAlias;
} }
@ -224,7 +230,7 @@ void TDEGenericDevice::internalSetModuleAlias(TQString ma) {
m_modAlias = ma; m_modAlias = ma;
} }
TQString &TDEGenericDevice::deviceDriver() { TQString TDEGenericDevice::deviceDriver() {
return m_deviceDriver; return m_deviceDriver;
} }
@ -232,7 +238,7 @@ void TDEGenericDevice::internalSetDeviceDriver(TQString dr) {
m_deviceDriver = dr; m_deviceDriver = dr;
} }
TQString &TDEGenericDevice::subsystem() { TQString TDEGenericDevice::subsystem() {
return m_subsystem; return m_subsystem;
} }
@ -240,7 +246,7 @@ void TDEGenericDevice::internalSetSubsystem(TQString ss) {
m_subsystem = ss; m_subsystem = ss;
} }
TQString &TDEGenericDevice::subModelID() { TQString TDEGenericDevice::subModelID() {
return m_submodelID; return m_submodelID;
} }
@ -282,8 +288,12 @@ TQString TDEGenericDevice::busID() {
TQString TDEGenericDevice::friendlyName() { TQString TDEGenericDevice::friendlyName() {
if (m_friendlyName.isNull()) { if (m_friendlyName.isNull()) {
if (type() == TDEGenericDeviceType::Root) { if (type() == TDEGenericDeviceType::RootSystem) {
TQString friendlyDriverName = m_systemPath; m_friendlyName = "Linux System";
}
else if (type() == TDEGenericDeviceType::Root) {
TQString friendlyDriverName = systemPath();
friendlyDriverName.truncate(friendlyDriverName.length()-1);
friendlyDriverName.remove(0, friendlyDriverName.findRev("/")+1); friendlyDriverName.remove(0, friendlyDriverName.findRev("/")+1);
m_friendlyName = friendlyDriverName; m_friendlyName = friendlyDriverName;
} }
@ -295,6 +305,7 @@ TQString TDEGenericDevice::friendlyName() {
} }
else { else {
TQString acpigentype = systemPath(); TQString acpigentype = systemPath();
acpigentype.truncate(acpigentype.length()-1);
acpigentype.remove(0, acpigentype.findRev("/")+1); acpigentype.remove(0, acpigentype.findRev("/")+1);
TQString pnpgentype = acpigentype; TQString pnpgentype = acpigentype;
pnpgentype.truncate(pnpgentype.find(":")); pnpgentype.truncate(pnpgentype.find(":"));
@ -348,7 +359,8 @@ TQString TDEGenericDevice::friendlyName() {
m_friendlyName = i18n("Generic %1 Device").arg(friendlyDriverName); m_friendlyName = i18n("Generic %1 Device").arg(friendlyDriverName);
} }
else if (m_systemPath.lower().startsWith("/sys/devices/virtual")) { else if (m_systemPath.lower().startsWith("/sys/devices/virtual")) {
TQString friendlyDriverName = m_systemPath; TQString friendlyDriverName = systemPath();
friendlyDriverName.truncate(friendlyDriverName.length()-1);
friendlyDriverName.remove(0, friendlyDriverName.findRev("/")+1); friendlyDriverName.remove(0, friendlyDriverName.findRev("/")+1);
if (!friendlyDriverName.isNull()) { if (!friendlyDriverName.isNull()) {
m_friendlyName = i18n("Virtual Device %1").arg(friendlyDriverName); m_friendlyName = i18n("Virtual Device %1").arg(friendlyDriverName);
@ -398,7 +410,7 @@ bool TDEStorageDevice::checkDiskStatus(TDEDiskDeviceStatus::TDEDiskDeviceStatus
return ((m_diskStatus&sf)!=(TDEDiskDeviceStatus::TDEDiskDeviceStatus)0); return ((m_diskStatus&sf)!=(TDEDiskDeviceStatus::TDEDiskDeviceStatus)0);
} }
TQString &TDEStorageDevice::diskLabel() { TQString TDEStorageDevice::diskLabel() {
return m_diskName; return m_diskName;
} }
@ -414,7 +426,7 @@ void TDEStorageDevice::internalSetMediaInserted(bool inserted) {
m_mediaInserted = inserted; m_mediaInserted = inserted;
} }
TQString &TDEStorageDevice::fileSystemName() { TQString TDEStorageDevice::fileSystemName() {
return m_fileSystemName; return m_fileSystemName;
} }
@ -422,7 +434,7 @@ void TDEStorageDevice::internalSetFileSystemName(TQString fn) {
m_fileSystemName = fn; m_fileSystemName = fn;
} }
TQString &TDEStorageDevice::fileSystemUsage() { TQString TDEStorageDevice::fileSystemUsage() {
return m_fileSystemUsage; return m_fileSystemUsage;
} }
@ -430,7 +442,7 @@ void TDEStorageDevice::internalSetFileSystemUsage(TQString fu) {
m_fileSystemUsage = fu; m_fileSystemUsage = fu;
} }
TQString &TDEStorageDevice::diskUUID() { TQString TDEStorageDevice::diskUUID() {
return m_diskUUID; return m_diskUUID;
} }
@ -438,7 +450,7 @@ void TDEStorageDevice::internalSetDiskUUID(TQString id) {
m_diskUUID = id; m_diskUUID = id;
} }
TQStringList &TDEStorageDevice::holdingDevices() { TQStringList TDEStorageDevice::holdingDevices() {
return m_holdingDevices; return m_holdingDevices;
} }
@ -446,7 +458,7 @@ void TDEStorageDevice::internalSetHoldingDevices(TQStringList hd) {
m_holdingDevices = hd; m_holdingDevices = hd;
} }
TQStringList &TDEStorageDevice::slaveDevices() { TQStringList TDEStorageDevice::slaveDevices() {
return m_slaveDevices; return m_slaveDevices;
} }
@ -823,7 +835,7 @@ TDECPUDevice::TDECPUDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQStri
TDECPUDevice::~TDECPUDevice() { TDECPUDevice::~TDECPUDevice() {
} }
double &TDECPUDevice::frequency() { double TDECPUDevice::frequency() {
return m_frequency; return m_frequency;
} }
@ -831,7 +843,7 @@ void TDECPUDevice::internalSetFrequency(double fr) {
m_frequency = fr; m_frequency = fr;
} }
double &TDECPUDevice::minFrequency() { double TDECPUDevice::minFrequency() {
return m_minfrequency; return m_minfrequency;
} }
@ -839,7 +851,7 @@ void TDECPUDevice::internalSetMinFrequency(double fr) {
m_minfrequency = fr; m_minfrequency = fr;
} }
double &TDECPUDevice::maxFrequency() { double TDECPUDevice::maxFrequency() {
return m_maxfrequency; return m_maxfrequency;
} }
@ -847,7 +859,7 @@ void TDECPUDevice::internalSetMaxFrequency(double fr) {
m_maxfrequency = fr; m_maxfrequency = fr;
} }
double &TDECPUDevice::transitionLatency() { double TDECPUDevice::transitionLatency() {
return m_transitionlatency; return m_transitionlatency;
} }
@ -855,7 +867,7 @@ void TDECPUDevice::internalSetTransitionLatency(double tl) {
m_transitionlatency = tl; m_transitionlatency = tl;
} }
TQString &TDECPUDevice::governor() { TQString TDECPUDevice::governor() {
return m_governor; return m_governor;
} }
@ -863,7 +875,7 @@ void TDECPUDevice::internalSetGovernor(TQString gr) {
m_governor = gr; m_governor = gr;
} }
TQString &TDECPUDevice::scalingDriver() { TQString TDECPUDevice::scalingDriver() {
return m_scalingdriver; return m_scalingdriver;
} }
@ -871,7 +883,7 @@ void TDECPUDevice::internalSetScalingDriver(TQString dr) {
m_scalingdriver = dr; m_scalingdriver = dr;
} }
TQStringList &TDECPUDevice::dependentProcessors() { TQStringList TDECPUDevice::dependentProcessors() {
return m_tiedprocs; return m_tiedprocs;
} }
@ -879,7 +891,7 @@ void TDECPUDevice::internalSetDependentProcessors(TQStringList dp) {
m_tiedprocs = dp; m_tiedprocs = dp;
} }
TQStringList &TDECPUDevice::availableFrequencies() { TQStringList TDECPUDevice::availableFrequencies() {
return m_frequencies; return m_frequencies;
} }
@ -887,7 +899,7 @@ void TDECPUDevice::internalSetAvailableFrequencies(TQStringList af) {
m_frequencies = af; m_frequencies = af;
} }
TQStringList &TDECPUDevice::availableGovernors() { TQStringList TDECPUDevice::availableGovernors() {
return m_governers; return m_governers;
} }
@ -930,6 +942,195 @@ void TDESensorDevice::internalSetValues(TDESensorClusterMap cl) {
m_sensorValues = cl; m_sensorValues = cl;
} }
TDERootSystemDevice::TDERootSystemDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TDEGenericDevice(dt, dn) {
m_hibernationSpace = -1;
}
TDERootSystemDevice::~TDERootSystemDevice() {
}
TDESystemFormFactor::TDESystemFormFactor TDERootSystemDevice::formFactor() {
return m_formFactor;
}
void TDERootSystemDevice::internalSetFormFactor(TDESystemFormFactor::TDESystemFormFactor ff) {
m_formFactor = ff;
}
TDESystemPowerStateList TDERootSystemDevice::powerStates() {
return m_powerStates;
}
void TDERootSystemDevice::internalSetPowerStates(TDESystemPowerStateList ps) {
m_powerStates = ps;
}
TDESystemHibernationMethodList TDERootSystemDevice::hibernationMethods() {
return m_hibernationMethods;
}
void TDERootSystemDevice::internalSetHibernationMethods(TDESystemHibernationMethodList hm) {
m_hibernationMethods = hm;
}
TDESystemHibernationMethod::TDESystemHibernationMethod TDERootSystemDevice::hibernationMethod() {
return m_hibernationMethod;
}
void TDERootSystemDevice::internalSetHibernationMethod(TDESystemHibernationMethod::TDESystemHibernationMethod hm) {
m_hibernationMethod = hm;
}
unsigned long TDERootSystemDevice::diskSpaceNeededForHibernation() {
return m_hibernationSpace;
}
void TDERootSystemDevice::internalSetDiskSpaceNeededForHibernation(unsigned long sz) {
m_hibernationSpace = sz;
}
bool TDERootSystemDevice::canSetHibernationMethod() {
TQString hibernationnode = "/sys/power/disk";
int rval = access (hibernationnode.ascii(), W_OK);
if (rval == 0) {
return TRUE;
}
else {
return FALSE;
}
}
bool TDERootSystemDevice::canStandby() {
TQString statenode = "/sys/power/state";
int rval = access (statenode.ascii(), W_OK);
if (rval == 0) {
if (powerStates().contains(TDESystemPowerState::Standby)) {
return TRUE;
}
else {
return FALSE;
}
}
else {
return FALSE;
}
}
bool TDERootSystemDevice::canSuspend() {
TQString statenode = "/sys/power/state";
int rval = access (statenode.ascii(), W_OK);
if (rval == 0) {
if (powerStates().contains(TDESystemPowerState::Suspend)) {
return TRUE;
}
else {
return FALSE;
}
}
else {
return FALSE;
}
}
bool TDERootSystemDevice::canHibernate() {
TQString statenode = "/sys/power/state";
int rval = access (statenode.ascii(), W_OK);
if (rval == 0) {
if (powerStates().contains(TDESystemPowerState::Hibernate)) {
return TRUE;
}
else {
return FALSE;
}
}
else {
return FALSE;
}
}
bool TDERootSystemDevice::canPowerOff() {
// FIXME
// Can we power down this system?
// This should probably be checked via DCOP and therefore interface with KDM
KConfig *config = KGlobal::config();
config->reparseConfiguration(); // config may have changed in the KControl module
config->setGroup("General" );
bool maysd = false;
if (config->readBoolEntry( "offerShutdown", true )/* && DM().canShutdown()*/) { // FIXME
maysd = true;
}
return maysd;
}
void TDERootSystemDevice::setHibernationMethod(TDESystemHibernationMethod::TDESystemHibernationMethod hm) {
TQString hibernationnode = "/sys/power/disk";
TQFile file( hibernationnode );
if ( file.open( IO_WriteOnly ) ) {
TQString hibernationCommand;
if (hm == TDESystemHibernationMethod::Platform) {
hibernationCommand = "platform";
}
if (hm == TDESystemHibernationMethod::Shutdown) {
hibernationCommand = "shutdown";
}
if (hm == TDESystemHibernationMethod::Reboot) {
hibernationCommand = "reboot";
}
if (hm == TDESystemHibernationMethod::TestProc) {
hibernationCommand = "testproc";
}
if (hm == TDESystemHibernationMethod::Test) {
hibernationCommand = "test";
}
TQTextStream stream( &file );
stream << hibernationCommand;
file.close();
}
}
bool TDERootSystemDevice::setPowerState(TDESystemPowerState::TDESystemPowerState ps) {
if ((ps == TDESystemPowerState::Standby) || (ps == TDESystemPowerState::Suspend) || (ps == TDESystemPowerState::Hibernate)) {
TQString statenode = "/sys/power/state";
TQFile file( statenode );
if ( file.open( IO_WriteOnly ) ) {
TQString powerCommand;
if (ps == TDESystemPowerState::Standby) {
powerCommand = "standby";
}
if (ps == TDESystemPowerState::Suspend) {
powerCommand = "mem";
}
if (ps == TDESystemPowerState::Hibernate) {
powerCommand = "disk";
}
TQTextStream stream( &file );
stream << powerCommand;
file.close();
return true;
}
}
else if (ps == TDESystemPowerState::PowerOff) {
// Power down the system using a DCOP command
// Values are explained at http://lists.kde.org/?l=kde-linux&m=115770988603387
TQByteArray data;
TQDataStream arg(data, IO_WriteOnly);
arg << (int)0 << (int)2 << (int)2;
if ( kapp->dcopClient()->send("ksmserver", "default", "logout(int,int,int)", data) ) {
return true;
}
return false;
}
else if (ps == TDESystemPowerState::Active) {
// Ummm...we're already active...
return true;
}
return false;
}
TDEBatteryDevice::TDEBatteryDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TDEGenericDevice(dt, dn) { TDEBatteryDevice::TDEBatteryDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TDEGenericDevice(dt, dn) {
} }
@ -1008,7 +1209,7 @@ void TDEBatteryDevice::internalSetDischargeRate(double vt) {
m_dischargeRate = vt; m_dischargeRate = vt;
} }
TQString &TDEBatteryDevice::technology() { TQString TDEBatteryDevice::technology() {
return m_technology; return m_technology;
} }
@ -1016,7 +1217,7 @@ void TDEBatteryDevice::internalSetTechnology(TQString tc) {
m_technology = tc; m_technology = tc;
} }
TQString &TDEBatteryDevice::status() { TQString TDEBatteryDevice::status() {
return m_status; return m_status;
} }
@ -1299,6 +1500,20 @@ void TDEMonitorDevice::internalSetPowerLevel(TDEDisplayPowerLevel::TDEDisplayPow
m_powerLevel = pl; m_powerLevel = pl;
} }
TDEEventDevice::TDEEventDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TDEGenericDevice(dt, dn) {
}
TDEEventDevice::~TDEEventDevice() {
}
TDEEventDeviceType::TDEEventDeviceType TDEEventDevice::eventType() {
return m_eventType;
}
void TDEEventDevice::internalSetEventType(TDEEventDeviceType::TDEEventDeviceType et) {
m_eventType = et;
}
TDEHardwareDevices::TDEHardwareDevices() { TDEHardwareDevices::TDEHardwareDevices() {
// Initialize members // Initialize members
pci_id_map = 0; pci_id_map = 0;
@ -1423,8 +1638,13 @@ void TDEHardwareDevices::rescanDeviceInformation(TDEGenericDevice* hwdevice) {
} }
TDEGenericDevice* TDEHardwareDevices::findBySystemPath(TQString syspath) { TDEGenericDevice* TDEHardwareDevices::findBySystemPath(TQString syspath) {
if (!syspath.endsWith("/")) {
syspath += "/";
}
TDEGenericDevice *hwdevice; TDEGenericDevice *hwdevice;
for ( hwdevice = m_deviceList.first(); hwdevice; hwdevice = m_deviceList.next() ) { // We can't use m_deviceList directly as m_deviceList can only have one iterator active against it at any given time
TDEGenericHardwareList devList = listAllPhysicalDevices();
for ( hwdevice = devList.first(); hwdevice; hwdevice = devList.next() ) {
if (hwdevice->systemPath() == syspath) { if (hwdevice->systemPath() == syspath) {
return hwdevice; return hwdevice;
} }
@ -1699,7 +1919,7 @@ void TDEHardwareDevices::processStatelessDevices() {
// We can't use m_deviceList directly as m_deviceList can only have one iterator active against it at any given time // We can't use m_deviceList directly as m_deviceList can only have one iterator active against it at any given time
TDEGenericHardwareList devList = listAllPhysicalDevices(); TDEGenericHardwareList devList = listAllPhysicalDevices();
for ( hwdevice = devList.first(); hwdevice; hwdevice = devList.next() ) { for ( hwdevice = devList.first(); hwdevice; hwdevice = devList.next() ) {
if ((hwdevice->type() == TDEGenericDeviceType::Network) || (hwdevice->type() == TDEGenericDeviceType::OtherSensor)) { if ((hwdevice->type() == TDEGenericDeviceType::RootSystem) || (hwdevice->type() == TDEGenericDeviceType::Network) || (hwdevice->type() == TDEGenericDeviceType::OtherSensor)) {
rescanDeviceInformation(hwdevice); rescanDeviceInformation(hwdevice);
emit hardwareUpdated(hwdevice); emit hardwareUpdated(hwdevice);
} }
@ -1956,6 +2176,9 @@ TDEGenericDeviceType::TDEGenericDeviceType readGenericDeviceTypeFromString(TQStr
if (query == "Root") { if (query == "Root") {
ret = TDEGenericDeviceType::Root; ret = TDEGenericDeviceType::Root;
} }
else if (query == "RootSystem") {
ret = TDEGenericDeviceType::RootSystem;
}
else if (query == "CPU") { else if (query == "CPU") {
ret = TDEGenericDeviceType::CPU; ret = TDEGenericDeviceType::CPU;
} }
@ -2449,7 +2672,7 @@ TDEGenericDevice* TDEHardwareDevices::classifyUnknownDevice(udev_device* dev, TD
TQString syspath_tail = systempath.lower(); TQString syspath_tail = systempath.lower();
syspath_tail.remove(0, syspath_tail.findRev("/")+1); syspath_tail.remove(0, syspath_tail.findRev("/")+1);
if (syspath_tail.startsWith("event")) { if (syspath_tail.startsWith("event")) {
if (!device) device = new TDEGenericDevice(TDEGenericDeviceType::Event); if (!device) device = new TDEEventDevice(TDEGenericDeviceType::Event);
} }
// Pull out all input special devices and stuff them under Input // Pull out all input special devices and stuff them under Input
if (syspath_tail.startsWith("input")) { if (syspath_tail.startsWith("input")) {
@ -2732,6 +2955,11 @@ TDEGenericDevice* TDEHardwareDevices::classifyUnknownDevice(udev_device* dev, TD
printf("[FIXME] UNCLASSIFIED DEVICE name: %s type: %s subsystem: %s driver: %s [Node Path: %s] [Syspath: %s] [%s:%s]\n\r", devicename.ascii(), devicetype.ascii(), devicesubsystem.ascii(), devicedriver.ascii(), devicenode.ascii(), udev_device_get_syspath(dev), devicevendorid.ascii(), devicemodelid.ascii()); fflush(stdout); printf("[FIXME] UNCLASSIFIED DEVICE name: %s type: %s subsystem: %s driver: %s [Node Path: %s] [Syspath: %s] [%s:%s]\n\r", devicename.ascii(), devicetype.ascii(), devicesubsystem.ascii(), devicedriver.ascii(), devicenode.ascii(), udev_device_get_syspath(dev), devicevendorid.ascii(), devicemodelid.ascii()); fflush(stdout);
} }
// Root devices are special
if ((device->type() == TDEGenericDeviceType::Root) || (device->type() == TDEGenericDeviceType::RootSystem)) {
systempath = device->systemPath();
}
// Set preliminary basic device information // Set preliminary basic device information
device->internalSetName(devicename); device->internalSetName(devicename);
device->internalSetDeviceNode(devicenode); device->internalSetDeviceNode(devicenode);
@ -3459,6 +3687,122 @@ TDEGenericDevice* TDEHardwareDevices::classifyUnknownDevice(udev_device* dev, TD
// Much of the code in libkrandr should be integrated into/interfaced with this library // Much of the code in libkrandr should be integrated into/interfaced with this library
} }
if (device->type() == TDEGenericDeviceType::RootSystem) {
// Try to obtain as much generic information about this system as possible
TDERootSystemDevice* rdevice = dynamic_cast<TDERootSystemDevice*>(device);
// Guess at my form factor
// dmidecode would tell me this, but is somewhat unreliable
TDESystemFormFactor::TDESystemFormFactor formfactor = TDESystemFormFactor::Desktop;
if (listByDeviceClass(TDEGenericDeviceType::Backlight).count() > 0) { // Is this really a good way to determine if a machine is a laptop?
formfactor = TDESystemFormFactor::Laptop;
}
rdevice->internalSetFormFactor(formfactor);
TQString valuesnodename = "/sys/power/";
TQDir valuesdir(valuesnodename);
valuesdir.setFilter(TQDir::All);
TQString nodename;
const TQFileInfoList *dirlist = valuesdir.entryInfoList();
if (dirlist) {
TQFileInfoListIterator valuesdirit(*dirlist);
TQFileInfo *dirfi;
while ( (dirfi = valuesdirit.current()) != 0 ) {
nodename = dirfi->fileName();
TQFile file( valuesnodename + nodename );
if ( file.open( IO_ReadOnly ) ) {
TQTextStream stream( &file );
TQString line;
line = stream.readLine();
if (nodename == "state") {
TDESystemPowerStateList powerstates;
// Always assume that these two fully on/fully off states are available
powerstates.append(TDESystemPowerState::Active);
powerstates.append(TDESystemPowerState::PowerOff);
if (line.contains("standby")) {
powerstates.append(TDESystemPowerState::Standby);
}
if (line.contains("mem")) {
powerstates.append(TDESystemPowerState::Suspend);
}
if (line.contains("disk")) {
powerstates.append(TDESystemPowerState::Hibernate);
}
rdevice->internalSetPowerStates(powerstates);
}
if (nodename == "disk") {
// Get list of available hibernation methods
TDESystemHibernationMethodList hibernationmethods;
if (line.contains("platform")) {
hibernationmethods.append(TDESystemHibernationMethod::Platform);
}
if (line.contains("shutdown")) {
hibernationmethods.append(TDESystemHibernationMethod::Shutdown);
}
if (line.contains("reboot")) {
hibernationmethods.append(TDESystemHibernationMethod::Reboot);
}
if (line.contains("testproc")) {
hibernationmethods.append(TDESystemHibernationMethod::TestProc);
}
if (line.contains("test")) {
hibernationmethods.append(TDESystemHibernationMethod::Test);
}
rdevice->internalSetHibernationMethods(hibernationmethods);
// Get current hibernation method
line.truncate(line.findRev("]"));
line.remove(0, line.findRev("[")+1);
TDESystemHibernationMethod::TDESystemHibernationMethod hibernationmethod = TDESystemHibernationMethod::None;
if (line.contains("platform")) {
hibernationmethod = TDESystemHibernationMethod::Platform;
}
if (line.contains("shutdown")) {
hibernationmethod = TDESystemHibernationMethod::Shutdown;
}
if (line.contains("reboot")) {
hibernationmethod = TDESystemHibernationMethod::Reboot;
}
if (line.contains("testproc")) {
hibernationmethod = TDESystemHibernationMethod::TestProc;
}
if (line.contains("test")) {
hibernationmethod = TDESystemHibernationMethod::Test;
}
rdevice->internalSetHibernationMethod(hibernationmethod);
}
if (nodename == "image_size") {
rdevice->internalSetDiskSpaceNeededForHibernation(line.toULong());
}
file.close();
}
++valuesdirit;
}
}
}
if (device->type() == TDEGenericDeviceType::Event) {
// Try to obtain as much generic information about this event device as possible
TDEEventDevice* edevice = dynamic_cast<TDEEventDevice*>(device);
if (edevice->systemPath().contains("PNP0C0D")) {
edevice->internalSetEventType(TDEEventDeviceType::ACPILidSwitch);
}
else if (edevice->systemPath().contains("PNP0C0E")) {
edevice->internalSetEventType(TDEEventDeviceType::ACPISleepButton);
}
else if (edevice->systemPath().contains("PNP0C0C")) {
edevice->internalSetEventType(TDEEventDeviceType::ACPIPowerButton);
}
else {
edevice->internalSetEventType(TDEEventDeviceType::Unknown);
}
}
// Root devices are still special
if ((device->type() == TDEGenericDeviceType::Root) || (device->type() == TDEGenericDeviceType::RootSystem)) {
systempath = device->systemPath();
}
// Set basic device information again, as some information may have changed // Set basic device information again, as some information may have changed
device->internalSetName(devicename); device->internalSetName(devicename);
device->internalSetDeviceNode(devicenode); device->internalSetDeviceNode(devicenode);
@ -3581,13 +3925,20 @@ void TDEHardwareDevices::updateParentDeviceInformation() {
} }
void TDEHardwareDevices::addCoreSystemDevices() { void TDEHardwareDevices::addCoreSystemDevices() {
TDEGenericDevice *hwdevice;
// Add the Main Root System Device, which provides all other devices
hwdevice = new TDERootSystemDevice(TDEGenericDeviceType::RootSystem);
hwdevice->internalSetSystemPath("/sys/devices");
m_deviceList.append(hwdevice);
rescanDeviceInformation(hwdevice);
// Add core top-level devices in /sys/devices to the hardware listing // Add core top-level devices in /sys/devices to the hardware listing
TQStringList holdingDeviceNodes; TQStringList holdingDeviceNodes;
TQString devicesnodename = "/sys/devices"; TQString devicesnodename = "/sys/devices";
TQDir devicesdir(devicesnodename); TQDir devicesdir(devicesnodename);
devicesdir.setFilter(TQDir::All); devicesdir.setFilter(TQDir::All);
TQString nodename; TQString nodename;
TDEGenericDevice *hwdevice;
const TQFileInfoList *dirlist = devicesdir.entryInfoList(); const TQFileInfoList *dirlist = devicesdir.entryInfoList();
if (dirlist) { if (dirlist) {
TQFileInfoListIterator devicesdirit(*dirlist); TQFileInfoListIterator devicesdirit(*dirlist);
@ -4086,6 +4437,9 @@ TQString TDEHardwareDevices::getFriendlyDeviceTypeStringFromType(TDEGenericDevic
if (query == TDEGenericDeviceType::Root) { if (query == TDEGenericDeviceType::Root) {
ret = i18n("Root"); ret = i18n("Root");
} }
else if (query == TDEGenericDeviceType::RootSystem) {
ret = i18n("System Root");
}
else if (query == TDEGenericDeviceType::CPU) { else if (query == TDEGenericDeviceType::CPU) {
ret = i18n("CPU"); ret = i18n("CPU");
} }
@ -4229,6 +4583,9 @@ TQPixmap TDEHardwareDevices::getDeviceTypeIconFromType(TDEGenericDeviceType::TDE
if (query == TDEGenericDeviceType::Root) { if (query == TDEGenericDeviceType::Root) {
ret = DesktopIcon("kcmdevices", size); ret = DesktopIcon("kcmdevices", size);
} }
else if (query == TDEGenericDeviceType::RootSystem) {
ret = DesktopIcon("kcmdevices", size);
}
else if (query == TDEGenericDeviceType::CPU) { else if (query == TDEGenericDeviceType::CPU) {
ret = DesktopIcon("kcmprocessor", size); ret = DesktopIcon("kcmprocessor", size);
} }
@ -4365,6 +4722,17 @@ TQPixmap TDEHardwareDevices::getDeviceTypeIconFromType(TDEGenericDeviceType::TDE
return ret; return ret;
} }
TDERootSystemDevice* TDEHardwareDevices::rootSystemDevice() {
TDEGenericDevice *hwdevice;
for ( hwdevice = m_deviceList.first(); hwdevice; hwdevice = m_deviceList.next() ) {
if (hwdevice->type() == TDEGenericDeviceType::RootSystem) {
return dynamic_cast<TDERootSystemDevice*>(hwdevice);
}
}
return 0;
}
TQString TDEHardwareDevices::bytesToFriendlySizeString(double bytes) { TQString TDEHardwareDevices::bytesToFriendlySizeString(double bytes) {
TQString prettystring; TQString prettystring;

@ -43,6 +43,7 @@
namespace TDEGenericDeviceType { namespace TDEGenericDeviceType {
enum TDEGenericDeviceType { enum TDEGenericDeviceType {
Root, Root,
RootSystem,
CPU, CPU,
GPU, GPU,
RAM, RAM,
@ -212,22 +213,22 @@ class TDECORE_EXPORT TDEGenericDevice
/** /**
* @return a TQString with the device name, if any * @return a TQString with the device name, if any
*/ */
TQString &name(); TQString name();
/** /**
* @return a TQString with the vendor name, if any * @return a TQString with the vendor name, if any
*/ */
TQString &vendorName(); TQString vendorName();
/** /**
* @return a TQString with the vendor model, if any * @return a TQString with the vendor model, if any
*/ */
TQString &vendorModel(); TQString vendorModel();
/** /**
* @return a TQString with the serial number, if any * @return a TQString with the serial number, if any
*/ */
TQString &serialNumber(); TQString serialNumber();
/** /**
* @return a TQString with a friendly name * @return a TQString with a friendly name
@ -240,21 +241,21 @@ class TDECORE_EXPORT TDEGenericDevice
/** /**
* @return a TQString with the device bus name, if any * @return a TQString with the device bus name, if any
*/ */
TQString &deviceBus(); TQString deviceBus();
/** /**
* @return a TQString with the system path, if any * @return a TQString with the system path, if any
* *
* This method is non-portable, so be careful! * This method is non-portable, so be careful!
*/ */
TQString &systemPath(); TQString systemPath();
/** /**
* @return a TQString with the system device node, if any * @return a TQString with the system device node, if any
* *
* This method is non-portable, so be careful! * This method is non-portable, so be careful!
*/ */
TQString &deviceNode(); TQString deviceNode();
/** /**
* @return true if this device has been blacklisted for update actions * @return true if this device has been blacklisted for update actions
@ -269,52 +270,52 @@ class TDECORE_EXPORT TDEGenericDevice
/** /**
* @return a TQString with the vendor ID, if any * @return a TQString with the vendor ID, if any
*/ */
TQString &vendorID(); TQString vendorID();
/** /**
* @return a TQString with the model ID, if any * @return a TQString with the model ID, if any
*/ */
TQString &modelID(); TQString modelID();
/** /**
* @return a TQString with the encoded vendor, if any * @return a TQString with the encoded vendor, if any
*/ */
TQString &vendorEncoded(); TQString vendorEncoded();
/** /**
* @return a TQString with the encoded model, if any * @return a TQString with the encoded model, if any
*/ */
TQString &modelEncoded(); TQString modelEncoded();
/** /**
* @return a TQString with the subvendor ID, if any * @return a TQString with the subvendor ID, if any
*/ */
TQString &subVendorID(); TQString subVendorID();
/** /**
* @return a TQString with the submodel ID, if any * @return a TQString with the submodel ID, if any
*/ */
TQString &subModelID(); TQString subModelID();
/** /**
* @return a TQString with the PCI device class, if any * @return a TQString with the PCI device class, if any
*/ */
TQString &PCIClass(); TQString PCIClass();
/** /**
* @return a TQString with the module alias string, if any * @return a TQString with the module alias string, if any
*/ */
TQString &moduleAlias(); TQString moduleAlias();
/** /**
* @return a TQString with the device driver, if any * @return a TQString with the device driver, if any
*/ */
TQString &deviceDriver(); TQString deviceDriver();
/** /**
* @return a TQString with the subsystem type, if any * @return a TQString with the subsystem type, if any
*/ */
TQString &subsystem(); TQString subsystem();
/** /**
* @return a TDEGenericDevice* with the parent device, if any * @return a TDEGenericDevice* with the parent device, if any
@ -505,12 +506,12 @@ class TDECORE_EXPORT TDEStorageDevice : public TDEGenericDevice
/** /**
* @return a TQString with the disk or partition label, if any * @return a TQString with the disk or partition label, if any
*/ */
TQString &diskLabel(); TQString diskLabel();
/** /**
* @return a TQString with the disk UUID, if any * @return a TQString with the disk UUID, if any
*/ */
TQString &diskUUID(); TQString diskUUID();
/** /**
* @return an OR-ed combination of TDEDiskDeviceType::TDEDiskDeviceType type flags * @return an OR-ed combination of TDEDiskDeviceType::TDEDiskDeviceType type flags
@ -530,22 +531,22 @@ class TDECORE_EXPORT TDEStorageDevice : public TDEGenericDevice
/** /**
* @return a TQString with the filesystem name, if any * @return a TQString with the filesystem name, if any
*/ */
TQString &fileSystemName(); TQString fileSystemName();
/** /**
* @return a TQString with the filesystem usage string, if any * @return a TQString with the filesystem usage string, if any
*/ */
TQString &fileSystemUsage(); TQString fileSystemUsage();
/** /**
* @return a TQStringList containing system paths to all devices with a lock on this device, if any * @return a TQStringList containing system paths to all devices with a lock on this device, if any
*/ */
TQStringList &holdingDevices(); TQStringList holdingDevices();
/** /**
* @return a TQStringList containing system paths to all devices locked by this device, if any * @return a TQStringList containing system paths to all devices locked by this device, if any
*/ */
TQStringList &slaveDevices(); TQStringList slaveDevices();
/** /**
* Mounts the device if not encrypted * Mounts the device if not encrypted
@ -717,47 +718,47 @@ class TDECORE_EXPORT TDECPUDevice : public TDEGenericDevice
/** /**
* @return a double with the current CPU frequency in MHz, if available * @return a double with the current CPU frequency in MHz, if available
*/ */
double &frequency(); double frequency();
/** /**
* @return a double with the minimum CPU frequency in MHz, if available * @return a double with the minimum CPU frequency in MHz, if available
*/ */
double &minFrequency(); double minFrequency();
/** /**
* @return a double with the maximum CPU frequency in MHz, if available * @return a double with the maximum CPU frequency in MHz, if available
*/ */
double &maxFrequency(); double maxFrequency();
/** /**
* @return a double with the transition latency in ns, if available * @return a double with the transition latency in ns, if available
*/ */
double &transitionLatency(); double transitionLatency();
/** /**
* @return a TQString with the current CPU governor policy, if available * @return a TQString with the current CPU governor policy, if available
*/ */
TQString &governor(); TQString governor();
/** /**
* @return a TQString with the current CPU scaling driver, if available * @return a TQString with the current CPU scaling driver, if available
*/ */
TQString &scalingDriver(); TQString scalingDriver();
/** /**
* @return a TQStringList with the IDs of all processors that are dependent on the frequency/power settings of this one, if available * @return a TQStringList with the IDs of all processors that are dependent on the frequency/power settings of this one, if available
*/ */
TQStringList &dependentProcessors(); TQStringList dependentProcessors();
/** /**
* @return a TQStringList with all valid scaling frequencies in Hz, if available * @return a TQStringList with all valid scaling frequencies in Hz, if available
*/ */
TQStringList &availableFrequencies(); TQStringList availableFrequencies();
/** /**
* @return a TQStringList with all available governor policies, if available * @return a TQStringList with all available governor policies, if available
*/ */
TQStringList &availableGovernors(); TQStringList availableGovernors();
/** /**
* @return TRUE if permissions allow the CPU governor to be set, FALSE if not * @return TRUE if permissions allow the CPU governor to be set, FALSE if not
@ -900,12 +901,12 @@ class TDECORE_EXPORT TDEBatteryDevice : public TDEGenericDevice
/** /**
* @return a TQString with the battery technology, if available * @return a TQString with the battery technology, if available
*/ */
TQString &technology(); TQString technology();
/** /**
* @return a TQString with the battery status, if available * @return a TQString with the battery status, if available
*/ */
TQString &status(); TQString status();
/** /**
* @return TRUE if the battery is installed * @return TRUE if the battery is installed
@ -1461,6 +1462,199 @@ class TDECORE_EXPORT TDESensorDevice : public TDEGenericDevice
friend class TDEHardwareDevices; friend class TDEHardwareDevices;
}; };
namespace TDESystemFormFactor {
enum TDESystemFormFactor {
Unclassified,
Desktop,
Laptop,
Server,
Other = 0x80000000
};
};
namespace TDESystemPowerState {
enum TDESystemPowerState {
Active,
Standby,
Suspend,
Hibernate,
PowerOff
};
};
namespace TDESystemHibernationMethod {
enum TDESystemHibernationMethod {
None,
Platform,
Shutdown,
Reboot,
TestProc,
Test
};
};
typedef TQValueList<TDESystemPowerState::TDESystemPowerState> TDESystemPowerStateList;
typedef TQValueList<TDESystemHibernationMethod::TDESystemHibernationMethod> TDESystemHibernationMethodList;
class TDECORE_EXPORT TDERootSystemDevice : public TDEGenericDevice
{
public:
/**
* Constructor.
* @param Device type
*/
TDERootSystemDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn=TQString::null);
/**
* Destructor.
*/
~TDERootSystemDevice();
/**
* @return a TDESystemFormFactor::TDESystemFormFactor with the system's form factor
*/
TDESystemFormFactor::TDESystemFormFactor formFactor();
/**
* @return a TDESystemPowerStateList with all available power states
*/
TDESystemPowerStateList powerStates();
/**
* @return a TDESystemHibernationMethodList with all available hibernation methods
*/
TDESystemHibernationMethodList hibernationMethods();
/**
* @return a TDESystemHibernationMethod::TDESystemHibernationMethod with the current hibernation method
*/
TDESystemHibernationMethod::TDESystemHibernationMethod hibernationMethod();
/**
* @return an unsigned long with the number of bytes required to hibernate
*/
unsigned long diskSpaceNeededForHibernation();
/**
* @return TRUE if permissions allow the hibernation method to be set, FALSE if not
*/
bool canSetHibernationMethod();
/**
* @return TRUE if hardware and permissions allow the system to enter standby, FALSE if not
*/
bool canStandby();
/**
* @return TRUE if hardware and permissions allow the system to be suspended, FALSE if not
*/
bool canSuspend();
/**
* @return TRUE if hardware and permissions allow the system to be hibernated, FALSE if not
*/
bool canHibernate();
/**
* @return TRUE if permissions allow the system to be powered down, FALSE if not
*/
bool canPowerOff();
/**
* @param hm a TDESystemHibernationMethod::TDESystemHibernationMethod with the desired hibernation method
*/
void setHibernationMethod(TDESystemHibernationMethod::TDESystemHibernationMethod hm);
/**
* @param ps a TDESystemPowerState::TDESystemPowerState with the desired hibernation method
* @return TRUE if power state was set
*/
bool setPowerState(TDESystemPowerState::TDESystemPowerState ps);
protected:
/**
* @param ff a TDESystemFormFactor::TDESystemFormFactor with the system's form factor
* @internal
*/
void internalSetFormFactor(TDESystemFormFactor::TDESystemFormFactor ff);
/**
* @param ps a TDESystemPowerStateList with all available power states
* @internal
*/
void internalSetPowerStates(TDESystemPowerStateList ps);
/**
* @param hm a TDESystemHibernationMethodList with all available hibernation methods
* @internal
*/
void internalSetHibernationMethods(TDESystemHibernationMethodList hm);
/**
* @param hm a TDESystemHibernationMethod::TDESystemHibernationMethod with the current hibernation method
* @internal
*/
void internalSetHibernationMethod(TDESystemHibernationMethod::TDESystemHibernationMethod hm);
/**
* @param sz an unsigned long with the number of bytes required to hibernate
* @internal
*/
void internalSetDiskSpaceNeededForHibernation(unsigned long sz);
private:
TDESystemFormFactor::TDESystemFormFactor m_formFactor;
TDESystemPowerStateList m_powerStates;
TDESystemHibernationMethodList m_hibernationMethods;
TDESystemHibernationMethod::TDESystemHibernationMethod m_hibernationMethod;
unsigned long m_hibernationSpace;
friend class TDEHardwareDevices;
};
namespace TDEEventDeviceType {
enum TDEEventDeviceType {
Unknown,
ACPILidSwitch,
ACPISleepButton,
ACPIPowerButton,
Other = 0x80000000
};
};
class TDECORE_EXPORT TDEEventDevice : public TDEGenericDevice
{
public:
/**
* Constructor.
* @param Device type
*/
TDEEventDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn=TQString::null);
/**
* Destructor.
*/
~TDEEventDevice();
/**
* @return a TDEEventDeviceType::TDEEventDeviceType with the event device type, if known
*/
TDEEventDeviceType::TDEEventDeviceType eventType();
protected:
/**
* @param et a TDEEventDeviceType::TDEEventDeviceType with the event device type, if known
* @internal
*/
void internalSetEventType(TDEEventDeviceType::TDEEventDeviceType et);
private:
TDEEventDeviceType::TDEEventDeviceType m_eventType;
friend class TDEHardwareDevices;
};
typedef TQPtrList<TDEGenericDevice> TDEGenericHardwareList; typedef TQPtrList<TDEGenericDevice> TDEGenericHardwareList;
typedef TQMap<TQString, TQString> TDEDeviceIDMap; typedef TQMap<TQString, TQString> TDEDeviceIDMap;
@ -1574,6 +1768,12 @@ class TDECORE_EXPORT TDEHardwareDevices : public TQObject
*/ */
TQPixmap getDeviceTypeIconFromType(TDEGenericDeviceType::TDEGenericDeviceType query, KIcon::StdSizes size); TQPixmap getDeviceTypeIconFromType(TDEGenericDeviceType::TDEGenericDeviceType query, KIcon::StdSizes size);
/**
* Convenience function to obtain the root system device
* @return a pointer to a TDERootSystemDevice object
*/
TDERootSystemDevice* rootSystemDevice();
/** /**
* Convert a byte count to human readable form * Convert a byte count to human readable form
* @param bytes a double containing the number of bytes * @param bytes a double containing the number of bytes

Loading…
Cancel
Save