summaryrefslogtreecommitdiff
authorskyhusker <skyhusker>2005-04-20 10:25:20 (UTC)
committer skyhusker <skyhusker>2005-04-20 10:25:20 (UTC)
commite439d0e6eaa6704a8b1b89ea32aa8a0520738a04 (patch) (side-by-side diff)
tree18c8b1eba5e1836f757765e4204d638500aa79f2
parentf6b9c85c09692f298ffa5ee95e1f171a9e158502 (diff)
downloadopie-e439d0e6eaa6704a8b1b89ea32aa8a0520738a04.zip
opie-e439d0e6eaa6704a8b1b89ea32aa8a0520738a04.tar.gz
opie-e439d0e6eaa6704a8b1b89ea32aa8a0520738a04.tar.bz2
First commit of OpieStumbler, an application which performs wireless networks scanning using Wireless Extensions
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/net/opiestumbler/config.in4
-rw-r--r--noncore/net/opiestumbler/main.cpp6
-rw-r--r--noncore/net/opiestumbler/opiestumbler.cpp348
-rw-r--r--noncore/net/opiestumbler/opiestumbler.h70
-rw-r--r--noncore/net/opiestumbler/opiestumbler.pro18
-rw-r--r--noncore/net/opiestumbler/stationinfo.cpp63
-rw-r--r--noncore/net/opiestumbler/stationinfo.h42
-rw-r--r--noncore/net/opiestumbler/stationviewitem.cpp52
-rw-r--r--noncore/net/opiestumbler/stationviewitem.h26
-rw-r--r--noncore/net/opiestumbler/stumbler.cpp80
-rw-r--r--noncore/net/opiestumbler/stumbler.h38
-rw-r--r--noncore/net/opiestumbler/stumblersettings.cpp35
-rw-r--r--noncore/net/opiestumbler/stumblersettings.h22
-rw-r--r--noncore/net/opiestumbler/stumblerstation.cpp21
-rw-r--r--noncore/net/opiestumbler/stumblerstation.h18
15 files changed, 843 insertions, 0 deletions
diff --git a/noncore/net/opiestumbler/config.in b/noncore/net/opiestumbler/config.in
new file mode 100644
index 0000000..88cdacf
--- a/dev/null
+++ b/noncore/net/opiestumbler/config.in
@@ -0,0 +1,4 @@
+ config OPIESTUMBLER
+ boolean "opie-stumbler (find wireless networks)"
+ default "y"
+ depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBOPIE2NET && LIBOPIE2UI
diff --git a/noncore/net/opiestumbler/main.cpp b/noncore/net/opiestumbler/main.cpp
new file mode 100644
index 0000000..5b5770d
--- a/dev/null
+++ b/noncore/net/opiestumbler/main.cpp
@@ -0,0 +1,6 @@
+#include "opiestumbler.h"
+
+#include <opie2/oapplicationfactory.h>
+
+using namespace Opie::Core;
+OPIE_EXPORT_APP_V2( OApplicationFactory<OpieStumbler>, "OpieStumbler" )
diff --git a/noncore/net/opiestumbler/opiestumbler.cpp b/noncore/net/opiestumbler/opiestumbler.cpp
new file mode 100644
index 0000000..8dedd67
--- a/dev/null
+++ b/noncore/net/opiestumbler/opiestumbler.cpp
@@ -0,0 +1,348 @@
+#include <cstdlib>
+
+#include <qmenubar.h>
+#include <qaction.h>
+#include <qlistview.h>
+#include <qstring.h>
+//#include <qapplication.h>
+#include <qdatetime.h>
+#include <qpopupmenu.h>
+#include <qstatusbar.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+#include <qtimer.h>
+
+#include <qpe/resource.h>
+#include <qpe/config.h>
+//#include <qpe/global.h>
+#include <qpe/qcopenvelope_qws.h>
+#include <qpe/qpeapplication.h>
+
+#include <opie2/odebug.h>
+#include <opie2/ostation.h>
+#include <opie2/omanufacturerdb.h>
+#include <opie2/onetwork.h>
+#include <opie2/oprocess.h>
+
+#include "stumbler.h"
+#include "opiestumbler.h"
+#include "stumblersettings.h"
+#include "stationviewitem.h"
+#include "stumblerstation.h"
+#include "stationinfo.h"
+
+
+using Opie::Net::OWirelessNetworkInterface;
+using Opie::Net::ONetwork;
+
+
+QString OpieStumbler::appCaption() {
+ return QObject::tr("OpieStumbler");
+}
+
+OpieStumbler::OpieStumbler(QWidget *parent, const char *name, WFlags)
+ :QMainWindow(parent, name, WStyle_ContextHelp),
+ m_listCurrent(new QListView(this)), m_listHistory(new QListView(this)),
+ m_stationsCurrent(new QList<Opie::Net::OStation>),
+ m_popupCurrent(new QPopupMenu(this)),
+ m_popupHistory(new QPopupMenu(this)),
+ m_db(NULL), m_proc(NULL)
+{
+
+ if ( QCopChannel::isRegistered("QPE/OpieStumbler") ) {
+ QCopEnvelope e("QPE/OpieStumbler", "show()");
+ exit(EXIT_SUCCESS);
+ }
+
+ QGridLayout *grid = new QGridLayout( this, 1, 1, 3, 0, "grid");
+ QVBoxLayout *lay = new QVBoxLayout( NULL, 0, 5, "lay" );
+ QSpacerItem *spacer = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Fixed );
+ lay->addItem(spacer);
+ lay->addWidget(m_listCurrent);
+ lay->addWidget(m_listHistory);
+ grid->addLayout(lay, 0, 0);
+
+ m_stationsCurrent->setAutoDelete(TRUE);
+
+ m_channel = new QCopChannel( "QPE/OpieStumbler", this );
+ connect(m_channel, SIGNAL(received(const QCString &, const QByteArray &)),
+ this, SLOT(slotMessageReceived( const QCString &, const QByteArray &)) );
+
+ //setCaption(appCaption());
+ //setCentralWidget(grid);
+ setToolBarsMovable(FALSE);
+
+
+ QPopupMenu *fileMenu = new QPopupMenu(this);
+ QPopupMenu *configMenu = new QPopupMenu(this);
+ QPopupMenu *scanMenu = new QPopupMenu(this);
+
+ fileMenu->insertItem( tr("Exit"), this, SLOT(close()) );
+ configMenu->insertItem( tr("Configure"), this, SLOT(slotConfigure()) );
+ scanMenu->insertItem( tr("Start"), this, SLOT(slotStartScanning()) );
+ scanMenu->insertItem( tr("Stop"), this, SLOT(slotStopScanning()) );
+
+ m_popupCurrent->insertItem( tr("Show details"), this, SLOT(slotShowDetails()) );
+ m_popupCurrent->insertItem( tr("Join Network"), this, SLOT(slotJoinNetwork()) );
+
+ menuBar()->insertItem(tr("File"), fileMenu);
+ menuBar()->insertItem(tr("Settings"), configMenu);
+ menuBar()->insertItem(tr("Scanning"), scanMenu);
+
+ QPEApplication::setStylusOperation(m_listCurrent->viewport(), QPEApplication::RightOnHold);
+ QPEApplication::setStylusOperation(m_listHistory->viewport(), QPEApplication::RightOnHold);
+
+ m_listCurrent->addColumn(tr("SSID"));
+ m_listCurrent->addColumn(tr("Chan"));
+ m_listCurrent->addColumn(tr("Signal"));
+ m_listCurrent->addColumn(tr("Enc"));
+ m_listCurrent->setSelectionMode( QListView::Extended );
+
+ m_listHistory->addColumn(tr("SSID"));
+ m_listHistory->addColumn(tr("Chan"));
+ m_listHistory->addColumn(tr("Max Sig"));
+ m_listHistory->addColumn(tr("Enc"));
+ m_listHistory->addColumn(tr("Vendor"));
+
+ connect(m_listCurrent, SIGNAL(mouseButtonPressed (int, QListViewItem*, const QPoint&, int)),
+ this, SLOT(slotCurrentMousePressed (int, QListViewItem*, const QPoint&, int)));
+
+ connect(m_listHistory, SIGNAL(mouseButtonPressed (int, QListViewItem*, const QPoint&, int)),
+ this, SLOT(slotHistoryMousePressed (int, QListViewItem*, const QPoint&, int)));
+
+ for(int i = CURCHAN; i <= CURENC; ++i) {
+ m_listCurrent->setColumnAlignment( i, Qt::AlignHCenter );
+ m_listHistory->setColumnAlignment( i, Qt::AlignHCenter );
+ }
+
+ loadConfig();
+ m_stumbler = new Stumbler(m_interface, this);
+ connect(m_stumbler, SIGNAL(newdata()), this, SLOT(slotUpdateStations()));
+
+ QTimer::singleShot(1000, this, SLOT(slotLoadManufacturers()) );
+
+ slotStartScanning();
+}
+
+void OpieStumbler::slotConfigure()
+{
+ StumblerSettings settings(this, "Settings", TRUE);
+ if (settings.exec() == QDialog::Accepted)
+ loadConfig();
+}
+
+void OpieStumbler::loadConfig()
+{
+ Config cfg("OpieStumbler", Config::User);
+ cfg.setGroup("General");
+ m_interface = cfg.readEntry("interface", "wlan0");
+}
+
+void OpieStumbler::slotStartScanning()
+{
+ setCaption(appCaption() + " (" + tr("Scanning") + ")");
+ m_stumbler->start();
+}
+
+void OpieStumbler::slotStopScanning()
+{
+ setCaption(appCaption());
+ m_stumbler->stop();
+}
+
+void OpieStumbler::slotUpdateStations()
+{
+ m_stationsCurrent->clear();
+
+ m_stationsCurrent = m_stumbler->stations();
+ if (m_stationsCurrent) {
+ QListIterator<Opie::Net::OStation> it(*m_stationsCurrent);
+ for(; it.current(); ++it) {
+ Opie::Net::OStation *station = it.current();
+ QListIterator<StumblerStation> itr(m_stationsHistory);
+ for( ; itr.current(); ++itr) {
+ if (itr.current()->st->macAddress.toString() == station->macAddress.toString()) {
+ break;
+ }
+ }
+ if (!itr.current()) {
+ //We need to copy the date because m_statiosCurrent has autodelete enabled
+ m_stationsHistory.append(new StumblerStation(new Opie::Net::OStation, QDateTime::currentDateTime()));
+ *(m_stationsHistory.last()->st) = (*station);
+ }
+ else {
+ if ( itr.current()->st->level < station->level )
+ itr.current()->st->level = station->level;
+
+ itr.current()->lastTimeSeen = QDateTime::currentDateTime();
+ }
+ }
+ }
+ displayStations();
+}
+
+void OpieStumbler::displayStations()
+{
+ m_listCurrent->clear();
+ for(QListIterator<Opie::Net::OStation> it(*m_stationsCurrent); it.current(); ++it)
+ new StationViewItem( m_listCurrent, it.current()->ssid, QString::number(it.current()->channel),
+ QString::number(it.current()->level), it.current()->encrypted ? "Y": "N", it.current()->macAddress.toString() );
+
+ m_listHistory->clear();
+ for(QListIterator<StumblerStation> it(m_stationsHistory); it.current(); ++it)
+ new StationViewItem( m_listHistory, it.current()->st->ssid, QString::number(it.current()->st->channel),
+ QString::number(it.current()->st->level), it.current()->st->encrypted ? "Y": "N",
+ manufacturer(it.current()->st->macAddress.toString()), it.current()->st->macAddress.toString() );
+}
+
+void OpieStumbler::slotMessageReceived( const QCString &message, const QByteArray &parameters)
+{
+ Q_UNUSED(const_cast<QByteArray &>(parameters))
+
+ if ( message == "show()" )
+ show();
+}
+
+void OpieStumbler::slotCurrentMousePressed(int button, QListViewItem * item, const QPoint &point, int c)
+{
+ Q_UNUSED(c)
+
+ if ( 2 == button ) {
+ m_mac = item->text(CURENC + 1);
+ m_popupCurrent->popup(point);
+ }
+}
+
+
+void OpieStumbler::slotHistoryMousePressed(int button, QListViewItem * item, const QPoint &point, int c)
+{
+ Q_UNUSED(c)
+
+ if ( 2 == button ) {
+ m_mac = item->text(HISVENDOR + 1);
+ m_popupHistory->popup(point);
+ }
+}
+
+void OpieStumbler::slotShowDetails()
+{
+ QListIterator<StumblerStation> it(m_stationsHistory);
+ for(; it.current() && it.current()->st->macAddress.toString() != m_mac; ++it );
+
+ if( it.current() ) {
+ StationInfo info(it.current()->st->ssid, it.current()->st->type, QString::number(it.current()->st->channel),
+ QString::number(it.current()->st->rates.last()/1000000), QString::number(it.current()->st->level),
+ it.current()->st->encrypted ? "WEP": "No",
+ it.current()->st->macAddress.toString(), manufacturer(it.current()->st->macAddress.toString(), TRUE),
+ it.current()->lastTimeSeen.toString() ,this, "", TRUE);
+ info.exec();
+ }
+
+}
+
+void OpieStumbler::slotLoadManufacturers()
+{
+ m_db = Opie::Net::OManufacturerDB::instance();
+}
+
+QString OpieStumbler::manufacturer( const QString &mac, bool extended )
+{
+ QString retval;
+ if ( m_db )
+ if ( extended )
+ retval = m_db->lookupExt(mac);
+ else
+ retval = m_db->lookup(mac);
+
+ if ( retval.isEmpty() )
+ retval = tr("Unknown");
+
+ return retval;
+}
+
+void OpieStumbler::slotJoinNetwork()
+{
+ slotStopScanning();
+
+ OWirelessNetworkInterface *wiface = static_cast<OWirelessNetworkInterface*>(ONetwork::instance()->interface(m_interface));
+
+ if( !wiface )
+ return;
+
+ QListIterator<StumblerStation> it(m_stationsHistory);
+
+ for(; it.current() && it.current()->st->macAddress.toString() != m_mac; ++it );
+
+ if( !it.current() )
+ return;
+
+ Opie::Net::OStation *station = it.current()->st;
+
+ odebug << "Bringing interface down" << oendl;
+ wiface->setUp(FALSE);
+
+ odebug << "Setting mode to " << (station->type == "adhoc" ? "adhoc" : "managed") << oendl;
+ wiface->setMode(station->type == "adhoc" ? "adhoc" : "managed" );
+
+ odebug << "Setting channel to " << station->channel << oendl;
+ wiface->setChannel(station->channel);
+
+ odebug << "Setting SSID to " << station->ssid << oendl;
+ wiface->setSSID(station->ssid);
+
+ wiface->commit();
+
+ odebug << "Bringing interface up" << oendl;
+ wiface->setUp(TRUE);
+ //Wait 5 sec for association
+ QTimer::singleShot(5000, this, SLOT(slotAssociated()));
+}
+
+void OpieStumbler::slotAssociated()
+{
+ OWirelessNetworkInterface *wiface = static_cast<OWirelessNetworkInterface*>(ONetwork::instance()->interface(m_interface));
+
+ if( !wiface )
+ return;
+
+ if (!wiface->isAssociated()) {
+ Global::statusMessage(tr("Could not Join"));
+ return;
+ }
+
+ Global::statusMessage(tr("Joined"));
+
+ if(m_proc) {
+ m_proc->kill();
+ delete m_proc;
+ }
+
+ m_proc = new Opie::Core::OProcess(this);
+
+ *m_proc << "udhcpc" << "-f" << "-n" << "-i" << m_interface;
+ m_proc->start(Opie::Core::OProcess::DontCare);
+ QTimer::singleShot(5000, this, SLOT(slotCheckDHCP()));
+}
+
+void OpieStumbler::slotCheckDHCP()
+{
+ if(!m_proc->isRunning()) {
+ Global::statusMessage(tr("Could not Obtain an Address"));
+ delete m_proc;
+ m_proc = NULL;
+ return;
+ }
+ m_listCurrent->show();
+
+
+ OWirelessNetworkInterface *wiface = static_cast<OWirelessNetworkInterface*>(ONetwork::instance()->interface(m_interface));
+ Global::statusMessage(tr("Obtained IP ") + wiface->ipV4Address());
+}
+
+
+
+
+
+
+
+
diff --git a/noncore/net/opiestumbler/opiestumbler.h b/noncore/net/opiestumbler/opiestumbler.h
new file mode 100644
index 0000000..3f45a78
--- a/dev/null
+++ b/noncore/net/opiestumbler/opiestumbler.h
@@ -0,0 +1,70 @@
+#ifndef OPIESTUMBLER_H
+#define OPIESTUMBLER_H
+
+#include <qmainwindow.h>
+#include <qlist.h>
+
+#include "stumblerstation.h"
+
+class QString;
+class QPopupMenu;
+class Stumbler;
+class QCopChannel;
+class QListView;
+class QListViewItem;
+
+namespace Opie{
+ namespace Net {
+ class OMacAddress;
+ class OStation;
+ class OManufacturerDB;
+ }
+
+ namespace Core {
+ class OProcess;
+ }
+}
+
+
+class OpieStumbler: public QMainWindow {
+ Q_OBJECT
+public:
+
+ enum CurrentColumns { CURSSID, CURCHAN, CURSIGNAL, CURENC };
+ enum HistoryColumns { HISSSID, HISCHAN, HISSIGNAL, HISENC, HISVENDOR };
+ OpieStumbler(QWidget *parent = 0, const char *name = 0, WFlags f = 0);
+ static QString appName() { return QString::fromLatin1("opiestumbler"); }
+ static QString appCaption();
+ void displayStations();
+ QString manufacturer(const QString &mac, bool extended = FALSE );
+protected slots:
+ void slotConfigure();
+ void slotStartScanning();
+ void slotStopScanning();
+ void slotUpdateStations();
+ void slotMessageReceived( const QCString &, const QByteArray & );
+ void slotCurrentMousePressed(int button, QListViewItem *item, const QPoint &point, int c);
+ void slotHistoryMousePressed(int button, QListViewItem *item, const QPoint &point, int c);
+ void slotShowDetails();
+ void slotLoadManufacturers();
+ void slotJoinNetwork();
+ void slotAssociated();
+ void slotCheckDHCP();
+protected:
+ void loadConfig();
+ QListView *m_listCurrent;
+ QListView *m_listHistory;
+ QString m_interface;
+ Stumbler *m_stumbler;
+ QCopChannel *m_channel;
+ QList <Opie::Net::OStation> *m_stationsCurrent;
+ QList <StumblerStation> m_stationsHistory;
+ QPopupMenu *m_popupCurrent;
+ QPopupMenu *m_popupHistory;
+ Opie::Net::OManufacturerDB *m_db;
+ QString m_mac;
+ Opie::Core::OProcess *m_proc;
+
+};
+
+#endif /* OPIESTUMBLER_H */
diff --git a/noncore/net/opiestumbler/opiestumbler.pro b/noncore/net/opiestumbler/opiestumbler.pro
new file mode 100644
index 0000000..a23bd51
--- a/dev/null
+++ b/noncore/net/opiestumbler/opiestumbler.pro
@@ -0,0 +1,18 @@
+TEMPLATE = app
+CONFIG += qte warn_on quick-app debug
+HEADERS = opiestumbler.h stumblersettings.h stumbler.h \
+ stationviewitem.h stumblerstation.h stationinfo.h
+SOURCES = opiestumbler.cpp stumblersettings.cpp stumbler.cpp \
+ main.cpp stationviewitem.cpp stumblerstation.cpp \
+ stationinfo.cpp
+TARGET = opiestumbler
+INCLUDEPATH += $(OPIEDIR)/include
+DEPENDPATH += $(OPIEDIR)/include
+LIBS += -lqpe -lqte -lopiecore2 -lopieui2 -lopienet2
+
+!contains(CONFIG,quick-app) {
+ DESTDIR = $(OPIEDIR)/bin
+ DEFINES += NOQUICKLAUNCH
+}
+
+include( $(OPIEDIR)/include.pro )
diff --git a/noncore/net/opiestumbler/stationinfo.cpp b/noncore/net/opiestumbler/stationinfo.cpp
new file mode 100644
index 0000000..926610e
--- a/dev/null
+++ b/noncore/net/opiestumbler/stationinfo.cpp
@@ -0,0 +1,63 @@
+#include <qlayout.h>
+#include <qgroupbox.h>
+
+
+#include "stationinfo.h"
+
+
+StationInfo::StationInfo( const QString &ssid, const QString &type, const QString &channel,
+ const QString &maxrate, const QString &level, const QString &encryption, const QString &address,
+ const QString &vendor, const QString &time,
+ QWidget *parent, const char *name, bool modal, WFlags f)
+ : QDialog( parent, name, modal, f)
+{
+ setCaption(tr("Station Details"));
+
+ QGridLayout *grid = new QGridLayout( this, 1, 2, 5);
+ QVBoxLayout *layLeft = new QVBoxLayout(0, 0, 6);
+ QVBoxLayout *layRight = new QVBoxLayout(0, 0, 6);
+
+
+ m_ssidLabel = new QLabel( tr("SSID:"), this );
+ layLeft->addWidget(m_ssidLabel);
+ m_typeLabel = new QLabel( tr("Type:"), this );
+ layLeft->addWidget(m_typeLabel);
+ m_channelLabel = new QLabel( tr("Channel:"), this );
+ layLeft->addWidget(m_channelLabel);
+ m_maxRateLabel = new QLabel( tr("Max Rate"), this );
+ layLeft->addWidget(m_maxRateLabel);
+ m_levelLabel = new QLabel( tr("Max Signal:"), this );
+ layLeft->addWidget(m_levelLabel);
+ m_encLabel = new QLabel( tr("Encryption:"), this );
+ layLeft->addWidget(m_encLabel);
+ m_addrLabel = new QLabel( tr("Address:"), this );
+ layLeft->addWidget(m_addrLabel);
+ m_vendorLabel = new QLabel( tr("Vendor:"), this );
+ layLeft->addWidget(m_vendorLabel);
+ m_timeLabel = new QLabel( tr("Last Time Seen:"), this );
+ layLeft->addWidget(m_timeLabel);
+
+
+ m_ssid = new QLabel( ssid, this);
+ layRight->addWidget(m_ssid);
+ m_type = new QLabel( type, this);
+ layRight->addWidget(m_type);
+ m_channel = new QLabel( channel, this);
+ layRight->addWidget(m_channel);
+ m_maxRate = new QLabel( maxrate + " " + tr("Mb/s"), this );
+ layRight->addWidget( m_maxRate );
+ m_level = new QLabel( level, this);
+ layRight->addWidget(m_level);
+ m_encryption = new QLabel( encryption, this);
+ layRight->addWidget(m_encryption);
+ m_address = new QLabel( address, this);
+ layRight->addWidget(m_address);
+ m_vendor = new QLabel( vendor, this);
+ layRight->addWidget(m_vendor);
+ m_lastTime = new QLabel( time, this);
+ layRight->addWidget(m_lastTime);
+
+
+ grid->addLayout( layRight, 0, 1);
+ grid->addLayout( layLeft, 0, 0 );
+}
diff --git a/noncore/net/opiestumbler/stationinfo.h b/noncore/net/opiestumbler/stationinfo.h
new file mode 100644
index 0000000..f8798a6
--- a/dev/null
+++ b/noncore/net/opiestumbler/stationinfo.h
@@ -0,0 +1,42 @@
+#ifndef STATIONINFO_H
+#define STATIONINFO_H
+
+#include <qdialog.h>
+#include <qlabel.h>
+
+class QWidget;
+class QString;
+class QGroupBox;
+
+class StationInfo: public QDialog
+{
+ Q_OBJECT
+
+public:
+ StationInfo( const QString &essid, const QString &type, const QString &channel,
+ const QString &maxrate, const QString &level, const QString &encryption, const QString &address,
+ const QString &vendor, const QString &time,
+ QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+
+protected:
+ QLabel *m_ssidLabel;
+ QLabel *m_typeLabel;
+ QLabel *m_channelLabel;
+ QLabel *m_maxRateLabel;
+ QLabel *m_levelLabel;
+ QLabel *m_encLabel;
+ QLabel *m_addrLabel;
+ QLabel *m_vendorLabel;
+ QLabel *m_timeLabel;
+ QLabel *m_ssid;
+ QLabel *m_type;
+ QLabel *m_channel;
+ QLabel *m_maxRate;
+ QLabel *m_level;
+ QLabel *m_encryption;
+ QLabel *m_address;
+ QLabel *m_vendor;
+ QLabel *m_lastTime;
+};
+
+#endif
diff --git a/noncore/net/opiestumbler/stationviewitem.cpp b/noncore/net/opiestumbler/stationviewitem.cpp
new file mode 100644
index 0000000..64223d7
--- a/dev/null
+++ b/noncore/net/opiestumbler/stationviewitem.cpp
@@ -0,0 +1,52 @@
+#include <qpalette.h>
+#include <qcolor.h>
+
+
+#include "stationviewitem.h"
+#include "opiestumbler.h"
+
+StationViewItem::StationViewItem( QListView *parent, const QString &ssid,
+ const QString &channel, const QString &level, const QString &enc,
+ const QString &mac )
+ : QListViewItem( parent, ssid, channel, level, enc, mac )
+{
+}
+
+StationViewItem::StationViewItem( QListView *parent, const QString &ssid,
+ const QString &channel, const QString &level, const QString &enc,
+ const QString &vendor, const QString &mac )
+
+: QListViewItem( parent, ssid, channel, level, enc, vendor, mac )
+{
+}
+
+void StationViewItem::paintCell( QPainter *p, const QColorGroup &cg,
+ int column, int width, int alignment )
+{
+ QColor c;
+ QColorGroup ch(cg);
+
+ if ( column == OpieStumbler::CURSIGNAL ) {
+ int value = text(column).toInt();
+ if ( value < 20 )
+ c.setRgb(255, 0, 0);
+ else if ( value < 35 )
+ c.setRgb(255, 255, 0);
+ else if ( value < 60 )
+ c.setRgb(0, 255, 0);
+ else
+ c.setRgb(0, 0, 255);
+ ch.setColor( QColorGroup::Text, c );
+ }
+
+ if ( column == OpieStumbler::CURSSID ) {
+ if ( text(OpieStumbler::CURENC) == "Y" )
+ c.setRgb(255, 0, 0);
+ else
+ c.setRgb(0, 255, 0);
+ ch.setColor( QColorGroup::Text, c );
+ }
+
+ QListViewItem::paintCell( p, ch, column, width, alignment );
+}
+
diff --git a/noncore/net/opiestumbler/stationviewitem.h b/noncore/net/opiestumbler/stationviewitem.h
new file mode 100644
index 0000000..48e74d5
--- a/dev/null
+++ b/noncore/net/opiestumbler/stationviewitem.h
@@ -0,0 +1,26 @@
+#ifndef STATIONVIEWITEM_H
+#define STATIONVIEWITEM_H
+
+#include <qlistview.h>
+
+
+class QString;
+class QPainter;
+class QColorGroup;
+class QColor;
+
+class StationViewItem: public QListViewItem
+{
+public:
+ StationViewItem( QListView *parent, const QString &ssid, const QString &channel,
+ const QString &level, const QString &enc, const QString &mac );
+ StationViewItem( QListView *parent, const QString &ssid, const QString &channel,
+ const QString &level, const QString &enc, const QString &vendor,
+ const QString &mac );
+
+ virtual void paintCell( QPainter *p, const QColorGroup &cg,
+ int column, int width, int alignment );
+};
+
+#endif
+
diff --git a/noncore/net/opiestumbler/stumbler.cpp b/noncore/net/opiestumbler/stumbler.cpp
new file mode 100644
index 0000000..cda6b99
--- a/dev/null
+++ b/noncore/net/opiestumbler/stumbler.cpp
@@ -0,0 +1,80 @@
+#include <qstring.h>
+#include <qtimer.h>
+#include <qapplication.h>
+
+//#include <opie2/onetutils.h>
+#include <opie2/onetwork.h>
+#include <opie2/odebug.h>
+
+#include "stumbler.h"
+
+using namespace Opie::Net;
+
+Stumbler::Stumbler(const QString &iface, QObject *parent, const char *name)
+ :QObject(parent, name), m_interval(5000),
+ m_wifaceName(iface),
+ m_timer(new QTimer(this))
+{
+ m_wiface = static_cast<OWirelessNetworkInterface*>(ONetwork::instance()->interface(m_wifaceName));
+ connect(m_timer, SIGNAL(timeout()), this, SLOT(slotRefresh()));
+}
+
+
+void Stumbler::start()
+{
+ if (!m_wiface) {
+ odebug << "Error, interface " << m_wifaceName << " does not exist" << oendl;
+ return;
+ }
+
+ if (!ONetwork::instance()->isWirelessInterface(m_wifaceName.ascii())) {
+ odebug << "Error, " << m_wifaceName << " is not a wireless interface" << oendl;
+ //FIXME: Tell the user about this
+ return;
+ }
+
+ if (!m_timer->isActive()) {
+ odebug << "Starting stumbler" << oendl;
+ m_wiface->setUp(FALSE);
+ m_wiface->setSSID("any");
+ m_wiface->setAssociatedAP( OMacAddress::broadcast );
+ m_wiface->setUp(TRUE);
+ m_timer->start(m_interval);
+ }
+}
+
+void Stumbler::stop()
+{
+ if (m_timer->isActive()) {
+ odebug << "Stoping stumbler" << oendl;
+ m_timer->stop();
+ }
+}
+
+void Stumbler::setInterval(int msec)
+{
+ m_interval = msec;
+ if (m_timer->isActive()) {
+ m_timer->stop();
+ m_timer->start(m_interval);
+ }
+}
+
+void Stumbler::setIface(const QString &iface)
+{
+ m_wifaceName = iface;
+ m_wiface = static_cast<OWirelessNetworkInterface*>(ONetwork::instance()->interface(m_wifaceName));
+}
+
+void Stumbler::slotRefresh()
+{
+ m_stationList = m_wiface->scanNetwork();
+ if ( qApp )
+ qApp->processEvents();
+ emit (newdata());
+}
+
+Opie::Net::OStationList * Stumbler::stations()
+{
+ return m_stationList;
+}
diff --git a/noncore/net/opiestumbler/stumbler.h b/noncore/net/opiestumbler/stumbler.h
new file mode 100644
index 0000000..de50d25
--- a/dev/null
+++ b/noncore/net/opiestumbler/stumbler.h
@@ -0,0 +1,38 @@
+#ifndef STUMBLER_H
+#define STUMBLER_H
+
+#include <opie2/ostation.h>
+
+#include <qobject.h>
+
+class QString;
+class QTimer;
+namespace Opie {
+ namespace Net {
+ class OWirelessNetworkInterface;
+ }
+}
+
+class Stumbler: public QObject {
+ Q_OBJECT
+
+public:
+ Stumbler(const QString &iface, QObject *parent = 0, const char *name = 0);
+ void start();
+ void stop();
+ void setInterval(int msec);
+ void setIface(const QString &iface);
+ Opie::Net::OStationList * stations();
+signals:
+ void newdata();
+protected slots:
+ void slotRefresh();
+protected:
+ int m_interval;
+ QString m_wifaceName;
+ QTimer *m_timer;
+ Opie::Net::OWirelessNetworkInterface *m_wiface;
+ Opie::Net::OStationList *m_stationList;
+};
+
+#endif
diff --git a/noncore/net/opiestumbler/stumblersettings.cpp b/noncore/net/opiestumbler/stumblersettings.cpp
new file mode 100644
index 0000000..f033e34
--- a/dev/null
+++ b/noncore/net/opiestumbler/stumblersettings.cpp
@@ -0,0 +1,35 @@
+#include <qlineedit.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+#include <qpe/config.h>
+
+#include "stumblersettings.h"
+
+StumblerSettings::StumblerSettings(QWidget* parent, const char* name, bool modal, WFlags f)
+ : QDialog(parent, name, modal, WStyle_ContextHelp), m_config(new Config("OpieStumbler"))
+{
+ setCaption(tr("Settings"));
+ m_config->setGroup("General");
+ QBoxLayout *l = new QHBoxLayout(this);
+ QLabel *lb = new QLabel(tr("Interface"), this);
+ m_interface = new QLineEdit(this);
+ m_interface->setText(m_config->readEntry("interface", "wlan0"));
+ connect(m_interface, SIGNAL(returnPressed()), this, SLOT(accept()));
+ l->addWidget(lb);
+ l->addWidget(m_interface);
+}
+
+StumblerSettings::~StumblerSettings()
+{
+ delete m_config;
+ delete m_interface;
+}
+
+void StumblerSettings::accept()
+{
+ m_config->writeEntry("interface", m_interface->text());
+ m_config->write();
+
+ QDialog::accept();
+}
diff --git a/noncore/net/opiestumbler/stumblersettings.h b/noncore/net/opiestumbler/stumblersettings.h
new file mode 100644
index 0000000..997fc85
--- a/dev/null
+++ b/noncore/net/opiestumbler/stumblersettings.h
@@ -0,0 +1,22 @@
+#ifndef STUMBLERSETTINGS_H
+#define STUMBLERSETTINGS_H
+
+#include <qdialog.h>
+
+class Config;
+class QLineEdit;
+
+class StumblerSettings: public QDialog {
+
+public:
+ StumblerSettings(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags f = 0);
+ ~StumblerSettings();
+
+protected slots:
+ void accept();
+protected:
+ Config *m_config;
+ QLineEdit *m_interface;
+};
+
+#endif
diff --git a/noncore/net/opiestumbler/stumblerstation.cpp b/noncore/net/opiestumbler/stumblerstation.cpp
new file mode 100644
index 0000000..36bd669
--- a/dev/null
+++ b/noncore/net/opiestumbler/stumblerstation.cpp
@@ -0,0 +1,21 @@
+#include "stumblerstation.h"
+#include <opie2/odebug.h>
+
+StumblerStation::StumblerStation(Opie::Net::OStation *station, const QDateTime &tm)
+ : st(station), lastTimeSeen(tm)
+{
+ /*odebug << "RHS: " << station->macAddress.toString() << oendl;
+ odebug << "THIS: " << st->macAddress.toString() << oendl; */
+}
+
+StumblerStation::~StumblerStation()
+{
+ if (st)
+ delete st;
+}
+
+bool StumblerStation::operator<(const StumblerStation &rhs)
+{
+ return rhs.lastTimeSeen < lastTimeSeen;
+}
+
diff --git a/noncore/net/opiestumbler/stumblerstation.h b/noncore/net/opiestumbler/stumblerstation.h
new file mode 100644
index 0000000..1532193
--- a/dev/null
+++ b/noncore/net/opiestumbler/stumblerstation.h
@@ -0,0 +1,18 @@
+#ifndef STUMBLERSTATION_H
+#define STUMBLERSTATION_H
+
+#include <opie2/ostation.h>
+
+#include <qdatetime.h>
+
+class StumblerStation
+{
+public:
+ StumblerStation(Opie::Net::OStation *station, const QDateTime &tm);
+ ~StumblerStation();
+ bool operator<(const StumblerStation &rhs);
+ Opie::Net::OStation *st;
+ QDateTime lastTimeSeen;
+};
+
+#endif