19#include "tdehardwaredevices.h"
24#include <tqsocketnotifier.h>
25#include <tqstringlist.h>
28#include <kstandarddirs.h>
33#include <tdeapplication.h>
34#include <dcopclient.h>
53#include <linux/input.h>
55#include "kiconloader.h"
57#include "tdegenericdevice.h"
58#include "tdestoragedevice.h"
59#include "tdecpudevice.h"
60#include "tdebatterydevice.h"
61#include "tdemainspowerdevice.h"
62#include "tdenetworkdevice.h"
63#include "tdebacklightdevice.h"
64#include "tdemonitordevice.h"
65#include "tdesensordevice.h"
66#include "tderootsystemdevice.h"
67#include "tdeeventdevice.h"
68#include "tdeinputdevice.h"
69#include "tdecryptographiccarddevice.h"
79timespec diff(timespec start, timespec end)
82 if ((
end.tv_nsec-start.tv_nsec)<0) {
83 temp.tv_sec =
end.tv_sec-start.tv_sec-1;
84 temp.tv_nsec = 1000000000+
end.tv_nsec-start.tv_nsec;
86 temp.tv_sec =
end.tv_sec-start.tv_sec;
87 temp.tv_nsec =
end.tv_nsec-start.tv_nsec;
101unsigned int reverse_bits(
unsigned int x)
103 x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
104 x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
105 x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
106 x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
107 return((x >> 16) | (x << 16));
111TQString readLineFile(TQString fname) {
112 TQFile file( fname );
113 if ( file.open( IO_ReadOnly ) ) {
114 TQTextStream stream( &file );
115 return stream.readLine();
117 return TQString::null;
124TQString decodeHexEncoding(TQString str);
127 TDE_EXPORT TDEHardwareDevices* create_tdeHardwareDevices()
129 return new TDEHardwareDevices();
133TDEHardwareDevices::TDEHardwareDevices() {
139 m_unclassifiedDevices = TQStringList();
142 m_deviceList.setAutoDelete(
true );
145 m_udevStruct = udev_new();
147 printf(
"Unable to create udev interface\n");
152 m_udevMonitorStruct = udev_monitor_new_from_netlink(m_udevStruct,
"udev");
153 udev_monitor_filter_add_match_subsystem_devtype(m_udevMonitorStruct, NULL, NULL);
154 udev_monitor_enable_receiving(m_udevMonitorStruct);
156 int udevmonitorfd = udev_monitor_get_fd(m_udevMonitorStruct);
157 if (udevmonitorfd >= 0) {
158 m_devScanNotifier =
new TQSocketNotifier(udevmonitorfd, TQSocketNotifier::Read,
this);
159 connect( m_devScanNotifier, TQ_SIGNAL(activated(
int)),
this, TQ_SLOT(processHotPluggedHardware()) );
164 m_mountTable.clear();
165 TQFile file(
"/proc/mounts" );
166 if ( file.open( IO_ReadOnly ) ) {
167 TQTextStream stream( &file );
168 while ( !stream.atEnd() ) {
169 TQString line = stream.readLine();
170 if (!line.isEmpty()) {
171 m_mountTable[line] =
true;
178 m_procMountsFd =
open(
"/proc/mounts", O_RDONLY, 0);
179 if (m_procMountsFd >= 0) {
180 m_mountScanNotifier =
new TQSocketNotifier(m_procMountsFd, TQSocketNotifier::Exception,
this);
181 connect( m_mountScanNotifier, TQ_SIGNAL(activated(
int)),
this, TQ_SLOT(processModifiedMounts()) );
187 TQFile cpufile(
"/proc/cpuinfo" );
188 if ( cpufile.open( IO_ReadOnly ) ) {
189 TQTextStream stream( &cpufile );
192 while ( !(line = stream.readLine()).isNull() )
194 m_cpuInfo.append( line );
206 connect( m_cpuWatch, TQ_SIGNAL(dirty(
const TQString &)),
this, TQ_SLOT(processModifiedCPUs()) );
208 m_cpuWatchTimer =
new TQTimer(
this);
209 connect( m_cpuWatchTimer, TQ_SIGNAL(timeout()),
this, TQ_SLOT(processModifiedCPUs()) );
214 m_deviceWatchTimer =
new TQTimer(
this);
215 connect( m_deviceWatchTimer, TQ_SIGNAL(timeout()),
this, TQ_SLOT(processStatelessDevices()) );
218 m_batteryWatchTimer =
new TQTimer(
this);
219 connect( m_batteryWatchTimer, TQ_SIGNAL(timeout()),
this, TQ_SLOT(processBatteryDevices()) );
222 queryHardwareInformation();
226TDEHardwareDevices::~TDEHardwareDevices() {
228 m_deviceWatchTimer->stop();
229 m_batteryWatchTimer->stop();
234 m_cpuWatch->stopScan();
236 m_cpuWatchTimer->stop();
240 close(m_procMountsFd);
243 if(m_udevMonitorStruct) {
244 udev_monitor_unref(m_udevMonitorStruct);
246 udev_unref(m_udevStruct);
263void TDEHardwareDevices::setTriggerlessHardwareUpdatesEnabled(
bool enable) {
265 TQDir nodezerocpufreq(
"/sys/devices/system/cpu/cpu0/cpufreq");
266 if (nodezerocpufreq.exists()) {
267 m_cpuWatchTimer->start( 500,
false );
269 m_batteryWatchTimer->stop();
270 m_deviceWatchTimer->start( 1000,
false );
273 m_cpuWatchTimer->stop();
274 m_deviceWatchTimer->stop();
278void TDEHardwareDevices::setBatteryUpdatesEnabled(
bool enable) {
280 TQDir nodezerocpufreq(
"/sys/devices/system/cpu/cpu0/cpufreq");
281 if (nodezerocpufreq.exists()) {
282 m_cpuWatchTimer->start( 500,
false );
284 m_batteryWatchTimer->start( 5000,
false );
287 m_cpuWatchTimer->stop();
288 m_batteryWatchTimer->stop();
292void TDEHardwareDevices::rescanDeviceInformation(TDEGenericDevice* hwdevice, udev_device* dev,
bool regenerateDeviceTree) {
293 bool toUnref =
false;
296 dev = udev_device_new_from_syspath(m_udevStruct, hwdevice->systemPath().ascii());
299 updateExistingDeviceInformation(hwdevice, dev);
300 if (regenerateDeviceTree) {
301 updateParentDeviceInformation(hwdevice);
305 udev_device_unref(dev);
309TDEGenericDevice* TDEHardwareDevices::findBySystemPath(TQString syspath) {
310 if (!syspath.endsWith(
"/")) {
313 TDEGenericDevice *hwdevice;
316 TDEGenericHardwareList devList = listAllPhysicalDevices();
317 for ( hwdevice = devList.first(); hwdevice; hwdevice = devList.next() ) {
318 if (hwdevice->systemPath() == syspath) {
326TDECPUDevice* TDEHardwareDevices::findCPUBySystemPath(TQString syspath,
bool inCache=
true) {
327 TDECPUDevice* cdevice;
330 if(inCache && !m_cpuByPathCache.isEmpty()) {
331 cdevice = m_cpuByPathCache.find(syspath);
338 cdevice =
dynamic_cast<TDECPUDevice*
>(findBySystemPath(syspath));
341 m_cpuByPathCache.insert(syspath, cdevice);
350TDEGenericDevice* TDEHardwareDevices::findByUniqueID(TQString uid) {
351 TDEGenericDevice *hwdevice;
353 TDEGenericHardwareList devList = listAllPhysicalDevices();
354 for ( hwdevice = devList.first(); hwdevice; hwdevice = devList.next() ) {
355 if (hwdevice->uniqueID() == uid) {
363TDEGenericDevice* TDEHardwareDevices::findByDeviceNode(TQString devnode) {
364 TDEGenericDevice *hwdevice;
365 for ( hwdevice = m_deviceList.first(); hwdevice; hwdevice = m_deviceList.next() ) {
366 if (hwdevice->deviceNode() == devnode) {
370 TDEStorageDevice *sdevice =
dynamic_cast<TDEStorageDevice*
>(hwdevice);
372 if (sdevice->mappedName() == devnode) {
381TDEStorageDevice* TDEHardwareDevices::findDiskByUID(TQString uid) {
382 TDEGenericDevice *hwdevice;
383 for ( hwdevice = m_deviceList.first(); hwdevice; hwdevice = m_deviceList.next() ) {
384 if (hwdevice->type() == TDEGenericDeviceType::Disk) {
385 TDEStorageDevice* sdevice =
static_cast<TDEStorageDevice*
>(hwdevice);
386 if (sdevice->uniqueID() == uid) {
395void TDEHardwareDevices::processHotPluggedHardware() {
396 udev_device *dev = udev_monitor_receive_device(m_udevMonitorStruct);
398 TQString actionevent(udev_device_get_action(dev));
399 if (actionevent ==
"add") {
400 TDEGenericDevice *device = classifyUnknownDevice(dev);
403 for (TDEGenericDevice *hwdevice = m_deviceList.first(); hwdevice; hwdevice = m_deviceList.next()) {
404 if (hwdevice->systemPath() == device->systemPath()) {
412 m_deviceList.append(device);
413 updateParentDeviceInformation(device);
414 emit hardwareAdded(device);
415 if (device->type() == TDEGenericDeviceType::Disk) {
417 TDEStorageDevice* sdevice =
static_cast<TDEStorageDevice*
>(device);
418 TQStringList slavedevices = sdevice->slaveDevices();
419 for (TQStringList::Iterator slaveit = slavedevices.begin(); slaveit != slavedevices.end(); ++slaveit) {
420 TDEGenericDevice* slavedevice = findBySystemPath(*slaveit);
421 if (slavedevice && slavedevice->type() == TDEGenericDeviceType::Disk) {
422 rescanDeviceInformation(slavedevice);
423 emit hardwareUpdated(slavedevice);
429 else if (actionevent ==
"remove") {
431 TQString systempath(udev_device_get_syspath(dev));
433 TDEGenericDevice *hwdevice;
434 for (hwdevice = m_deviceList.first(); hwdevice; hwdevice = m_deviceList.next()) {
435 if (hwdevice->systemPath() == systempath) {
437 if (hwdevice->type() == TDEGenericDeviceType::Disk) {
438 TDEStorageDevice* sdevice =
static_cast<TDEStorageDevice*
>(hwdevice);
439 TQStringList slavedevices = sdevice->slaveDevices();
440 for (TQStringList::Iterator slaveit = slavedevices.begin(); slaveit != slavedevices.end(); ++slaveit) {
441 TDEGenericDevice* slavedevice = findBySystemPath(*slaveit);
442 if (slavedevice && slavedevice->type() == TDEGenericDeviceType::Disk) {
443 rescanDeviceInformation(slavedevice);
444 emit hardwareUpdated(slavedevice);
449 rescanDeviceInformation(hwdevice, dev);
450 if (m_deviceList.find(hwdevice) != -1 && m_deviceList.take())
452 emit hardwareRemoved(hwdevice);
459 else if (actionevent ==
"change") {
461 TQString systempath(udev_device_get_syspath(dev));
463 TDEGenericDevice *hwdevice;
464 for (hwdevice = m_deviceList.first(); hwdevice; hwdevice = m_deviceList.next()) {
465 if (hwdevice->systemPath() == systempath) {
466 if (!hwdevice->blacklistedForUpdate()) {
467 rescanDeviceInformation(hwdevice, dev);
468 emit hardwareUpdated(hwdevice);
471 else if ((hwdevice->type() == TDEGenericDeviceType::Monitor)
472 && (hwdevice->systemPath().contains(systempath))) {
473 if (!hwdevice->blacklistedForUpdate()) {
474 struct udev_device *slavedev;
475 slavedev = udev_device_new_from_syspath(m_udevStruct, hwdevice->systemPath().ascii());
476 classifyUnknownDevice(slavedev, hwdevice,
false);
477 udev_device_unref(slavedev);
478 updateParentDeviceInformation(hwdevice);
479 emit hardwareUpdated(hwdevice);
484 udev_device_unref(dev);
488void TDEHardwareDevices::processModifiedCPUs() {
493 timespec time1, time2, time3;
494 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
496 printf(
"TDEHardwareDevices::processModifiedCPUs() : begin at '%u'\n", time1.tv_nsec);
501 TQFile cpufile(
"/proc/cpuinfo" );
502 if ( cpufile.open( IO_ReadOnly ) ) {
503 TQTextStream stream( &cpufile );
505 m_cpuInfo = TQStringList::split(
'\n', stream.read(),
true);
510 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
511 printf(
"TDEHardwareDevices::processModifiedCPUs() : checkpoint1 at %u [%u]\n", time2.tv_nsec, diff(time1,time2).tv_nsec);
516 bool cpuinfo_format_x86 =
true;
517 bool cpuinfo_format_arm =
false;
522 TQStringList::Iterator blockBegin = m_cpuInfo.begin();
523 for (TQStringList::Iterator cpuit1 = m_cpuInfo.begin(); cpuit1 != m_cpuInfo.end(); ++cpuit1) {
525 if (!(*blockBegin).startsWith(
"processor")) {
527 TQStringList::Iterator cpuit2;
528 for (cpuit2 = blockBegin; cpuit2 != m_cpuInfo.end(); ++cpuit2) {
530 if (curline2.startsWith(
"processor")) {
534 else if (curline2 == NULL || curline2 ==
"") {
539 m_cpuInfo.insert(blockBegin, (*cpuit2));
541 else if(blockNumber == 0) {
542 m_cpuInfo.insert(blockBegin,
"processor : 0");
545 if (curline1 == NULL || curline1 ==
"") {
550 else if (curline1.startsWith(
"Processor")) {
551 cpuinfo_format_x86 =
false;
552 cpuinfo_format_arm =
true;
557 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
558 printf(
"TDEHardwareDevices::processModifiedCPUs() : checkpoint2 at %u [%u]\n", time2.tv_nsec, diff(time1,time2).tv_nsec);
563 TDECPUDevice *cdevice;
565 bool modified =
false;
566 bool have_frequency =
false;
569 int processorNumber = 0;
570 int processorCount = 0;
572 if (cpuinfo_format_x86) {
576 TQStringList::Iterator cpuit;
577 for (cpuit = m_cpuInfo.begin(); cpuit != m_cpuInfo.end(); ++cpuit) {
579 if (curline.startsWith(
"processor")) {
580 curline.remove(0, curline.find(
":")+2);
581 processorNumber = curline.toInt();
583 cdevice =
dynamic_cast<TDECPUDevice*
>(findCPUBySystemPath(TQString(
"/sys/devices/system/cpu/cpu%1").arg(processorNumber)));
586 if (cdevice->coreNumber() != processorNumber) {
588 cdevice->internalSetCoreNumber(processorNumber);
592 else if (cdevice && curline.startsWith(
"model name")) {
593 curline.remove(0, curline.find(
":")+2);
594 if (cdevice->name() != curline) {
596 cdevice->internalSetName(curline);
599 else if (cdevice && curline.startsWith(
"cpu MHz")) {
600 curline.remove(0, curline.find(
":")+2);
601 if (cdevice->frequency() != curline.toDouble()) {
603 cdevice->internalSetFrequency(curline.toDouble());
605 have_frequency =
true;
607 else if (cdevice && curline.startsWith(
"vendor_id")) {
608 curline.remove(0, curline.find(
":")+2);
609 if (cdevice->vendorName() != curline) {
611 cdevice->internalSetVendorName(curline);
613 if (cdevice->vendorEncoded() != curline) {
615 cdevice->internalSetVendorEncoded(curline);
618 else if (curline == NULL || curline ==
"") {
623 else if (cpuinfo_format_arm) {
627 TQStringList::Iterator cpuit;
630 TQString serialNumber;
631 for (cpuit = m_cpuInfo.begin(); cpuit != m_cpuInfo.end(); ++cpuit) {
633 if (curline.startsWith(
"Processor")) {
634 curline.remove(0, curline.find(
":")+2);
637 else if (curline.startsWith(
"Hardware")) {
638 curline.remove(0, curline.find(
":")+2);
639 vendorName = curline;
641 else if (curline.startsWith(
"Serial")) {
642 curline.remove(0, curline.find(
":")+2);
643 serialNumber = curline;
646 for (TQStringList::Iterator cpuit = m_cpuInfo.begin(); cpuit != m_cpuInfo.end(); ++cpuit) {
648 if (curline.startsWith(
"processor")) {
649 curline.remove(0, curline.find(
":")+2);
650 processorNumber = curline.toInt();
652 cdevice =
dynamic_cast<TDECPUDevice*
>(findCPUBySystemPath(TQString(
"/sys/devices/system/cpu/cpu%1").arg(processorNumber)));
655 if (cdevice->coreNumber() != processorNumber) modified =
true;
656 cdevice->internalSetCoreNumber(processorNumber);
657 if (cdevice->name() != modelName) modified =
true;
658 cdevice->internalSetName(modelName);
659 if (cdevice->vendorName() != vendorName) modified =
true;
660 cdevice->internalSetVendorName(vendorName);
661 if (cdevice->vendorEncoded() != vendorName) modified =
true;
662 cdevice->internalSetVendorEncoded(vendorName);
663 if (cdevice->serialNumber() != serialNumber) modified =
true;
664 cdevice->internalSetSerialNumber(serialNumber);
668 if (curline == NULL || curline ==
"") {
674 processorCount = processorNumber+1;
677 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
678 printf(
"TDEHardwareDevices::processModifiedCPUs() : checkpoint3 at %u [%u]\n", time2.tv_nsec, diff(time1,time2).tv_nsec);
683 for (processorNumber=0; processorNumber<processorCount; processorNumber++) {
684 cdevice =
dynamic_cast<TDECPUDevice*
>(findCPUBySystemPath(TQString(
"/sys/devices/system/cpu/cpu%1").arg(processorNumber)));
685 TQDir cpufreq_dir(TQString(
"/sys/devices/system/cpu/cpu%1/cpufreq").arg(processorNumber));
686 TQString scalinggovernor;
687 TQString scalingdriver;
688 double minfrequency = -1;
689 double maxfrequency = -1;
690 double trlatency = -1;
691 TQStringList affectedcpulist;
692 TQStringList frequencylist;
693 TQStringList governorlist;
694 if (cpufreq_dir.exists()) {
696 nodename = cpufreq_dir.path();
697 nodename.append(
"/scaling_governor");
698 TQFile scalinggovernorfile(nodename);
699 if (scalinggovernorfile.open(IO_ReadOnly)) {
700 TQTextStream stream( &scalinggovernorfile );
701 scalinggovernor = stream.readLine();
702 scalinggovernorfile.close();
704 nodename = cpufreq_dir.path();
705 nodename.append(
"/scaling_driver");
706 TQFile scalingdriverfile(nodename);
707 if (scalingdriverfile.open(IO_ReadOnly)) {
708 TQTextStream stream( &scalingdriverfile );
709 scalingdriver = stream.readLine();
710 scalingdriverfile.close();
712 nodename = cpufreq_dir.path();
713 nodename.append(
"/cpuinfo_min_freq");
714 TQFile minfrequencyfile(nodename);
715 if (minfrequencyfile.open(IO_ReadOnly)) {
716 TQTextStream stream( &minfrequencyfile );
717 minfrequency = stream.readLine().toDouble()/1000.0;
718 minfrequencyfile.close();
720 nodename = cpufreq_dir.path();
721 nodename.append(
"/cpuinfo_max_freq");
722 TQFile maxfrequencyfile(nodename);
723 if (maxfrequencyfile.open(IO_ReadOnly)) {
724 TQTextStream stream( &maxfrequencyfile );
725 maxfrequency = stream.readLine().toDouble()/1000.0;
726 maxfrequencyfile.close();
728 nodename = cpufreq_dir.path();
729 nodename.append(
"/cpuinfo_transition_latency");
730 TQFile trlatencyfile(nodename);
731 if (trlatencyfile.open(IO_ReadOnly)) {
732 TQTextStream stream( &trlatencyfile );
733 trlatency = stream.readLine().toDouble()/1000.0;
734 trlatencyfile.close();
736 nodename = cpufreq_dir.path();
737 nodename.append(
"/scaling_available_frequencies");
738 TQFile availfreqsfile(nodename);
739 if (availfreqsfile.open(IO_ReadOnly)) {
740 TQTextStream stream( &availfreqsfile );
741 frequencylist = TQStringList::split(
" ", stream.readLine());
742 availfreqsfile.close();
744 nodename = cpufreq_dir.path();
745 nodename.append(
"/scaling_available_governors");
746 TQFile availgvrnsfile(nodename);
747 if (availgvrnsfile.open(IO_ReadOnly)) {
748 TQTextStream stream( &availgvrnsfile );
749 governorlist = TQStringList::split(
" ", stream.readLine());
750 availgvrnsfile.close();
752 nodename = cpufreq_dir.path();
753 nodename.append(
"/affected_cpus");
754 TQFile tiedcpusfile(nodename);
755 if (tiedcpusfile.open(IO_ReadOnly)) {
756 TQTextStream stream( &tiedcpusfile );
757 affectedcpulist = TQStringList::split(
" ", stream.readLine());
758 tiedcpusfile.close();
762 if (!have_frequency) {
763 bool cpufreq_have_frequency =
false;
764 nodename = cpufreq_dir.path();
765 nodename.append(
"/scaling_cur_freq");
766 TQFile cpufreqfile(nodename);
767 if (cpufreqfile.open(IO_ReadOnly)) {
768 cpufreq_have_frequency =
true;
771 nodename = cpufreq_dir.path();
772 nodename.append(
"/cpuinfo_cur_freq");
773 cpufreqfile.setName(nodename);
774 if (cpufreqfile.open(IO_ReadOnly)) {
775 cpufreq_have_frequency =
true;
778 if (cpufreq_have_frequency) {
779 TQTextStream stream( &cpufreqfile );
780 double cpuinfo_cur_freq = stream.readLine().toDouble()/1000.0;
781 if (cdevice && cdevice->frequency() != cpuinfo_cur_freq) {
783 cdevice->internalSetFrequency(cpuinfo_cur_freq);
789 bool minfrequencyFound =
false;
790 bool maxfrequencyFound =
false;
791 TQStringList::Iterator freqit;
792 for ( freqit = frequencylist.begin(); freqit != frequencylist.end(); ++freqit ) {
793 double thisfrequency = (*freqit).toDouble()/1000.0;
794 if (thisfrequency == minfrequency) {
795 minfrequencyFound =
true;
797 if (thisfrequency == maxfrequency) {
798 maxfrequencyFound =
true;
802 if (!minfrequencyFound) {
803 int minFrequencyInt = (minfrequency*1000.0);
804 frequencylist.prepend(TQString(
"%1").arg(minFrequencyInt));
806 if (!maxfrequencyFound) {
807 int maxfrequencyInt = (maxfrequency*1000.0);
808 frequencylist.append(TQString(
"%1").arg(maxfrequencyInt));
812 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
813 printf(
"TDEHardwareDevices::processModifiedCPUs() : checkpoint3.%u at %u [%u]\n", processorNumber, time2.tv_nsec, diff(time1,time2).tv_nsec);
818 if (have_frequency) {
820 minfrequency = cdevice->frequency();
821 maxfrequency = cdevice->frequency();
828 if (cdevice->governor() != scalinggovernor) {
830 cdevice->internalSetGovernor(scalinggovernor);
832 if (cdevice->scalingDriver() != scalingdriver) {
834 cdevice->internalSetScalingDriver(scalingdriver);
836 if (cdevice->minFrequency() != minfrequency) {
838 cdevice->internalSetMinFrequency(minfrequency);
840 if (cdevice->maxFrequency() != maxfrequency) {
842 cdevice->internalSetMaxFrequency(maxfrequency);
844 if (cdevice->transitionLatency() != trlatency) {
846 cdevice->internalSetTransitionLatency(trlatency);
848 if (cdevice->dependentProcessors().join(
" ") != affectedcpulist.join(
" ")) {
850 cdevice->internalSetDependentProcessors(affectedcpulist);
852 if (cdevice->availableFrequencies().join(
" ") != frequencylist.join(
" ")) {
854 cdevice->internalSetAvailableFrequencies(frequencylist);
856 if (cdevice->availableGovernors().join(
" ") != governorlist.join(
" ")) {
858 cdevice->internalSetAvailableGovernors(governorlist);
864 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
865 printf(
"TDEHardwareDevices::processModifiedCPUs() : checkpoint4 at %u [%u]\n", time2.tv_nsec, diff(time1,time2).tv_nsec);
870 for (processorNumber=0; processorNumber<processorCount; processorNumber++) {
871 TDEGenericDevice* hwdevice = findCPUBySystemPath(TQString(
"/sys/devices/system/cpu/cpu%1").arg(processorNumber));
874 emit hardwareUpdated(hwdevice);
880 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
881 printf(
"TDEHardwareDevices::processModifiedCPUs() : end at %u [%u]\n", time2.tv_nsec, diff(time1,time2).tv_nsec);
882 printf(
"TDEHardwareDevices::processModifiedCPUs() : total time: %u\n", diff(time3,time2).tv_nsec);
886void TDEHardwareDevices::processStatelessDevices() {
889 TDEGenericDevice *hwdevice;
891#ifdef STATELESSPROFILING
892 timespec time1, time2, time3;
893 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
894 printf(
"TDEHardwareDevices::processStatelessDevices() : begin at '%u'\n", time1.tv_nsec);
899 TDEGenericHardwareList devList = listAllPhysicalDevices();
900 for ( hwdevice = devList.first(); hwdevice; hwdevice = devList.next() ) {
901 if ((hwdevice->type() == TDEGenericDeviceType::RootSystem) || (hwdevice->type() == TDEGenericDeviceType::Network) ||
902 (hwdevice->type() == TDEGenericDeviceType::OtherSensor) || (hwdevice->type() == TDEGenericDeviceType::Event) ||
903 (hwdevice->type() == TDEGenericDeviceType::Battery) || (hwdevice->type() == TDEGenericDeviceType::PowerSupply)) {
904 rescanDeviceInformation(hwdevice, NULL,
false);
905 emit hardwareUpdated(hwdevice);
906#ifdef STATELESSPROFILING
907 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
908 printf(
"TDEHardwareDevices::processStatelessDevices() : '%s' finished at %u [%u]\n", (hwdevice->name()).ascii(), time2.tv_nsec, diff(time1,time2).tv_nsec);
914#ifdef STATELESSPROFILING
915 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
916 printf(
"TDEHardwareDevices::processStatelessDevices() : end at '%u'\n", time2.tv_nsec);
917 printf(
"TDEHardwareDevices::processStatelessDevices() : took '%u'\n", diff(time3,time2).tv_nsec);
921void TDEHardwareDevices::processBatteryDevices() {
922 TDEGenericDevice *hwdevice;
925 TDEGenericHardwareList devList = listAllPhysicalDevices();
926 for ( hwdevice = devList.first(); hwdevice; hwdevice = devList.next() ) {
927 if (hwdevice->type() == TDEGenericDeviceType::Battery) {
928 rescanDeviceInformation(hwdevice, NULL,
false);
929 emit hardwareUpdated(hwdevice);
931 else if (hwdevice->type() == TDEGenericDeviceType::PowerSupply) {
932 TDEMainsPowerDevice *pdevice =
dynamic_cast<TDEMainsPowerDevice*
>(hwdevice);
933 int previousOnlineState = pdevice->online();
934 rescanDeviceInformation(hwdevice, NULL,
false);
935 if (pdevice->online() != previousOnlineState) {
936 emit hardwareUpdated(hwdevice);
943void TDEHardwareDevices::processEventDeviceKeyPressed(
unsigned int keycode, TDEEventDevice* edevice) {
944 emit eventDeviceKeyPressed(keycode, edevice);
947void TDEHardwareDevices::processModifiedMounts() {
950 TQMap<TQString, bool> deletedEntries = m_mountTable;
953 m_mountTable.clear();
954 TQFile file(
"/proc/mounts" );
955 if ( file.open( IO_ReadOnly ) ) {
956 TQTextStream stream( &file );
957 while ( !stream.atEnd() ) {
958 TQString line = stream.readLine();
959 if (!line.isEmpty()) {
960 m_mountTable[line] =
true;
965 TQMap<TQString, bool> addedEntries = m_mountTable;
968 for ( TQMap<TQString, bool>::ConstIterator mtIt = m_mountTable.begin(); mtIt != m_mountTable.end(); ++mtIt ) {
969 if (deletedEntries.contains(mtIt.key())) {
970 deletedEntries.remove(mtIt.key());
971 addedEntries.remove(mtIt.key());
976 TQMap<TQString, bool>::Iterator it;
977 for ( it = addedEntries.begin(); it != addedEntries.end(); ++it ) {
979 TQStringList mountInfo = TQStringList::split(
" ", it.key(),
true);
980 TDEGenericDevice* hwdevice = findByDeviceNode(*mountInfo.at(0));
981 if (hwdevice && hwdevice->type() == TDEGenericDeviceType::Disk) {
982 rescanDeviceInformation(hwdevice);
983 emit hardwareUpdated(hwdevice);
988 for ( it = deletedEntries.begin(); it != deletedEntries.end(); ++it ) {
990 TQStringList mountInfo = TQStringList::split(
" ", it.key(),
true);
991 TDEGenericDevice* hwdevice = findByDeviceNode(*mountInfo.at(0));
992 if (hwdevice && hwdevice->type() == TDEGenericDeviceType::Disk) {
993 rescanDeviceInformation(hwdevice);
994 emit hardwareUpdated(hwdevice);
999TDEDiskDeviceType::TDEDiskDeviceType classifyDiskType(udev_device* dev,
const TQString devicenode,
const TQString devicebus,
const TQString disktypestring,
const TQString systempath,
const TQString devicevendor,
const TQString devicemodel,
const TQString filesystemtype,
const TQString devicedriver) {
1001 TDEDiskDeviceType::TDEDiskDeviceType disktype = TDEDiskDeviceType::Null;
1003 if (devicebus.upper() ==
"USB") {
1004 disktype = disktype | TDEDiskDeviceType::USB;
1007 if (disktypestring.upper() ==
"DISK") {
1008 disktype = disktype | TDEDiskDeviceType::HDD;
1011 if ((disktypestring.upper() ==
"FLOPPY")
1012 || (TQString(udev_device_get_property_value(dev,
"ID_DRIVE_FLOPPY")) ==
"1")) {
1013 disktype = disktype | TDEDiskDeviceType::Floppy;
1014 disktype = disktype & ~TDEDiskDeviceType::HDD;
1017 if ((disktypestring.upper() ==
"ZIP")
1018 || (TQString(udev_device_get_property_value(dev,
"ID_DRIVE_FLOPPY_ZIP")) ==
"1")
1019 || ((devicevendor.upper() ==
"IOMEGA") && (devicemodel.upper().contains(
"ZIP")))) {
1020 disktype = disktype | TDEDiskDeviceType::Zip;
1021 disktype = disktype & ~TDEDiskDeviceType::HDD;
1024 if ((devicevendor.upper() ==
"APPLE") && (devicemodel.upper().contains(
"IPOD"))) {
1025 disktype = disktype | TDEDiskDeviceType::MediaDevice;
1027 if ((devicevendor.upper() ==
"SANDISK") && (devicemodel.upper().contains(
"SANSA"))) {
1028 disktype = disktype | TDEDiskDeviceType::MediaDevice;
1031 if (disktypestring.upper() ==
"TAPE") {
1032 disktype = disktype | TDEDiskDeviceType::Tape;
1035 if ((disktypestring.upper() ==
"COMPACT_FLASH")
1036 || (TQString(udev_device_get_property_value(dev,
"ID_DRIVE_FLASH_CF")) ==
"1")
1037 || (TQString(udev_device_get_property_value(dev,
"ID_ATA_CFA")) ==
"1")) {
1038 disktype = disktype | TDEDiskDeviceType::CompactFlash;
1039 disktype = disktype | TDEDiskDeviceType::HDD;
1042 if ((disktypestring.upper() ==
"MEMORY_STICK")
1043 || (TQString(udev_device_get_property_value(dev,
"ID_DRIVE_FLASH_MS")) ==
"1")) {
1044 disktype = disktype | TDEDiskDeviceType::MemoryStick;
1045 disktype = disktype | TDEDiskDeviceType::HDD;
1048 if ((disktypestring.upper() ==
"SMART_MEDIA")
1049 || (TQString(udev_device_get_property_value(dev,
"ID_DRIVE_FLASH_SM")) ==
"1")) {
1050 disktype = disktype | TDEDiskDeviceType::SmartMedia;
1051 disktype = disktype | TDEDiskDeviceType::HDD;
1054 if ((disktypestring.upper() ==
"SD_MMC")
1055 || (TQString(udev_device_get_property_value(dev,
"ID_DRIVE_FLASH_SD")) ==
"1")
1056 || (TQString(udev_device_get_property_value(dev,
"ID_DRIVE_FLASH_SDHC")) ==
"1")
1057 || (TQString(udev_device_get_property_value(dev,
"ID_DRIVE_FLASH_MMC")) ==
"1")) {
1058 disktype = disktype | TDEDiskDeviceType::SDMMC;
1059 disktype = disktype | TDEDiskDeviceType::HDD;
1062 if ((disktypestring.upper() ==
"FLASHKEY")
1063 || (TQString(udev_device_get_property_value(dev,
"ID_DRIVE_FLASH")) ==
"1")) {
1064 disktype = disktype | TDEDiskDeviceType::Flash;
1065 disktype = disktype | TDEDiskDeviceType::HDD;
1068 if (disktypestring.upper() ==
"OPTICAL") {
1069 disktype = disktype | TDEDiskDeviceType::Optical;
1072 if (disktypestring.upper() ==
"JAZ") {
1073 disktype = disktype | TDEDiskDeviceType::Jaz;
1076 if (disktypestring.upper() ==
"CD") {
1077 disktype = disktype | TDEDiskDeviceType::Optical;
1079 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA")) ==
"1") {
1080 disktype = disktype | TDEDiskDeviceType::CDROM;
1082 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_CD_R")) ==
"1") {
1083 disktype = disktype | TDEDiskDeviceType::CDR;
1084 disktype = disktype & ~TDEDiskDeviceType::CDROM;
1086 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_CD_RW")) ==
"1") {
1087 disktype = disktype | TDEDiskDeviceType::CDRW;
1088 disktype = disktype & ~TDEDiskDeviceType::CDROM;
1089 disktype = disktype & ~TDEDiskDeviceType::CDR;
1091 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_MRW")) ==
"1") {
1092 disktype = disktype | TDEDiskDeviceType::CDMRRW;
1093 disktype = disktype & ~TDEDiskDeviceType::CDROM;
1094 disktype = disktype & ~TDEDiskDeviceType::CDR;
1095 disktype = disktype & ~TDEDiskDeviceType::CDRW;
1097 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_MRW_W")) ==
"1") {
1098 disktype = disktype | TDEDiskDeviceType::CDMRRWW;
1099 disktype = disktype & ~TDEDiskDeviceType::CDROM;
1100 disktype = disktype & ~TDEDiskDeviceType::CDR;
1101 disktype = disktype & ~TDEDiskDeviceType::CDRW;
1102 disktype = disktype & ~TDEDiskDeviceType::CDMRRW;
1104 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_MO")) ==
"1") {
1105 disktype = disktype | TDEDiskDeviceType::CDMO;
1106 disktype = disktype & ~TDEDiskDeviceType::CDROM;
1107 disktype = disktype & ~TDEDiskDeviceType::CDR;
1108 disktype = disktype & ~TDEDiskDeviceType::CDRW;
1109 disktype = disktype & ~TDEDiskDeviceType::CDMRRW;
1110 disktype = disktype & ~TDEDiskDeviceType::CDMRRWW;
1112 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_DVD")) ==
"1") {
1113 disktype = disktype | TDEDiskDeviceType::DVDROM;
1114 disktype = disktype & ~TDEDiskDeviceType::CDROM;
1116 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_DVD_RAM")) ==
"1") {
1117 disktype = disktype | TDEDiskDeviceType::DVDRAM;
1118 disktype = disktype & ~TDEDiskDeviceType::DVDROM;
1120 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_DVD_R")) ==
"1") {
1121 disktype = disktype | TDEDiskDeviceType::DVDR;
1122 disktype = disktype & ~TDEDiskDeviceType::DVDROM;
1124 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_DVD_R_DL")) ==
"1") {
1125 disktype = disktype | TDEDiskDeviceType::DVDRDL;
1126 disktype = disktype & ~TDEDiskDeviceType::DVDROM;
1127 disktype = disktype & ~TDEDiskDeviceType::DVDR;
1129 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_DVD_PLUS_R")) ==
"1") {
1130 disktype = disktype | TDEDiskDeviceType::DVDPLUSR;
1131 disktype = disktype & ~TDEDiskDeviceType::DVDROM;
1132 disktype = disktype & ~TDEDiskDeviceType::DVDR;
1133 disktype = disktype & ~TDEDiskDeviceType::DVDRDL;
1135 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_DVD_PLUS_R_DL")) ==
"1") {
1136 disktype = disktype | TDEDiskDeviceType::DVDPLUSRDL;
1137 disktype = disktype & ~TDEDiskDeviceType::DVDROM;
1138 disktype = disktype & ~TDEDiskDeviceType::DVDR;
1139 disktype = disktype & ~TDEDiskDeviceType::DVDRDL;
1140 disktype = disktype & ~TDEDiskDeviceType::DVDPLUSR;
1142 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_DVD_RW")) ==
"1") {
1143 disktype = disktype | TDEDiskDeviceType::DVDRW;
1144 disktype = disktype & ~TDEDiskDeviceType::DVDROM;
1145 disktype = disktype & ~TDEDiskDeviceType::DVDR;
1146 disktype = disktype & ~TDEDiskDeviceType::DVDRDL;
1147 disktype = disktype & ~TDEDiskDeviceType::DVDPLUSR;
1148 disktype = disktype & ~TDEDiskDeviceType::DVDPLUSRDL;
1150 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_DVD_RW_DL")) ==
"1") {
1151 disktype = disktype | TDEDiskDeviceType::DVDRWDL;
1152 disktype = disktype & ~TDEDiskDeviceType::DVDROM;
1153 disktype = disktype & ~TDEDiskDeviceType::DVDR;
1154 disktype = disktype & ~TDEDiskDeviceType::DVDRDL;
1155 disktype = disktype & ~TDEDiskDeviceType::DVDPLUSR;
1156 disktype = disktype & ~TDEDiskDeviceType::DVDPLUSRDL;
1157 disktype = disktype & ~TDEDiskDeviceType::DVDRW;
1159 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_DVD_PLUS_RW")) ==
"1") {
1160 disktype = disktype | TDEDiskDeviceType::DVDPLUSRW;
1161 disktype = disktype & ~TDEDiskDeviceType::DVDROM;
1162 disktype = disktype & ~TDEDiskDeviceType::DVDR;
1163 disktype = disktype & ~TDEDiskDeviceType::DVDRDL;
1164 disktype = disktype & ~TDEDiskDeviceType::DVDPLUSR;
1165 disktype = disktype & ~TDEDiskDeviceType::DVDPLUSRDL;
1166 disktype = disktype & ~TDEDiskDeviceType::DVDRW;
1167 disktype = disktype & ~TDEDiskDeviceType::DVDRWDL;
1169 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_DVD_PLUS_RW_DL")) ==
"1") {
1170 disktype = disktype | TDEDiskDeviceType::DVDPLUSRWDL;
1171 disktype = disktype & ~TDEDiskDeviceType::DVDROM;
1172 disktype = disktype & ~TDEDiskDeviceType::DVDR;
1173 disktype = disktype & ~TDEDiskDeviceType::DVDRDL;
1174 disktype = disktype & ~TDEDiskDeviceType::DVDPLUSR;
1175 disktype = disktype & ~TDEDiskDeviceType::DVDPLUSRDL;
1176 disktype = disktype & ~TDEDiskDeviceType::DVDRW;
1177 disktype = disktype & ~TDEDiskDeviceType::DVDRWDL;
1178 disktype = disktype & ~TDEDiskDeviceType::DVDPLUSRW;
1180 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_BD")) ==
"1") {
1181 disktype = disktype | TDEDiskDeviceType::BDROM;
1182 disktype = disktype & ~TDEDiskDeviceType::CDROM;
1184 if ((TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_BD_R")) ==
"1")
1185 || (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_BD_R_DL")) ==
"1")
1187 disktype = disktype | TDEDiskDeviceType::BDR;
1188 disktype = disktype & ~TDEDiskDeviceType::BDROM;
1190 if ((TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_BD_RE")) ==
"1")
1191 || (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_BD_RE_DL")) ==
"1")
1193 disktype = disktype | TDEDiskDeviceType::BDRW;
1194 disktype = disktype & ~TDEDiskDeviceType::BDROM;
1195 disktype = disktype & ~TDEDiskDeviceType::BDR;
1197 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_HDDVD")) ==
"1") {
1198 disktype = disktype | TDEDiskDeviceType::HDDVDROM;
1199 disktype = disktype & ~TDEDiskDeviceType::CDROM;
1201 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_HDDVD_R")) ==
"1") {
1202 disktype = disktype | TDEDiskDeviceType::HDDVDR;
1203 disktype = disktype & ~TDEDiskDeviceType::HDDVDROM;
1205 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_HDDVD_RW")) ==
"1") {
1206 disktype = disktype | TDEDiskDeviceType::HDDVDRW;
1207 disktype = disktype & ~TDEDiskDeviceType::HDDVDROM;
1208 disktype = disktype & ~TDEDiskDeviceType::HDDVDR;
1210 if (!TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_TRACK_COUNT_AUDIO")).isNull()) {
1211 disktype = disktype | TDEDiskDeviceType::CDAudio;
1213 if ((TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_VCD")) ==
"1") || (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_SDVD")) ==
"1")) {
1214 disktype = disktype | TDEDiskDeviceType::CDVideo;
1217 if ((disktype & TDEDiskDeviceType::DVDROM)
1218 || (disktype & TDEDiskDeviceType::DVDRAM)
1219 || (disktype & TDEDiskDeviceType::DVDR)
1220 || (disktype & TDEDiskDeviceType::DVDRW)
1221 || (disktype & TDEDiskDeviceType::DVDRDL)
1222 || (disktype & TDEDiskDeviceType::DVDRWDL)
1223 || (disktype & TDEDiskDeviceType::DVDPLUSR)
1224 || (disktype & TDEDiskDeviceType::DVDPLUSRW)
1225 || (disktype & TDEDiskDeviceType::DVDPLUSRDL)
1226 || (disktype & TDEDiskDeviceType::DVDPLUSRWDL)
1230 int retcode = system(TQString(
"tdeiso_info --exists=ISO9660/VIDEO_TS/VIDEO_TS.IFO %1").arg(devicenode).ascii());
1232 disktype = disktype | TDEDiskDeviceType::DVDVideo;
1239 if (systempath.startsWith(
"/sys/devices/virtual/block/ram")) {
1240 disktype = disktype | TDEDiskDeviceType::RAM;
1242 if (systempath.startsWith(
"/sys/devices/virtual/block/loop")) {
1243 disktype = disktype | TDEDiskDeviceType::Loop;
1246 if (disktype == TDEDiskDeviceType::Null) {
1249 disktype = disktype | TDEDiskDeviceType::HDD;
1252 if (filesystemtype.upper() ==
"CRYPTO_LUKS") {
1253 disktype = disktype | TDEDiskDeviceType::LUKS;
1255 else if (filesystemtype.upper() ==
"CRYPTO") {
1256 disktype = disktype | TDEDiskDeviceType::OtherCrypted;
1264typedef TQMap<TQString, TQString> TDEConfigMap;
1266TQString readUdevAttribute(udev_device* dev, TQString attr) {
1267 return TQString(udev_device_get_property_value(dev, attr.ascii()));
1270TDEGenericDeviceType::TDEGenericDeviceType readGenericDeviceTypeFromString(TQString query) {
1271 TDEGenericDeviceType::TDEGenericDeviceType ret = TDEGenericDeviceType::Other;
1274 if (query ==
"Root") {
1275 ret = TDEGenericDeviceType::Root;
1277 else if (query ==
"RootSystem") {
1278 ret = TDEGenericDeviceType::RootSystem;
1280 else if (query ==
"CPU") {
1281 ret = TDEGenericDeviceType::CPU;
1283 else if (query ==
"GPU") {
1284 ret = TDEGenericDeviceType::GPU;
1286 else if (query ==
"RAM") {
1287 ret = TDEGenericDeviceType::RAM;
1289 else if (query ==
"Bus") {
1290 ret = TDEGenericDeviceType::Bus;
1292 else if (query ==
"I2C") {
1293 ret = TDEGenericDeviceType::I2C;
1295 else if (query ==
"MDIO") {
1296 ret = TDEGenericDeviceType::MDIO;
1298 else if (query ==
"Mainboard") {
1299 ret = TDEGenericDeviceType::Mainboard;
1301 else if (query ==
"Disk") {
1302 ret = TDEGenericDeviceType::Disk;
1304 else if (query ==
"SCSI") {
1305 ret = TDEGenericDeviceType::SCSI;
1307 else if (query ==
"StorageController") {
1308 ret = TDEGenericDeviceType::StorageController;
1310 else if (query ==
"Mouse") {
1311 ret = TDEGenericDeviceType::Mouse;
1313 else if (query ==
"Keyboard") {
1314 ret = TDEGenericDeviceType::Keyboard;
1316 else if (query ==
"HID") {
1317 ret = TDEGenericDeviceType::HID;
1319 else if (query ==
"Modem") {
1320 ret = TDEGenericDeviceType::Modem;
1322 else if (query ==
"Monitor") {
1323 ret = TDEGenericDeviceType::Monitor;
1325 else if (query ==
"Network") {
1326 ret = TDEGenericDeviceType::Network;
1328 else if (query ==
"NonvolatileMemory") {
1329 ret = TDEGenericDeviceType::NonvolatileMemory;
1331 else if (query ==
"Printer") {
1332 ret = TDEGenericDeviceType::Printer;
1334 else if (query ==
"Scanner") {
1335 ret = TDEGenericDeviceType::Scanner;
1337 else if (query ==
"Sound") {
1338 ret = TDEGenericDeviceType::Sound;
1340 else if (query ==
"VideoCapture") {
1341 ret = TDEGenericDeviceType::VideoCapture;
1343 else if (query ==
"IEEE1394") {
1344 ret = TDEGenericDeviceType::IEEE1394;
1346 else if (query ==
"PCMCIA") {
1347 ret = TDEGenericDeviceType::PCMCIA;
1349 else if (query ==
"Camera") {
1350 ret = TDEGenericDeviceType::Camera;
1352 else if (query ==
"Serial") {
1353 ret = TDEGenericDeviceType::Serial;
1355 else if (query ==
"Parallel") {
1356 ret = TDEGenericDeviceType::Parallel;
1358 else if (query ==
"TextIO") {
1359 ret = TDEGenericDeviceType::TextIO;
1361 else if (query ==
"Peripheral") {
1362 ret = TDEGenericDeviceType::Peripheral;
1364 else if (query ==
"Backlight") {
1365 ret = TDEGenericDeviceType::Backlight;
1367 else if (query ==
"Battery") {
1368 ret = TDEGenericDeviceType::Battery;
1370 else if (query ==
"Power") {
1371 ret = TDEGenericDeviceType::PowerSupply;
1373 else if (query ==
"Dock") {
1374 ret = TDEGenericDeviceType::Dock;
1376 else if (query ==
"ThermalSensor") {
1377 ret = TDEGenericDeviceType::ThermalSensor;
1379 else if (query ==
"ThermalControl") {
1380 ret = TDEGenericDeviceType::ThermalControl;
1382 else if (query ==
"Bluetooth") {
1383 ret = TDEGenericDeviceType::BlueTooth;
1385 else if (query ==
"Bridge") {
1386 ret = TDEGenericDeviceType::Bridge;
1388 else if (query ==
"Hub") {
1389 ret = TDEGenericDeviceType::Hub;
1391 else if (query ==
"Platform") {
1392 ret = TDEGenericDeviceType::Platform;
1394 else if (query ==
"Cryptography") {
1395 ret = TDEGenericDeviceType::Cryptography;
1397 else if (query ==
"CryptographicCard") {
1398 ret = TDEGenericDeviceType::CryptographicCard;
1400 else if (query ==
"BiometricSecurity") {
1401 ret = TDEGenericDeviceType::BiometricSecurity;
1403 else if (query ==
"TestAndMeasurement") {
1404 ret = TDEGenericDeviceType::TestAndMeasurement;
1406 else if (query ==
"Timekeeping") {
1407 ret = TDEGenericDeviceType::Timekeeping;
1409 else if (query ==
"Event") {
1410 ret = TDEGenericDeviceType::Event;
1412 else if (query ==
"Input") {
1413 ret = TDEGenericDeviceType::Input;
1415 else if (query ==
"PNP") {
1416 ret = TDEGenericDeviceType::PNP;
1418 else if (query ==
"OtherACPI") {
1419 ret = TDEGenericDeviceType::OtherACPI;
1421 else if (query ==
"OtherUSB") {
1422 ret = TDEGenericDeviceType::OtherUSB;
1424 else if (query ==
"OtherMultimedia") {
1425 ret = TDEGenericDeviceType::OtherMultimedia;
1427 else if (query ==
"OtherPeripheral") {
1428 ret = TDEGenericDeviceType::OtherPeripheral;
1430 else if (query ==
"OtherSensor") {
1431 ret = TDEGenericDeviceType::OtherSensor;
1433 else if (query ==
"OtherVirtual") {
1434 ret = TDEGenericDeviceType::OtherVirtual;
1437 ret = TDEGenericDeviceType::Other;
1443TDEDiskDeviceType::TDEDiskDeviceType readDiskDeviceSubtypeFromString(TQString query, TDEDiskDeviceType::TDEDiskDeviceType flagsIn=TDEDiskDeviceType::Null) {
1444 TDEDiskDeviceType::TDEDiskDeviceType ret = flagsIn;
1447 if (query ==
"MediaDevice") {
1448 ret = ret | TDEDiskDeviceType::MediaDevice;
1450 if (query ==
"Floppy") {
1451 ret = ret | TDEDiskDeviceType::Floppy;
1453 if (query ==
"CDROM") {
1454 ret = ret | TDEDiskDeviceType::CDROM;
1456 if (query ==
"CDR") {
1457 ret = ret | TDEDiskDeviceType::CDR;
1459 if (query ==
"CDRW") {
1460 ret = ret | TDEDiskDeviceType::CDRW;
1462 if (query ==
"CDMO") {
1463 ret = ret | TDEDiskDeviceType::CDMO;
1465 if (query ==
"CDMRRW") {
1466 ret = ret | TDEDiskDeviceType::CDMRRW;
1468 if (query ==
"CDMRRWW") {
1469 ret = ret | TDEDiskDeviceType::CDMRRWW;
1471 if (query ==
"DVDROM") {
1472 ret = ret | TDEDiskDeviceType::DVDROM;
1474 if (query ==
"DVDRAM") {
1475 ret = ret | TDEDiskDeviceType::DVDRAM;
1477 if (query ==
"DVDR") {
1478 ret = ret | TDEDiskDeviceType::DVDR;
1480 if (query ==
"DVDRW") {
1481 ret = ret | TDEDiskDeviceType::DVDRW;
1483 if (query ==
"DVDRDL") {
1484 ret = ret | TDEDiskDeviceType::DVDRDL;
1486 if (query ==
"DVDRWDL") {
1487 ret = ret | TDEDiskDeviceType::DVDRWDL;
1489 if (query ==
"DVDPLUSR") {
1490 ret = ret | TDEDiskDeviceType::DVDPLUSR;
1492 if (query ==
"DVDPLUSRW") {
1493 ret = ret | TDEDiskDeviceType::DVDPLUSRW;
1495 if (query ==
"DVDPLUSRDL") {
1496 ret = ret | TDEDiskDeviceType::DVDPLUSRDL;
1498 if (query ==
"DVDPLUSRWDL") {
1499 ret = ret | TDEDiskDeviceType::DVDPLUSRWDL;
1501 if (query ==
"BDROM") {
1502 ret = ret | TDEDiskDeviceType::BDROM;
1504 if (query ==
"BDR") {
1505 ret = ret | TDEDiskDeviceType::BDR;
1507 if (query ==
"BDRW") {
1508 ret = ret | TDEDiskDeviceType::BDRW;
1510 if (query ==
"HDDVDROM") {
1511 ret = ret | TDEDiskDeviceType::HDDVDROM;
1513 if (query ==
"HDDVDR") {
1514 ret = ret | TDEDiskDeviceType::HDDVDR;
1516 if (query ==
"HDDVDRW") {
1517 ret = ret | TDEDiskDeviceType::HDDVDRW;
1519 if (query ==
"Zip") {
1520 ret = ret | TDEDiskDeviceType::Zip;
1522 if (query ==
"Jaz") {
1523 ret = ret | TDEDiskDeviceType::Jaz;
1525 if (query ==
"Camera") {
1526 ret = ret | TDEDiskDeviceType::Camera;
1528 if (query ==
"LUKS") {
1529 ret = ret | TDEDiskDeviceType::LUKS;
1531 if (query ==
"OtherCrypted") {
1532 ret = ret | TDEDiskDeviceType::OtherCrypted;
1534 if (query ==
"CDAudio") {
1535 ret = ret | TDEDiskDeviceType::CDAudio;
1537 if (query ==
"CDVideo") {
1538 ret = ret | TDEDiskDeviceType::CDVideo;
1540 if (query ==
"DVDVideo") {
1541 ret = ret | TDEDiskDeviceType::DVDVideo;
1543 if (query ==
"BDVideo") {
1544 ret = ret | TDEDiskDeviceType::BDVideo;
1546 if (query ==
"Flash") {
1547 ret = ret | TDEDiskDeviceType::Flash;
1549 if (query ==
"USB") {
1550 ret = ret | TDEDiskDeviceType::USB;
1552 if (query ==
"Tape") {
1553 ret = ret | TDEDiskDeviceType::Tape;
1555 if (query ==
"HDD") {
1556 ret = ret | TDEDiskDeviceType::HDD;
1558 if (query ==
"Optical") {
1559 ret = ret | TDEDiskDeviceType::Optical;
1561 if (query ==
"RAM") {
1562 ret = ret | TDEDiskDeviceType::RAM;
1564 if (query ==
"Loop") {
1565 ret = ret | TDEDiskDeviceType::Loop;
1567 if (query ==
"CompactFlash") {
1568 ret = ret | TDEDiskDeviceType::CompactFlash;
1570 if (query ==
"MemoryStick") {
1571 ret = ret | TDEDiskDeviceType::MemoryStick;
1573 if (query ==
"SmartMedia") {
1574 ret = ret | TDEDiskDeviceType::SmartMedia;
1576 if (query ==
"SDMMC") {
1577 ret = ret | TDEDiskDeviceType::SDMMC;
1579 if (query ==
"UnlockedCrypt") {
1580 ret = ret | TDEDiskDeviceType::UnlockedCrypt;
1586TDEGenericDevice* createDeviceObjectForType(TDEGenericDeviceType::TDEGenericDeviceType type) {
1587 TDEGenericDevice* ret = 0;
1589 if (type == TDEGenericDeviceType::Disk) {
1590 ret =
new TDEStorageDevice(type);
1593 ret =
new TDEGenericDevice(type);
1599TDEGenericDevice* TDEHardwareDevices::classifyUnknownDeviceByExternalRules(udev_device* dev, TDEGenericDevice* existingdevice,
bool classifySubDevices) {
1601 TDEGenericDevice* device = existingdevice;
1602 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Other);
1606 if (classifySubDevices) {
1607 if (!device->m_externalRulesFile.isNull()) {
1608 if (device->type() == TDEGenericDeviceType::Disk) {
1610 TDEStorageDevice* sdevice =
static_cast<TDEStorageDevice*
>(device);
1611 TQStringList subtype = device->m_externalSubtype;
1612 TDEDiskDeviceType::TDEDiskDeviceType desiredSubdeviceType = TDEDiskDeviceType::Null;
1613 if (subtype.count()>0) {
1614 for ( TQStringList::Iterator paramit = subtype.begin(); paramit != subtype.end(); ++paramit ) {
1615 desiredSubdeviceType = readDiskDeviceSubtypeFromString(*paramit, desiredSubdeviceType);
1617 if (desiredSubdeviceType != sdevice->diskType()) {
1618 printf(
"[tdehardwaredevices] Rules file %s used to set device subtype for device at path %s\n", device->m_externalRulesFile.ascii(), device->systemPath().ascii()); fflush(stdout);
1619 sdevice->internalSetDiskType(desiredSubdeviceType);
1626 TQStringList hardware_info_directories(
TDEGlobal::dirs()->resourceDirs(
"data"));
1627 TQString hardware_info_directory_suffix(
"tdehwlib/deviceclasses/");
1628 TQString hardware_info_directory;
1635 device->m_externalRulesFile = TQString::null;
1636 for ( TQStringList::Iterator it = hardware_info_directories.begin(); it != hardware_info_directories.end(); ++it ) {
1637 hardware_info_directory = (*it);
1638 hardware_info_directory += hardware_info_directory_suffix;
1641 TQDir d(hardware_info_directory);
1642 d.setFilter( TQDir::Files | TQDir::Hidden );
1644 const TQFileInfoList *list = d.entryInfoList();
1645 TQFileInfoListIterator it( *list );
1648 while ((fi = it.current()) != 0) {
1649 if (fi->extension(
false) ==
"hwclass") {
1653 TDEConfig rulesFile(fi->absFilePath(),
true,
false);
1654 rulesFile.setGroup(
"Conditions");
1655 TDEConfigMap conditionmap = rulesFile.entryMap(
"Conditions");
1656 TDEConfigMap::Iterator cndit;
1657 for (cndit = conditionmap.begin(); cndit != conditionmap.end(); ++cndit) {
1658 TQStringList conditionList = TQStringList::split(
',', cndit.data(),
false);
1659 bool atleastonematch =
false;
1660 bool allmatch =
true;
1661 TQString matchtype = rulesFile.readEntry(
"MATCH_TYPE",
"All");
1662 if (conditionList.count() < 1) {
1666 for ( TQStringList::Iterator paramit = conditionList.begin(); paramit != conditionList.end(); ++paramit ) {
1667 if ((*paramit) ==
"MatchType") {
1670 if (cndit.key() ==
"VENDOR_ID") {
1671 if (device->vendorID() == (*paramit)) {
1672 atleastonematch =
true;
1678 else if (cndit.key() ==
"MODEL_ID") {
1679 if (device->modelID() == (*paramit)) {
1680 atleastonematch =
true;
1686 else if (cndit.key() ==
"DRIVER") {
1687 if (device->deviceDriver() == (*paramit)) {
1688 atleastonematch =
true;
1695 if (readUdevAttribute(dev, cndit.key()) == (*paramit)) {
1696 atleastonematch =
true;
1704 if (matchtype ==
"All") {
1709 else if (matchtype ==
"Any") {
1710 if (!atleastonematch) {
1720 rulesFile.setGroup(
"DeviceType");
1721 TQString gentype = rulesFile.readEntry(
"GENTYPE");
1722 TDEGenericDeviceType::TDEGenericDeviceType desiredDeviceType = device->type();
1723 if (!gentype.isNull()) {
1724 desiredDeviceType = readGenericDeviceTypeFromString(gentype);
1728 if (desiredDeviceType != device->type()) {
1729 printf(
"[tdehardwaredevices] Rules file %s used to set device type for device at path %s\n", fi->absFilePath().ascii(), device->systemPath().ascii()); fflush(stdout);
1730 if (m_deviceList.contains(device)) {
1731 m_deviceList.remove(device);
1736 device = createDeviceObjectForType(desiredDeviceType);
1741 device->m_externalSubtype = rulesFile.readListEntry(
"SUBTYPE",
',');
1742 device->m_externalRulesFile = fi->absFilePath();
1745 rulesFile.setGroup(
"DeviceSettings");
1746 device->internalSetBlacklistedForUpdate(rulesFile.readBoolEntry(
"UPDATE_BLACKLISTED", device->blacklistedForUpdate()));
1758TDEGenericDevice* TDEHardwareDevices::classifyUnknownDevice(udev_device* dev, TDEGenericDevice* existingdevice,
bool force_full_classification) {
1760 TQString devicename;
1761 TQString devicetype;
1762 TQString devicedriver;
1763 TQString devicesubsystem;
1764 TQString devicenode;
1765 TQString systempath;
1766 TQString devicevendorid;
1767 TQString devicemodelid;
1768 TQString devicevendoridenc;
1769 TQString devicemodelidenc;
1770 TQString devicesubvendorid;
1771 TQString devicesubmodelid;
1772 TQString devicetypestring;
1773 TQString devicetypestring_alt;
1774 TQString devicepciclass;
1775 TDEGenericDevice* device = existingdevice;
1776 bool temp_udev_device = !dev;
1778 devicename = (udev_device_get_sysname(dev));
1779 devicetype = (udev_device_get_devtype(dev));
1780 devicedriver = (udev_device_get_driver(dev));
1781 devicesubsystem = (udev_device_get_subsystem(dev));
1782 devicenode = (udev_device_get_devnode(dev));
1783 systempath = (udev_device_get_syspath(dev));
1785 devicevendorid = (udev_device_get_property_value(dev,
"ID_VENDOR_ID"));
1786 devicemodelid = (udev_device_get_property_value(dev,
"ID_MODEL_ID"));
1787 devicevendoridenc = (udev_device_get_property_value(dev,
"ID_VENDOR_ENC"));
1788 devicemodelidenc = (udev_device_get_property_value(dev,
"ID_MODEL_ENC"));
1789 devicesubvendorid = (udev_device_get_property_value(dev,
"ID_SUBVENDOR_ID"));
1790 devicesubmodelid = (udev_device_get_property_value(dev,
"ID_SUBMODEL_ID"));
1791 devicetypestring = (udev_device_get_property_value(dev,
"ID_TYPE"));
1792 devicetypestring_alt = (udev_device_get_property_value(dev,
"DEVTYPE"));
1793 devicepciclass = (udev_device_get_property_value(dev,
"PCI_CLASS"));
1797 devicename = device->name();
1798 devicetype = device->m_udevtype;
1799 devicedriver = device->deviceDriver();
1800 devicesubsystem = device->subsystem();
1801 devicenode = device->deviceNode();
1802 systempath = device->systemPath();
1803 devicevendorid = device->vendorID();
1804 devicemodelid = device->modelID();
1805 devicevendoridenc = device->vendorEncoded();
1806 devicemodelidenc = device->modelEncoded();
1807 devicesubvendorid = device->subVendorID();
1808 devicesubmodelid = device->subModelID();
1809 devicetypestring = device->m_udevdevicetypestring;
1810 devicetypestring_alt = device->udevdevicetypestring_alt;
1811 devicepciclass = device->PCIClass();
1813 TQString syspathudev = systempath;
1814 syspathudev.truncate(syspathudev.length()-1);
1815 dev = udev_device_new_from_syspath(m_udevStruct, syspathudev.ascii());
1824 TQString current_path = systempath;
1825 TQString devicemodalias = TQString::null;
1827 while (done ==
false) {
1828 TQString malnodename = current_path;
1829 malnodename.append(
"/modalias");
1830 TQFile malfile(malnodename);
1831 if (malfile.open(IO_ReadOnly)) {
1832 TQTextStream stream( &malfile );
1833 devicemodalias = stream.readLine();
1836 if (devicemodalias.startsWith(
"pci") || devicemodalias.startsWith(
"usb")) {
1840 devicemodalias = TQString::null;
1841 current_path.truncate(current_path.findRev(
"/"));
1842 if (!current_path.startsWith(
"/sys/devices")) {
1852 if (devicevendorid.isNull() || devicemodelid.isNull() || devicemodelid.contains(
"/")) {
1853 if (devicemodalias != TQString::null) {
1855 if (devicemodalias.startsWith(
"pci")) {
1856 int vloc = devicemodalias.find(
"v");
1857 int dloc = devicemodalias.find(
"d", vloc);
1858 int svloc = devicemodalias.find(
"sv");
1859 int sdloc = devicemodalias.find(
"sd", vloc);
1861 devicevendorid = devicemodalias.mid(vloc+1, 8).lower();
1862 devicemodelid = devicemodalias.mid(dloc+1, 8).lower();
1864 devicesubvendorid = devicemodalias.mid(svloc+1, 8).lower();
1865 devicesubmodelid = devicemodalias.mid(sdloc+1, 8).lower();
1867 devicevendorid.remove(0,4);
1868 devicemodelid.remove(0,4);
1869 devicesubvendorid.remove(0,4);
1870 devicesubmodelid.remove(0,4);
1872 if (devicemodalias.startsWith(
"usb")) {
1873 int vloc = devicemodalias.find(
"v");
1874 int dloc = devicemodalias.find(
"p", vloc);
1875 int svloc = devicemodalias.find(
"sv");
1876 int sdloc = devicemodalias.find(
"sp", vloc);
1878 devicevendorid = devicemodalias.mid(vloc+1, 4).lower();
1879 devicemodelid = devicemodalias.mid(dloc+1, 4).lower();
1881 devicesubvendorid = devicemodalias.mid(svloc+1, 4).lower();
1882 devicesubmodelid = devicemodalias.mid(sdloc+1, 4).lower();
1889 if (devicedriver.isNull()) {
1890 TQString driverSymlink = udev_device_get_syspath(dev);
1891 TQString driverSymlinkDir = driverSymlink;
1892 driverSymlink.append(
"/device/driver");
1893 driverSymlinkDir.append(
"/device/");
1894 TQFileInfo dirfi(driverSymlink);
1895 if (dirfi.isSymLink()) {
1896 char* collapsedPath = realpath((driverSymlinkDir + dirfi.readLink()).ascii(), NULL);
1897 devicedriver = TQString(collapsedPath);
1898 free(collapsedPath);
1899 devicedriver.remove(0, devicedriver.findRev(
"/")+1);
1904 TQString classnodename = systempath;
1905 classnodename.append(
"/class");
1906 TQFile classfile( classnodename );
1907 if ( classfile.open( IO_ReadOnly ) ) {
1908 TQTextStream stream( &classfile );
1909 devicepciclass = stream.readLine();
1910 devicepciclass.replace(
"0x",
"");
1911 devicepciclass = devicepciclass.lower();
1918 TQString syspath_tail = systempath.lower();
1919 syspath_tail.truncate(syspath_tail.length()-1);
1920 syspath_tail.remove(0, syspath_tail.findRev(
"/")+1);
1921 if (syspath_tail.startsWith(
"event")) {
1922 if (!device) device =
new TDEEventDevice(TDEGenericDeviceType::Event);
1925 if (syspath_tail.startsWith(
"input")) {
1926 if (!device) device =
new TDEInputDevice(TDEGenericDeviceType::Input);
1929 if (devicesubsystem ==
"rc") {
1930 if (!device) device =
new TDEInputDevice(TDEGenericDeviceType::Input);
1936 bool is_keyboard =
false;
1937 TQString inputtopdirname = udev_device_get_syspath(dev);
1938 inputtopdirname.append(
"/input/");
1939 TQDir inputdir(inputtopdirname);
1940 inputdir.setFilter(TQDir::All);
1941 const TQFileInfoList *dirlist = inputdir.entryInfoList();
1943 TQFileInfoListIterator inputdirsit(*dirlist);
1945 while ( (dirfi = inputdirsit.current()) != 0 ) {
1946 if ((dirfi->fileName() !=
".") && (dirfi->fileName() !=
"..")) {
1947 struct udev_device *slavedev;
1948 slavedev = udev_device_new_from_syspath(m_udevStruct, (inputtopdirname + dirfi->fileName()).ascii());
1949 if (udev_device_get_property_value(slavedev,
"ID_INPUT_KEYBOARD") != 0) {
1952 udev_device_unref(slavedev);
1958 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Keyboard);
1962 if (((devicetype ==
"disk")
1963 || (devicetype ==
"partition")
1964 || (devicedriver ==
"floppy")
1965 || (devicesubsystem ==
"scsi_disk")
1966 || (devicesubsystem ==
"scsi_tape"))
1967 && ((devicenode !=
"")
1970 device =
new TDEStorageDevice(TDEGenericDeviceType::Disk);
1973 else if (devicetype ==
"host") {
1974 if (devicesubsystem ==
"bluetooth") {
1975 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::BlueTooth);
1978 else if (devicetype.isNull()) {
1979 if (devicesubsystem ==
"acpi") {
1982 TQString pnpgentype = systempath;
1983 pnpgentype.remove(0, pnpgentype.findRev(
"/")+1);
1984 pnpgentype.truncate(pnpgentype.find(
":"));
1985 if (pnpgentype.startsWith(
"PNP")) {
1989 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::OtherACPI);
1992 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::OtherACPI);
1995 else if (devicesubsystem ==
"input") {
1999 if (systempath.contains(
"/mouse")) {
2000 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Mouse);
2005 if (udev_device_get_property_value(dev,
"ID_INPUT_MOUSE") != 0) {
2006 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Mouse);
2012 if (udev_device_get_property_value(dev,
"ID_INPUT_KEYBOARD") != 0) {
2013 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Keyboard);
2017 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::HID);
2020 else if (devicesubsystem ==
"tty") {
2021 if (devicenode.contains(
"/ttyS")) {
2022 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Serial);
2025 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::TextIO);
2028 else if (devicesubsystem ==
"usb-serial") {
2029 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Serial);
2031 else if ((devicesubsystem ==
"spi_master")
2032 || (devicesubsystem ==
"spidev")) {
2033 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Serial);
2035 else if (devicesubsystem ==
"spi") {
2036 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2038 else if (devicesubsystem ==
"watchdog") {
2039 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2041 else if (devicesubsystem ==
"node") {
2042 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2044 else if (devicesubsystem ==
"regulator") {
2045 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2047 else if (devicesubsystem ==
"memory") {
2048 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2050 else if (devicesubsystem ==
"clockevents") {
2051 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2053 else if (devicesubsystem ==
"thermal") {
2056 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::ThermalControl);
2058 else if (devicesubsystem ==
"hwmon") {
2061 if (!device) device =
new TDESensorDevice(TDEGenericDeviceType::OtherSensor);
2063 else if (devicesubsystem ==
"vio") {
2064 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2066 else if (devicesubsystem ==
"virtio") {
2067 if (devicedriver ==
"virtio_blk") {
2068 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::SCSI);
2070 if (devicedriver ==
"virtio_net") {
2071 if (!device) device =
new TDENetworkDevice(TDEGenericDeviceType::Network);
2073 if (devicedriver ==
"virtio_balloon") {
2074 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::RAM);
2081 if (devicesubsystem ==
"backlight") {
2082 if (!device) device =
new TDEBacklightDevice(TDEGenericDeviceType::Backlight);
2084 if (systempath.lower().startsWith(
"/sys/module/")
2085 || (systempath.lower().startsWith(
"/sys/kernel/"))) {
2086 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2088 if ((devicetypestring ==
"audio")
2089 || (devicesubsystem ==
"sound")
2090 || (devicesubsystem ==
"hdaudio")
2091 || (devicesubsystem ==
"ac97")) {
2092 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Sound);
2094 if (devicesubsystem ==
"container") {
2095 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::OtherACPI);
2097 if ((devicesubsystem ==
"video4linux")
2098 || (devicesubsystem ==
"dvb")) {
2099 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::VideoCapture);
2101 if ((devicetypestring_alt ==
"scsi_target")
2102 || (devicesubsystem ==
"scsi_host")
2103 || (devicesubsystem ==
"scsi_disk")
2104 || (devicesubsystem ==
"scsi_device")
2105 || (devicesubsystem ==
"scsi_generic")
2106 || (devicesubsystem ==
"scsi")
2107 || (devicetypestring_alt ==
"sas_target")
2108 || (devicesubsystem ==
"sas_host")
2109 || (devicesubsystem ==
"sas_port")
2110 || (devicesubsystem ==
"sas_device")
2111 || (devicesubsystem ==
"sas_expander")
2112 || (devicesubsystem ==
"sas_generic")
2113 || (devicesubsystem ==
"sas_phy")
2114 || (devicesubsystem ==
"sas_end_device")
2115 || (devicesubsystem ==
"spi_transport")
2116 || (devicesubsystem ==
"spi_host")
2117 || (devicesubsystem ==
"ata_port")
2118 || (devicesubsystem ==
"ata_link")
2119 || (devicesubsystem ==
"ata_disk")
2120 || (devicesubsystem ==
"ata_device")
2121 || (devicesubsystem ==
"ata")) {
2122 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2124 if (devicesubsystem ==
"infiniband") {
2125 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Peripheral);
2127 if ((devicesubsystem ==
"infiniband_cm")
2128 || (devicesubsystem ==
"infiniband_mad")
2129 || (devicesubsystem ==
"infiniband_verbs")) {
2130 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2132 if (devicesubsystem ==
"infiniband_srp") {
2133 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::SCSI);
2135 if ((devicesubsystem ==
"enclosure")
2136 || (devicesubsystem ==
"clocksource")
2137 || (devicesubsystem ==
"amba")) {
2138 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2140 if (devicesubsystem ==
"edac") {
2141 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::RAM);
2143 if (devicesubsystem.startsWith(
"mc") && systempath.contains(
"/edac/")) {
2144 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::RAM);
2146 if ((devicesubsystem ==
"ipmi")
2147 || (devicesubsystem ==
"ipmi_si")) {
2148 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Mainboard);
2150 if (devicesubsystem ==
"iommu") {
2151 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2153 if (devicesubsystem ==
"misc") {
2154 if (devicedriver.startsWith(
"tpm_")) {
2155 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Cryptography);
2158 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2161 if (devicesubsystem ==
"media") {
2162 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2164 if (devicesubsystem ==
"nd") {
2165 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::RAM);
2167 if (devicesubsystem ==
"ptp"
2168 || (devicesubsystem ==
"rtc")) {
2169 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Timekeeping);
2171 if (devicesubsystem ==
"leds") {
2172 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::OtherACPI);
2174 if (devicesubsystem ==
"net") {
2175 if (!device) device =
new TDENetworkDevice(TDEGenericDeviceType::Network);
2177 if ((devicesubsystem ==
"i2c")
2178 || (devicesubsystem ==
"i2c-dev")) {
2179 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::I2C);
2181 if (devicesubsystem ==
"mdio_bus") {
2182 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::MDIO);
2184 if (devicesubsystem ==
"graphics") {
2185 if (devicenode.isNull()) {
2186 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::GPU);
2189 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2192 if (devicesubsystem ==
"tifm_adapter") {
2193 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::StorageController);
2195 if ((devicesubsystem ==
"mmc_host")
2196 || (devicesubsystem ==
"memstick_host")) {
2197 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::StorageController);
2199 if (devicesubsystem ==
"mmc") {
2200 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2202 if (devicesubsystem ==
"event_source") {
2203 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Mainboard);
2205 if (devicesubsystem ==
"bsg") {
2206 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::SCSI);
2208 if (devicesubsystem ==
"firewire") {
2209 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::IEEE1394);
2211 if (devicesubsystem ==
"drm") {
2212 if (devicenode.isNull()) {
2213 if (!device) device =
new TDEMonitorDevice(TDEGenericDeviceType::Monitor);
2216 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2219 if (devicesubsystem ==
"nvmem") {
2220 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::NonvolatileMemory);
2222 if (devicesubsystem ==
"serio") {
2223 if (devicedriver.contains(
"atkbd")) {
2224 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Keyboard);
2226 else if (devicedriver.contains(
"mouse")) {
2227 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Mouse);
2230 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Serial);
2233 if ((devicesubsystem ==
"ppdev")
2234 || (devicesubsystem ==
"parport")) {
2235 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Parallel);
2237 if (devicesubsystem ==
"printer") {
2238 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Printer);
2240 if (devicesubsystem ==
"bridge") {
2241 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Bridge);
2243 if ((devicesubsystem ==
"pci_bus")
2244 || (devicesubsystem ==
"pci_express")) {
2245 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Bus);
2247 if (devicesubsystem ==
"pcmcia_socket") {
2248 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::PCMCIA);
2250 if (devicesubsystem ==
"platform") {
2251 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2253 if (devicesubsystem ==
"ieee80211") {
2254 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2256 if (devicesubsystem ==
"rfkill") {
2257 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2259 if (devicesubsystem ==
"machinecheck") {
2260 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2262 if (devicesubsystem ==
"pnp") {
2263 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::PNP);
2265 if ((devicesubsystem ==
"hid")
2266 || (devicesubsystem ==
"hidraw")
2267 || (devicesubsystem ==
"usbhid")) {
2268 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::HID);
2270 if (devicesubsystem ==
"power_supply") {
2271 TQString powersupplyname(udev_device_get_property_value(dev,
"POWER_SUPPLY_NAME"));
2272 if ((devicedriver ==
"ac")
2273 || (devicedriver.contains(
"charger"))
2274 || (powersupplyname.upper().startsWith(
"AC"))) {
2275 if (!device) device =
new TDEMainsPowerDevice(TDEGenericDeviceType::PowerSupply);
2278 if (!device) device =
new TDEBatteryDevice(TDEGenericDeviceType::Battery);
2281 if (systempath.lower().startsWith(
"/sys/devices/virtual")) {
2282 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::OtherVirtual);
2287 if (!devicepciclass.isNull()) {
2289 if (devicepciclass.startsWith(
"0001")) {
2290 if (devicenode.isNull()) {
2291 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::GPU);
2294 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2298 TQString devicepcisubclass = devicepciclass;
2299 devicepcisubclass = devicepcisubclass.remove(0,2);
2300 if (devicepciclass.startsWith(
"01")) {
2301 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::StorageController);
2303 if (devicepciclass.startsWith(
"02")) {
2304 if (!device) device =
new TDENetworkDevice(TDEGenericDeviceType::Network);
2306 if (devicepciclass.startsWith(
"03")) {
2307 if (devicenode.isNull()) {
2308 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::GPU);
2311 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2314 if (devicepciclass.startsWith(
"04")) {
2315 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::OtherMultimedia);
2317 if (devicepciclass.startsWith(
"05")) {
2318 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::RAM);
2320 if (devicepciclass.startsWith(
"06")) {
2321 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Bridge);
2323 if (devicepciclass.startsWith(
"07")) {
2324 if (devicepcisubclass.startsWith(
"03")) {
2325 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Modem);
2328 if (devicepciclass.startsWith(
"0a")) {
2329 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Dock);
2331 if (devicepciclass.startsWith(
"0b")) {
2332 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::CPU);
2334 if (devicepciclass.startsWith(
"0c")) {
2335 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Serial);
2339 if ((devicesubsystem ==
"usb")
2340 && (devicedriver ==
"uvcvideo")) {
2341 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2346 if ((devicesubsystem ==
"usb")
2347 || (devicesubsystem ==
"usbmisc")
2348 || (devicesubsystem ==
"usb_device")
2349 || (devicesubsystem ==
"usbmon")) {
2351 int usbInterfaceClass = -1;
2353 TQFile ifaceprotofile(current_path +
"/bInterfaceClass");
2354 if (ifaceprotofile.open(IO_ReadOnly)) {
2355 TQTextStream stream( &ifaceprotofile );
2356 usbInterfaceClass = stream.readLine().toUInt(NULL, 16);
2357 ifaceprotofile.close();
2361 int usbInterfaceSubClass = -1;
2363 TQFile ifaceprotofile(current_path +
"/bInterfaceSubClass");
2364 if (ifaceprotofile.open(IO_ReadOnly)) {
2365 TQTextStream stream( &ifaceprotofile );
2366 usbInterfaceSubClass = stream.readLine().toUInt(NULL, 16);
2367 ifaceprotofile.close();
2371 int usbInterfaceProtocol = -1;
2373 TQFile ifaceprotofile(current_path +
"/bInterfaceProtocol");
2374 if (ifaceprotofile.open(IO_ReadOnly)) {
2375 TQTextStream stream( &ifaceprotofile );
2376 usbInterfaceProtocol = stream.readLine().toUInt(NULL, 16);
2377 ifaceprotofile.close();
2380 if ((usbInterfaceClass == 6) && (usbInterfaceSubClass == 1) && (usbInterfaceProtocol == 1)) {
2383 device =
new TDEStorageDevice(TDEGenericDeviceType::Disk);
2384 TDEStorageDevice* sdevice =
static_cast<TDEStorageDevice*
>(device);
2385 sdevice->internalSetDiskType(TDEDiskDeviceType::Camera);
2386 TQString parentsyspathudev = systempath;
2387 parentsyspathudev.truncate(parentsyspathudev.length()-1);
2388 parentsyspathudev.truncate(parentsyspathudev.findRev(
"/"));
2389 struct udev_device *parentdev;
2390 parentdev = udev_device_new_from_syspath(m_udevStruct, parentsyspathudev.ascii());
2391 devicenode = (udev_device_get_devnode(parentdev));
2392 udev_device_unref(parentdev);
2395 else if (usbInterfaceClass == 9) {
2397 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Hub);
2399 else if (usbInterfaceClass == 11) {
2401 if (!device) device =
new TDECryptographicCardDevice(TDEGenericDeviceType::CryptographicCard);
2403 else if (usbInterfaceClass == 14) {
2405 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::BiometricSecurity);
2407 else if (usbInterfaceClass == 254) {
2409 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::TestAndMeasurement);
2412 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::OtherUSB);
2415 if (devicesubsystem ==
"pci") {
2416 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::OtherPeripheral);
2418 if (devicesubsystem ==
"cpu") {
2419 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Platform);
2425 if (!device) device =
new TDEGenericDevice(TDEGenericDeviceType::Other);
2426 if (!m_unclassifiedDevices.contains(devicename))
2428 m_unclassifiedDevices.append(devicename);
2429 printf(
"[FIXME] UNCLASSIFIED DEVICE name: %s type: %s subsystem: %s driver: %s [Node Path: %s] [Syspath: %s] [%s:%s]\n",
2430 devicename.ascii(), devicetype.ascii(), devicesubsystem.ascii(), devicedriver.ascii(), devicenode.ascii(), udev_device_get_syspath(dev), devicevendorid.ascii(), devicemodelid.ascii()); fflush(stdout);
2435 if ((device->type() == TDEGenericDeviceType::Root) || (device->type() == TDEGenericDeviceType::RootSystem)) {
2436 systempath = device->systemPath();
2440 device->internalSetName(devicename);
2441 device->internalSetDeviceNode(devicenode);
2442 device->internalSetSystemPath(systempath);
2443 device->internalSetVendorID(devicevendorid);
2444 device->internalSetModelID(devicemodelid);
2445 device->internalSetVendorEncoded(devicevendoridenc);
2446 device->internalSetModelEncoded(devicemodelidenc);
2447 device->internalSetSubVendorID(devicesubvendorid);
2448 device->internalSetSubModelID(devicesubmodelid);
2449 device->internalSetModuleAlias(devicemodalias);
2450 device->internalSetDeviceDriver(devicedriver);
2451 device->internalSetSubsystem(devicesubsystem);
2452 device->internalSetPCIClass(devicepciclass);
2454 updateBlacklists(device, dev);
2456 if (force_full_classification) {
2458 device = classifyUnknownDeviceByExternalRules(dev, device,
false);
2462 device->m_udevtype = devicetype;
2463 device->m_udevdevicetypestring = devicetypestring;
2464 device->udevdevicetypestring_alt = devicetypestring_alt;
2466 updateExistingDeviceInformation(device, dev);
2468 if (temp_udev_device) {
2469 udev_device_unref(dev);
2475void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice *device, udev_device *dev) {
2480 TQString devicename;
2481 TQString devicetype;
2482 TQString devicedriver;
2483 TQString devicesubsystem;
2484 TQString devicenode;
2485 TQString systempath;
2486 TQString devicevendorid;
2487 TQString devicemodelid;
2488 TQString devicevendoridenc;
2489 TQString devicemodelidenc;
2490 TQString devicesubvendorid;
2491 TQString devicesubmodelid;
2492 TQString devicetypestring;
2493 TQString devicetypestring_alt;
2494 TQString devicepciclass;
2495 bool temp_udev_device = !dev;
2497 devicename = device->name();
2498 devicetype = device->m_udevtype;
2499 devicedriver = device->deviceDriver();
2500 devicesubsystem = device->subsystem();
2501 devicenode = device->deviceNode();
2502 systempath = device->systemPath();
2503 devicevendorid = device->vendorID();
2504 devicemodelid = device->modelID();
2505 devicevendoridenc = device->vendorEncoded();
2506 devicemodelidenc = device->modelEncoded();
2507 devicesubvendorid = device->subVendorID();
2508 devicesubmodelid = device->subModelID();
2509 devicetypestring = device->m_udevdevicetypestring;
2510 devicetypestring_alt = device->udevdevicetypestring_alt;
2511 devicepciclass = device->PCIClass();
2514 TQString syspathudev = systempath;
2515 syspathudev.truncate(syspathudev.length()-1);
2516 dev = udev_device_new_from_syspath(m_udevStruct, syspathudev.ascii());
2519 if (device->type() == TDEGenericDeviceType::Disk) {
2520 TDEStorageDevice* sdevice =
static_cast<TDEStorageDevice*
>(device);
2521 if (sdevice->diskType() & TDEDiskDeviceType::Camera) {
2523 sdevice->internalSetDiskStatus(TDEDiskDeviceStatus::Removable);
2524 sdevice->internalSetFileSystemName(
"pictbridge");
2528 TQStringList holdingDeviceNodes;
2529 TQString holdersnodename = udev_device_get_syspath(dev);
2530 holdersnodename.append(
"/holders/");
2531 TQDir holdersdir(holdersnodename);
2532 holdersdir.setFilter(TQDir::All);
2533 const TQFileInfoList *dirlist = holdersdir.entryInfoList();
2535 TQFileInfoListIterator holdersdirit(*dirlist);
2537 while ( (dirfi = holdersdirit.current()) != 0 ) {
2538 if (dirfi->isSymLink()) {
2539 char* collapsedPath = realpath((holdersnodename + dirfi->readLink()).ascii(), NULL);
2540 holdingDeviceNodes.append(TQString(collapsedPath));
2541 free(collapsedPath);
2548 TQStringList slaveDeviceNodes;
2549 TQString slavesnodename = udev_device_get_syspath(dev);
2550 slavesnodename.append(
"/slaves/");
2551 TQDir slavedir(slavesnodename);
2552 slavedir.setFilter(TQDir::All);
2553 dirlist = slavedir.entryInfoList();
2555 TQFileInfoListIterator slavedirit(*dirlist);
2557 while ( (dirfi = slavedirit.current()) != 0 ) {
2558 if (dirfi->isSymLink()) {
2559 char* collapsedPath = realpath((slavesnodename + dirfi->readLink()).ascii(), NULL);
2560 slaveDeviceNodes.append(TQString(collapsedPath));
2561 free(collapsedPath);
2568 TQString devicevendor(udev_device_get_property_value(dev,
"ID_VENDOR"));
2569 TQString devicemodel(udev_device_get_property_value(dev,
"ID_MODEL"));
2570 TQString devicebus(udev_device_get_property_value(dev,
"ID_BUS"));
2573 TQString disklabel(decodeHexEncoding(TQString::fromLocal8Bit(udev_device_get_property_value(dev,
"ID_FS_LABEL_ENC"))));
2574 if (disklabel ==
"") {
2575 disklabel = TQString::fromLocal8Bit(udev_device_get_property_value(dev,
"ID_FS_LABEL"));
2577 TQString diskuuid(udev_device_get_property_value(dev,
"ID_FS_UUID"));
2578 TQString filesystemtype(udev_device_get_property_value(dev,
"ID_FS_TYPE"));
2579 TQString filesystemusage(udev_device_get_property_value(dev,
"ID_FS_USAGE"));
2581 device->internalSetVendorName(devicevendor);
2582 device->internalSetVendorModel(devicemodel);
2583 device->internalSetDeviceBus(devicebus);
2585 TDEDiskDeviceType::TDEDiskDeviceType disktype = sdevice->diskType();
2586 TDEDiskDeviceStatus::TDEDiskDeviceStatus diskstatus = TDEDiskDeviceStatus::Null;
2588 TDEStorageDevice* parentdisk = NULL;
2589 if (!(TQString(udev_device_get_property_value(dev,
"ID_PART_ENTRY_NUMBER")).isEmpty())) {
2590 TQString parentsyspath = systempath;
2591 parentsyspath.truncate(parentsyspath.length()-1);
2592 parentsyspath.truncate(parentsyspath.findRev(
"/"));
2593 parentdisk =
static_cast<TDEStorageDevice*
>(findBySystemPath(parentsyspath));
2595 disktype = classifyDiskType(dev, devicenode, devicebus, devicetypestring, systempath, devicevendor, devicemodel, filesystemtype, devicedriver);
2598 disktype = disktype | parentdisk->diskType();
2599 diskstatus = diskstatus | parentdisk->diskStatus();
2601 sdevice->internalSetDiskType(disktype);
2602 device = classifyUnknownDeviceByExternalRules(dev, device,
true);
2603 disktype = sdevice->diskType();
2606 if ((filesystemtype.upper() ==
"CRYPTO_LUKS" || filesystemtype.upper() ==
"CRYPTO") &&
2607 holdingDeviceNodes.count() > 0) {
2608 disktype = disktype | TDEDiskDeviceType::UnlockedCrypt;
2611 disktype = disktype & ~TDEDiskDeviceType::UnlockedCrypt;
2614 if (TQString(udev_device_get_property_value(dev,
"UDISKS_IGNORE")) ==
"1") {
2615 diskstatus = diskstatus | TDEDiskDeviceStatus::Hidden;
2618 if ((disktype & TDEDiskDeviceType::CDROM)
2619 || (disktype & TDEDiskDeviceType::CDR)
2620 || (disktype & TDEDiskDeviceType::CDRW)
2621 || (disktype & TDEDiskDeviceType::CDMO)
2622 || (disktype & TDEDiskDeviceType::CDMRRW)
2623 || (disktype & TDEDiskDeviceType::CDMRRWW)
2624 || (disktype & TDEDiskDeviceType::DVDROM)
2625 || (disktype & TDEDiskDeviceType::DVDRAM)
2626 || (disktype & TDEDiskDeviceType::DVDR)
2627 || (disktype & TDEDiskDeviceType::DVDRW)
2628 || (disktype & TDEDiskDeviceType::DVDRDL)
2629 || (disktype & TDEDiskDeviceType::DVDRWDL)
2630 || (disktype & TDEDiskDeviceType::DVDPLUSR)
2631 || (disktype & TDEDiskDeviceType::DVDPLUSRW)
2632 || (disktype & TDEDiskDeviceType::DVDPLUSRDL)
2633 || (disktype & TDEDiskDeviceType::DVDPLUSRWDL)
2634 || (disktype & TDEDiskDeviceType::BDROM)
2635 || (disktype & TDEDiskDeviceType::BDR)
2636 || (disktype & TDEDiskDeviceType::BDRW)
2637 || (disktype & TDEDiskDeviceType::HDDVDROM)
2638 || (disktype & TDEDiskDeviceType::HDDVDR)
2639 || (disktype & TDEDiskDeviceType::HDDVDRW)
2640 || (disktype & TDEDiskDeviceType::CDAudio)
2641 || (disktype & TDEDiskDeviceType::CDVideo)
2642 || (disktype & TDEDiskDeviceType::DVDVideo)
2643 || (disktype & TDEDiskDeviceType::BDVideo)
2646 disktype = disktype | TDEDiskDeviceType::Optical;
2649 if (disktype & TDEDiskDeviceType::Floppy) {
2652 TQString floppyblknodename = systempath;
2653 floppyblknodename.append(
"/block");
2654 TQDir floppyblkdir(floppyblknodename);
2655 floppyblkdir.setFilter(TQDir::All);
2656 const TQFileInfoList *floppyblkdirlist = floppyblkdir.entryInfoList();
2657 if (floppyblkdirlist) {
2658 TQFileInfoListIterator floppyblkdirit(*floppyblkdirlist);
2660 while ( (dirfi = floppyblkdirit.current()) != 0 ) {
2661 if ((dirfi->fileName() !=
".") && (dirfi->fileName() !=
"..")) {
2663 devicenode = TQString(
"/dev/").append(dirfi->fileName());
2678 TQString floppycmsnodename = systempath;
2679 floppycmsnodename.append(
"/cmos");
2680 TQFile floppycmsfile( floppycmsnodename );
2681 TQString cmosstring;
2682 if ( floppycmsfile.open( IO_ReadOnly ) ) {
2683 TQTextStream stream( &floppycmsfile );
2684 cmosstring = stream.readLine();
2685 floppycmsfile.close();
2690 if (devicenode.isNull()) {
2692 disktype = disktype & ~TDEDiskDeviceType::Floppy;
2696 if (devicetypestring.upper() ==
"CD") {
2697 if (TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA_STATE")).upper() ==
"BLANK") {
2698 diskstatus = diskstatus | TDEDiskDeviceStatus::Blank;
2700 sdevice->internalSetMediaInserted((TQString(udev_device_get_property_value(dev,
"ID_CDROM_MEDIA")) !=
""));
2703 if (disktype & TDEDiskDeviceType::Zip) {
2705 TQString zipnodename = systempath;
2706 zipnodename.append(
"/size");
2707 TQFile namefile( zipnodename );
2709 if ( namefile.open( IO_ReadOnly ) ) {
2710 TQTextStream stream( &namefile );
2711 zipsize = stream.readLine();
2714 if (!zipsize.isNull()) {
2715 sdevice->internalSetMediaInserted((zipsize.toInt() != 0));
2719 if (readLineFile( systempath +
"/removable" ).toUInt()) {
2720 diskstatus = diskstatus | TDEDiskDeviceStatus::Removable;
2724 else if ((disktype & TDEDiskDeviceType::CompactFlash)
2725 || (disktype & TDEDiskDeviceType::MemoryStick)
2726 || (disktype & TDEDiskDeviceType::SmartMedia)
2727 || (disktype & TDEDiskDeviceType::SDMMC)) {
2728 diskstatus = diskstatus | TDEDiskDeviceStatus::Removable;
2731 if ((!filesystemtype.isEmpty()) && (filesystemtype.upper() !=
"CRYPTO_LUKS") &&
2732 (filesystemtype.upper() !=
"CRYPTO") && (filesystemtype.upper() !=
"SWAP")) {
2733 diskstatus = diskstatus | TDEDiskDeviceStatus::ContainsFilesystem;
2736 diskstatus = diskstatus & ~TDEDiskDeviceStatus::ContainsFilesystem;
2740 diskstatus = diskstatus | TDEDiskDeviceStatus::Mountable;
2741 if (devicetypestring.upper().isNull() && devicetypestring_alt.upper().isNull() && (disktype & TDEDiskDeviceType::HDD)) {
2744 diskstatus = diskstatus & ~TDEDiskDeviceStatus::Mountable;
2746 if ( diskstatus & TDEDiskDeviceStatus::Removable ) {
2747 if (sdevice->mediaInserted()) {
2748 diskstatus = diskstatus | TDEDiskDeviceStatus::Inserted;
2751 diskstatus = diskstatus & ~TDEDiskDeviceStatus::Mountable;
2755 if (filesystemtype.upper() ==
"SWAP") {
2756 diskstatus = diskstatus & ~TDEDiskDeviceStatus::Mountable;
2759 if ((!TQString(udev_device_get_property_value(dev,
"ID_PART_TABLE_TYPE")).isEmpty()) &&
2760 ((TQString(udev_device_get_property_value(dev,
"ID_PART_ENTRY_TYPE")).isEmpty() &&
2761 !(diskstatus & TDEDiskDeviceStatus::ContainsFilesystem)) ||
2762 (TQString(udev_device_get_property_value(dev,
"ID_PART_ENTRY_TYPE")) ==
"0x5") ||
2763 (TQString(udev_device_get_property_value(dev,
"ID_PART_ENTRY_TYPE")) ==
"0xf") ||
2764 (TQString(udev_device_get_property_value(dev,
"ID_FS_USAGE")).upper() ==
"RAID"))) {
2765 diskstatus = diskstatus & ~TDEDiskDeviceStatus::Mountable;
2768 if ((disktype & TDEDiskDeviceType::HDD) || (disktype & TDEDiskDeviceType::Optical)) {
2769 if (!(diskstatus & TDEDiskDeviceStatus::ContainsFilesystem)) {
2770 diskstatus = diskstatus & ~TDEDiskDeviceStatus::Mountable;
2774 if (filesystemtype.upper() ==
"CRYPTO_LUKS" || filesystemtype.upper() ==
"CRYPTO" ||
2775 filesystemusage.upper() ==
"RAID") {
2776 diskstatus = diskstatus & ~TDEDiskDeviceStatus::Mountable;
2779 if (holdingDeviceNodes.count() > 0) {
2780 diskstatus = diskstatus | TDEDiskDeviceStatus::UsedByDevice;
2783 if (slaveDeviceNodes.count() > 0) {
2784 diskstatus = diskstatus | TDEDiskDeviceStatus::UsesDevice;
2789 sdevice->internalSetDiskType(disktype);
2790 sdevice->internalSetDiskUUID(diskuuid);
2791 sdevice->internalSetDiskStatus(diskstatus);
2792 sdevice->internalSetFileSystemName(filesystemtype);
2793 sdevice->internalSetFileSystemUsage(filesystemusage);
2794 sdevice->internalSetSlaveDevices(slaveDeviceNodes);
2795 sdevice->internalSetHoldingDevices(holdingDeviceNodes);
2798 if ((sdevice->isDiskOfType(TDEDiskDeviceType::CDROM))
2799 || (sdevice->isDiskOfType(TDEDiskDeviceType::CDR))
2800 || (sdevice->isDiskOfType(TDEDiskDeviceType::CDRW))
2801 || (sdevice->isDiskOfType(TDEDiskDeviceType::CDMO))
2802 || (sdevice->isDiskOfType(TDEDiskDeviceType::CDMRRW))
2803 || (sdevice->isDiskOfType(TDEDiskDeviceType::CDMRRWW))
2804 || (sdevice->isDiskOfType(TDEDiskDeviceType::DVDROM))
2805 || (sdevice->isDiskOfType(TDEDiskDeviceType::DVDRAM))
2806 || (sdevice->isDiskOfType(TDEDiskDeviceType::DVDR))
2807 || (sdevice->isDiskOfType(TDEDiskDeviceType::DVDRW))
2808 || (sdevice->isDiskOfType(TDEDiskDeviceType::DVDRDL))
2809 || (sdevice->isDiskOfType(TDEDiskDeviceType::DVDRWDL))
2810 || (sdevice->isDiskOfType(TDEDiskDeviceType::DVDPLUSR))
2811 || (sdevice->isDiskOfType(TDEDiskDeviceType::DVDPLUSRW))
2812 || (sdevice->isDiskOfType(TDEDiskDeviceType::DVDPLUSRDL))
2813 || (sdevice->isDiskOfType(TDEDiskDeviceType::DVDPLUSRWDL))
2814 || (sdevice->isDiskOfType(TDEDiskDeviceType::BDROM))
2815 || (sdevice->isDiskOfType(TDEDiskDeviceType::BDR))
2816 || (sdevice->isDiskOfType(TDEDiskDeviceType::BDRW))
2817 || (sdevice->isDiskOfType(TDEDiskDeviceType::HDDVDROM))
2818 || (sdevice->isDiskOfType(TDEDiskDeviceType::HDDVDR))
2819 || (sdevice->isDiskOfType(TDEDiskDeviceType::HDDVDRW))
2820 || (sdevice->isDiskOfType(TDEDiskDeviceType::CDAudio))
2821 || (sdevice->isDiskOfType(TDEDiskDeviceType::CDVideo))
2822 || (sdevice->isDiskOfType(TDEDiskDeviceType::DVDVideo))
2823 || (sdevice->isDiskOfType(TDEDiskDeviceType::BDVideo))
2825 if (disklabel ==
"" && sdevice->diskLabel().isNull()) {
2827 FILE *exepipe = popen(((TQString(
"volname %1").arg(devicenode).ascii())),
"r");
2830 disklabel = fgets(buffer,
sizeof(buffer), exepipe);
2836 sdevice->internalSetDiskLabel(disklabel);
2837 sdevice->internalUpdateMountPath();
2838 sdevice->internalUpdateMappedName();
2842 if (device->type() == TDEGenericDeviceType::Network) {
2844 TQString potentialdevicenode = systempath;
2845 if (potentialdevicenode.endsWith(
"/")) potentialdevicenode.truncate(potentialdevicenode.length()-1);
2846 potentialdevicenode.remove(0, potentialdevicenode.findRev(
"/")+1);
2847 TQString potentialparentnode = systempath;
2848 if (potentialparentnode.endsWith(
"/")) potentialparentnode.truncate(potentialparentnode.length()-1);
2849 potentialparentnode.remove(0, potentialparentnode.findRev(
"/", potentialparentnode.findRev(
"/")-1)+1);
2850 if (potentialparentnode.startsWith(
"net/")) {
2851 devicenode = potentialdevicenode;
2854 if (devicenode.isNull()) {
2858 device->m_deviceType = TDEGenericDeviceType::Platform;
2862 TDENetworkDevice* ndevice =
dynamic_cast<TDENetworkDevice*
>(device);
2863 TQString valuesnodename = systempath +
"/";
2864 TQDir valuesdir(valuesnodename);
2865 valuesdir.setFilter(TQDir::All);
2867 const TQFileInfoList *dirlist = valuesdir.entryInfoList();
2869 TQFileInfoListIterator valuesdirit(*dirlist);
2871 while ( (dirfi = valuesdirit.current()) != 0 ) {
2872 nodename = dirfi->fileName();
2873 TQFile file( valuesnodename + nodename );
2874 if ( file.open( IO_ReadOnly ) ) {
2875 TQTextStream stream( &file );
2877 line = stream.readLine();
2878 if (nodename ==
"address") {
2879 ndevice->internalSetMacAddress(line);
2881 else if (nodename ==
"carrier") {
2882 ndevice->internalSetCarrierPresent(line.toInt());
2884 else if (nodename ==
"dormant") {
2885 ndevice->internalSetDormant(line.toInt());
2887 else if (nodename ==
"operstate") {
2888 TQString friendlyState = line.lower();
2889 friendlyState[0] = friendlyState[0].upper();
2890 ndevice->internalSetState(friendlyState);
2898 if ((ndevice->state().upper() ==
"UP")
2899 || (ndevice->state().upper() ==
"UNKNOWN")) {
2900 struct ifaddrs *ifaddr, *ifa;
2902 char host[NI_MAXHOST];
2904 if (getifaddrs(&ifaddr) != -1) {
2905 for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
2906 if (ifa->ifa_addr == NULL) {
2910 family = ifa->ifa_addr->sa_family;
2912 if (TQString(ifa->ifa_name) == devicenode) {
2913 if ((family == AF_INET) || (family == AF_INET6)) {
2914 s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ?
sizeof(
struct sockaddr_in) :
sizeof(
struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
2916 TQString address(host);
2917 if (family == AF_INET) {
2918 ndevice->internalSetIpV4Address(address);
2920 else if (family == AF_INET6) {
2921 address.truncate(address.findRev(
"%"));
2922 ndevice->internalSetIpV6Address(address);
2925 s = getnameinfo(ifa->ifa_netmask, (family == AF_INET) ?
sizeof(
struct sockaddr_in) :
sizeof(
struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
2927 TQString address(host);
2928 if (family == AF_INET) {
2929 ndevice->internalSetIpV4Netmask(address);
2931 else if (family == AF_INET6) {
2932 address.truncate(address.findRev(
"%"));
2933 ndevice->internalSetIpV6Netmask(address);
2936 s = ifa->ifa_ifu.ifu_broadaddr ? getnameinfo(ifa->ifa_ifu.ifu_broadaddr, (family == AF_INET) ?
sizeof(
struct sockaddr_in) :
sizeof(
struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) : EAI_NONAME;
2938 TQString address(host);
2939 if (family == AF_INET) {
2940 ndevice->internalSetIpV4Broadcast(address);
2942 else if (family == AF_INET6) {
2943 address.truncate(address.findRev(
"%"));
2944 ndevice->internalSetIpV6Broadcast(address);
2947 s = ifa->ifa_ifu.ifu_dstaddr ? getnameinfo(ifa->ifa_ifu.ifu_dstaddr, (family == AF_INET) ?
sizeof(
struct sockaddr_in) :
sizeof(
struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) : EAI_NONAME;
2949 TQString address(host);
2950 if (family == AF_INET) {
2951 ndevice->internalSetIpV4Destination(address);
2953 else if (family == AF_INET6) {
2954 address.truncate(address.findRev(
"%"));
2955 ndevice->internalSetIpV6Destination(address);
2963 freeifaddrs(ifaddr);
2966 TQString valuesnodename = systempath +
"/statistics/";
2967 TQDir valuesdir(valuesnodename);
2968 valuesdir.setFilter(TQDir::All);
2970 const TQFileInfoList *dirlist = valuesdir.entryInfoList();
2972 TQFileInfoListIterator valuesdirit(*dirlist);
2974 while ( (dirfi = valuesdirit.current()) != 0 ) {
2975 nodename = dirfi->fileName();
2976 TQFile file( valuesnodename + nodename );
2977 if ( file.open( IO_ReadOnly ) ) {
2978 TQTextStream stream( &file );
2980 line = stream.readLine();
2981 if (nodename ==
"rx_bytes") {
2982 ndevice->internalSetRxBytes(line.toDouble());
2984 else if (nodename ==
"tx_bytes") {
2985 ndevice->internalSetTxBytes(line.toDouble());
2987 else if (nodename ==
"rx_packets") {
2988 ndevice->internalSetRxPackets(line.toDouble());
2990 else if (nodename ==
"tx_packets") {
2991 ndevice->internalSetTxPackets(line.toDouble());
3002 if ((device->type() == TDEGenericDeviceType::OtherSensor) || (device->type() == TDEGenericDeviceType::ThermalSensor)) {
3004 TDESensorClusterMap sensors;
3005 TQString valuesnodename = systempath +
"/";
3006 TQDir valuesdir(valuesnodename);
3007 valuesdir.setFilter(TQDir::All);
3009 const TQFileInfoList *dirlist = valuesdir.entryInfoList();
3011 TQFileInfoListIterator valuesdirit(*dirlist);
3013 while ( (dirfi = valuesdirit.current()) != 0 ) {
3014 nodename = dirfi->fileName();
3015 if (nodename.contains(
"_")) {
3016 TQFile file( valuesnodename + nodename );
3017 if ( file.open( IO_ReadOnly ) ) {
3018 TQTextStream stream( &file );
3020 line = stream.readLine();
3021 TQStringList sensornodelist = TQStringList::split(
"_", nodename);
3022 TQString sensornodename = *(sensornodelist.at(0));
3023 TQString sensornodetype = *(sensornodelist.at(1));
3024 double lineValue = line.toDouble();
3025 if (!sensornodename.contains(
"fan")) {
3026 lineValue = lineValue / 1000.0;
3028 if (sensornodetype ==
"label") {
3029 sensors[sensornodename].label = line;
3031 else if (sensornodetype ==
"input") {
3032 sensors[sensornodename].current = lineValue;
3034 else if (sensornodetype ==
"min") {
3035 sensors[sensornodename].minimum = lineValue;
3037 else if (sensornodetype ==
"max") {
3038 sensors[sensornodename].maximum = lineValue;
3040 else if (sensornodetype ==
"warn") {
3041 sensors[sensornodename].warning = lineValue;
3043 else if (sensornodetype ==
"crit") {
3044 sensors[sensornodename].critical = lineValue;
3053 TDESensorDevice* sdevice =
dynamic_cast<TDESensorDevice*
>(device);
3054 sdevice->internalSetValues(sensors);
3057 if (device->type() == TDEGenericDeviceType::Battery) {
3059 TDEBatteryDevice* bdevice =
dynamic_cast<TDEBatteryDevice*
>(device);
3060 TQString valuesnodename = systempath +
"/";
3061 TQDir valuesdir(valuesnodename);
3062 valuesdir.setFilter(TQDir::All);
3064 double bdevice_capacity = 0;
3065 double bdevice_voltage = 0;
3066 int bdevice_time_to_empty = 0;
3067 int bdevice_time_to_full = 0;
3068 bool bdevice_has_energy =
false;
3069 bool bdevice_has_time_to_empty =
false;
3070 bool bdevice_has_time_to_full =
false;
3071 const TQFileInfoList *dirlist = valuesdir.entryInfoList();
3073 TQFileInfoListIterator valuesdirit(*dirlist);
3076 TQFile file( valuesnodename +
"voltage_now" );
3077 if ( file.open( IO_ReadOnly ) ) {
3078 TQTextStream stream( &file );
3080 line = stream.readLine();
3081 bdevice_voltage = line.toDouble()/1000000.0;
3082 bdevice->internalSetVoltage(bdevice_voltage);
3086 while ( (dirfi = valuesdirit.current()) != 0 ) {
3087 nodename = dirfi->fileName();
3088 file.setName( valuesnodename + nodename );
3089 if ( file.open( IO_ReadOnly ) ) {
3090 TQTextStream stream( &file );
3092 line = stream.readLine();
3093 if (nodename ==
"alarm") {
3094 bdevice->internalSetAlarmEnergy(line.toDouble()/1000000.0);
3096 else if (nodename ==
"capacity") {
3097 bdevice_capacity = line.toDouble();
3099 else if (nodename ==
"charge_full") {
3100 bdevice->internalSetMaximumEnergy(line.toDouble()/1000000.0);
3102 else if (nodename ==
"energy_full") {
3103 if (bdevice_voltage > 0) {
3105 bdevice->internalSetMaximumEnergy(line.toDouble()/1000000.0/bdevice_voltage);
3108 else if (nodename ==
"charge_full_design") {
3109 bdevice->internalSetMaximumDesignEnergy(line.toDouble()/1000000.0);
3111 else if (nodename ==
"energy_full_design") {
3112 if (bdevice_voltage > 0) {
3114 bdevice->internalSetMaximumDesignEnergy(line.toDouble()/1000000.0/bdevice_voltage);
3117 else if (nodename ==
"charge_now") {
3118 bdevice->internalSetEnergy(line.toDouble()/1000000.0);
3119 bdevice_has_energy =
true;
3121 else if (nodename ==
"energy_now") {
3122 if (bdevice_voltage > 0) {
3124 bdevice->internalSetEnergy(line.toDouble()/1000000.0/bdevice_voltage);
3125 bdevice_has_energy =
true;
3128 else if (nodename ==
"manufacturer") {
3129 bdevice->internalSetVendorName(line.stripWhiteSpace());
3131 else if (nodename ==
"model_name") {
3132 bdevice->internalSetVendorModel(line.stripWhiteSpace());
3134 else if (nodename ==
"current_now") {
3135 bdevice->internalSetDischargeRate(line.toDouble()/1000000.0);
3137 else if (nodename ==
"power_now") {
3138 if (bdevice_voltage > 0) {
3140 bdevice->internalSetDischargeRate(line.toDouble()/1000000.0/bdevice_voltage);
3143 else if (nodename ==
"present") {
3144 bdevice->internalSetInstalled(line.toInt());
3146 else if (nodename ==
"serial_number") {
3147 bdevice->internalSetSerialNumber(line.stripWhiteSpace());
3149 else if (nodename ==
"status") {
3150 bdevice->internalSetStatus(line);
3152 else if (nodename ==
"technology") {
3153 bdevice->internalSetTechnology(line);
3155 else if (nodename ==
"time_to_empty_now") {
3157 bdevice_time_to_empty = line.toDouble()*60;
3158 bdevice_has_time_to_empty =
true;
3160 else if (nodename ==
"time_to_full_now") {
3162 bdevice_time_to_full = line.toDouble()*60;
3163 bdevice_has_time_to_full =
true;
3165 else if (nodename ==
"voltage_min_design") {
3166 bdevice->internalSetMinimumVoltage(line.toDouble()/1000000.0);
3175 if (!bdevice_has_energy) {
3176 bdevice->internalSetEnergy(bdevice_capacity*bdevice->maximumEnergy()/100);
3184 if (bdevice->status() == TDEBatteryStatus::Charging) {
3185 if (!bdevice_has_time_to_full && bdevice->dischargeRate() > 0) {
3186 bdevice->internalSetTimeRemaining(((bdevice->maximumEnergy()-bdevice->energy())/bdevice->dischargeRate())*60*60);
3189 bdevice->internalSetTimeRemaining(bdevice_time_to_full);
3193 if (!bdevice_has_time_to_empty && bdevice->dischargeRate() > 0) {
3194 bdevice->internalSetTimeRemaining((bdevice->energy()/bdevice->dischargeRate())*60*60);
3197 bdevice->internalSetTimeRemaining(bdevice_time_to_empty);
3202 if (device->type() == TDEGenericDeviceType::PowerSupply) {
3204 TDEMainsPowerDevice* pdevice =
dynamic_cast<TDEMainsPowerDevice*
>(device);
3205 TQString valuesnodename = systempath +
"/";
3206 TQDir valuesdir(valuesnodename);
3207 valuesdir.setFilter(TQDir::All);
3209 const TQFileInfoList *dirlist = valuesdir.entryInfoList();
3211 TQFileInfoListIterator valuesdirit(*dirlist);
3213 while ( (dirfi = valuesdirit.current()) != 0 ) {
3214 nodename = dirfi->fileName();
3215 TQFile file( valuesnodename + nodename );
3216 if ( file.open( IO_ReadOnly ) ) {
3217 TQTextStream stream( &file );
3219 line = stream.readLine();
3220 if (nodename ==
"manufacturer") {
3221 pdevice->internalSetVendorName(line.stripWhiteSpace());
3223 else if (nodename ==
"model_name") {
3224 pdevice->internalSetVendorModel(line.stripWhiteSpace());
3226 else if (nodename ==
"online") {
3227 pdevice->internalSetOnline(line.toInt());
3229 else if (nodename ==
"serial_number") {
3230 pdevice->internalSetSerialNumber(line.stripWhiteSpace());
3239 if (device->type() == TDEGenericDeviceType::Backlight) {
3241 TDEBacklightDevice* bdevice =
dynamic_cast<TDEBacklightDevice*
>(device);
3242 TQString valuesnodename = systempath +
"/";
3243 TQDir valuesdir(valuesnodename);
3244 valuesdir.setFilter(TQDir::All);
3246 const TQFileInfoList *dirlist = valuesdir.entryInfoList();
3248 TQFileInfoListIterator valuesdirit(*dirlist);
3250 while ( (dirfi = valuesdirit.current()) != 0 ) {
3251 nodename = dirfi->fileName();
3252 TQFile file( valuesnodename + nodename );
3253 if ( file.open( IO_ReadOnly ) ) {
3254 TQTextStream stream( &file );
3256 line = stream.readLine();
3257 if (nodename ==
"bl_power") {
3258 TDEDisplayPowerLevel::TDEDisplayPowerLevel pl = TDEDisplayPowerLevel::On;
3259 int rpl = line.toInt();
3260 if (rpl == FB_BLANK_UNBLANK) {
3261 pl = TDEDisplayPowerLevel::On;
3263 else if (rpl == FB_BLANK_POWERDOWN) {
3264 pl = TDEDisplayPowerLevel::Off;
3266 bdevice->internalSetPowerLevel(pl);
3268 else if (nodename ==
"max_brightness") {
3269 bdevice->internalSetMaximumRawBrightness(line.toInt());
3271 else if (nodename ==
"actual_brightness") {
3272 bdevice->internalSetCurrentRawBrightness(line.toInt());
3281 if (device->type() == TDEGenericDeviceType::Monitor) {
3282 TDEMonitorDevice* mdevice =
dynamic_cast<TDEMonitorDevice*
>(device);
3283 TQString valuesnodename = systempath +
"/";
3284 TQDir valuesdir(valuesnodename);
3285 valuesdir.setFilter(TQDir::All);
3287 const TQFileInfoList *dirlist = valuesdir.entryInfoList();
3289 TQFileInfoListIterator valuesdirit(*dirlist);
3291 while ( (dirfi = valuesdirit.current()) != 0 ) {
3292 nodename = dirfi->fileName();
3293 TQFile file( valuesnodename + nodename );
3294 if ( file.open( IO_ReadOnly ) ) {
3295 TQTextStream stream( &file );
3297 line = stream.readLine();
3298 if (nodename ==
"status") {
3299 mdevice->internalSetConnected(line.lower() ==
"connected");
3301 else if (nodename ==
"enabled") {
3302 mdevice->internalSetEnabled(line.lower() ==
"enabled");
3304 else if (nodename ==
"modes") {
3305 TQStringList resinfo;
3306 TQStringList resolutionsStringList = line.upper();
3307 while ((!stream.atEnd()) && (!line.isNull())) {
3308 line = stream.readLine();
3309 if (!line.isNull()) {
3310 resolutionsStringList.append(line.upper());
3313 TDEResolutionList resolutions;
3314 resolutions.clear();
3315 for (TQStringList::Iterator it = resolutionsStringList.begin(); it != resolutionsStringList.end(); ++it) {
3316 resinfo = TQStringList::split(
'X', *it,
true);
3317 resolutions.append(TDEResolutionPair((*(resinfo.at(0))).toUInt(), (*(resinfo.at(1))).toUInt()));
3319 mdevice->internalSetResolutions(resolutions);
3321 else if (nodename ==
"dpms") {
3322 TDEDisplayPowerLevel::TDEDisplayPowerLevel pl = TDEDisplayPowerLevel::On;
3324 pl = TDEDisplayPowerLevel::On;
3326 else if (line ==
"Standby") {
3327 pl = TDEDisplayPowerLevel::Standby;
3329 else if (line ==
"Suspend") {
3330 pl = TDEDisplayPowerLevel::Suspend;
3332 else if (line ==
"Off") {
3333 pl = TDEDisplayPowerLevel::Off;
3335 mdevice->internalSetPowerLevel(pl);
3343 TQString genericPortName = mdevice->systemPath();
3344 genericPortName.remove(0, genericPortName.find(
"-")+1);
3345 genericPortName.truncate(genericPortName.findRev(
"-"));
3346 mdevice->internalSetPortType(genericPortName);
3348 if (mdevice->connected()) {
3349 TQPair<TQString,TQString> monitor_info = getEDIDMonitorName(device->systemPath());
3350 if (!monitor_info.first.isNull()) {
3351 mdevice->internalSetVendorName(monitor_info.first);
3352 mdevice->internalSetVendorModel(monitor_info.second);
3353 mdevice->m_friendlyName = monitor_info.first +
" " + monitor_info.second;
3356 mdevice->m_friendlyName =
i18n(
"Generic %1 Device").arg(genericPortName);
3358 mdevice->internalSetEdid(getEDID(mdevice->systemPath()));
3361 mdevice->m_friendlyName =
i18n(
"Disconnected %1 Port").arg(genericPortName);
3362 mdevice->internalSetEdid(TQByteArray());
3363 mdevice->internalSetResolutions(TDEResolutionList());
3370 if (device->type() == TDEGenericDeviceType::RootSystem) {
3372 TDERootSystemDevice* rdevice =
dynamic_cast<TDERootSystemDevice*
>(device);
3376 TDESystemFormFactor::TDESystemFormFactor formfactor = TDESystemFormFactor::Desktop;
3377 if (listByDeviceClass(TDEGenericDeviceType::Backlight).count() > 0) {
3378 formfactor = TDESystemFormFactor::Laptop;
3380 rdevice->internalSetFormFactor(formfactor);
3382 TQString valuesnodename =
"/sys/power/";
3383 TQDir valuesdir(valuesnodename);
3384 valuesdir.setFilter(TQDir::All);
3386 const TQFileInfoList *dirlist = valuesdir.entryInfoList();
3388 TQFileInfoListIterator valuesdirit(*dirlist);
3390 TDESystemPowerStateList powerstates;
3391 TDESystemHibernationMethodList hibernationmethods;
3392 TDESystemHibernationMethod::TDESystemHibernationMethod hibernationmethod =
3393 TDESystemHibernationMethod::Unsupported;
3394 while ( (dirfi = valuesdirit.current()) != 0 ) {
3395 nodename = dirfi->fileName();
3396 TQFile file( valuesnodename + nodename );
3397 if ( file.open( IO_ReadOnly ) ) {
3398 TQTextStream stream( &file );
3400 line = stream.readLine();
3401 if (nodename ==
"state") {
3403 powerstates.append(TDESystemPowerState::Active);
3404 powerstates.append(TDESystemPowerState::PowerOff);
3405 if (line.contains(
"standby")) {
3406 powerstates.append(TDESystemPowerState::Standby);
3408 if (line.contains(
"freeze")) {
3409 powerstates.append(TDESystemPowerState::Freeze);
3411 if (line.contains(
"mem")) {
3412 powerstates.append(TDESystemPowerState::Suspend);
3414 if (line.contains(
"disk")) {
3415 powerstates.append(TDESystemPowerState::Disk);
3418 if (nodename ==
"disk") {
3420 if (line.contains(
"platform")) {
3421 hibernationmethods.append(TDESystemHibernationMethod::Platform);
3423 if (line.contains(
"shutdown")) {
3424 hibernationmethods.append(TDESystemHibernationMethod::Shutdown);
3426 if (line.contains(
"reboot")) {
3427 hibernationmethods.append(TDESystemHibernationMethod::Reboot);
3429 if (line.contains(
"suspend")) {
3430 hibernationmethods.append(TDESystemHibernationMethod::Suspend);
3432 if (line.contains(
"testproc")) {
3433 hibernationmethods.append(TDESystemHibernationMethod::TestProc);
3435 if (line.contains(
"test")) {
3436 hibernationmethods.append(TDESystemHibernationMethod::Test);
3440 line.truncate(line.findRev(
"]"));
3441 line.remove(0, line.findRev(
"[")+1);
3442 if (line.contains(
"platform")) {
3443 hibernationmethod = TDESystemHibernationMethod::Platform;
3445 if (line.contains(
"shutdown")) {
3446 hibernationmethod = TDESystemHibernationMethod::Shutdown;
3448 if (line.contains(
"reboot")) {
3449 hibernationmethod = TDESystemHibernationMethod::Reboot;
3451 if (line.contains(
"suspend")) {
3452 hibernationmethod = TDESystemHibernationMethod::Suspend;
3454 if (line.contains(
"testproc")) {
3455 hibernationmethod = TDESystemHibernationMethod::TestProc;
3457 if (line.contains(
"test")) {
3458 hibernationmethod = TDESystemHibernationMethod::Test;
3461 if (nodename ==
"image_size") {
3462 rdevice->internalSetDiskSpaceNeededForHibernation(line.toULong());
3471 if (powerstates.contains(TDESystemPowerState::Disk) &&
3472 hibernationmethods.contains(TDESystemHibernationMethod::Platform)) {
3473 powerstates.append(TDESystemPowerState::Hibernate);
3475 if (powerstates.contains(TDESystemPowerState::Disk) &&
3476 hibernationmethods.contains(TDESystemHibernationMethod::Suspend)) {
3477 powerstates.append(TDESystemPowerState::HybridSuspend);
3479 powerstates.remove(TDESystemPowerState::Disk);
3481 rdevice->internalSetPowerStates(powerstates);
3482 rdevice->internalSetHibernationMethods(hibernationmethods);
3483 rdevice->internalSetHibernationMethod(hibernationmethod);
3490 if (device->type() == TDEGenericDeviceType::Event) {
3492 TDEEventDevice* edevice =
dynamic_cast<TDEEventDevice*
>(device);
3493 TDESwitchType::TDESwitchType edevice_switches = edevice->providedSwitches();
3494 if (edevice->systemPath().contains(
"PNP0C0D")
3495 || (edevice_switches & TDESwitchType::Lid)) {
3496 edevice->internalSetEventType(TDEEventDeviceType::ACPILidSwitch);
3498 else if (edevice->systemPath().contains(
"PNP0C0E")
3499 || edevice->systemPath().contains(
"/LNXSLPBN")
3500 || (edevice_switches & TDESwitchType::SleepButton)) {
3501 edevice->internalSetEventType(TDEEventDeviceType::ACPISleepButton);
3503 else if (edevice->systemPath().contains(
"PNP0C0C")
3504 || edevice->systemPath().contains(
"/LNXPWRBN")
3505 || (edevice_switches & TDESwitchType::PowerButton)) {
3506 edevice->internalSetEventType(TDEEventDeviceType::ACPIPowerButton);
3508 else if (edevice->systemPath().contains(
"_acpi")) {
3509 edevice->internalSetEventType(TDEEventDeviceType::ACPIOtherInput);
3512 edevice->internalSetEventType(TDEEventDeviceType::Unknown);
3516 if (device->type() == TDEGenericDeviceType::Input) {
3518 TDEInputDevice* idevice =
dynamic_cast<TDEInputDevice*
>(device);
3519 if (idevice->systemPath().contains(
"PNP0C0D")) {
3520 idevice->internalSetInputType(TDEInputDeviceType::ACPILidSwitch);
3522 else if (idevice->systemPath().contains(
"PNP0C0E") || idevice->systemPath().contains(
"/LNXSLPBN")) {
3523 idevice->internalSetInputType(TDEInputDeviceType::ACPISleepButton);
3525 else if (idevice->systemPath().contains(
"PNP0C0C") || idevice->systemPath().contains(
"/LNXPWRBN")) {
3526 idevice->internalSetInputType(TDEInputDeviceType::ACPIPowerButton);
3528 else if (idevice->systemPath().contains(
"_acpi")) {
3529 idevice->internalSetInputType(TDEInputDeviceType::ACPIOtherInput);
3532 idevice->internalSetInputType(TDEInputDeviceType::Unknown);
3536 if (device->type() == TDEGenericDeviceType::Event) {
3538 TDEEventDevice* edevice =
dynamic_cast<TDEEventDevice*
>(device);
3541 if (edevice->m_fd < 0 && access (edevice->deviceNode().ascii(), R_OK) == 0) {
3542 edevice->m_fd =
open(edevice->deviceNode().ascii(), O_RDONLY);
3546 edevice->internalStartMonitoring(
this);
3550 if ((device->type() == TDEGenericDeviceType::Root) || (device->type() == TDEGenericDeviceType::RootSystem)) {
3551 systempath = device->systemPath();
3555 device->internalSetName(devicename);
3556 device->internalSetDeviceNode(devicenode);
3557 device->internalSetSystemPath(systempath);
3558 device->internalSetVendorID(devicevendorid);
3559 device->internalSetModelID(devicemodelid);
3560 device->internalSetVendorEncoded(devicevendoridenc);
3561 device->internalSetModelEncoded(devicemodelidenc);
3562 device->internalSetSubVendorID(devicesubvendorid);
3563 device->internalSetSubModelID(devicesubmodelid);
3564 device->internalSetDeviceDriver(devicedriver);
3565 device->internalSetSubsystem(devicesubsystem);
3566 device->internalSetPCIClass(devicepciclass);
3569 device->m_udevtype = devicetype;
3570 device->m_udevdevicetypestring = devicetypestring;
3571 device->udevdevicetypestring_alt = devicetypestring_alt;
3573 if (temp_udev_device) {
3574 udev_device_unref(dev);
3578void TDEHardwareDevices::updateBlacklists(TDEGenericDevice* hwdevice, udev_device* dev) {
3584 if ((hwdevice->vendorID() ==
"08ec") && (hwdevice->modelID() ==
"0020") && (TQString(udev_device_get_property_value(dev,
"ID_TYPE")) ==
"cd")) {
3585 hwdevice->internalSetBlacklistedForUpdate(
true);
3589bool TDEHardwareDevices::queryHardwareInformation() {
3590 if (!m_udevStruct) {
3595 m_deviceList.clear();
3596 addCoreSystemDevices();
3598 struct udev_enumerate *enumerate;
3599 struct udev_list_entry *devices, *dev_list_entry;
3600 struct udev_device *dev;
3603 enumerate = udev_enumerate_new(m_udevStruct);
3604 udev_enumerate_add_match_subsystem(enumerate, NULL);
3605 udev_enumerate_scan_devices(enumerate);
3606 devices = udev_enumerate_get_list_entry(enumerate);
3608 udev_list_entry_foreach(dev_list_entry, devices) {
3612 path = udev_list_entry_get_name(dev_list_entry);
3613 dev = udev_device_new_from_syspath(m_udevStruct, path);
3615 TDEGenericDevice* device = classifyUnknownDevice(dev);
3618 TDEGenericDevice *hwdevice;
3619 for (hwdevice = m_deviceList.first(); hwdevice; hwdevice = m_deviceList.next()) {
3620 if (hwdevice->systemPath() == device->systemPath()) {
3628 m_deviceList.append(device);
3631 udev_device_unref(dev);
3635 udev_enumerate_unref(enumerate);
3638 updateParentDeviceInformation();
3643void TDEHardwareDevices::updateParentDeviceInformation(TDEGenericDevice* hwdevice) {
3646 TQString current_path = hwdevice->systemPath();
3647 TDEGenericDevice* parentdevice = 0;
3649 if (current_path.endsWith(
"/")) {
3650 current_path.truncate(current_path.findRev(
"/"));
3652 while (done ==
false) {
3653 current_path.truncate(current_path.findRev(
"/"));
3654 if (current_path.startsWith(
"/sys/devices")) {
3655 if (current_path.endsWith(
"/")) {
3656 current_path.truncate(current_path.findRev(
"/"));
3658 parentdevice = findBySystemPath(current_path);
3669 hwdevice->internalSetParentDevice(parentdevice);
3672void TDEHardwareDevices::updateParentDeviceInformation() {
3673 TDEGenericDevice *hwdevice;
3676 TDEGenericHardwareList devList = listAllPhysicalDevices();
3677 for ( hwdevice = devList.first(); hwdevice; hwdevice = devList.next() ) {
3678 updateParentDeviceInformation(hwdevice);
3682void TDEHardwareDevices::addCoreSystemDevices() {
3683 TDEGenericDevice *hwdevice;
3686 hwdevice =
new TDERootSystemDevice(TDEGenericDeviceType::RootSystem);
3687 hwdevice->internalSetSystemPath(
"/sys/devices");
3688 m_deviceList.append(hwdevice);
3689 rescanDeviceInformation(hwdevice);
3692 TQStringList holdingDeviceNodes;
3693 TQString devicesnodename =
"/sys/devices";
3694 TQDir devicesdir(devicesnodename);
3695 devicesdir.setFilter(TQDir::All);
3697 const TQFileInfoList *dirlist = devicesdir.entryInfoList();
3699 TQFileInfoListIterator devicesdirit(*dirlist);
3701 while ( (dirfi = devicesdirit.current()) != 0 ) {
3702 nodename = dirfi->fileName();
3703 if (nodename !=
"." && nodename !=
"..") {
3704 hwdevice =
new TDEGenericDevice(TDEGenericDeviceType::Root);
3705 hwdevice->internalSetSystemPath(dirfi->absFilePath());
3706 m_deviceList.append(hwdevice);
3715 TQDir d(
"/sys/devices/system/cpu/");
3716 d.setFilter( TQDir::Dirs );
3717 const TQFileInfoList *list = d.entryInfoList();
3719 TQFileInfoListIterator it( *list );
3721 while ((fi = it.current()) != 0) {
3722 TQString directoryName = fi->fileName();
3723 if (directoryName.startsWith(
"cpu")) {
3724 directoryName = directoryName.remove(0,3);
3726 int processorNumber = directoryName.toUInt(&isInt, 10);
3728 hwdevice =
new TDECPUDevice(TDEGenericDeviceType::CPU);
3729 hwdevice->internalSetSystemPath(TQString(
"/sys/devices/system/cpu/cpu%1").arg(processorNumber));
3730 m_deviceList.append(hwdevice);
3738 processModifiedCPUs();
3741TQString TDEHardwareDevices::findPCIDeviceName(TQString vendorid, TQString modelid, TQString subvendorid, TQString submodelid) {
3742 TQString vendorName = TQString::null;
3743 TQString modelName = TQString::null;
3744 TQString friendlyName = TQString::null;
3747 pci_id_map =
new TDEDeviceIDMap;
3749 TQString database_filename =
"/usr/share/hwdata/pci.ids";
3750 if (!TQFile::exists(database_filename)) {
3751 database_filename =
"/usr/share/misc/pci.ids";
3753 if (!TQFile::exists(database_filename)) {
3754 printf(
"[tdehardwaredevices] Unable to locate PCI information database pci.ids\n"); fflush(stdout);
3755 return i18n(
"Unknown PCI Device");
3758 TQFile database(database_filename);
3759 if (database.open(IO_ReadOnly)) {
3760 TQTextStream stream(&database);
3764 TQString subvendorID;
3765 TQString submodelID;
3766 TQString deviceMapKey;
3767 TQStringList devinfo;
3768 while (!stream.atEnd()) {
3769 line = stream.readLine();
3770 if ((!line.upper().startsWith(
"\t")) && (!line.upper().startsWith(
"#"))) {
3771 line.replace(
"\t",
"");
3772 devinfo = TQStringList::split(
' ', line,
false);
3773 vendorID = *(devinfo.at(0));
3775 vendorName.remove(0, vendorName.find(
" "));
3776 vendorName = vendorName.stripWhiteSpace();
3777 modelName = TQString::null;
3778 deviceMapKey = vendorID.lower() +
":::";
3781 if ((line.upper().startsWith(
"\t")) && (!line.upper().startsWith(
"\t\t"))) {
3782 line.replace(
"\t",
"");
3783 devinfo = TQStringList::split(
' ', line,
false);
3784 modelID = *(devinfo.at(0));
3786 modelName.remove(0, modelName.find(
" "));
3787 modelName = modelName.stripWhiteSpace();
3788 deviceMapKey = vendorID.lower() +
":" + modelID.lower() +
"::";
3791 if (line.upper().startsWith(
"\t\t")) {
3792 line.replace(
"\t",
"");
3793 devinfo = TQStringList::split(
' ', line,
false);
3794 subvendorID = *(devinfo.at(0));
3795 submodelID = *(devinfo.at(1));
3797 modelName.remove(0, modelName.find(
" "));
3798 modelName = modelName.stripWhiteSpace();
3799 modelName.remove(0, modelName.find(
" "));
3800 modelName = modelName.stripWhiteSpace();
3801 deviceMapKey = vendorID.lower() +
":" + modelID.lower() +
":" + subvendorID.lower() +
":" + submodelID.lower();
3805 if (modelName.isNull()) {
3806 pci_id_map->insert(deviceMapKey,
"***UNKNOWN DEVICE*** " + vendorName,
true);
3809 pci_id_map->insert(deviceMapKey, vendorName +
" " + modelName,
true);
3815 printf(
"[tdehardwaredevices] Unable to open PCI information database %s\n", database_filename.ascii()); fflush(stdout);
3820 TQString deviceName;
3821 TQString deviceMapKey = vendorid.lower() +
":" + modelid.lower() +
":" + subvendorid.lower() +
":" + submodelid.lower();
3823 deviceName = (*pci_id_map)[deviceMapKey];
3824 if (deviceName.isNull() || deviceName.startsWith(
"***UNKNOWN DEVICE*** ")) {
3825 deviceMapKey = vendorid.lower() +
":" + modelid.lower() +
":" + subvendorid.lower() +
":";
3826 deviceName = (*pci_id_map)[deviceMapKey];
3827 if (deviceName.isNull() || deviceName.startsWith(
"***UNKNOWN DEVICE*** ")) {
3828 deviceMapKey = vendorid.lower() +
":" + modelid.lower() +
"::";
3829 deviceName = (*pci_id_map)[deviceMapKey];
3833 if (deviceName.startsWith(
"***UNKNOWN DEVICE*** ")) {
3834 deviceName.replace(
"***UNKNOWN DEVICE*** ",
"");
3835 deviceName.prepend(
i18n(
"Unknown PCI Device") +
" ");
3836 if (subvendorid.isNull()) {
3837 deviceName.append(TQString(
" [%1:%2]").arg(vendorid.lower()).arg(modelid.lower()));
3840 deviceName.append(TQString(
" [%1:%2] [%3:%4]").arg(vendorid.lower()).arg(modelid.lower()).arg(subvendorid.lower()).arg(submodelid.lower()));
3847 return i18n(
"Unknown PCI Device");
3851TQString TDEHardwareDevices::findUSBDeviceName(TQString vendorid, TQString modelid, TQString subvendorid, TQString submodelid) {
3852 TQString vendorName = TQString::null;
3853 TQString modelName = TQString::null;
3854 TQString friendlyName = TQString::null;
3857 usb_id_map =
new TDEDeviceIDMap;
3859 TQString database_filename =
"/usr/share/hwdata/usb.ids";
3860 if (!TQFile::exists(database_filename)) {
3861 database_filename =
"/usr/share/misc/usb.ids";
3863 if (!TQFile::exists(database_filename)) {
3864 printf(
"[tdehardwaredevices] Unable to locate USB information database usb.ids\n"); fflush(stdout);
3865 return i18n(
"Unknown USB Device");
3868 TQFile database(database_filename);
3869 if (database.open(IO_ReadOnly)) {
3870 TQTextStream stream(&database);
3874 TQString subvendorID;
3875 TQString submodelID;
3876 TQString deviceMapKey;
3877 TQStringList devinfo;
3878 while (!stream.atEnd()) {
3879 line = stream.readLine();
3880 if ((!line.upper().startsWith(
"\t")) && (!line.upper().startsWith(
"#"))) {
3881 line.replace(
"\t",
"");
3882 devinfo = TQStringList::split(
' ', line,
false);
3883 vendorID = *(devinfo.at(0));
3885 vendorName.remove(0, vendorName.find(
" "));
3886 vendorName = vendorName.stripWhiteSpace();
3887 modelName = TQString::null;
3888 deviceMapKey = vendorID.lower() +
":::";
3891 if ((line.upper().startsWith(
"\t")) && (!line.upper().startsWith(
"\t\t"))) {
3892 line.replace(
"\t",
"");
3893 devinfo = TQStringList::split(
' ', line,
false);
3894 modelID = *(devinfo.at(0));
3896 modelName.remove(0, modelName.find(
" "));
3897 modelName = modelName.stripWhiteSpace();
3898 deviceMapKey = vendorID.lower() +
":" + modelID.lower() +
"::";
3901 if (line.upper().startsWith(
"\t\t")) {
3902 line.replace(
"\t",
"");
3903 devinfo = TQStringList::split(
' ', line,
false);
3904 subvendorID = *(devinfo.at(0));
3905 submodelID = *(devinfo.at(1));
3907 modelName.remove(0, modelName.find(
" "));
3908 modelName = modelName.stripWhiteSpace();
3909 modelName.remove(0, modelName.find(
" "));
3910 modelName = modelName.stripWhiteSpace();
3911 deviceMapKey = vendorID.lower() +
":" + modelID.lower() +
":" + subvendorID.lower() +
":" + submodelID.lower();
3915 if (modelName.isNull()) {
3916 usb_id_map->insert(deviceMapKey,
"***UNKNOWN DEVICE*** " + vendorName,
true);
3919 usb_id_map->insert(deviceMapKey, vendorName +
" " + modelName,
true);
3925 printf(
"[tdehardwaredevices] Unable to open USB information database %s\n", database_filename.ascii()); fflush(stdout);
3930 TQString deviceName;
3931 TQString deviceMapKey = vendorid.lower() +
":" + modelid.lower() +
":" + subvendorid.lower() +
":" + submodelid.lower();
3933 deviceName = (*usb_id_map)[deviceMapKey];
3934 if (deviceName.isNull() || deviceName.startsWith(
"***UNKNOWN DEVICE*** ")) {
3935 deviceMapKey = vendorid.lower() +
":" + modelid.lower() +
":" + subvendorid.lower() +
":";
3936 deviceName = (*usb_id_map)[deviceMapKey];
3937 if (deviceName.isNull() || deviceName.startsWith(
"***UNKNOWN DEVICE*** ")) {
3938 deviceMapKey = vendorid.lower() +
":" + modelid.lower() +
"::";
3939 deviceName = (*usb_id_map)[deviceMapKey];
3943 if (deviceName.startsWith(
"***UNKNOWN DEVICE*** ")) {
3944 deviceName.replace(
"***UNKNOWN DEVICE*** ",
"");
3945 deviceName.prepend(
i18n(
"Unknown USB Device") +
" ");
3946 if (subvendorid.isNull()) {
3947 deviceName.append(TQString(
" [%1:%2]").arg(vendorid.lower()).arg(modelid.lower()));
3950 deviceName.append(TQString(
" [%1:%2] [%3:%4]").arg(vendorid.lower()).arg(modelid.lower()).arg(subvendorid.lower()).arg(submodelid.lower()));
3957 return i18n(
"Unknown USB Device");
3961TQString TDEHardwareDevices::findPNPDeviceName(TQString pnpid) {
3962 TQString friendlyName = TQString::null;
3965 pnp_id_map =
new TDEDeviceIDMap;
3967 TQStringList hardware_info_directories(
TDEGlobal::dirs()->resourceDirs(
"data"));
3968 TQString hardware_info_directory_suffix(
"tdehwlib/pnpdev/");
3969 TQString hardware_info_directory;
3970 TQString database_filename;
3972 for ( TQStringList::Iterator it = hardware_info_directories.begin(); it != hardware_info_directories.end(); ++it ) {
3973 hardware_info_directory = (*it);
3974 hardware_info_directory += hardware_info_directory_suffix;
3977 database_filename = hardware_info_directory +
"pnp.ids";
3978 if (TQFile::exists(database_filename)) {
3984 if (!TQFile::exists(database_filename)) {
3985 printf(
"[tdehardwaredevices] Unable to locate PNP information database pnp.ids\n"); fflush(stdout);
3986 return i18n(
"Unknown PNP Device");
3989 TQFile database(database_filename);
3990 if (database.open(IO_ReadOnly)) {
3991 TQTextStream stream(&database);
3994 TQString vendorName;
3995 TQString deviceMapKey;
3996 TQStringList devinfo;
3997 while (!stream.atEnd()) {
3998 line = stream.readLine();
3999 if ((!line.upper().startsWith(
"\t")) && (!line.upper().startsWith(
"#"))) {
4000 devinfo = TQStringList::split(
'\t', line,
false);
4001 if (devinfo.count() > 1) {
4002 pnpID = *(devinfo.at(0));
4003 vendorName = *(devinfo.at(1));;
4004 vendorName = vendorName.stripWhiteSpace();
4005 deviceMapKey = pnpID.upper().stripWhiteSpace();
4006 if (!deviceMapKey.isNull()) {
4007 pnp_id_map->insert(deviceMapKey, vendorName,
true);
4015 printf(
"[tdehardwaredevices] Unable to open PNP information database %s\n", database_filename.ascii()); fflush(stdout);
4020 TQString deviceName;
4022 deviceName = (*pnp_id_map)[pnpid];
4027 return i18n(
"Unknown PNP Device");
4031TQString TDEHardwareDevices::findMonitorManufacturerName(TQString dpyid) {
4032 TQString friendlyName = TQString::null;
4035 dpy_id_map =
new TDEDeviceIDMap;
4037 TQStringList hardware_info_directories(
TDEGlobal::dirs()->resourceDirs(
"data"));
4038 TQString hardware_info_directory_suffix(
"tdehwlib/pnpdev/");
4039 TQString hardware_info_directory;
4040 TQString database_filename;
4042 for ( TQStringList::Iterator it = hardware_info_directories.begin(); it != hardware_info_directories.end(); ++it ) {
4043 hardware_info_directory = (*it);
4044 hardware_info_directory += hardware_info_directory_suffix;
4047 database_filename = hardware_info_directory +
"dpy.ids";
4048 if (TQFile::exists(database_filename)) {
4054 if (!TQFile::exists(database_filename)) {
4055 printf(
"[tdehardwaredevices] Unable to locate monitor information database dpy.ids\n"); fflush(stdout);
4056 return i18n(
"Unknown Monitor Device");
4059 TQFile database(database_filename);
4060 if (database.open(IO_ReadOnly)) {
4061 TQTextStream stream(&database);
4064 TQString vendorName;
4065 TQString deviceMapKey;
4066 TQStringList devinfo;
4067 while (!stream.atEnd()) {
4068 line = stream.readLine();
4069 if ((!line.upper().startsWith(
"\t")) && (!line.upper().startsWith(
"#"))) {
4070 devinfo = TQStringList::split(
'\t', line,
false);
4071 if (devinfo.count() > 1) {
4072 dpyID = *(devinfo.at(0));
4073 vendorName = *(devinfo.at(1));;
4074 vendorName = vendorName.stripWhiteSpace();
4075 deviceMapKey = dpyID.upper().stripWhiteSpace();
4076 if (!deviceMapKey.isNull()) {
4077 dpy_id_map->insert(deviceMapKey, vendorName,
true);
4085 printf(
"[tdehardwaredevices] Unable to open monitor information database %s\n", database_filename.ascii()); fflush(stdout);
4090 TQString deviceName;
4092 deviceName = (*dpy_id_map)[dpyid];
4097 return i18n(
"Unknown Monitor Device");
4101TQPair<TQString,TQString> TDEHardwareDevices::getEDIDMonitorName(TQString path) {
4102 TQPair<TQString,TQString> edid;
4103 TQByteArray binaryedid = getEDID(path);
4104 if (binaryedid.isNull()) {
4105 return TQPair<TQString,TQString>(TQString::null, TQString::null);
4109 unsigned char letter_1 = ((binaryedid[8]>>2) & 0x1F) + 0x40;
4110 unsigned char letter_2 = (((binaryedid[8] & 0x03) << 3) | ((binaryedid[9]>>5) & 0x07)) + 0x40;
4111 unsigned char letter_3 = (binaryedid[9] & 0x1F) + 0x40;
4112 TQChar qletter_1 = TQChar(letter_1);
4113 TQChar qletter_2 = TQChar(letter_2);
4114 TQChar qletter_3 = TQChar(letter_3);
4115 TQString manufacturer_id = TQString(
"%1%2%3").arg(qletter_1).arg(qletter_2).arg(qletter_3);
4118 unsigned int raw_model_id = (((binaryedid[10] << 8) | binaryedid[11]) << 16) & 0xFFFF0000;
4120 unsigned int model_id = reverse_bits(raw_model_id);
4123 bool has_friendly_name =
false;
4124 unsigned char descriptor_block[18];
4126 for (i=72;i<90;i++) {
4127 descriptor_block[i-72] = binaryedid[i] & 0xFF;
4129 if ((descriptor_block[0] != 0) || (descriptor_block[1] != 0) || (descriptor_block[3] != 0xFC)) {
4130 for (i=90;i<108;i++) {
4131 descriptor_block[i-90] = binaryedid[i] & 0xFF;
4133 if ((descriptor_block[0] != 0) || (descriptor_block[1] != 0) || (descriptor_block[3] != 0xFC)) {
4134 for (i=108;i<126;i++) {
4135 descriptor_block[i-108] = binaryedid[i] & 0xFF;
4140 TQString monitor_name;
4141 if ((descriptor_block[0] == 0) && (descriptor_block[1] == 0) && (descriptor_block[3] == 0xFC)) {
4142 char* pos = strchr((
char *)(descriptor_block+5),
'\n');
4145 has_friendly_name =
true;
4146 monitor_name = TQString((
char *)(descriptor_block+5));
4149 has_friendly_name =
false;
4154 TQString manufacturer_name = findMonitorManufacturerName(manufacturer_id);
4155 if (manufacturer_name.isNull()) {
4156 manufacturer_name = manufacturer_id;
4159 if (has_friendly_name) {
4160 edid.first = TQString(
"%1").arg(manufacturer_name);
4161 edid.second = TQString(
"%2").arg(monitor_name);
4164 edid.first = TQString(
"%1").arg(manufacturer_name);
4165 edid.second = TQString(
"0x%2").arg(model_id, 0, 16);
4171TQByteArray TDEHardwareDevices::getEDID(TQString path) {
4172 TQFile file(TQString(
"%1/edid").arg(path));
4173 if (!file.open (IO_ReadOnly)) {
4174 return TQByteArray();
4176 TQByteArray binaryedid = file.readAll();
4181TQString TDEHardwareDevices::getFriendlyDeviceTypeStringFromType(TDEGenericDeviceType::TDEGenericDeviceType query) {
4182 TQString ret =
"Unknown Device";
4185 if (query == TDEGenericDeviceType::Root) {
4188 else if (query == TDEGenericDeviceType::RootSystem) {
4189 ret =
i18n(
"System Root");
4191 else if (query == TDEGenericDeviceType::CPU) {
4194 else if (query == TDEGenericDeviceType::GPU) {
4195 ret =
i18n(
"Graphics Processor");
4197 else if (query == TDEGenericDeviceType::RAM) {
4200 else if (query == TDEGenericDeviceType::Bus) {
4203 else if (query == TDEGenericDeviceType::I2C) {
4204 ret =
i18n(
"I2C Bus");
4206 else if (query == TDEGenericDeviceType::MDIO) {
4207 ret =
i18n(
"MDIO Bus");
4209 else if (query == TDEGenericDeviceType::Mainboard) {
4210 ret =
i18n(
"Mainboard");
4212 else if (query == TDEGenericDeviceType::Disk) {
4215 else if (query == TDEGenericDeviceType::SCSI) {
4218 else if (query == TDEGenericDeviceType::StorageController) {
4219 ret =
i18n(
"Storage Controller");
4221 else if (query == TDEGenericDeviceType::Mouse) {
4222 ret =
i18n(
"Mouse");
4224 else if (query == TDEGenericDeviceType::Keyboard) {
4225 ret =
i18n(
"Keyboard");
4227 else if (query == TDEGenericDeviceType::HID) {
4230 else if (query == TDEGenericDeviceType::Modem) {
4231 ret =
i18n(
"Modem");
4233 else if (query == TDEGenericDeviceType::Monitor) {
4234 ret =
i18n(
"Monitor and Display");
4236 else if (query == TDEGenericDeviceType::Network) {
4237 ret =
i18n(
"Network");
4239 else if (query == TDEGenericDeviceType::NonvolatileMemory) {
4240 ret =
i18n(
"Nonvolatile Memory");
4242 else if (query == TDEGenericDeviceType::Printer) {
4243 ret =
i18n(
"Printer");
4245 else if (query == TDEGenericDeviceType::Scanner) {
4246 ret =
i18n(
"Scanner");
4248 else if (query == TDEGenericDeviceType::Sound) {
4249 ret =
i18n(
"Sound");
4251 else if (query == TDEGenericDeviceType::VideoCapture) {
4252 ret =
i18n(
"Video Capture");
4254 else if (query == TDEGenericDeviceType::IEEE1394) {
4255 ret =
i18n(
"IEEE1394");
4257 else if (query == TDEGenericDeviceType::PCMCIA) {
4258 ret =
i18n(
"PCMCIA");
4260 else if (query == TDEGenericDeviceType::Camera) {
4261 ret =
i18n(
"Camera");
4263 else if (query == TDEGenericDeviceType::TextIO) {
4264 ret =
i18n(
"Text I/O");
4266 else if (query == TDEGenericDeviceType::Serial) {
4267 ret =
i18n(
"Serial Communications Controller");
4269 else if (query == TDEGenericDeviceType::Parallel) {
4270 ret =
i18n(
"Parallel Port");
4272 else if (query == TDEGenericDeviceType::Peripheral) {
4273 ret =
i18n(
"Peripheral");
4275 else if (query == TDEGenericDeviceType::Backlight) {
4276 ret =
i18n(
"Backlight");
4278 else if (query == TDEGenericDeviceType::Battery) {
4279 ret =
i18n(
"Battery");
4281 else if (query == TDEGenericDeviceType::PowerSupply) {
4282 ret =
i18n(
"Power Supply");
4284 else if (query == TDEGenericDeviceType::Dock) {
4285 ret =
i18n(
"Docking Station");
4287 else if (query == TDEGenericDeviceType::ThermalSensor) {
4288 ret =
i18n(
"Thermal Sensor");
4290 else if (query == TDEGenericDeviceType::ThermalControl) {
4291 ret =
i18n(
"Thermal Control");
4293 else if (query == TDEGenericDeviceType::BlueTooth) {
4294 ret =
i18n(
"Bluetooth");
4296 else if (query == TDEGenericDeviceType::Bridge) {
4297 ret =
i18n(
"Bridge");
4299 else if (query == TDEGenericDeviceType::Hub) {
4302 else if (query == TDEGenericDeviceType::Platform) {
4303 ret =
i18n(
"Platform");
4305 else if (query == TDEGenericDeviceType::Cryptography) {
4306 ret =
i18n(
"Cryptography");
4308 else if (query == TDEGenericDeviceType::CryptographicCard) {
4309 ret =
i18n(
"Cryptographic Card");
4311 else if (query == TDEGenericDeviceType::BiometricSecurity) {
4312 ret =
i18n(
"Biometric Security");
4314 else if (query == TDEGenericDeviceType::TestAndMeasurement) {
4315 ret =
i18n(
"Test and Measurement");
4317 else if (query == TDEGenericDeviceType::Timekeeping) {
4318 ret =
i18n(
"Timekeeping");
4320 else if (query == TDEGenericDeviceType::Event) {
4321 ret =
i18n(
"Platform Event");
4323 else if (query == TDEGenericDeviceType::Input) {
4324 ret =
i18n(
"Platform Input");
4326 else if (query == TDEGenericDeviceType::PNP) {
4327 ret =
i18n(
"Plug and Play");
4329 else if (query == TDEGenericDeviceType::OtherACPI) {
4330 ret =
i18n(
"Other ACPI");
4332 else if (query == TDEGenericDeviceType::OtherUSB) {
4333 ret =
i18n(
"Other USB");
4335 else if (query == TDEGenericDeviceType::OtherMultimedia) {
4336 ret =
i18n(
"Other Multimedia");
4338 else if (query == TDEGenericDeviceType::OtherPeripheral) {
4339 ret =
i18n(
"Other Peripheral");
4341 else if (query == TDEGenericDeviceType::OtherSensor) {
4342 ret =
i18n(
"Other Sensor");
4344 else if (query == TDEGenericDeviceType::OtherVirtual) {
4345 ret =
i18n(
"Other Virtual");
4348 ret =
i18n(
"Unknown Device");
4354TQPixmap TDEHardwareDevices::getDeviceTypeIconFromType(TDEGenericDeviceType::TDEGenericDeviceType query,
TDEIcon::StdSizes size) {
4358 if (query == TDEGenericDeviceType::Root) {
4361 else if (query == TDEGenericDeviceType::RootSystem) {
4364 else if (query == TDEGenericDeviceType::CPU) {
4367 else if (query == TDEGenericDeviceType::GPU) {
4370 else if (query == TDEGenericDeviceType::RAM) {
4373 else if (query == TDEGenericDeviceType::Bus) {
4376 else if (query == TDEGenericDeviceType::I2C) {
4377 ret =
DesktopIcon(
"preferences-desktop-peripherals", size);
4379 else if (query == TDEGenericDeviceType::MDIO) {
4380 ret =
DesktopIcon(
"preferences-desktop-peripherals", size);
4382 else if (query == TDEGenericDeviceType::Mainboard) {
4385 else if (query == TDEGenericDeviceType::Disk) {
4386 ret =
DesktopIcon(
"drive-harddisk-unmounted", size);
4388 else if (query == TDEGenericDeviceType::SCSI) {
4391 else if (query == TDEGenericDeviceType::StorageController) {
4394 else if (query == TDEGenericDeviceType::Mouse) {
4397 else if (query == TDEGenericDeviceType::Keyboard) {
4400 else if (query == TDEGenericDeviceType::HID) {
4403 else if (query == TDEGenericDeviceType::Modem) {
4406 else if (query == TDEGenericDeviceType::Monitor) {
4409 else if (query == TDEGenericDeviceType::Network) {
4412 else if (query == TDEGenericDeviceType::NonvolatileMemory) {
4415 else if (query == TDEGenericDeviceType::Printer) {
4418 else if (query == TDEGenericDeviceType::Scanner) {
4421 else if (query == TDEGenericDeviceType::Sound) {
4424 else if (query == TDEGenericDeviceType::VideoCapture) {
4427 else if (query == TDEGenericDeviceType::IEEE1394) {
4430 else if (query == TDEGenericDeviceType::PCMCIA) {
4433 else if (query == TDEGenericDeviceType::Camera) {
4436 else if (query == TDEGenericDeviceType::Serial) {
4437 ret =
DesktopIcon(
"preferences-desktop-peripherals", size);
4439 else if (query == TDEGenericDeviceType::Parallel) {
4440 ret =
DesktopIcon(
"preferences-desktop-peripherals", size);
4442 else if (query == TDEGenericDeviceType::TextIO) {
4445 else if (query == TDEGenericDeviceType::Peripheral) {
4448 else if (query == TDEGenericDeviceType::Backlight) {
4451 else if (query == TDEGenericDeviceType::Battery) {
4454 else if (query == TDEGenericDeviceType::PowerSupply) {
4457 else if (query == TDEGenericDeviceType::Dock) {
4460 else if (query == TDEGenericDeviceType::ThermalSensor) {
4463 else if (query == TDEGenericDeviceType::ThermalControl) {
4466 else if (query == TDEGenericDeviceType::BlueTooth) {
4469 else if (query == TDEGenericDeviceType::Bridge) {
4472 else if (query == TDEGenericDeviceType::Hub) {
4475 else if (query == TDEGenericDeviceType::Platform) {
4478 else if (query == TDEGenericDeviceType::Cryptography) {
4481 else if (query == TDEGenericDeviceType::CryptographicCard) {
4484 else if (query == TDEGenericDeviceType::BiometricSecurity) {
4487 else if (query == TDEGenericDeviceType::TestAndMeasurement) {
4490 else if (query == TDEGenericDeviceType::Timekeeping) {
4493 else if (query == TDEGenericDeviceType::Event) {
4496 else if (query == TDEGenericDeviceType::Input) {
4499 else if (query == TDEGenericDeviceType::PNP) {
4502 else if (query == TDEGenericDeviceType::OtherACPI) {
4505 else if (query == TDEGenericDeviceType::OtherUSB) {
4508 else if (query == TDEGenericDeviceType::OtherMultimedia) {
4511 else if (query == TDEGenericDeviceType::OtherPeripheral) {
4514 else if (query == TDEGenericDeviceType::OtherSensor) {
4517 else if (query == TDEGenericDeviceType::OtherVirtual) {
4527TDERootSystemDevice* TDEHardwareDevices::rootSystemDevice() {
4528 TDEGenericDevice *hwdevice;
4529 for ( hwdevice = m_deviceList.first(); hwdevice; hwdevice = m_deviceList.next() ) {
4530 if (hwdevice->type() == TDEGenericDeviceType::RootSystem) {
4531 return dynamic_cast<TDERootSystemDevice*
>(hwdevice);
4538TQString TDEHardwareDevices::bytesToFriendlySizeString(
double bytes) {
4539 TQString prettystring;
4541 prettystring = TQString(
"%1B").arg(bytes);
4544 bytes = bytes / 1024;
4545 prettystring = TQString(
"%1KB").arg(bytes, 0,
'f', 1);
4549 bytes = bytes / 1024;
4550 prettystring = TQString(
"%1MB").arg(bytes, 0,
'f', 1);
4554 bytes = bytes / 1024;
4555 prettystring = TQString(
"%1GB").arg(bytes, 0,
'f', 1);
4559 bytes = bytes / 1024;
4560 prettystring = TQString(
"%1TB").arg(bytes, 0,
'f', 1);
4564 bytes = bytes / 1024;
4565 prettystring = TQString(
"%1PB").arg(bytes, 0,
'f', 1);
4569 bytes = bytes / 1024;
4570 prettystring = TQString(
"%1EB").arg(bytes, 0,
'f', 1);
4574 bytes = bytes / 1024;
4575 prettystring = TQString(
"%1ZB").arg(bytes, 0,
'f', 1);
4579 bytes = bytes / 1024;
4580 prettystring = TQString(
"%1YB").arg(bytes, 0,
'f', 1);
4583 return prettystring;
4586TDEGenericHardwareList TDEHardwareDevices::listByDeviceClass(TDEGenericDeviceType::TDEGenericDeviceType cl) {
4587 TDEGenericHardwareList ret;
4588 ret.setAutoDelete(
false);
4590 TDEGenericDevice *hwdevice;
4591 for ( hwdevice = m_deviceList.first(); hwdevice; hwdevice = m_deviceList.next() ) {
4592 if (hwdevice->type() == cl) {
4593 ret.append(hwdevice);
4600TDEGenericHardwareList TDEHardwareDevices::listAllPhysicalDevices() {
4601 TDEGenericHardwareList ret = m_deviceList;
4602 ret.setAutoDelete(
false);
4607#include "tdehardwaredevices.moc"
KSimpleDirWatch is a basic copy of KDirWatch but with the TDEIO linking requirement removed.
Access KDE Configuration entries.
static TDEStandardDirs * dirs()
Returns the application standard dirs object.
TQPixmap DesktopIcon(const TQString &name, int size=0, int state=TDEIcon::DefaultState, TDEInstance *instance=TDEGlobal::instance())
Load a desktop icon.
StdSizes
These are the standard sizes for icons.
TQString i18n(const char *text)
i18n is the function that does everything you need to translate a string.
TDEAction * close(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
TDEAction * open(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
const TDEShortcut & end()
Goto end of the document.