summaryrefslogtreecommitdiffstats
path: root/kcontrol/usbview/kcmusb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kcontrol/usbview/kcmusb.cpp')
-rw-r--r--kcontrol/usbview/kcmusb.cpp192
1 files changed, 192 insertions, 0 deletions
diff --git a/kcontrol/usbview/kcmusb.cpp b/kcontrol/usbview/kcmusb.cpp
new file mode 100644
index 000000000..b58647a9e
--- /dev/null
+++ b/kcontrol/usbview/kcmusb.cpp
@@ -0,0 +1,192 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Matthias Hoelzer-Kluepfel <[email protected]> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <tqgroupbox.h>
+#include <tqheader.h>
+#include <tqlayout.h>
+#include <tqlistview.h>
+#include <tqsplitter.h>
+#include <tqtextview.h>
+#include <tqtimer.h>
+
+#include <tdeaboutdata.h>
+#include <kdialog.h>
+#include <kgenericfactory.h>
+
+#include "usbdevices.h"
+#include "kcmusb.moc"
+
+typedef KGenericFactory<USBViewer, TQWidget > USBFactory;
+K_EXPORT_COMPONENT_FACTORY (kcm_usb, USBFactory("kcmusb") )
+
+USBViewer::USBViewer(TQWidget *parent, const char *name, const TQStringList &)
+ : TDECModule(USBFactory::instance(), parent, name)
+{
+ setButtons(Help);
+
+ setQuickHelp( i18n("<h1>USB Devices</h1> This module allows you to see"
+ " the devices attached to your USB bus(es)."));
+
+ TQVBoxLayout *vbox = new TQVBoxLayout(this, 0, KDialog::spacingHint());
+ TQGroupBox *gbox = new TQGroupBox(i18n("USB Devices"), this);
+ gbox->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(gbox);
+
+ TQVBoxLayout *vvbox = new TQVBoxLayout(gbox->layout(), KDialog::spacingHint());
+
+ TQSplitter *splitter = new TQSplitter(gbox);
+ vvbox->addWidget(splitter);
+
+ _devices = new TQListView(splitter);
+ _devices->addColumn(i18n("Device"));
+ _devices->setRootIsDecorated(true);
+ _devices->header()->hide();
+ _devices->setMinimumWidth(200);
+ _devices->setColumnWidthMode(0, TQListView::Maximum);
+
+ TQValueList<int> sizes;
+ sizes.append(200);
+ splitter->setSizes(sizes);
+
+ _details = new TQTextView(splitter);
+
+ splitter->setResizeMode(_devices, TQSplitter::KeepSize);
+
+ TQTimer *refreshTimer = new TQTimer(this);
+ // 1 sec seems to be a good compromise between latency and polling load.
+ refreshTimer->start(1000);
+
+ connect(refreshTimer, TQT_SIGNAL(timeout()), TQT_SLOT(refresh()));
+ connect(_devices, TQT_SIGNAL(selectionChanged(TQListViewItem*)),
+ this, TQT_SLOT(selectionChanged(TQListViewItem*)));
+
+ TDEAboutData *about =
+ new TDEAboutData(I18N_NOOP("kcmusb"), I18N_NOOP("TDE USB Viewer"),
+ 0, 0, TDEAboutData::License_GPL,
+ I18N_NOOP("(c) 2001 Matthias Hoelzer-Kluepfel"));
+
+ about->addAuthor("Matthias Hoelzer-Kluepfel", 0, "[email protected]");
+ about->addCredit("Leo Savernik", "Live Monitoring of USB Bus", "[email protected]");
+ setAboutData( about );
+
+ load();
+}
+
+void USBViewer::load()
+{
+ _items.clear();
+ _devices->clear();
+
+ refresh();
+}
+
+static TQ_UINT32 key( USBDevice &dev )
+{
+ return dev.bus()*256 + dev.device();
+}
+
+static TQ_UINT32 key_parent( USBDevice &dev )
+{
+ return dev.bus()*256 + dev.parent();
+}
+
+static void delete_recursive( TQListViewItem *item, const TQIntDict<TQListViewItem> &new_items )
+{
+ if (!item)
+ return;
+
+ TQListViewItemIterator it( item );
+ while ( it.current() ) {
+ if (!new_items.find(it.current()->text(1).toUInt())) {
+ delete_recursive( it.current()->firstChild(), new_items);
+ delete it.current();
+ }
+ ++it;
+ }
+}
+
+void USBViewer::refresh()
+{
+ TQIntDict<TQListViewItem> new_items;
+
+ if (!USBDevice::parse("/proc/bus/usb/devices"))
+ USBDevice::parseSys("/sys/bus/usb/devices");
+
+ int level = 0;
+ bool found = true;
+
+ while (found)
+ {
+ found = false;
+
+ TQPtrListIterator<USBDevice> it(USBDevice::devices());
+ for ( ; it.current(); ++it)
+ if (it.current()->level() == level)
+ {
+ TQ_UINT32 k = key(*it.current());
+ if (level == 0)
+ {
+ TQListViewItem *item = _items.find(k);
+ if (!item) {
+ item = new TQListViewItem(_devices,
+ it.current()->product(),
+ TQString::number(k));
+ }
+ new_items.insert(k, item);
+ found = true;
+ }
+ else
+ {
+ TQListViewItem *parent = new_items.find(key_parent(*it.current()));
+ if (parent)
+ {
+ TQListViewItem *item = _items.find(k);
+
+ if (!item) {
+ item = new TQListViewItem(parent,
+ it.current()->product(),
+ TQString::number(k) );
+ }
+ new_items.insert(k, item);
+ parent->setOpen(true);
+ found = true;
+ }
+ }
+ }
+
+ ++level;
+ }
+
+ // recursive delete all items not in new_items
+ delete_recursive( _devices->firstChild(), new_items );
+
+ _items = new_items;
+
+ if (!_devices->selectedItem())
+ selectionChanged(_devices->firstChild());
+}
+
+
+void USBViewer::selectionChanged(TQListViewItem *item)
+{
+ if (item)
+ {
+ TQ_UINT32 busdev = item->text(1).toUInt();
+ USBDevice *dev = USBDevice::find(busdev>>8, busdev&255);
+ if (dev)
+ {
+ _details->setText(dev->dump());
+ return;
+ }
+ }
+ _details->clear();
+}
+
+