-rw-r--r-- | noncore/net/opiestumbler/config.in | 4 | ||||
-rw-r--r-- | noncore/net/opiestumbler/main.cpp | 6 | ||||
-rw-r--r-- | noncore/net/opiestumbler/opiestumbler.cpp | 348 | ||||
-rw-r--r-- | noncore/net/opiestumbler/opiestumbler.h | 70 | ||||
-rw-r--r-- | noncore/net/opiestumbler/opiestumbler.pro | 18 | ||||
-rw-r--r-- | noncore/net/opiestumbler/stationinfo.cpp | 63 | ||||
-rw-r--r-- | noncore/net/opiestumbler/stationinfo.h | 42 | ||||
-rw-r--r-- | noncore/net/opiestumbler/stationviewitem.cpp | 52 | ||||
-rw-r--r-- | noncore/net/opiestumbler/stationviewitem.h | 26 | ||||
-rw-r--r-- | noncore/net/opiestumbler/stumbler.cpp | 80 | ||||
-rw-r--r-- | noncore/net/opiestumbler/stumbler.h | 38 | ||||
-rw-r--r-- | noncore/net/opiestumbler/stumblersettings.cpp | 35 | ||||
-rw-r--r-- | noncore/net/opiestumbler/stumblersettings.h | 22 | ||||
-rw-r--r-- | noncore/net/opiestumbler/stumblerstation.cpp | 21 | ||||
-rw-r--r-- | noncore/net/opiestumbler/stumblerstation.h | 18 |
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 ¶meters) +{ + 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 |