summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/wellenreiter/gui/configwindow.cpp16
-rw-r--r--noncore/net/wellenreiter/gui/graphwindow.cpp34
-rw-r--r--noncore/net/wellenreiter/gui/graphwindow.h26
-rw-r--r--noncore/net/wellenreiter/gui/logwindow.cpp12
-rw-r--r--noncore/net/wellenreiter/gui/mainwindow.cpp9
-rw-r--r--noncore/net/wellenreiter/gui/packetview.cpp16
-rw-r--r--noncore/net/wellenreiter/gui/protolistview.cpp10
-rw-r--r--noncore/net/wellenreiter/gui/resource.cpp8
-rw-r--r--noncore/net/wellenreiter/gui/scanlist.cpp61
-rw-r--r--noncore/net/wellenreiter/gui/wellenreiter.cpp70
-rw-r--r--noncore/net/wellenreiter/gui/wellenreiter.h5
-rw-r--r--noncore/net/wellenreiter/gui/wellenreiterbase.cpp2
-rw-r--r--noncore/net/wellenreiter/opie-wellenreiter.control2
-rw-r--r--noncore/net/wellenreiter/wellenreiter.pro1
14 files changed, 154 insertions, 118 deletions
diff --git a/noncore/net/wellenreiter/gui/configwindow.cpp b/noncore/net/wellenreiter/gui/configwindow.cpp
index ae149e2..1670f93 100644
--- a/noncore/net/wellenreiter/gui/configwindow.cpp
+++ b/noncore/net/wellenreiter/gui/configwindow.cpp
@@ -1,492 +1,496 @@
/**********************************************************************
** Copyright (C) 2002-2004 Michael 'Mickey' Lauer. All rights reserved.
**
** This file is part of Wellenreiter II.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
/* LOCAL */
#include "configwindow.h"
#include "mainwindow.h"
+#include "protolistview.h"
/* OPIE */
#include <opie2/onetwork.h>
#ifdef QWS
#include <opie2/oapplication.h>
#include <opie2/oconfig.h>
#include <opie2/odevice.h>
#include <opie2/odebug.h>
using namespace Opie::Core;
using namespace Opie::Net;
#endif
/* QT */
#include <qapplication.h>
#include <qcheckbox.h>
#include <qcombobox.h>
#include <qfile.h>
#include <qlineedit.h>
#include <qlayout.h>
#include <qmap.h>
#include <qpushbutton.h>
#include <qradiobutton.h>
#include <qspinbox.h>
#include <qtabwidget.h>
#include <qtoolbutton.h>
#include <qtextstream.h>
/* STD */
#include <assert.h>
WellenreiterConfigWindow* WellenreiterConfigWindow::_instance = 0;
WellenreiterConfigWindow::WellenreiterConfigWindow( QWidget * parent, const char * name, WFlags f )
:WellenreiterConfigBase( parent, name, true, f )
{
_devicetype[ "cisco" ] = DEVTYPE_CISCO;
_devicetype[ "wlan-ng" ] = DEVTYPE_WLAN_NG;
_devicetype[ "hostap" ] = DEVTYPE_HOSTAP;
_devicetype[ "orinoco" ] = DEVTYPE_ORINOCO;
_devicetype[ "<manual>" ] = DEVTYPE_MANUAL;
_devicetype[ "<file>" ] = DEVTYPE_FILE;
// gather possible interface names from ONetwork
ONetwork* net = ONetwork::instance();
ONetwork::InterfaceIterator it = net->iterator();
while ( it.current() )
{
if ( it.current()->isWireless() )
interfaceName->insertItem( it.current()->name() );
++it;
}
load();
#ifdef Q_WS_X11 // We're on X11: adding an Ok-Button for the Dialog here
QPushButton* okButton = new QPushButton( "ok", this );
okButton->show();
WellenreiterConfigBaseLayout->addWidget( okButton, 0, 3 ); //FIXME: rename this in configbase.ui
connect( okButton, SIGNAL( clicked() ), this, SLOT( accept() ) );
#endif
WellenreiterConfigWindow::_instance = this;
connect( deviceType, SIGNAL( activated(int) ), this, SLOT( changedDeviceType(int) ) );
connect( newNetworkAction, SIGNAL( activated(int) ), this, SLOT( changedNetworkAction(int) ) );
connect( newClientAction, SIGNAL( activated(int) ), this, SLOT( changedClientAction(int) ) );
connect( newStationAction, SIGNAL( activated(int) ), this, SLOT( changedStationAction(int) ) );
connect( getCaptureFileName, SIGNAL( clicked() ), this, SLOT( getCaptureFileNameClicked() ) );
// make the checkbox 'channelAll' control all other channels
connect( channelAll, SIGNAL( stateChanged(int) ), this, SLOT( channelAllClicked(int) ) );
connect( autodetect, SIGNAL( clicked() ), this, SLOT( performAutodetection() ) );
// hide tab4 (parse) until Wellenreiter 1.2
tab->removePage( tab_4 );
};
void WellenreiterConfigWindow::accept()
{
save();
QDialog::accept();
}
WellenreiterConfigWindow::~WellenreiterConfigWindow()
{
}
void WellenreiterConfigWindow::performAutodetection()
{
//TODO: insert modal splash screen here
// and sleep a second, so that it looks
// like we're actually doing something fancy... ;-)
odebug << "WellenreiterConfigWindow::performAutodetection()" << oendl;
// try to guess device type
QFile m( "/proc/modules" );
if ( m.open( IO_ReadOnly ) )
{
int devicetype(0);
QString line;
QTextStream modules( &m );
while( !modules.atEnd() && !devicetype )
{
modules >> line;
if ( line.contains( "cisco" ) ) devicetype = DEVTYPE_CISCO;
else if ( line.contains( "hostap" ) ) devicetype = DEVTYPE_HOSTAP;
else if ( line.contains( "prism" ) ) devicetype = DEVTYPE_WLAN_NG;
else if ( line.contains( "orinoco" ) ) devicetype = DEVTYPE_ORINOCO;
}
if ( devicetype )
{
deviceType->setCurrentItem( devicetype );
_guess = devicetype;
odebug << "Wellenreiter: guessed device type to be #" << devicetype << "" << oendl;
}
}
}
int WellenreiterConfigWindow::driverType() const
{
QString name = deviceType->currentText();
if ( _devicetype.contains( name ) )
{
return _devicetype[name];
}
else
{
return 0;
}
};
int WellenreiterConfigWindow::hoppingInterval() const
{
return hopInterval->cleanText().toInt();
}
bool WellenreiterConfigWindow::usePrismHeader() const
{
return prismHeader->isChecked();
}
bool WellenreiterConfigWindow::isChannelChecked( int channel ) const
{
switch ( channel )
{
case 1: return channel1->isOn();
case 2: return channel2->isOn();
case 3: return channel3->isOn();
case 4: return channel4->isOn();
case 5: return channel5->isOn();
case 6: return channel6->isOn();
case 7: return channel7->isOn();
case 8: return channel8->isOn();
case 9: return channel9->isOn();
case 10: return channel10->isOn();
case 11: return channel11->isOn();
case 12: return channel12->isOn();
case 13: return channel13->isOn();
case 14: return channel14->isOn();
+ default: return false;
}
+
+
}
void WellenreiterConfigWindow::changedDeviceType(int t)
{
if ( t != DEVTYPE_FILE ) return;
QString name = ( (WellenreiterMainWindow*) qApp->mainWidget() )->getFileName(false);
if ( !name.isEmpty() && QFile::exists( name ) )
{
interfaceName->insertItem( name );
interfaceName->setCurrentItem( interfaceName->count()-1 );
}
else
{
deviceType->setCurrentItem( _guess );
}
}
void WellenreiterConfigWindow::synchronizeActionsAndScripts()
{
if ( newNetworkAction->currentItem() == 4 ) newNetworkScript->show(); else newNetworkScript->hide();
if ( newClientAction->currentItem() == 4 ) newClientScript->show(); else newClientScript->hide();
if ( newStationAction->currentItem() == 4 ) newStationScript->show(); else newStationScript->hide();
//newNetworkScript->setEnabled( newNetworkAction->currentItem() == 4 );
//newClientScript->setEnabled( newClientAction->currentItem() == 4 );
//newStationScript->setEnabled( newStationAction->currentItem() == 4 );
}
-void WellenreiterConfigWindow::changedNetworkAction(int t)
+void WellenreiterConfigWindow::changedNetworkAction(int )
{
synchronizeActionsAndScripts();
}
-void WellenreiterConfigWindow::changedClientAction(int t)
+void WellenreiterConfigWindow::changedClientAction(int )
{
synchronizeActionsAndScripts();
}
-void WellenreiterConfigWindow::changedStationAction(int t)
+void WellenreiterConfigWindow::changedStationAction(int )
{
synchronizeActionsAndScripts();
}
void WellenreiterConfigWindow::getCaptureFileNameClicked()
{
QString name = ( (WellenreiterMainWindow*) qApp->mainWidget() )->getFileName(true);
odebug << "name = " << name << "" << oendl;
if ( !name.isEmpty() )
{
captureFileName->setText( name );
}
}
void WellenreiterConfigWindow::channelAllClicked(int state)
{
bool b = state;
channel1->setChecked( b );
channel2->setChecked( b );
channel3->setChecked( b );
channel4->setChecked( b );
channel5->setChecked( b );
channel6->setChecked( b );
channel7->setChecked( b );
channel8->setChecked( b );
channel9->setChecked( b );
channel10->setChecked( b );
channel11->setChecked( b );
channel12->setChecked( b );
channel13->setChecked( b );
channel14->setChecked( b );
}
bool WellenreiterConfigWindow::useGPS() const
{
return enableGPS->isChecked();
}
const QString WellenreiterConfigWindow::gpsHost() const
{
return useGPS() ? gpsdHost->currentText() : QString::null;
}
int WellenreiterConfigWindow::gpsPort() const
{
- bool ok;
return useGPS() ? gpsdPort->value() : -1;
}
void WellenreiterConfigWindow::performAction( const QString& type,
const QString& essid,
const QString& mac,
bool wep,
int channel,
- int signal
+ int /* signal */
/* , const GpsLocation& loc */ )
{
int action;
QString script;
if ( type == "network" )
{
action = newNetworkAction->currentItem();
script = newNetworkScript->text();
}
else if ( type == "managed" || type == "adhoc" )
{
action = newClientAction->currentItem();
script = newClientScript->text();
}
else if ( type == "station" )
{
action = newStationAction->currentItem();
script = newStationScript->text();
}
else
{
owarn << "WellenreiterConfigWindow::performAction(): unknown type '" << type << "'" << oendl;
return;
}
- odebug << "for event '" << (const char*) type << "' I'm going to perform action " << action << " (script='" << script << "')" << oendl;
+ odebug << "for event '" << type << "' I'm going to perform action " << action << " (script='" << script << "')" << oendl;
switch( action )
{
case 0: /* Ignore */ return;
case 1: /* Play Alarm */ ODevice::inst()->playAlarmSound(); return;
case 2: /* Play Click */ ODevice::inst()->playTouchSound(); return;
case 3: /* Blink LED */ break; //FIXME: Implement this
case 4: /* Run Script */
{
/**
*
* Script Substitution Information:
*
* $SSID = SSID
* $MAC = MAC
* $WEP = Wep
* $CHAN = Channel
*
**/
script = script.replace( QRegExp( "$SSID" ), essid );
script = script.replace( QRegExp( "$MAC" ), mac );
script = script.replace( QRegExp( "$WEP" ), wep ? QString( "true" ) : QString( "false" ) );
script = script.replace( QRegExp( "$CHAN" ), QString::number( channel ) );
odebug << "going to call script '" << script << "'" << oendl;
::system( script );
odebug << "script returned." << oendl;
return;
}
default: assert( false );
}
}
void WellenreiterConfigWindow::load()
{
#ifdef Q_WS_X11
#warning Persistent Configuration not yet implemented for standalone X11 build
performAutodetection();
#else
odebug << "loading configuration settings..." << oendl;
/* This is dumb monkey typing stuff... We _need_ to do this automatically! */
OConfig* c = oApp->config();
c->setGroup( "Interface" );
QString interface = c->readEntry( "name", "<none>" );
if ( interface != "<none>" )
{
#if QT_VERSION < 300
interfaceName->insertItem( interface, 0 );
interfaceName->setCurrentItem( 0 );
#else
interfaceName->setCurrentText( interface );
#endif
QString device = c->readEntry( "type", "<select>" );
#if QT_VERSION < 300
for ( int i = 0; i < deviceType->count(); ++i )
{
if ( deviceType->text( i ) == device )
{
deviceType->setCurrentItem( i );
break;
}
}
#else
deviceType->setCurrentText( device );
#endif
}
else
{
performAutodetection();
}
prismHeader->setChecked( c->readBoolEntry( "prism", false ) );
hopChannels->setChecked( c->readBoolEntry( "hop", true ) );
hopInterval->setValue( c->readNumEntry( "interval", 250 ) );
adaptiveHopping->setChecked( c->readBoolEntry( "adaptive", true ) );
c->setGroup( "Capture" );
writeCaptureFile->setChecked( c->readBoolEntry( "writeCaptureFile", true ) );
captureFileName->setEnabled( writeCaptureFile->isChecked() );
getCaptureFileName->setEnabled( writeCaptureFile->isChecked() );
+ parsePackets->setEnabled( writeCaptureFile->isChecked() );
captureFileName->setText( c->readEntry( "filename", "/tmp/capture" ) );
hexViewBufferUnlimited->setChecked( c->readBoolEntry( "hexViewBufferUnlimited", true ) );
hexViewBufferLimited->setChecked( !c->readBoolEntry( "hexViewBufferUnlimited", true ) );
hexViewBufferSize->setValue( c->readNumEntry( "hexViewBufferSize", 2000 ) );
c->setGroup( "UI" );
lookupVendor->setChecked( c->readBoolEntry( "lookupVendor", true ) );
openTree->setChecked( c->readBoolEntry( "openTree", true ) );
disablePM->setChecked( c->readBoolEntry( "disablePM", true ) );
newNetworkAction->setCurrentItem( c->readNumEntry( "newNetworkAction", 1 ) ); // Default: Play Alarm
newNetworkScript->setText( c->readEntry( "newNetworkScript", "" ) );
newClientAction->setCurrentItem( c->readNumEntry( "newClientAction", 2 ) ); // Default: Play Click
newClientScript->setText( c->readEntry( "newClientScript", "" ) );
newStationAction->setCurrentItem( c->readNumEntry( "newStationAction", 2 ) ); // Default: Play Click
newStationScript->setText( c->readEntry( "newStationScript", "" ) );
synchronizeActionsAndScripts(); // needed for showing/hiding the script QLineEdit on demand
c->setGroup( "GPS" );
enableGPS->setChecked( c->readBoolEntry( "use", false ) );
#if QT_VERSION < 300
gpsdHost->insertItem( c->readEntry( "host", "localhost" ), 0 );
gpsdHost->setCurrentItem( 0 );
#else
gpsdHost->setCurrentText( c->readEntry( "host", "localhost" ) );
#endif
gpsdPort->setValue( c->readNumEntry( "port", 2947 ) );
startGPS->setChecked( c->readBoolEntry( "start", false ) );
commandGPS->setText( c->readEntry( "command", "gpsd -p /dev/ttyS3 -s 57600" ) );
#endif
}
void WellenreiterConfigWindow::save()
{
#ifdef Q_WS_X11
#warning Persistent Configuration not yet implemented for standalone X11 build
#else
odebug << "saving configuration settings..." << oendl;
/* This is dumb monkey typing stuff... We _need_ to do this automatically! */
OConfig* c = oApp->config();
c->setGroup( "Interface" );
c->writeEntry( "name", interfaceName->currentText() );
c->writeEntry( "type", deviceType->currentText() );
c->writeEntry( "prism", prismHeader->isChecked() );
c->writeEntry( "hop", hopChannels->isChecked() );
c->writeEntry( "interval", hopInterval->value() );
c->writeEntry( "adaptive", adaptiveHopping->isChecked() );
c->setGroup( "Capture" );
c->writeEntry( "writeCaptureFile", writeCaptureFile->isChecked() );
c->writeEntry( "filename", captureFileName->text() );
c->writeEntry( "hexViewBufferUnlimited", hexViewBufferUnlimited->isChecked() );
c->writeEntry( "hexViewBufferSize", hexViewBufferSize->value() );
c->setGroup( "UI" );
c->writeEntry( "lookupVendor", lookupVendor->isChecked() );
c->writeEntry( "openTree", openTree->isChecked() );
c->writeEntry( "disablePM", disablePM->isChecked() );
c->writeEntry( "newNetworkAction", newNetworkAction->currentItem() );
c->writeEntry( "newNetworkScript", newNetworkScript->text() );
c->writeEntry( "newClientAction", newClientAction->currentItem() );
c->writeEntry( "newClientScript", newClientScript->text() );
c->writeEntry( "newStationAction", newStationAction->currentItem() );
c->writeEntry( "newStationScript", newStationScript->text() );
c->setGroup( "GPS" );
c->writeEntry( "use", enableGPS->isChecked() );
c->writeEntry( "host", gpsdHost->currentText() );
c->writeEntry( "port", gpsdPort->value() );
c->writeEntry( "start", startGPS->isChecked() );
c->writeEntry( "command", commandGPS->text() );
c->write();
#endif
}
int WellenreiterConfigWindow::hexViewBuffer() const
{
return hexViewBufferUnlimited->isChecked() ? -1 : hexViewBufferSize->value();
}
diff --git a/noncore/net/wellenreiter/gui/graphwindow.cpp b/noncore/net/wellenreiter/gui/graphwindow.cpp
index b4174d3..d53421c 100644
--- a/noncore/net/wellenreiter/gui/graphwindow.cpp
+++ b/noncore/net/wellenreiter/gui/graphwindow.cpp
@@ -1,187 +1,211 @@
/**********************************************************************
** Copyright (C) 2002-2004 Michael 'Mickey' Lauer. All rights reserved.
**
** This file is part of Wellenreiter II.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#include "graphwindow.h"
#include <qpainter.h>
#include <qpixmap.h>
#include <qtimer.h>
+/* XPM */
+static char * background[] = {
+"16 16 6 1",
+" c None",
+". c #52676E",
+"+ c #3F545B",
+"@ c #394E56",
+"# c #2F454C",
+"$ c #364B52",
+".+++++++++++++++",
+"@###############",
+"+$$$$$$$$$$$$$$$",
+"@###############",
+"+$$$$$$$$$$$$$$$",
+"@###############",
+"+$$$$$$$$$$$$$$$",
+"@###############",
+"+$$$$$$$$$$$$$$$",
+"@###############",
+"+$$$$$$$$$$$$$$$",
+"@###############",
+"+$$$$$$$$$$$$$$$",
+"@###############",
+"+$$$$$$$$$$$$$$$",
+"@###############"};
+
+
MFrequencySpectrum::MFrequencySpectrum( int channels, QWidget* parent, const char* name, WFlags f)
:QWidget( parent, name,f ), _channels( channels )
{
_values = new int[_channels];
_dirty = new bool[_channels];
for ( int i = 0; i < channels; ++i )
{ _values[i] = 0;
_dirty[i] = true;
}
// we draw everything on our own
setBackgroundMode( QWidget::NoBackground );
}
void MFrequencySpectrum::drawTopLine( QPainter* p, int x, int y, int width, const QColor& c )
{
p->setPen( c.light() );
p->drawLine( x, y, x+width-1, y );
}
void MFrequencySpectrum::drawBottomLine( QPainter* p, int x, int y, int width, const QColor& c )
{
p->setPen( c.dark() );
p->drawLine( x, y, x+width-1, y );
}
void MFrequencySpectrum::drawLine( QPainter* p, int x, int y, int width, const QColor& c )
{
p->setPen( c.light() );
p->drawPoint( x++, y );
p->setPen( c );
p->drawLine( x, y, x+width-2, y );
p->setPen( c.dark() );
p->drawPoint( x+width-1, y );
}
void MFrequencySpectrum::drawBar( QPainter* p, int x, int y, int width, int height, int maxheight )
{
int h1 = 133; int h2 = 0;
int s1 = 200; int s2 = 255;
int v1 = 140; int v2 = 255;
/*int h1 = 196; int h2 = 194;
int s1 = 85; int s2 = 15;
int v1 = 95; int v2 = 237;*/
QColor c( 120, 60, 200 );
for ( int i = 0; i < height; ++i )
{
int h = (h2-h1)*i/maxheight + h1;
int s = (s2-s1)*i/maxheight + s1;
int v = (v2-v1)*i/maxheight + v1;
if ( i == 0 )
drawBottomLine( p, x, y-i, width, QColor( h,s,v, QColor::Hsv ) );
else if ( i == height-1 )
drawTopLine( p, x, y-i, width, QColor( h,s,v, QColor::Hsv ) );
else
drawLine( p, x, y-i, width, QColor( h,s,v, QColor::Hsv ) );
}
}
-void MFrequencySpectrum::paintEvent( QPaintEvent* e )
+void MFrequencySpectrum::paintEvent( QPaintEvent* )
{
QPixmap pm( size() );
QPainter p;
p.begin( &pm );
p.drawTiledPixmap( 0, 0, size().width(), size().height(), QPixmap( (const char**) &background ) );
int xmargin = 5;
int ymargin = 2;
int y = size().height() - 2 * ymargin;
int x = 0;
int width = ( size().width() - 2 * xmargin ) / _channels;
for ( int i = 0; i < _channels; ++i )
{
if ( _dirty[i] )
{
drawBar( &p, xmargin + x, y - ymargin, width-3, _values[i]*y/100, y );
_dirty[i] = false;
}
x+= width;
}
p.end();
bitBlt( this, 0, 0, &pm );
}
void MFrequencySpectrum::mousePressEvent( QMouseEvent* e )
{
int xmargin = 5;
int ymargin = 2;
int y = size().height() - 2 * ymargin;
- int x = 0;
int width = ( size().width() - 2 * xmargin ) / _channels;
QPoint pos = e->pos();
int channel = ( pos.x()-xmargin ) / width;
int height = 100 - ( pos.y()-ymargin )*100/y;
if ( channel < 15 ) _values[channel] = height;
}
Legende::Legende( int channels, QWidget* parent, const char* name, WFlags f )
:QFrame( parent, name, f ), _channels( channels )
{
setLineWidth( 2 );
setFrameStyle( Panel + Sunken );
setFixedHeight( 16 );
}
void Legende::drawContents( QPainter* p )
{
int xmargin = 5;
- int ymargin = 2;
- int x = 0;
int width = ( contentsRect().width() - 2 * xmargin ) / _channels;
for ( int i = 0; i < _channels; ++i )
p->drawText( xmargin + (width*i), 12, QString().sprintf( "%02d", i+1 ) );
}
MGraphWindow::MGraphWindow( QWidget* parent, const char* name, WFlags f )
:QVBox( parent, name, f )
{
spectrum = new MFrequencySpectrum( 14, this );
legende = new Legende( 14, this );
startTimer( 50 );
};
void MGraphWindow::testGraph()
{
static int i = 0;
spectrum->setValue( i++, 100 );
if ( i == 14 ) i = 0;
QTimer::singleShot( 2000, this, SLOT( testGraph() ) );
}
-void MGraphWindow::timerEvent( QTimerEvent* e )
+void MGraphWindow::timerEvent( QTimerEvent* )
{
for ( int i = 0; i < 14; i++ )
{
spectrum->decrease( i, 1 );
}
spectrum->repaint();
}
void MGraphWindow::traffic( int channel, int signal )
{
spectrum->setValue( channel-1, signal );
}
diff --git a/noncore/net/wellenreiter/gui/graphwindow.h b/noncore/net/wellenreiter/gui/graphwindow.h
index fafcab1..392d85b 100644
--- a/noncore/net/wellenreiter/gui/graphwindow.h
+++ b/noncore/net/wellenreiter/gui/graphwindow.h
@@ -1,121 +1,95 @@
/**********************************************************************
** Copyright (C) 2002-2004 Michael 'Mickey' Lauer. All rights reserved.
**
** This file is part of Wellenreiter II.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#ifndef GRAPHWINDOW_H
#define GRAPHWINDOW_H
#include <qwidget.h>
#include <qvbox.h>
class MFrequencySpectrum : public QWidget
{
public:
MFrequencySpectrum( int channels, QWidget* parent = 0, const char* name = "MFrequencySpectrum", WFlags f = 0 );
int value( int channel ) const { return _values[channel]; };
void setValue( int channel, int value )
{
if ( value > _values[channel] )
{
_values[channel] = value;
_dirty[channel] = true;
}
};
void decrease( int channel, int amount )
{
if ( _values[channel] >= amount )
{
_values[channel] -= amount;
_dirty[channel] = true;
}
};
protected:
virtual void paintEvent( QPaintEvent* );
virtual void mousePressEvent( QMouseEvent* );
void drawLine( QPainter* p, int x, int y, int width, const QColor& c );
void drawTopLine( QPainter* p, int x, int y, int width, const QColor& c );
void drawBottomLine( QPainter* p, int x, int y, int width, const QColor& c );
void MFrequencySpectrum::drawBar( QPainter* p, int x, int y, int width, int height, int maxheight );
private:
int _channels;
int* _values;
bool* _dirty;
};
class Legende : public QFrame
{
public:
Legende( int channels, QWidget* parent = 0, const char* name = "Legende", WFlags f = 0 );
protected:
virtual void drawContents( QPainter* );
private:
int _channels;
};
class MGraphWindow : public QVBox
{
Q_OBJECT
public:
MGraphWindow( QWidget* parent = 0, const char* name = "MGraphWindow", WFlags f = 0 );
void traffic( int channel, int signal );
protected:
virtual void timerEvent( QTimerEvent* e );
protected slots:
virtual void testGraph();
protected:
MFrequencySpectrum* spectrum;
Legende* legende;
};
-/* XPM */
-static char * background[] = {
-"16 16 6 1",
-" c None",
-". c #52676E",
-"+ c #3F545B",
-"@ c #394E56",
-"# c #2F454C",
-"$ c #364B52",
-".+++++++++++++++",
-"@###############",
-"+$$$$$$$$$$$$$$$",
-"@###############",
-"+$$$$$$$$$$$$$$$",
-"@###############",
-"+$$$$$$$$$$$$$$$",
-"@###############",
-"+$$$$$$$$$$$$$$$",
-"@###############",
-"+$$$$$$$$$$$$$$$",
-"@###############",
-"+$$$$$$$$$$$$$$$",
-"@###############",
-"+$$$$$$$$$$$$$$$",
-"@###############"};
-
#endif
diff --git a/noncore/net/wellenreiter/gui/logwindow.cpp b/noncore/net/wellenreiter/gui/logwindow.cpp
index 714a9a9..a83f700 100644
--- a/noncore/net/wellenreiter/gui/logwindow.cpp
+++ b/noncore/net/wellenreiter/gui/logwindow.cpp
@@ -1,60 +1,58 @@
/**********************************************************************
** Copyright (C) 2002-2004 Michael 'Mickey' Lauer. All rights reserved.
**
** This file is part of Wellenreiter II.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#include "logwindow.h"
/* OPIE */
#include <opie2/odebug.h>
using namespace Opie::Core;
/* QT */
#include <qmultilineedit.h>
#include <qdatetime.h>
MLogWindow* MLogWindow::_instance;
MLogWindow::MLogWindow( QWidget * parent, const char * name, WFlags f )
:QVBox( parent, name, f )
{
ledit = new QMultiLineEdit( this );
ledit->setReadOnly( true );
+ ledit->setUndoEnabled( false );
+
MLogWindow::_instance = this;
}
void MLogWindow::log( QString text )
{
QTime time = QTime::currentTime();
- QString line;
- line.sprintf( "[%s] %s\n", (const char*) time.toString(), (const char*) text );
- int col;
- int row;
- ledit->getCursorPosition( &col, &row );
- ledit->insertAt( line, col, row );
- odebug << line << oendl;
+ QString line = QString( "[%1] %2\n" ).arg(time.toString() ).arg( text );
+ ledit->insertLine( line );
+ odebug << line << oendl;
}
void MLogWindow::clear()
{
ledit->clear();
}
const QString MLogWindow::getLog() const
{
return ledit->text();
}
diff --git a/noncore/net/wellenreiter/gui/mainwindow.cpp b/noncore/net/wellenreiter/gui/mainwindow.cpp
index ef7ffcf..3e18531 100644
--- a/noncore/net/wellenreiter/gui/mainwindow.cpp
+++ b/noncore/net/wellenreiter/gui/mainwindow.cpp
@@ -1,251 +1,252 @@
/**********************************************************************
** Copyright (C) 2002-2004 Michael 'Mickey' Lauer. All rights reserved.
**
** This file is part of Wellenreiter II.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#include "configwindow.h"
#include "gps.h"
#include "logwindow.h"
#include "packetview.h"
#include "mainwindow.h"
#include "wellenreiter.h"
#include "scanlist.h"
/* OPIE */
#ifdef QWS
#include <qpe/resource.h>
#include <opie2/odebug.h>
#include <opie2/ofiledialog.h>
#else
#include "resource.h"
#include <qapplication.h>
#include <qfiledialog.h>
#endif
-using namespace Opie::Core;
-using namespace Opie::Net;
-using namespace Opie::Ui;
/* QT */
#include <qcombobox.h>
#include <qdatastream.h>
#include <qfile.h>
#include <qfileinfo.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qlineedit.h>
#include <qiconset.h>
#include <qmenubar.h>
#include <qmessagebox.h>
#include <qpopupmenu.h>
#include <qpushbutton.h>
#include <qstatusbar.h>
#include <qspinbox.h>
#include <qtextstream.h>
#include <qtoolbutton.h>
#include <qwhatsthis.h>
/* STD */
#include <unistd.h>
+using namespace Opie::Core;
+using namespace Opie::Net;
+using namespace Opie::Ui;
+
WellenreiterMainWindow::WellenreiterMainWindow( QWidget * parent, const char * name, WFlags f )
:QMainWindow( parent, name, f )
{
cw = new WellenreiterConfigWindow( this );
mw = new Wellenreiter( this );
mw->setConfigWindow( cw );
setCentralWidget( mw );
// setup application icon
setIcon( Resource::loadPixmap( "wellenreiter/appicon-trans" ) );
#ifndef QWS
setIconText( "Wellenreiter/X11" );
#endif
// setup tool buttons
startButton = new QToolButton( 0 );
QWhatsThis::add( startButton, tr( "Click here to start scanning." ) );
#ifdef QWS
startButton->setAutoRaise( true );
#endif
startButton->setIconSet( Resource::loadIconSet( "wellenreiter/SearchIcon" ) );
startButton->setEnabled( false );
connect( startButton, SIGNAL( clicked() ), mw, SLOT( startClicked() ) );
stopButton = new QToolButton( 0 );
QWhatsThis::add( stopButton, tr( "Click here to stop scanning." ) );
#ifdef QWS
stopButton->setAutoRaise( true );
#endif
stopButton->setIconSet( Resource::loadIconSet( "wellenreiter/CancelIcon" ) );
stopButton->setEnabled( false );
connect( stopButton, SIGNAL( clicked() ), mw, SLOT( stopClicked() ) );
QToolButton* d = new QToolButton( 0 );
QWhatsThis::add( d, tr( "Click here to open the configure dialog." ) ),
#ifdef QWS
d->setAutoRaise( true );
#endif
d->setIconSet( Resource::loadIconSet( "wellenreiter/SettingsIcon" ) );
connect( d, SIGNAL( clicked() ), this, SLOT( showConfigure() ) );
uploadButton = new QToolButton( 0 );
QWhatsThis::add( uploadButton, tr( "Click here to upload a capture session." ) );
#ifdef QWS
uploadButton->setAutoRaise( true );
#endif
uploadButton->setIconSet( Resource::loadIconSet( "up" ) );
uploadButton->setEnabled( false );
//uploadButton->setEnabled( true ); // DEBUGGING
connect( uploadButton, SIGNAL( clicked() ), this, SLOT( uploadSession() ) );
// setup menu bar
int id;
QMenuBar* mb = menuBar();
QPopupMenu* fileSave = new QPopupMenu( mb );
fileSave->insertItem( tr( "&Session..." ), this, SLOT( fileSaveSession() ) );
fileSave->insertItem( tr( "&Text Log..." ), this, SLOT( fileSaveLog() ) );
fileSave->insertItem( tr( "&Hex Log..." ), this, SLOT( fileSaveHex() ) );
QPopupMenu* fileLoad = new QPopupMenu( mb );
fileLoad->insertItem( tr( "&Session..." ), this, SLOT( fileLoadSession() ) );
//fileLoad->insertItem( "&Log", this, SLOT( fileLoadLog() ) );
QPopupMenu* file = new QPopupMenu( mb );
file->insertItem( tr( "&New" ), this, SLOT( fileNew() ) );
id = file->insertItem( tr( "&Load" ), fileLoad );
file->insertItem( tr( "&Save" ), fileSave );
file->insertSeparator();
uploadID = file->insertItem( tr( "&Upload Session" ), this, SLOT( uploadSession() ) );
file->insertSeparator();
file->insertItem( tr( "&Exit" ), qApp, SLOT( quit() ) );
QPopupMenu* sniffer = new QPopupMenu( mb );
sniffer->insertItem( tr( "&Configure..." ), this, SLOT( showConfigure() ) );
sniffer->insertSeparator();
startID = sniffer->insertItem( tr( "&Start" ), mw, SLOT( startClicked() ) );
sniffer->setItemEnabled( startID, false );
stopID = sniffer->insertItem( tr( "Sto&p" ), mw, SLOT( stopClicked() ) );
sniffer->setItemEnabled( stopID, false );
QPopupMenu* view = new QPopupMenu( mb );
view->insertItem( tr( "&Expand All" ), this, SLOT( viewExpandAll() ) );
view->insertItem( tr( "&Collapse All" ), this, SLOT( viewCollapseAll() ) );
QPopupMenu* demo = new QPopupMenu( mb );
demo->insertItem( tr( "&Add something" ), this, SLOT( demoAddStations() ) );
//demo->insertItem( tr( "&Read from GPSd" ), this, SLOT( demoReadFromGps() ) );
id = mb->insertItem( tr( "&File" ), file );
id = mb->insertItem( tr( "&View" ), view );
//mb->setItemEnabled( id, false );
id = mb->insertItem( tr( "&Sniffer" ), sniffer );
id = mb->insertItem( tr( "&Demo" ), demo );
mb->setItemEnabled( id, true );
mb->setItemEnabled( uploadID, false );
#ifdef QWS
mb->insertItem( startButton );
mb->insertItem( stopButton );
mb->insertItem( uploadButton );
mb->insertItem( d );
#else // Qt3 changed the insertion order. It's now totally random :(
mb->insertItem( d );
mb->insertItem( uploadButton );
mb->insertItem( stopButton );
mb->insertItem( startButton );
#endif
updateToolButtonState();
// setup status bar (for now only on X11)
#ifndef QWS
statusBar()->message( tr( "Ready." ) );
#endif
connect( mw, SIGNAL( startedSniffing() ), this, SLOT( changedSniffingState() ) );
connect( mw, SIGNAL( stoppedSniffing() ), this, SLOT( changedSniffingState() ) );
};
void WellenreiterMainWindow::showConfigure()
{
odebug << "show configure..." << oendl;
cw->setCaption( tr( "Configure" ) );
int result = QPEApplication::execDialog( cw );
if ( result ) updateToolButtonState();
}
void WellenreiterMainWindow::updateToolButtonState()
{
const QString& interface = cw->interfaceName->currentText();
const int cardtype = cw->driverType();
if ( ( interface != "<select>" ) && ( cardtype != 0 ) )
{
startButton->setEnabled( true );
menuBar()->setItemEnabled( startID, true );
}
else
{
startButton->setEnabled( false );
menuBar()->setItemEnabled( startID, false );
}
}
void WellenreiterMainWindow::changedSniffingState()
{
startButton->setEnabled( !mw->sniffing );
menuBar()->setItemEnabled( startID, !mw->sniffing );
stopButton->setEnabled( mw->sniffing );
menuBar()->setItemEnabled( stopID, mw->sniffing );
if ( !mw->sniffing && QFile::exists( mw->dumpname ) )
{
menuBar()->setItemEnabled( uploadID, true );
uploadButton->setEnabled( true );
}
}
WellenreiterMainWindow::~WellenreiterMainWindow()
{
odebug << "Wellenreiter: bye." << oendl;
};
void WellenreiterMainWindow::demoAddStations()
{
//mw = 0; // test SIGSEGV handling
mw->netView()->addNewItem( "managed", "Vanille", OMacAddress::fromString("00:00:20:EF:A6:43"), true, 6, 80, GpsLocation( 39.8794, -94.0936) );
mw->netView()->addNewItem( "managed", "Vanille", OMacAddress::fromString("00:30:6D:EF:A6:23"), true, 11, 10, GpsLocation( 0.0, 0.0 ) );
mw->netView()->addNewItem( "adhoc", "ELAN", OMacAddress::fromString("00:03:F8:E7:16:22"), false, 3, 10, GpsLocation( 5.5, 2.3 ) );
mw->netView()->addNewItem( "adhoc", "ELAN", OMacAddress::fromString("00:04:01:E7:56:62"), false, 3, 15, GpsLocation( 2.3, 5.5 ) );
mw->netView()->addNewItem( "adhoc", "ELAN", OMacAddress::fromString("00:05:8E:E7:56:E2"), false, 3, 20, GpsLocation( -10.0, -20.5 ) );
}
void WellenreiterMainWindow::demoReadFromGps()
@@ -279,304 +280,304 @@ QString WellenreiterMainWindow::getFileName( bool save )
str = QFileDialog::getSaveFileName();
#endif
if ( str.isEmpty() /*|| QFileInfo(str).isDir()*/ )
return "";
}
else
{
#ifdef QWS
str = OFileDialog::getOpenFileName( 2, "/", QString::null, map );
#else
str = QFileDialog::getOpenFileName();
#endif
if ( str.isEmpty() || !QFile(str).exists() || QFileInfo(str).isDir() )
return "";
}
return str;
}
void WellenreiterMainWindow::fileSaveLog()
{
QString fname = getFileName( true );
if ( !fname.isEmpty() )
{
QFile f( fname );
if ( f.open(IO_WriteOnly) )
{
QTextStream t( &f );
t << mw->logWindow()->getLog();
f.close();
odebug << "Saved log to file '" << fname << "'" << oendl;
}
else
{
odebug << "Problem saving log to file '" << fname << "'" << oendl;
}
}
}
void WellenreiterMainWindow::fileSaveSession()
{
QString fname = getFileName( true );
if ( !fname.isEmpty() )
{
QFile f( fname );
if ( f.open(IO_WriteOnly) )
{
QDataStream t( &f );
t << *mw->netView();
f.close();
odebug << "Saved session to file '" << fname << "'" << oendl;
}
else
{
odebug << "Problem saving session to file '" << fname << "'" << oendl;
}
}
}
void WellenreiterMainWindow::fileSaveHex()
{
#warning DOES NOT WORK AT THE MOMENT
/*
QString fname = getFileName( true );
if ( !fname.isEmpty() )
{
QFile f( fname );
if ( f.open(IO_WriteOnly) )
{
QTextStream t( &f );
t << mw->hexWindow()->getLog();
f.close();
odebug << "Saved hex log to file '" << fname << "'" << oendl;
}
else
{
odebug << "Problem saving hex log to file '" << fname << "'" << oendl;
}
}
*/
}
void WellenreiterMainWindow::fileLoadSession()
{
QString fname = getFileName( false );
if ( !fname.isEmpty() )
{
QFile f( fname );
if ( f.open(IO_ReadOnly) )
{
QDataStream t( &f );
t >> *mw->netView();
f.close();
odebug << "Loaded session from file '" << fname << "'" << oendl;
}
else
{
odebug << "Problem loading session from file '" << fname << "'" << oendl;
}
}
}
void WellenreiterMainWindow::fileNew()
{
mw->netView()->clear();
mw->logWindow()->clear();
mw->hexWindow()->clear();
}
void WellenreiterMainWindow::closeEvent( QCloseEvent* e )
{
if ( mw->isDaemonRunning() )
{
QMessageBox::warning( this, "Wellenreiter/Opie",
tr( "Sniffing in progress!\nPlease stop sniffing before closing." ) );
e->ignore();
}
else
{
QMainWindow::closeEvent( e );
}
}
static const char* CAP_hostname = "www.vanille.de";
#include <netdb.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
void WellenreiterMainWindow::uploadSession()
{
QLineEdit* from;
QLineEdit* location;
QLineEdit* comments;
QPushButton* accept;
QPushButton* reject;
QDialog* d = new QDialog( 0, "session upload", true );
d->setCaption( tr( "Upload Session" ) );
QGridLayout* g = new QGridLayout( d, 4, 2, 3 );
g->addWidget( new QLabel( tr( "From: " ), d ), 0, 0 );
g->addWidget( from = new QLineEdit( d ), 0, 1 );
g->addWidget( new QLabel( tr( "Location: " ), d ), 1, 0 );
g->addWidget( location = new QLineEdit( d ), 1, 1 );
g->addWidget( new QLabel( tr( "Comments: " ), d ), 2, 0 );
g->addWidget( comments = new QLineEdit( d ), 2, 1 );
g->addWidget( accept = new QPushButton( tr( "&Ok" ), d ), 3, 0 );
g->addWidget( reject = new QPushButton( tr( "&Cancel" ), d ), 3, 1 );
accept->setDefault( true );
accept->setAutoDefault( true );
from->setText( "WL II User" );
location->setText( "WL II Location" );
comments->setText( "No Comments." );
connect( accept, SIGNAL( clicked() ), d, SLOT( accept() ) );
connect( reject, SIGNAL( clicked() ), d, SLOT( reject() ) );
int result = d->exec();
if ( !result )
{
odebug << "Session upload cancelled :(" << oendl;
return;
}
odebug << "Starting upload..." << oendl;
struct sockaddr_in raddr;
struct hostent *rhost_info;
int sock = -1;
bool ok = false;
rhost_info = (struct hostent *) ::gethostbyname( CAP_hostname );
if ( rhost_info )
{
if ( !QFile::exists( mw->captureFileName() ) )
{
QMessageBox::warning( 0, tr( "Error" ), tr( "<p>Logfile '%1' doesn't exist</p>").arg( mw->captureFileName() ) );
return;
}
QFile f( mw->captureFileName() );
if ( !f.open( IO_ReadOnly ) )
{
QMessageBox::warning( 0, tr( "Error" ), tr( "<p>Can't open Logfile '%1'</p>").arg( mw->captureFileName() ) );
return;
}
- int content_length = f.size();
+// int content_length = f.size();
::memset( &raddr, 0, sizeof (struct sockaddr_in) );
::memcpy( &raddr. sin_addr, rhost_info-> h_addr, rhost_info-> h_length );
raddr.sin_family = rhost_info-> h_addrtype;
raddr.sin_port = htons ( 80 );
sock = ::socket( AF_INET, SOCK_STREAM, 0 );
if ( sock >= 0 )
{
if ( ::connect ( sock, (struct sockaddr *) & raddr, sizeof (struct sockaddr)) >= 0 )
{
QString header;
QString content;
QString preambel;
header = ""
"POST /projects/capturedump.spy HTTP/1.1\r\n"
"Host: www.vanille.de\r\n"
"User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20031010 Galeon/1.3.10\r\n"
"Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1\r\n"
"Accept-Language: en\r\n"
"Accept-Encoding: gzip, deflate, compress;q=0.9\r\n"
"Accept-Charset: us-ascii,utf-8;q=0.7,*;q=0.7\r\n"
"Keep-Alive: 300\r\n"
"Connection: keep-alive\r\n"
"Referer: http://www.vanille.de/projects/capturedump.spy\r\n"
"Content-Type: multipart/form-data; boundary=---------------------------97267758015830030481215568065\r\n"
"Content-Length: %1\r\n"
"\r\n";
content = ""
"-----------------------------97267758015830030481215568065\r\n"
"Content-Disposition: form-data; name=\"Name\"\r\n"
"\r\n"
"%1\r\n"
"-----------------------------97267758015830030481215568065\r\n"
"Content-Disposition: form-data; name=\"Location\"\r\n"
"\r\n"
"%2\r\n"
"-----------------------------97267758015830030481215568065\r\n"
"Content-Disposition: form-data; name=\"Comments\"\r\n"
"\r\n"
"%3\r\n"
"-----------------------------97267758015830030481215568065\r\n"
"Content-Disposition: form-data; name=\"upfile\"; filename=\"%4\"\r\n"
"Content-Type: application/octet-stream\r\n"
"\r\n";
preambel = ""
"\r\n-----------------------------97267758015830030481215568065--\r\n";
content = content.arg( from->text().isEmpty() ? QString( "Anonymous Wellenreiter II User" ) : from->text() );
content = content.arg( location->text().isEmpty() ? QString( "Anonymous Wellenreiter II Location" ) : location->text() );
content = content.arg( comments->text().isEmpty() ? QString( "Anonymous Wellenreiter II Comments" ) : comments->text() );
content = content.arg( mw->captureFileName() );
header = header.arg( QString::number( content.length() + f.size() + preambel.length() ) );
// write header
const char* ascii = header.latin1();
uint ascii_len = ::strlen( ascii );
::write ( sock, ascii, ascii_len );
// write fixed content
ascii = content.latin1();
ascii_len = ::strlen( ascii );
::write ( sock, ascii, ascii_len );
// write variable content
char ch;
while ( !f.atEnd() )
{
f.readBlock( &ch, 1 );
::write ( sock, &ch, 1 );
}
// write preambel
ascii = preambel.latin1();
ascii_len = ::strlen( ascii );
::write ( sock, ascii, ascii_len );
// done!
ok = true;
}
}
::close ( sock );
}
if ( ok )
QMessageBox::information( 0, tr( "Success" ),
QString ( "<p>%1</p>" ).arg( tr( "Capture Dump was uploaded to %1" ) ).arg( CAP_hostname ) );
else
QMessageBox::warning( 0, tr( "Error" ),
QString ( "<p>%1</p>" ).arg ( tr( "Connection to %1 failed" ) ).arg( CAP_hostname ) );
}
void WellenreiterMainWindow::viewExpandAll()
{
mw->netView()->expand();
}
void WellenreiterMainWindow::viewCollapseAll()
{
mw->netView()->collapse();
}
diff --git a/noncore/net/wellenreiter/gui/packetview.cpp b/noncore/net/wellenreiter/gui/packetview.cpp
index 69438fa..d71111f 100644
--- a/noncore/net/wellenreiter/gui/packetview.cpp
+++ b/noncore/net/wellenreiter/gui/packetview.cpp
@@ -1,153 +1,165 @@
/**********************************************************************
** Copyright (C) 2002-2004 Michael 'Mickey' Lauer. All rights reserved.
**
** This file is part of Wellenreiter II.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#include "packetview.h"
/* OPIE */
#include <opie2/opcap.h>
#include <opie2/odebug.h>
#include <opie2/olistview.h>
#include <opie2/oapplication.h>
/* QT */
#include <qfont.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qlist.h>
#include <qlistview.h>
#include <qobjectlist.h>
#include <qspinbox.h>
#include <qtextview.h>
using namespace Opie::Net;
using namespace Opie::Core;
using namespace Opie::Ui;
PacketView::PacketView( QWidget * parent, const char * name, WFlags f )
:QFrame( parent, name, f )
{
_number = new QSpinBox( this );
_number->setPrefix( "Pkt# " );
_label = new QLabel( this );
_list = new OListView( this );
_list->addColumn( "#" );
_list->addColumn( "Packet Type" );
_list->setColumnAlignment( 0, Qt::AlignCenter );
_list->setColumnAlignment( 1, Qt::AlignLeft );
_list->setAllColumnsShowFocus( true );
_list->setFont( QFont( "Fixed", 8 ) );
_hex = new QTextView( this );
_hex->setMargin( 0 );
_hex->setFont( QFont( "Fixed", 8 ) );
QVBoxLayout* vb = new QVBoxLayout( this, 2, 2 );
QHBoxLayout* hb = new QHBoxLayout( vb, 2 );
hb->addWidget( _label, 5 );
hb->addWidget( _number, 2 );
vb->addWidget( _list, 3 );
vb->addWidget( _hex, 4 ); // allow a bit (4/3) more space
_packets.setAutoDelete( true );
connect( _number, SIGNAL( valueChanged( int ) ), this, SLOT( showPacket( int ) ) );
connect( parent, SIGNAL( currentChanged( QWidget *) ), this, SLOT( activated( QWidget* ) ) );
clear();
}
void PacketView::add( const OPacket* p, int size )
{
+ /*
+ * don't scroll away when somebody views packages
+ * while scanning
+ */
+ int value = _number->value();
+ bool last = (value == static_cast<int>( _packets.count() ) );
+
odebug << "PacketView::add() size = " << size << oendl;
if ( size == -1 ) // unlimited buffer
{
_packets.append( p );
}
else
{ // limited buffer, limit = size
- while ( _packets.count() >= size )
+ while ( _packets.count() >= static_cast<uint>( size ) )
{
_packets.removeFirst();
+ --value;
}
+
+ /* check if we lost our packet */
+ last = ( value < 1 );
_packets.append( p );
}
_number->setMinValue( 1 );
_number->setMaxValue( _packets.count() );
- _number->setValue( _packets.count() );
+ _number->setValue( last ? _packets.count() : value );
}
void PacketView::showPacket( int number )
{
_list->clear();
_hex->setText("");
const OPacket* p = _packets.at( number-1 );
if ( p )
{
_doSubPackets( const_cast<QObjectList*>( p->children() ), 0 );
_doHexPacket( p );
QDateTime dt; dt.setTime_t( p->timeval().tv_sec );
_label->setText( dt.toString() + QString().sprintf( " Len=%d", p->len() ) );
}
else
{
odebug << "D'oh! No packet!" << oendl;
}
}
void PacketView::activated( QWidget* w )
{
if ( ( this == w ) && _packets.count() )
{
_number->setValue( 1 );
}
}
void PacketView::_doSubPackets( QObjectList* l, int counter )
{
if (!l) return;
QObject* o = l->first();
while ( o )
{
new OListViewItem( _list, QString::number( counter++ ), o->name() );
_doSubPackets( const_cast<QObjectList*>( o->children() ), counter );
o = l->next();
}
}
void PacketView::_doHexPacket( const OPacket* p )
{
if ( oApp->desktop()->width() > 320 )
_hex->setText( p->dump( 16 ) );
else
_hex->setText( p->dump( 8 ) );
}
const QString PacketView::getLog() const
{
+ return QString::null;
}
void PacketView::clear()
{
_packets.clear();
_number->setMinValue( 0 );
_number->setMaxValue( 0 );
_label->setText( "---" );
_list->clear();
_hex->setText( " <center><i>-- no Packet available --</i></center> " );
}
diff --git a/noncore/net/wellenreiter/gui/protolistview.cpp b/noncore/net/wellenreiter/gui/protolistview.cpp
index 635e174..1e3d195 100644
--- a/noncore/net/wellenreiter/gui/protolistview.cpp
+++ b/noncore/net/wellenreiter/gui/protolistview.cpp
@@ -1,120 +1,120 @@
/**********************************************************************
** Copyright (C) 2002-2004 Michael 'Mickey' Lauer. All rights reserved.
**
** This file is part of Wellenreiter II.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
/* LOCAL */
#include "protolistview.h"
#include <qcheckbox.h>
#include <qcombobox.h>
#include <qvbox.h>
#include <qlabel.h>
ProtocolListView::ProtocolListView( QWidget* parent, const char* name, WFlags f )
:QScrollView( parent, name, f )
{
parse = ( QString( "parsePackets" ) == QString( name ) );
setMargins( 3, 3, 0, 0 );
viewport()->setBackgroundColor( QCheckBox(0).palette().color( QPalette::Active, QColorGroup::Background ) );
vbox = new QVBox( viewport() );
vbox->setSpacing( 1 );
addChild( vbox );
QHBox* hbox = new QHBox( vbox );
hbox->setSpacing( 40 );
new QLabel( tr( "Protocol Family" ), hbox );
new QLabel( tr( "Perform Action" ), hbox );
QFrame* frame = new QFrame( vbox );
frame->setFrameStyle( QFrame::HLine + QFrame::Sunken );
//TODO: hardcoded for now...a protocol database would be nice!?
//addProtocol( "Ethernet" );
addProtocol( "Prism" );
//addProtocol( "802.11" );
addProtocol( "802.11 Management" );
addProtocol( "802.11 SSID" );
addProtocol( "802.11 Rates" );
addProtocol( "802.11 CF" );
addProtocol( "802.11 FH" );
addProtocol( "802.11 DS" );
addProtocol( "802.11 Tim" );
addProtocol( "802.11 IBSS" );
addProtocol( "802.11 Challenge" );
addProtocol( "802.11 Data" );
addProtocol( "802.11 LLC" );
addProtocol( "802.11 Data" );
addProtocol( "IP" );
addProtocol( "ARP" );
addProtocol( "UDP" );
addProtocol( "TCP" );
}
ProtocolListView::~ProtocolListView()
{
}
void ProtocolListView::addProtocol( const QString& name )
{
QHBox* hbox = new QHBox( vbox );
- new QCheckBox( name, hbox, (const char*) name );
+ new QCheckBox( name, hbox, name.local8Bit() );
if ( parse )
{
- QComboBox* combo = new QComboBox( hbox, (const char*) name );
+ QComboBox* combo = new QComboBox( hbox, name.local8Bit() );
#ifdef QWS
combo->setFixedWidth( 75 );
#endif
combo->insertItem( "Pass" );
combo->insertItem( "Discard!" );
combo->insertItem( "TouchSound" );
combo->insertItem( "AlarmSound" );
combo->insertItem( "KeySound" );
combo->insertItem( "LedOn" );
combo->insertItem( "LedOff" );
combo->insertItem( "LogMessage" );
combo->insertItem( "MessageBox" );
}
else
{
- QComboBox* combo = new QComboBox( hbox, (const char*) name );
+ QComboBox* combo = new QComboBox( hbox, name.local8Bit() );
#ifdef QWS
combo->setFixedWidth( 75 );
#endif
combo->insertItem( "Pass" );
combo->insertItem( "Discard!" );
}
}
bool ProtocolListView::isProtocolChecked( const QString& name )
{
- QCheckBox* box = (QCheckBox*) child( (const char*) name );
+ QCheckBox* box = (QCheckBox*) child( name.local8Bit() );
return ( box && box->isOn() );
}
QString ProtocolListView::protocolAction( const QString& name )
{
- QComboBox* combo = (QComboBox*) child( (const char*) name, "QComboBox" );
+ QComboBox* combo = (QComboBox*) child( name.local8Bit(), "QComboBox" );
if ( combo )
return combo->currentText();
else
return "<unknown>";
}
diff --git a/noncore/net/wellenreiter/gui/resource.cpp b/noncore/net/wellenreiter/gui/resource.cpp
index cb17f51..13096f2 100644
--- a/noncore/net/wellenreiter/gui/resource.cpp
+++ b/noncore/net/wellenreiter/gui/resource.cpp
@@ -1,49 +1,49 @@
/**********************************************************************
** Copyright (C) 2002-2004 Michael 'Mickey' Lauer. All rights reserved.
**
** This file is part of Wellenreiter II.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#include "resource.h"
#define PIXMAPPATH "/usr/local/share"
#include <qiconset.h>
namespace Resource
{
QPixmap loadPixmap( const QString& pix )
{
QString filename;
- filename.sprintf( "%s/%s.png", (const char*) PIXMAPPATH, (const char*) pix );
+ filename.sprintf( "%s/%s.png", PIXMAPPATH, pix.local8Bit() );
QPixmap pixmap( filename );
if ( pixmap.isNull() )
{
- odebug << "Wellenreiter::Resource: can't find pixmap " + filename << oendl;
+ odebug << "Wellenreiter::Resource: can't find pixmap " + filename << oendl;
}
return pixmap;
};
QIconSet loadIconSet( const QString& pix )
{
QString filename;
- filename.sprintf( "%s/%s.png", (const char*) PIXMAPPATH, (const char*) pix );
+ filename.sprintf( "%s/%s.png", PIXMAPPATH, pix.local8Bit() );
QPixmap pixmap( filename );
if ( pixmap.isNull() )
{
- odebug << "Wellenreiter::Resource: can't find pixmap " + filename << oendl;
+ odebug << "Wellenreiter::Resource: can't find pixmap " + filename << oendl;
}
return QIconSet( pixmap );
};
};
diff --git a/noncore/net/wellenreiter/gui/scanlist.cpp b/noncore/net/wellenreiter/gui/scanlist.cpp
index 9e907d8..fa1d724 100644
--- a/noncore/net/wellenreiter/gui/scanlist.cpp
+++ b/noncore/net/wellenreiter/gui/scanlist.cpp
@@ -1,566 +1,569 @@
/**********************************************************************
** Copyright (C) 2002-2004 Michael 'Mickey' Lauer. All rights reserved.
**
** This file is part of Wellenreiter II.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#include "scanlist.h"
#include "configwindow.h"
#include "logwindow.h"
/* OPIE */
#ifdef QWS
#include <opie2/odebug.h>
#include <qpe/qpeapplication.h>
#include <qpe/resource.h>
#else
#include "resource.h"
#endif
-using namespace Opie::Core;
-using namespace Opie::Ui;
-using namespace Opie::Net;
+
/* QT */
#include <qcursor.h>
#include <qdatetime.h>
#include <qpopupmenu.h>
#include <qcheckbox.h>
/* STD */
#include <assert.h>
+using namespace Opie::Core;
+using namespace Opie::Ui;
+using namespace Opie::Net;
+
const int col_type = 0;
const int col_essid = 0;
const int col_sig = 1;
const int col_ap = 2;
const int col_channel = 3;
const int col_wep = 4;
const int col_traffic = 5;
const int col_ip = 6;
const int col_manuf = 7;
const int col_firstseen = 8;
const int col_lastseen = 9;
const int col_location = 10;
+#define DEBUG
+
MScanListView::MScanListView( QWidget* parent, const char* name )
:OListView( parent, name )
{
setFrameShape( QListView::StyledPanel );
setFrameShadow( QListView::Sunken );
addColumn( tr( "Net/Station" ) );
setColumnAlignment( col_essid, AlignLeft || AlignVCenter );
addColumn( tr( "#" ) );
setColumnAlignment( col_sig, AlignCenter );
addColumn( tr( "MAC" ) );
setColumnAlignment( col_ap, AlignCenter );
addColumn( tr( "Chn" ) );
setColumnAlignment( col_channel, AlignCenter );
addColumn( tr( "W" ) );
setColumnAlignment( col_wep, AlignCenter );
addColumn( tr( "T" ) );
setColumnAlignment( col_traffic, AlignCenter );
addColumn( tr( "IP" ) );
setColumnAlignment( col_ip, AlignCenter );
addColumn( tr( "Manufacturer" ) );
setColumnAlignment( col_manuf, AlignCenter );
addColumn( tr( "First Seen" ) );
setColumnAlignment( col_firstseen, AlignCenter );
addColumn( tr( "Last Seen" ) );
setColumnAlignment( col_lastseen, AlignCenter );
addColumn( tr( "Location" ) );
setColumnAlignment( col_location, AlignCenter );
setRootIsDecorated( true );
setAllColumnsShowFocus( true );
connect( this, SIGNAL( rightButtonClicked(QListViewItem*,const QPoint&,int) ),
this, SLOT( contextMenuRequested(QListViewItem*,const QPoint&,int) ) );
#ifdef QWS
QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold );
#endif
};
MScanListView::~MScanListView()
{
};
OListViewItem* MScanListView::childFactory()
{
return new MScanListItem( this );
}
void MScanListView::serializeTo( QDataStream& s) const
{
odebug << "serializing MScanListView" << oendl;
OListView::serializeTo( s );
}
void MScanListView::serializeFrom( QDataStream& s)
{
odebug << "serializing MScanListView" << oendl;
OListView::serializeFrom( s );
}
void MScanListView::addNewItem( const QString& type,
const QString& essid,
const OMacAddress& mac,
bool wep,
int channel,
int signal,
const GpsLocation& loc,
bool probe )
{
QString macaddr = mac.toString(true);
#ifdef DEBUG
odebug << "MScanList::addNewItem( " << type << " / "
<< essid << " / " << macaddr
<< " [" << channel << "]" << oendl;
#endif
// search, if we already have seen this net
QString s;
MScanListItem* network;
MScanListItem* item = static_cast<MScanListItem*> ( firstChild() );
while ( item && ( item->text( col_essid ) != essid ) )
{
#ifdef DEBUG
odebug << "itemtext: " << item->text( col_essid ) << "" << oendl;
#endif
item = static_cast<MScanListItem*> ( item->nextSibling() );
}
if ( item )
{
// we have already seen this net, check all childs if MAC exists
network = item;
item = static_cast<MScanListItem*> ( item->firstChild() );
assert( item ); // this shouldn't fail
while ( item && ( item->text( col_ap ) != macaddr ) )
{
#ifdef DEBUG
odebug << "subitemtext: " << item->text( col_ap ) << "" << oendl;
#endif
item = static_cast<MScanListItem*> ( item->nextSibling() );
}
if ( item )
{
// we have already seen this item, it's a dupe
#ifdef DEBUG
odebug << "" << macaddr << " is a dupe - ignoring..." << oendl;
#endif
item->receivedBeacon();
return;
}
}
else
{
- s.sprintf( "(i) New network: ESSID '%s'", (const char*) essid );
+ s = QString( "(i) New network: ESSID '%1'" ).arg( essid );
MLogWindow::logwindow()->log( s );
network = new MScanListItem( this, "network", essid, QString::null, 0, 0, 0, probe );
}
// insert new station as child from network
// no essid to reduce clutter, maybe later we have a nick or stationname to display!?
#ifdef DEBUG
odebug << "inserting new station " << macaddr << "" << oendl;
#endif
MScanListItem* station = new MScanListItem( network, type, "", macaddr, wep, channel, signal );
station->setManufacturer( mac.manufacturer() );
station->setLocation( loc.dmsPosition() );
if ( type == "managed" )
{
- s.sprintf( "(i) New Access Point in '%s' [%d]", (const char*) essid, channel );
+ s = QString( "(i) New Access Point in '%1' [%2]" ).arg( essid ).arg( channel );
}
else
{
- s.sprintf( "(i) New AdHoc station in '%s' [%d]", (const char*) essid, channel );
+ s = QString( "(i) New AdHoc station in '%1' [%2]" ).arg( essid ).arg( channel );
}
MLogWindow::logwindow()->log( s );
}
void MScanListView::addIfNotExisting( MScanListItem* network, const OMacAddress& addr, const QString& type )
{
MScanListItem* subitem = static_cast<MScanListItem*>( network->firstChild() );
while ( subitem && ( subitem->text( col_ap ) != addr.toString(true) ) )
{
#ifdef DEBUG
odebug << "subitemtext: " << subitem->text( col_ap ) << "" << oendl;
#endif
subitem = static_cast<MScanListItem*> ( subitem->nextSibling() );
}
if ( subitem )
{
// we have already seen this item, it's a dupe
#ifdef DEBUG
odebug << "" << addr.toString(true) << " is a dupe - ignoring..." << oendl;
#endif
subitem->receivedBeacon(); //FIXME: sent data bit
return;
}
// Hey, it seems to be a new item :-D
MScanListItem* station = new MScanListItem( network, type, /* network->text( col_essid ) */ "", addr.toString(true), false, -1, -1 );
station->setManufacturer( addr.manufacturer() );
QString s;
if ( type == "station" )
{
- s.sprintf( "(i) New Station in '%s' [xx]", (const char*) network->text( col_essid ) );
+ s = QString( "(i) New Station in '%1' [xx]" ).arg( network->text( col_essid ) );
}
else
{
- s.sprintf( "(i) New Wireless Station in '%s' [xx]", (const char*) network->text( col_essid ) );
+ s = QString( "(i) New Wireless Station in '%1' [xx]" ).arg( network->text( col_essid ) );
}
MLogWindow::logwindow()->log( s );
}
void MScanListView::WDStraffic( const OMacAddress& from, const OMacAddress& to, const OMacAddress& viaFrom, const OMacAddress& viaTo )
{
- odebug << "WDSTraffic: " << (const char*) viaFrom.toString() << " and " << viaTo.toString() << " seem to form a WDS" << oendl;
+ odebug << "WDSTraffic: " << viaFrom.toString() << " and " << viaTo.toString() << " seem to form a WDS" << oendl;
QString s;
- MScanListItem* network;
+// MScanListItem* network;
QListViewItemIterator it( this );
while ( it.current() &&
it.current()->text( col_ap ) != viaFrom.toString(true) &&
it.current()->text( col_ap ) != viaTo.toString(true) ) ++it;
MScanListItem* item = static_cast<MScanListItem*>( it.current() );
if ( item ) // Either viaFrom or viaTo AP has shown up yet, so just add our two new stations
{
addIfNotExisting( static_cast<MScanListItem*>(item->parent()), from );
addIfNotExisting( static_cast<MScanListItem*>(item->parent()), to );
}
else
{
odebug << "D'Oh! Stations without AP... ignoring for now... will handle this in 1.1 version :-D" << oendl;
MLogWindow::logwindow()->log( "WARNING: Unhandled WSD traffic!" );
}
}
-void MScanListView::toDStraffic( const OMacAddress& from, const OMacAddress& to, const OMacAddress& via )
+void MScanListView::toDStraffic( const OMacAddress& from, const OMacAddress& /*to*/, const OMacAddress& via )
{
QString s;
- MScanListItem* network;
+// MScanListItem* network;
QListViewItemIterator it( this );
while ( it.current() && it.current()->text( col_ap ) != via.toString(true) ) ++it;
MScanListItem* item = static_cast<MScanListItem*>( it.current() );
if ( item ) // AP has shown up yet, so just add our new "from" - station
{
addIfNotExisting( static_cast<MScanListItem*>(item->parent()), from, "adhoc" );
}
else
{
odebug << "D'Oh! Station without AP... ignoring for now... will handle this in 1.1 :-D" << oendl;
MLogWindow::logwindow()->log( "WARNING: Unhandled toDS traffic!" );
}
}
-void MScanListView::fromDStraffic( const OMacAddress& from, const OMacAddress& to, const OMacAddress& via )
+void MScanListView::fromDStraffic( const OMacAddress& from, const OMacAddress& /*to*/, const OMacAddress& via )
{
QString s;
- MScanListItem* network;
+// MScanListItem* network;
QListViewItemIterator it( this );
while ( it.current() && it.current()->text( col_ap ) != via.toString(true) ) ++it;
MScanListItem* item = static_cast<MScanListItem*>( it.current() );
if ( item ) // AP has shown up yet, so just add our new "from" - station
{
addIfNotExisting( static_cast<MScanListItem*>(item->parent()), from, "station" );
}
else
{
odebug << "D'Oh! Station without AP... ignoring for now... will handle this in 1.1 :-D" << oendl;
MLogWindow::logwindow()->log( "WARNING: Unhandled fromDS traffic!" );
}
}
-void MScanListView::IBSStraffic( const OMacAddress& from, const OMacAddress& to, const OMacAddress& via )
+void MScanListView::IBSStraffic( const OMacAddress& /*from*/, const OMacAddress& /*to*/, const OMacAddress& /*via*/ )
{
owarn << "D'oh! Not yet implemented..." << oendl;
MLogWindow::logwindow()->log( "WARNING: Unhandled IBSS traffic!" );
}
void MScanListView::identify( const OMacAddress& macaddr, const QString& ip )
{
- odebug << "identify " << (const char*) macaddr.toString() << " = " << ip << "" << oendl;
+ odebug << "identify " << macaddr.toString() << " = " << ip << "" << oendl;
QListViewItemIterator it( this );
for ( ; it.current(); ++it )
{
if ( it.current()->text( col_ap ) == macaddr.toString(true) )
{
it.current()->setText( col_ip, ip );
return;
}
}
odebug << "D'oh! Received identification, but item not yet in list... ==> Handle this!" << oendl;
- MLogWindow::logwindow()->log( QString().sprintf( "WARNING: Unhandled identification %s = %s!",
- (const char*) macaddr.toString(), (const char*) ip ) );
+ MLogWindow::logwindow()->log( QString( "WARNING: Unhandled identification %1 = %2!" )
+ .arg( macaddr.toString() ).arg( ip ) );
}
void MScanListView::addService( const QString& name, const OMacAddress& macaddr, const QString& ip )
{
- odebug << "addService '" << (const char*) name << "', Server = " << (const char*) macaddr.toString() << " = " << ip << "" << oendl;
+ odebug << "addService '" << name << "', Server = " << macaddr.toString() << " = " << ip << "" << oendl;
//TODO: Refactor that out, we need it all over the place.
// Best to do it in a more comfortable abstraction in OListView
// (Hmm, didn't I already start something in this direction?)
QListViewItemIterator it( this );
for ( ; it.current(); ++it )
{
if ( it.current()->text( col_ap ) == macaddr.toString(true) )
{
MScanListItem* subitem = static_cast<MScanListItem*>( it.current()->firstChild() );
while ( subitem && ( subitem->text( col_essid ) != name ) )
{
#ifdef DEBUG
odebug << "subitemtext: " << subitem->text( col_essid ) << "" << oendl;
#endif
subitem = static_cast<MScanListItem*> ( subitem->nextSibling() );
}
if ( subitem )
{
// we have already seen this item, it's a dupe
#ifdef DEBUG
odebug << "" << name << " is a dupe - ignoring..." << oendl;
#endif
subitem->receivedBeacon(); //FIXME: sent data bit
return;
}
// never seen that - add new item
MScanListItem* item = new MScanListItem( it.current(), "service", "N/A", " ", false, -1, -1 );
item->setText( col_essid, name );
return;
}
}
odebug << "D'oh! Received identification, but item not yet in list... ==> Handle this!" << oendl;
- MLogWindow::logwindow()->log( QString().sprintf( "WARNING: Unhandled service addition %s = %s!",
- (const char*) macaddr.toString(), (const char*) ip ) );
+ MLogWindow::logwindow()->log( QString("WARNING: Unhandled service addition %s = %s!")
+ .arg( macaddr.toString() ).arg( ip ) );
}
void MScanListView::contextMenuRequested( QListViewItem* item, const QPoint&, int col )
{
if ( !item ) return;
MScanListItem* itm = static_cast<MScanListItem*>( item );
- odebug << "contextMenuRequested on item '" << (const char*) itm->text(0) << "' ("
- << (const char*) itm->type << ") in column: '" << col << "'" << oendl;
+ odebug << "contextMenuRequested on item '" << itm->text(0) << "' ("
+ << itm->type << ") in column: '" << col << "'" << oendl;
if ( itm->type == "adhoc" || itm->type == "managed" )
{
- QString entry = QString().sprintf( "&Join %s Net '%s'...", (const char*) itm->type, (const char*) itm->essid() );
+ QString entry = QString( "&Join %1 Net '%2'..." ).arg( itm->type ).arg( itm->essid() );
QPopupMenu m( this );
m.insertItem( entry, 37773, 0 );
int result = m.exec( QCursor::pos() );
if ( result == 37773 )
emit joinNetwork( itm->type, itm->essid(), itm->channel(), itm->macaddr() );
}
}
//============================================================
// MScanListItem
//============================================================
MScanListItem::MScanListItem( QListView* parent, const QString& type, const QString& essid, const QString& macaddr,
bool wep, int channel, int signal, bool probed )
:OListViewItem( parent, essid, QString::null, macaddr, QString::null, QString::null ),
_type( type ), _essid( essid ), _macaddr( macaddr ), _wep( wep ),
_channel( channel ), _signal( signal ), _beacons( 1 )
{
#ifdef DEBUG
odebug << "creating scanlist item" << oendl;
#endif
if ( WellenreiterConfigWindow::instance() )
WellenreiterConfigWindow::instance()->performAction( type, essid, macaddr, wep, channel, signal ); // better use signal/slot combination here
decorateItem( type, essid, macaddr, wep, channel, signal, probed );
}
MScanListItem::MScanListItem( QListViewItem* parent, const QString& type, const QString& essid, const QString& macaddr,
bool wep, int channel, int signal )
:OListViewItem( parent, essid, QString::null, macaddr, QString::null, QString::null )
{
#ifdef DEBUG
odebug << "creating scanlist item" << oendl;
#endif
if ( WellenreiterConfigWindow::instance() )
WellenreiterConfigWindow::instance()->performAction( type, essid, macaddr, wep, channel, signal ); // better use signal/slot combination here
decorateItem( type, essid, macaddr, wep, channel, signal, false );
}
const QString& MScanListItem::essid() const
{
if ( type == "network" )
return _essid;
else
return ( (MScanListItem*) parent() )->essid();
}
OListViewItem* MScanListItem::childFactory()
{
return new MScanListItem( this );
}
void MScanListItem::serializeTo( QDataStream& s ) const
{
#ifdef DEBUG
odebug << "serializing MScanListItem" << oendl;
#endif
OListViewItem::serializeTo( s );
s << _type;
s << (Q_UINT8) ( _wep ? 'y' : 'n' );
}
void MScanListItem::serializeFrom( QDataStream& s )
{
#ifdef DEBUG
odebug << "serializing MScanListItem" << oendl;
#endif
OListViewItem::serializeFrom( s );
Q_UINT8 wep;
s >> _type;
s >> wep;
_wep = (wep == 'y');
- QString name;
- name.sprintf( "wellenreiter/%s", (const char*) _type );
+ QString name = QString( "wellenreiter/"+ _type );
setPixmap( col_type, Resource::loadPixmap( name ) );
if ( _wep )
setPixmap( col_wep, Resource::loadPixmap( "wellenreiter/cracked" ) ); //FIXME: rename the pixmap!
listView()->triggerUpdate();
}
void MScanListItem::decorateItem( QString type, QString essid, QString macaddr, bool wep, int channel, int signal, bool probed )
{
#ifdef DEBUG
- odebug << "decorating scanlist item " << (const char*) type << " / "
- << (const char*) essid << " / " << (const char*) macaddr
+ odebug << "decorating scanlist item " << type << " / "
+ << essid << " / " << macaddr
<< "[" << channel << "]" << oendl;
#endif
// set icon for managed or adhoc mode
QString name;
- name.sprintf( "wellenreiter/%s", (const char*) type );
+ name.sprintf( "wellenreiter/"+ type );
setPixmap( col_type, Resource::loadPixmap( name ) );
// special case for probed networks FIXME: This is ugly at present
if ( type == "network" && probed )
{
setPixmap( col_type, Resource::loadPixmap( "wellenreiter/network-probed.png" ) );
}
// set icon for wep (wireless encryption protocol)
if ( wep )
setPixmap( col_wep, Resource::loadPixmap( "wellenreiter/cracked" ) ); //FIXME: rename the pixmap!
// set channel and signal text
if ( signal != -1 )
setText( col_sig, QString::number( signal ) );
if ( channel != -1 )
setText( col_channel, QString::number( channel ) );
setText( col_firstseen, QTime::currentTime().toString() );
//setText( col_lastseen, QTime::currentTime().toString() );
listView()->triggerUpdate();
this->type = type;
_type = type;
_essid = essid;
_macaddr = macaddr;
_channel = channel;
_beacons = 1;
_signal = 0;
if ( WellenreiterConfigWindow::instance()->openTree->isChecked() )
{
listView()->ensureItemVisible( this );
}
}
void MScanListItem::setManufacturer( const QString& manufacturer )
{
setText( col_manuf, manufacturer );
}
void MScanListItem::setLocation( const QString& location )
{
setText( col_location, location );
}
void MScanListItem::receivedBeacon()
{
_beacons++;
#ifdef DEBUG
odebug << "MScanListItem " << _macaddr << ": received beacon #" << _beacons << "" << oendl;
#endif
setText( col_sig, QString::number( _beacons ) );
setText( col_lastseen, QTime::currentTime().toString() );
MScanListItem* p = (MScanListItem*) parent();
if ( p ) p->receivedBeacon();
}
diff --git a/noncore/net/wellenreiter/gui/wellenreiter.cpp b/noncore/net/wellenreiter/gui/wellenreiter.cpp
index e801ce7..df8e9c3 100644
--- a/noncore/net/wellenreiter/gui/wellenreiter.cpp
+++ b/noncore/net/wellenreiter/gui/wellenreiter.cpp
@@ -1,766 +1,778 @@
/**********************************************************************
** Copyright (C) 2002-2004 Michael 'Mickey' Lauer. All rights reserved.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
***********************************************************************/
#include "gps.h"
#include "wellenreiter.h"
#include "scanlist.h"
#include "logwindow.h"
#include "packetview.h"
#include "configwindow.h"
#include "statwindow.h"
#include "graphwindow.h"
#include "protolistview.h"
/* OPIE */
#ifdef QWS
#include <opie2/oapplication.h>
#include <opie2/odebug.h>
#include <opie2/odevice.h>
#else
#include <qapplication.h>
#endif
#include <opie2/omanufacturerdb.h>
#include <opie2/onetwork.h>
#include <opie2/opcap.h>
#include <qpe/qcopenvelope_qws.h>
-using namespace Opie::Core;
-using namespace Opie::Net;
-using namespace Opie::Ui;
/* QT */
#include <qcheckbox.h>
#include <qcombobox.h>
#include <qdatetime.h>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qmessagebox.h>
#include <qobjectlist.h>
#include <qregexp.h>
#include <qspinbox.h>
#include <qtimer.h>
#include <qtoolbutton.h>
#include <qmainwindow.h>
/* STD */
#include <assert.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>
#include <signal.h>
+
+using namespace Opie::Core;
+using namespace Opie::Net;
+using namespace Opie::Ui;
+
Wellenreiter* Wellenreiter::instance = 0;
Wellenreiter::Wellenreiter( QWidget* parent )
: WellenreiterBase( parent, 0, 0 ),
sniffing( false ), iface( 0 ), configwindow( 0 )
{
logwindow->log( "(i) Wellenreiter has been started." );
//
// detect operating system
//
#ifdef QWS
- QString sys;
- sys.sprintf( "(i) Running on '%s'.", (const char*) ODevice::inst()->systemString() );
+ QString sys = QString( "(i) Running on '%1'.").arg( ODevice::inst()->systemString() );
_system = ODevice::inst()->system();
logwindow->log( sys );
#endif
netview->setColumnWidthMode( 1, QListView::Manual );
connect( netview, SIGNAL( joinNetwork(const QString&,const QString&,int,const QString&) ),
this, SLOT( joinNetwork(const QString&,const QString&,int,const QString&) ) );
pcap = new OPacketCapturer();
pcap->setAutoDelete( false );
gps = new GPS( this );
QTimer::singleShot( 1000, this, SLOT( initialTimer() ) );
registerSignalHandler();
}
Wellenreiter::~Wellenreiter()
{
delete pcap;
//unregisterSignalHandler();
}
void Wellenreiter::initialTimer()
{
odebug << "preloading manufacturer database..." << oendl;
OManufacturerDB::instance();
}
void Wellenreiter::signalHandler( int sig )
{
+ Q_UNUSED( sig )
oerr << "Aye! Received SIGSEGV or SIGBUS! Trying to exit gracefully..." << oendl;
if ( Wellenreiter::instance->sniffing )
{
Wellenreiter::instance->pcap->closeDumpFile();
Wellenreiter::instance->pcap->close();
Wellenreiter::instance->stopClicked();
}
oerr << "Phew. Seemed to work." << oendl;
::exit( -1 );
}
void Wellenreiter::registerSignalHandler()
{
Wellenreiter::instance = this;
struct sigaction action;
action.sa_handler = Wellenreiter::signalHandler;
if (sigemptyset(&action.sa_mask))
oerr << "sigemptyset() failure:" << strerror( errno ) << oendl;
if (sigaction(SIGSEGV, &action, NULL))
oerr << "can't set up a signal handler for SIGSEGV:" << strerror( errno ) << oendl;
if (sigaction(SIGBUS, &action, NULL))
oerr << "can't set up a signal handler for SIGBUS:" << strerror( errno ) << oendl;
odebug << "signal handlers setup." << oendl;
}
void Wellenreiter::setConfigWindow( WellenreiterConfigWindow* cw )
{
configwindow = cw;
}
void Wellenreiter::channelHopped(int c)
{
QString title = "Wellenreiter II -scan- [";
QString left;
if ( c > 1 ) left.fill( '.', c-1 );
title.append( left );
title.append( '|' );
if ( c < iface->channels() )
{
QString right;
right.fill( '.', iface->channels()-c );
title.append( right );
}
title.append( "]" );
//title.append( QString().sprintf( " %02d", c ) );
assert( parent() );
( (QMainWindow*) parent() )->setCaption( title );
}
void Wellenreiter::handleNotification( OPacket* p )
{
QObjectList* l = p->queryList();
QObjectListIt it( *l );
QObject* o;
while ( (o = it.current()) != 0 )
{
QString name = it.current()->name();
if ( configwindow->parsePackets->isProtocolChecked( name ) )
{
QString action = configwindow->parsePackets->protocolAction( name );
- odebug << "parsePacket-action for '" << (const char*) name << "' seems to be '" << action << "'" << oendl;
+ odebug << "parsePacket-action for '" << name << "' seems to be '" << action << "'" << oendl;
doAction( action, name, p );
}
else
{
odebug << "protocol '" << name << "' not checked in parsePackets." << oendl;
}
++it;
}
}
void Wellenreiter::handleManagementFrame( OPacket* p, OWaveLanManagementPacket* manage )
{
if ( manage->managementType() == "Beacon" ) handleManagementFrameBeacon( p, manage );
else if ( manage->managementType() == "ProbeRequest" ) handleManagementFrameProbeRequest( p, manage );
else if ( manage->managementType() == "ProbeResponse" ) handleManagementFrameProbeResponse( p, manage );
else owarn << "Wellenreiter::handleManagementFrame(): '" << manage->managementType() << "' - please handle me!" << oendl;
}
-void Wellenreiter::handleManagementFrameProbeRequest( OPacket* p, OWaveLanManagementPacket* request )
+void Wellenreiter::handleManagementFrameProbeRequest( OPacket* p, OWaveLanManagementPacket* /* request */ )
{
OWaveLanManagementSSID* ssid = static_cast<OWaveLanManagementSSID*>( p->child( "802.11 SSID" ) );
QString essid = ssid ? ssid->ID( true /* decloak */ ) : QString("<unknown>");
- OWaveLanManagementDS* ds = static_cast<OWaveLanManagementDS*>( p->child( "802.11 DS" ) );
- int channel = ds ? ds->channel() : -1;
+// OWaveLanManagementDS* ds = static_cast<OWaveLanManagementDS*>( p->child( "802.11 DS" ) );
+// int channel = ds ? ds->channel() : -1;
OWaveLanPacket* header = static_cast<OWaveLanPacket*>( p->child( "802.11" ) );
GpsLocation loc( -111, -111 );
if ( configwindow->enableGPS->isChecked() )
{
// TODO: add check if GPS is working!?
odebug << "Wellenreiter::gathering GPS data..." << oendl;
loc = gps->position();
odebug << "Wellenreiter::GPS data received is ( " << loc.latitude() << " , " << loc.longitude() << " ) - dms string = '" << loc.dmsPosition().latin1() << "'" << oendl;
}
if ( essid.length() )
netView()->addNewItem( "adhoc", essid, header->macAddress2(), false /* should check FrameControl field */, -1, 0, loc, true /* only probed */ );
odebug << "Wellenreiter::invalid frame [possibly noise] detected!" << oendl;
}
-void Wellenreiter::handleManagementFrameProbeResponse( OPacket* p, OWaveLanManagementPacket* response )
+void Wellenreiter::handleManagementFrameProbeResponse( OPacket* /* p */, OWaveLanManagementPacket* /* response */ )
{
}
-void Wellenreiter::handleManagementFrameBeacon( OPacket* p, OWaveLanManagementPacket* beacon )
+void Wellenreiter::handleManagementFrameBeacon( OPacket* p, OWaveLanManagementPacket* beacon )
{
QString type;
if ( beacon->canIBSS() )
{
type = "adhoc";
}
else if ( beacon->canESS() )
{
type = "managed";
}
else
{
owarn << "Wellenreiter::invalid frame [possibly noise] detected!" << oendl;
return;
}
OWaveLanManagementSSID* ssid = static_cast<OWaveLanManagementSSID*>( p->child( "802.11 SSID" ) );
QString essid = ssid ? ssid->ID( true /* decloak */ ) : QString("<unknown>");
OWaveLanManagementDS* ds = static_cast<OWaveLanManagementDS*>( p->child( "802.11 DS" ) );
int channel = ds ? ds->channel() : -1;
OWaveLanPacket* header = static_cast<OWaveLanPacket*>( p->child( "802.11" ) );
GpsLocation loc( -111, -111 );
if ( configwindow->enableGPS->isChecked() )
{
// TODO: add check if GPS is working!?
odebug << "Wellenreiter::gathering GPS data..." << oendl;
loc = gps->position();
odebug << "Wellenreiter::GPS data received is ( " << loc.latitude() << " , " << loc.longitude() << " ) - dms string = '" << loc.dmsPosition().latin1() << "'" << oendl;
}
netView()->addNewItem( type, essid, header->macAddress2(), beacon->canPrivacy(), channel, 0, loc );
// update graph window
if ( ds )
{
OPrismHeaderPacket* prism = static_cast<OPrismHeaderPacket*>( p->child( "Prism" ) );
if ( prism )
graphwindow->traffic( ds->channel(), prism->signalStrength() );
else
graphwindow->traffic( ds->channel(), 95 );
}
}
void Wellenreiter::handleControlFrame( OPacket* p, OWaveLanControlPacket* control )
{
OWaveLanPacket* header = static_cast<OWaveLanPacket*>( p->child( "802.11" ) );
if ( control->controlType() == "Acknowledge" )
{
netView()->addNewItem( "adhoc", "<unknown>", header->macAddress1(), false, -1, 0, GpsLocation( -111, -111 ) );
}
else
{
odebug << "Wellenreiter::handleControlFrame - please handle " << control->controlType() << " in a future version! :D" << oendl;
}
}
-void Wellenreiter::handleWlanData( OPacket* p, OWaveLanDataPacket* data, OMacAddress& from, OMacAddress& to )
+void Wellenreiter::handleWlanData( OPacket* p, OWaveLanDataPacket* /* data */ , OMacAddress& from, OMacAddress& to )
{
OWaveLanPacket* wlan = (OWaveLanPacket*) p->child( "802.11" );
if ( wlan->fromDS() && !wlan->toDS() )
{
netView()->fromDStraffic( wlan->macAddress3(), wlan->macAddress1(), wlan->macAddress2() );
from = wlan->macAddress3();
to = wlan->macAddress2();
}
else if ( !wlan->fromDS() && wlan->toDS() )
{
netView()->toDStraffic( wlan->macAddress2(), wlan->macAddress3(), wlan->macAddress1() );
from = wlan->macAddress2();
to = wlan->macAddress3();
}
else if ( wlan->fromDS() && wlan->toDS() )
{
netView()->WDStraffic( wlan->macAddress4(), wlan->macAddress3(), wlan->macAddress1(), wlan->macAddress2() );
from = wlan->macAddress4();
to = wlan->macAddress3();
}
else
{
netView()->IBSStraffic( wlan->macAddress2(), wlan->macAddress1(), wlan->macAddress3() );
from = wlan->macAddress2();
to = wlan->macAddress1();
}
}
-void Wellenreiter::handleEthernetData( OPacket* p, OEthernetPacket* data, OMacAddress& from, OMacAddress& to )
+void Wellenreiter::handleEthernetData( OPacket* /* p */, OEthernetPacket* data, OMacAddress& from, OMacAddress& to )
{
from = data->sourceAddress();
to = data->destinationAddress();
netView()->addNewItem( "station", "<wired>", from, false, -1, 0, GpsLocation( -111, -111 ) );
}
-void Wellenreiter::handleARPData( OPacket* p, OARPPacket*, OMacAddress& source, OMacAddress& dest )
+void Wellenreiter::handleARPData( OPacket* p, OARPPacket*, OMacAddress& /* source */, OMacAddress& /* dest */ )
{
OARPPacket* arp = (OARPPacket*) p->child( "ARP" );
if ( arp )
{
odebug << "Received ARP traffic (type '" << arp->type() << "'): " << oendl;
if ( arp->type() == "REQUEST" )
{
netView()->identify( arp->senderMacAddress(), arp->senderIPV4Address().toString() );
}
else if ( arp->type() == "REPLY" )
{
netView()->identify( arp->senderMacAddress(), arp->senderIPV4Address().toString() );
netView()->identify( arp->targetMacAddress(), arp->targetIPV4Address().toString() );
}
}
}
-void Wellenreiter::handleIPData( OPacket* p, OIPPacket* ip, OMacAddress& source, OMacAddress& dest )
+void Wellenreiter::handleIPData( OPacket* p, OIPPacket* /* ip */, OMacAddress& source, OMacAddress& /* dest */ )
{
//TODO: Implement more IP based protocols
ODHCPPacket* dhcp = (ODHCPPacket*) p->child( "DHCP" );
if ( dhcp )
{
odebug << "Received DHCP '" << dhcp->type() << "' packet" << oendl;
if ( dhcp->type() == "OFFER" )
{
- odebug << "DHCP: '" << (const char*) source.toString() << "' ('" << dhcp->serverAddress().toString() << "') seems to be a DHCP server." << oendl;
+ odebug << "DHCP: '" << source.toString() << "' ('" << dhcp->serverAddress().toString() << "') seems to be a DHCP server." << oendl;
netView()->identify( source, dhcp->serverAddress().toString() );
netView()->addService( "DHCP", source, dhcp->serverAddress().toString() );
}
else if ( dhcp->type() == "ACK" )
{
- odebug << "DHCP: '" << (const char*) dhcp->clientMacAddress().toString() << "' ('" << dhcp->yourAddress().toString() << "') accepted the offered DHCP address." << oendl;
+ odebug << "DHCP: '" << dhcp->clientMacAddress().toString() << "' ('" << dhcp->yourAddress().toString() << "') accepted the offered DHCP address." << oendl;
netView()->identify( dhcp->clientMacAddress(), dhcp->yourAddress().toString() );
}
}
}
QObject* Wellenreiter::childIfToParse( OPacket* p, const QString& protocol )
{
if ( configwindow->parsePackets->isProtocolChecked( protocol ) )
if ( configwindow->parsePackets->protocolAction( protocol ) == "Discard!" )
return 0;
return p->child( protocol );
}
bool Wellenreiter::checkDumpPacket( OPacket* p )
{
// go through all child packets and see if one is inside the child hierarchy for p
// if so, do what the user requested (protocolAction), e.g. pass or discard
if ( !configwindow->writeCaptureFile->isChecked() )
return true; // semantic change - we're logging anyway now to /tmp/wellenreiter
QObjectList* l = p->queryList();
QObjectListIt it( *l );
QObject* o;
while ( (o = it.current()) != 0 )
{
QString name = it.current()->name();
if ( configwindow->capturePackets->isProtocolChecked( name ) )
{
QString action = configwindow->capturePackets->protocolAction( name );
- odebug << "capturePackets-action for '" << (const char*) name << "' seems to be '" << action << "'" << oendl;
+ odebug << "capturePackets-action for '" << name << "' seems to be '" << action << "'" << oendl;
if ( action == "Discard" )
{
- logwindow->log( QString().sprintf( "(i) dump-discarding of '%s' packet requested.", (const char*) name ) );
+ logwindow->log( QString("(i) dump-discarding of '%1' packet requested." ).arg( name ) );
return false;
}
}
else
{
odebug << "protocol '" << name << "' not checked in capturePackets." << oendl;
}
++it;
}
return true;
}
void Wellenreiter::receivePacket( OPacket* p )
{
hexWindow()->add( p, configwindow->hexViewBuffer() );
if ( checkDumpPacket( p ) )
{
pcap->dump( p );
}
// check for a management frame
OWaveLanManagementPacket* manage = static_cast<OWaveLanManagementPacket*>( childIfToParse( p, "802.11 Management" ) );
if ( manage )
{
handleManagementFrame( p, manage );
return;
}
// check for a control frame
OWaveLanControlPacket* control = static_cast<OWaveLanControlPacket*>( childIfToParse( p, "802.11 Control" ) );
if ( control )
{
handleControlFrame( p, control );
return;
}
OMacAddress source;
OMacAddress dest;
//TODO: WEP check here
// check for a wireless data frame
OWaveLanDataPacket* wlan = static_cast<OWaveLanDataPacket*>( childIfToParse( p, "802.11 Data" ) );
if ( wlan )
{
handleWlanData( p, wlan, source, dest );
}
// check for a wired data frame
OEthernetPacket* eth = static_cast<OEthernetPacket*>( childIfToParse( p, "Ethernet" ) );
if ( eth )
{
handleEthernetData( p, eth, source, dest );
}
// check for an arp frame since arp frames come in two flavours:
// 802.11 encapsulates ARP data within IP packets while wired ethernet doesn't.
OARPPacket* arp = static_cast<OARPPacket*>( childIfToParse( p, "ARP" ) );
if ( arp )
{
handleARPData( p, arp, source, dest );
}
// check for a ip frame
OIPPacket* ip = static_cast<OIPPacket*>( childIfToParse( p, "IP" ) );
if ( ip )
{
handleIPData( p, ip, source, dest );
}
//handleNotification( p );
}
void Wellenreiter::stopClicked()
{
if ( iface )
{
disconnect( SIGNAL( receivedPacket(Opie::Net::OPacket*) ), this, SLOT( receivePacket(Opie::Net::OPacket*) ) );
disconnect( SIGNAL( hopped(int) ), this, SLOT( channelHopped(int) ) );
iface->setChannelHopping(); // stop hopping channels
}
else
killTimers();
pcap->close();
sniffing = false;
if ( iface )
{
// switch off monitor mode
iface->setMode( "managed" );
// switch off promisc flag
iface->setPromiscuousMode( false );
system( "cardctl reset; sleep 1" ); //FIXME: Use OProcess
}
logwindow->log( "(i) Stopped Scanning." );
assert( parent() );
( (QMainWindow*) parent() )->setCaption( "Wellenreiter II" );
// message the user
QMessageBox::information( this, "Wellenreiter II",
tr( "Your wireless card\nshould now be usable again." ) );
sniffing = false;
emit( stoppedSniffing() );
#ifdef QWS
if ( WellenreiterConfigWindow::instance()->disablePM->isChecked() )
{
QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
}
#else
#warning FIXME: setScreenSaverMode is not operational on the X11 build
#endif
- // print out statistics
- for( QMap<QString,int>::ConstIterator it = pcap->statistics().begin(); it != pcap->statistics().end(); ++it )
- statwindow->updateCounter( it.key(), it.data() );
+ updateStatistics();
}
void Wellenreiter::startClicked()
{
// get configuration from config window
const QString& interface = configwindow->interfaceName->currentText();
const int cardtype = configwindow->driverType();
- const int interval = configwindow->hoppingInterval();
+// const int interval = configwindow->hoppingInterval();
if ( ( interface == "" ) || ( cardtype == 0 ) )
{
QMessageBox::information( this, "Wellenreiter II",
tr( "No device configured.\nPlease reconfigure!" ) );
return;
}
// configure device
ONetwork* net = ONetwork::instance();
// TODO: check if interface is wireless and support sniffing for non-wireless interfaces
if ( cardtype != DEVTYPE_FILE )
{
if ( !net->isPresent( interface ) )
{
QMessageBox::information( this, "Wellenreiter II",
tr( "The configured device (%1)\nis not available on this system\n. Please reconfigure!" ).arg( interface ) );
return;
}
iface = static_cast<OWirelessNetworkInterface*>(net->interface( interface )); // fails if network is not wireless!
assert( iface );
// bring device UP
iface->setUp( true );
if ( !iface->isUp() )
{
QMessageBox::warning( this, "Wellenreiter II",
tr( "Can't bring interface '%1' up:\n" ).arg( iface->name() ) + strerror( errno ) );
return;
}
// check if wireless extension version matches
if ( ONetwork::wirelessExtensionCompileVersion() != iface->wirelessExtensionDriverVersion() )
{
QMessageBox::critical( this, "Wellenreiter II", tr( "<p>The Wireless Extension Versions<br>are not matching!<p>"
" Wellenreiter II : WE V%1<br>Interface driver: WE V%2" )
.arg( QString::number( ONetwork::wirelessExtensionCompileVersion() ) )
.arg( QString::number( iface->wirelessExtensionDriverVersion() ) ) );
return;
}
}
// set monitor mode
bool usePrism = configwindow->usePrismHeader();
switch ( cardtype )
{
case DEVTYPE_CISCO: iface->setMonitoring( new OCiscoMonitoringInterface( iface, usePrism ) ); break;
case DEVTYPE_WLAN_NG: iface->setMonitoring( new OWlanNGMonitoringInterface( iface, usePrism ) ); break;
case DEVTYPE_HOSTAP: iface->setMonitoring( new OHostAPMonitoringInterface( iface, usePrism ) ); break;
case DEVTYPE_ORINOCO: iface->setMonitoring( new OOrinocoMonitoringInterface( iface, usePrism ) ); break;
case DEVTYPE_MANUAL: QMessageBox::information( this, "Wellenreiter II", tr( "Bring your device into\nmonitor mode now." ) ); break;
case DEVTYPE_FILE: odebug << "Wellenreiter: Capturing from file '" << interface << "'" << oendl; break;
default: assert( 0 ); // shouldn't reach this
}
// switch device into monitor mode
if ( cardtype < DEVTYPE_FILE )
{
if ( cardtype != DEVTYPE_MANUAL )
iface->setMode( "monitor" );
if ( iface->mode() != "monitor" )
{
if ( QMessageBox::warning( this, "Wellenreiter II",
tr( "Can't set interface '%1'\ninto monitor mode:\n" ).arg( iface->name() ) + strerror( errno ) +
tr( "\nContinue with limited functionality?" ), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::No )
return;
}
}
// open GPS device
if ( configwindow->enableGPS->isChecked() )
{
odebug << "Wellenreiter:GPS enabled @ " << configwindow->gpsdHost->currentText() << ":" << configwindow->gpsdPort->value() << "" << oendl;
gps->open( configwindow->gpsdHost->currentText(), configwindow->gpsdPort->value() );
}
// open pcap and start sniffing
if ( configwindow->writeCaptureFile->isChecked() ) // write to a user specified capture file?
{
dumpname = configwindow->captureFileName->text();
if ( dumpname.isEmpty() ) dumpname = "captureFile";
dumpname.append( '-' );
dumpname.append( QTime::currentTime().toString().replace( QRegExp( ":" ), "-" ) );
dumpname.append( ".wellenreiter" );
}
if ( cardtype != DEVTYPE_FILE )
pcap->open( interface );
else
pcap->openCaptureFile( interface );
if ( configwindow->writeCaptureFile->isChecked() )
{
odebug << "Wellenreiter:: dumping to " << dumpname << oendl;
pcap->openDumpFile( dumpname );
}
if ( !pcap->isOpen() )
{
QMessageBox::warning( this, "Wellenreiter II", tr( "Can't open packet capturer for\n'%1':\n" ).arg(
cardtype == DEVTYPE_FILE ? (const char*) interface : iface->name() ) + QString(strerror( errno ) ));
return;
}
// set capturer to non-blocking mode
pcap->setBlocking( false );
// start channel hopper
if ( cardtype != DEVTYPE_FILE )
{
logwindow->log( QString().sprintf( "(i) Starting channel hopper (d=%d ms)", configwindow->hopInterval->value() ) );
iface->setChannelHopping( configwindow->hopInterval->value() ); //use interval from config window
}
if ( cardtype != DEVTYPE_FILE )
{
// connect socket notifier and start channel hopper
connect( pcap, SIGNAL( receivedPacket(Opie::Net::OPacket*) ), this, SLOT( receivePacket(Opie::Net::OPacket*) ) );
connect( iface->channelHopper(), SIGNAL( hopped(int) ), this, SLOT( channelHopped(int) ) );
}
else
{
// start timer for reading packets
startTimer( 100 );
}
logwindow->log( "(i) Started Scanning." );
sniffing = true;
#ifdef QWS
if ( WellenreiterConfigWindow::instance()->disablePM->isChecked() )
{
QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Disable;
}
#else
#warning FIXME: setScreenSaverMode is not operational on the X11 build
#endif
emit( startedSniffing() );
if ( cardtype != DEVTYPE_FILE ) channelHopped( 6 ); // set title
else
{
assert( parent() );
( (QMainWindow*) parent() )->setCaption( tr( "Wellenreiter II - replaying capture file..." ) );
}
}
void Wellenreiter::timerEvent( QTimerEvent* )
{
odebug << "Wellenreiter::timerEvent()" << oendl;
OPacket* p = pcap->next();
if ( !p ) // no more packets available
{
stopClicked();
}
else
{
receivePacket( p );
// We no longer delete packets here. Ownership of the packets is
// transferred to the PacketView.
//delete p;
}
}
-void Wellenreiter::doAction( const QString& action, const QString& protocol, OPacket* p )
+void Wellenreiter::doAction( const QString& action, const QString& protocol, OPacket* /* p */ )
{
#ifdef QWS
if ( action == "TouchSound" )
ODevice::inst()->playTouchSound();
else if ( action == "AlarmSound" )
ODevice::inst()->playAlarmSound();
else if ( action == "KeySound" )
ODevice::inst()->playKeySound();
else if ( action == "LedOn" )
ODevice::inst()->setLedState( Led_Mail, Led_On );
else if ( action == "LedOff" )
ODevice::inst()->setLedState( Led_Mail, Led_Off );
else if ( action == "LogMessage" )
- logwindow->log( QString().sprintf( "Got packet with protocol '%s'", (const char*) protocol ) );
+ logwindow->log( QString(tr("Got packet with protocol '%1'","Protocol Name" ) ).arg( protocol ) );
else if ( action == "MessageBox" )
QMessageBox::information( this, "Notification!",
- QString().sprintf( "Got packet with protocol '%s'", (const char*) protocol ) );
+ QString(tr( "Got packet with protocol '%1'", "Protocol Name" ) ).arg( protocol ) );
#else
#warning Actions do not work with Qt/X11 yet
#endif
}
void Wellenreiter::joinNetwork(const QString& type, const QString& essid, int channel, const QString& macaddr)
{
#ifdef QWS
if ( !iface )
{
QMessageBox::warning( this, tr( "Can't do that!" ), tr( "No wireless\ninterface available." ) );
return;
}
if ( sniffing )
{
QMessageBox::warning( this, tr( "Can't do that!" ), tr( "Stop sniffing before\njoining a net." ) );
return;
}
- odebug << "joinNetwork() with Interface " << (const char*) iface->name()
- << ": " << (const char*) type << ", " << (const char*) essid
- << ", " << channel << ", " << (const char*) macaddr << oendl;
+ odebug << "joinNetwork() with Interface " << iface->name()
+ << ": " << type << ", " << essid
+ << ", " << channel << ", " << macaddr << oendl;
QCopEnvelope msg( "QPE/Application/networksettings", "wlan(QString,QString,QString)" );
int count = 3;
odebug << "sending " << count << " messages" << oendl;
msg << QString("count") << QString::number(count);
odebug << "msg >" << iface->name() << "< Mode >" << type.latin1() << "<" << oendl;
msg << QString(iface->name()) << QString("Mode") << type;
odebug << "msg >" << iface->name() << "< essid >" << essid.latin1() << "<" << oendl;
msg << QString(iface->name()) << QString("ESSID") << essid;
odebug << "msg >" << iface->name() << "< channel >" << channel << "<" << oendl;
msg << QString(iface->name()) << QString("Channel") << channel;
// odebug << "msg >" << iface->name() << "< mac >" << macaddr << "<" << oendl;
// msg << QString(iface->name()) << QString("MacAddr") << macaddr;
#else
QMessageBox::warning( this, tr( "Can't do that!" ), tr( "Function only available on Embedded build" ) );
#endif
}
+void Wellenreiter::updateStatistics()
+{
+ // print out statistics
+ for( QMap<QString,int>::ConstIterator it = pcap->statistics().begin(); it != pcap->statistics().end(); ++it )
+ statwindow->updateCounter( it.key(), it.data() );
+}
+
+void Wellenreiter::slotTabChanged( QWidget* wid )
+{
+ if ( wid == statwindow )
+ updateStatistics();
+}
diff --git a/noncore/net/wellenreiter/gui/wellenreiter.h b/noncore/net/wellenreiter/gui/wellenreiter.h
index f582a5f..5ac389e 100644
--- a/noncore/net/wellenreiter/gui/wellenreiter.h
+++ b/noncore/net/wellenreiter/gui/wellenreiter.h
@@ -1,112 +1,117 @@
/**********************************************************************
** Copyright (C) 2002-2004 Michael 'Mickey' Lauer. All rights reserved.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#ifndef WELLENREITER_H
#define WELLENREITER_H
#include "wellenreiterbase.h"
#ifdef QWS
#include <opie2/odevice.h>
#endif
#include <signal.h>
class QTimerEvent;
class QPixmap;
namespace Opie {namespace Net {class OPacket;}}
namespace Opie {namespace Net {class OWaveLanManagementPacket;}}
namespace Opie {namespace Net {class OWaveLanControlPacket;}}
namespace Opie {namespace Net {class OWaveLanDataPacket;}}
namespace Opie {namespace Net {class OEthernetPacket;}}
namespace Opie {namespace Net {class OARPPacket;}}
namespace Opie {namespace Net {class OMacAddress;}}
namespace Opie {namespace Net {class OIPPacket;}}
namespace Opie {namespace Net {class OPacket;}}
namespace Opie {namespace Net {class OWirelessNetworkInterface;}}
namespace Opie {namespace Net {class OPacketCapturer;}}
class PacketView;
class WellenreiterConfigWindow;
class MLogWindow;
class GPS;
class Wellenreiter : public WellenreiterBase {
Q_OBJECT
public:
Wellenreiter( QWidget* parent = 0 );
~Wellenreiter();
void setConfigWindow( WellenreiterConfigWindow* cw );
MScanListView* netView() const { return netview; };
MLogWindow* logWindow() const { return logwindow; };
PacketView* hexWindow() const { return hexwindow; };
bool isDaemonRunning() const { return sniffing; };
QString captureFileName() const { return dumpname; };
public:
QString dumpname;
bool sniffing;
static Wellenreiter* instance;
static void signalHandler( int sig );
protected:
virtual void timerEvent( QTimerEvent* );
public slots:
void initialTimer();
void channelHopped(int);
void receivePacket(Opie::Net::OPacket*);
void startClicked();
void stopClicked();
void joinNetwork(const QString&,const QString&,int,const QString&);
signals:
void startedSniffing();
void stoppedSniffing();
private:
void handleManagementFrame( Opie::Net::OPacket* p, Opie::Net::OWaveLanManagementPacket* );
void handleManagementFrameBeacon( Opie::Net::OPacket* p, Opie::Net::OWaveLanManagementPacket* );
void handleManagementFrameProbeRequest( Opie::Net::OPacket* p, Opie::Net::OWaveLanManagementPacket* );
void handleManagementFrameProbeResponse( Opie::Net::OPacket* p, Opie::Net::OWaveLanManagementPacket* );
void handleControlFrame( Opie::Net::OPacket* p, Opie::Net::OWaveLanControlPacket* control );
void handleWlanData( Opie::Net::OPacket* p, Opie::Net::OWaveLanDataPacket* data, Opie::Net::OMacAddress& from, Opie::Net::OMacAddress& to );
void handleEthernetData( Opie::Net::OPacket* p, Opie::Net::OEthernetPacket* data, Opie::Net::OMacAddress& from, Opie::Net::OMacAddress& to );
void handleARPData( Opie::Net::OPacket* p, Opie::Net::OARPPacket* arp, Opie::Net::OMacAddress& from, Opie::Net::OMacAddress& to );
void handleIPData( Opie::Net::OPacket* p, Opie::Net::OIPPacket* ip, Opie::Net::OMacAddress& from, Opie::Net::OMacAddress& to );
void handleNotification( Opie::Net::OPacket* p );
void doAction( const QString& action, const QString& protocol, Opie::Net::OPacket* p );
QObject* childIfToParse( Opie::Net::OPacket* p, const QString& protocol );
bool checkDumpPacket( Opie::Net::OPacket* p );
void registerSignalHandler();
+ private slots:
+ void slotTabChanged( QWidget* );
+
private:
+ void updateStatistics();
+
#ifdef QWS
Opie::Core::OSystem _system; // Opie Operating System identifier
#endif
Opie::Net::OWirelessNetworkInterface* iface;
Opie::Net::OPacketCapturer* pcap;
WellenreiterConfigWindow* configwindow;
GPS* gps;
//void readConfig();
//void writeConfig();
};
#endif
diff --git a/noncore/net/wellenreiter/gui/wellenreiterbase.cpp b/noncore/net/wellenreiter/gui/wellenreiterbase.cpp
index a29d520..0ca0bd7 100644
--- a/noncore/net/wellenreiter/gui/wellenreiterbase.cpp
+++ b/noncore/net/wellenreiter/gui/wellenreiterbase.cpp
@@ -1,190 +1,192 @@
/**********************************************************************
** Copyright (C) 2002-2004 Michael 'Mickey' Lauer. All rights reserved.
**
** This file is part of Wellenreiter II.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
***********************************************************************/
#include "wellenreiterbase.h"
#include <qlabel.h>
#include <qlayout.h>
#include "logwindow.h"
#include "packetview.h"
#include "scanlist.h"
#include "statwindow.h"
#include "graphwindow.h"
#ifdef QWS
#include <qpe/resource.h>
#include <opie2/otabwidget.h>
using namespace Opie;
#else
#include "resource.h"
#include <qtabwidget.h>
#endif
#define WELLENREITER_VERSION "V1.0.3 (unofficial)"
/*
* Constructs a WellenreiterBase which is a child of 'parent', with the
* name 'name' and widget flags set to 'f'
*/
using namespace Opie::Ui;
using namespace Opie::Ui;
using namespace Opie::Ui;
WellenreiterBase::WellenreiterBase( QWidget* parent, const char* name, WFlags fl )
: QWidget( parent, name, fl )
{
//ani1 = new QPixmap( Resource::loadPixmap( "wellenreiter/networks_rot0" ) );
//ani2 = new QPixmap( Resource::loadPixmap( "wellenreiter/networks_rot90" ) );
//ani3 = new QPixmap( Resource::loadPixmap( "wellenreiter/networks_rot180" ) );
//ani4 = new QPixmap( Resource::loadPixmap( "wellenreiter/networks_rot270" ) );
if ( !name )
setName( "WellenreiterBase" );
resize( 191, 294 );
#ifdef QWS
setCaption( tr( "Wellenreiter/Opie" ) );
#else
setCaption( tr( "Wellenreiter/X11" ) );
#endif
WellenreiterBaseLayout = new QVBoxLayout( this );
WellenreiterBaseLayout->setSpacing( 2 );
WellenreiterBaseLayout->setMargin( 0 );
#ifdef QWS
TabWidget = new OTabWidget( this, "TabWidget", OTabWidget::Global );
#else
TabWidget = new QTabWidget( this, "TabWidget" );
#endif
ap = new QWidget( TabWidget, "ap" );
apLayout = new QVBoxLayout( ap );
apLayout->setSpacing( 2 );
apLayout->setMargin( 2 );
//--------- NETVIEW TAB --------------
netview = new MScanListView( ap );
apLayout->addWidget( netview );
//--------- GRAPH TAB --------------
graphwindow = new MGraphWindow( TabWidget, "Graph" );
//--------- LOG TAB --------------
logwindow = new MLogWindow( TabWidget, "Log" );
//--------- HEX TAB --------------
hexwindow = new PacketView( TabWidget, "Hex" );
//--------- STAT TAB --------------
statwindow = new MStatWindow( TabWidget, "Stat" );
//--------- ABOUT TAB --------------
about = new QWidget( TabWidget, "about" );
aboutLayout = new QGridLayout( about );
aboutLayout->setSpacing( 6 );
aboutLayout->setMargin( 11 );
PixmapLabel1_3_2 = new QLabel( about, "PixmapLabel1_3_2" );
PixmapLabel1_3_2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, PixmapLabel1_3_2->sizePolicy().hasHeightForWidth() ) );
PixmapLabel1_3_2->setFrameShape( QLabel::Panel );
PixmapLabel1_3_2->setFrameShadow( QLabel::Sunken );
PixmapLabel1_3_2->setLineWidth( 2 );
PixmapLabel1_3_2->setMargin( 0 );
PixmapLabel1_3_2->setMidLineWidth( 0 );
QPixmap logo = Resource::loadPixmap( "wellenreiter/logo" );
QPainter draw( &logo );
draw.setPen( Qt::black );
draw.setFont( QFont( "Fixed", 8 ) );
draw.drawText( 30, 10, WELLENREITER_VERSION );
PixmapLabel1_3_2->setPixmap( logo );
PixmapLabel1_3_2->setScaledContents( TRUE );
PixmapLabel1_3_2->setAlignment( int( QLabel::AlignCenter ) );
aboutLayout->addWidget( PixmapLabel1_3_2, 0, 0 );
TextLabel1_4_2 = new QLabel( about, "TextLabel1_4_2" );
QFont TextLabel1_4_2_font( TextLabel1_4_2->font() );
TextLabel1_4_2_font.setFamily( "adobe-helvetica" );
TextLabel1_4_2_font.setPointSize( 10 );
TextLabel1_4_2->setFont( TextLabel1_4_2_font );
TextLabel1_4_2->setText(
"<p align=center>"
"<hr>"
"<b>(C) Michael 'Mickey' Lauer</b><br>"
"<hr>"
"mickey@Vanille.de<br>"
"www.Vanille.de/projects/wellenreiter.html<br>"
"www.wellenreiter.net"
"</p>" );
TextLabel1_4_2->setAlignment( int( QLabel::AlignCenter ) );
aboutLayout->addWidget( TextLabel1_4_2, 1, 0 );
#ifdef QWS
TabWidget->addTab( ap, "wellenreiter/networks", tr( "Nets" ) );
TabWidget->addTab( graphwindow, "wellenreiter/graph", tr( "Graph" ) );
TabWidget->addTab( logwindow, "wellenreiter/log", tr( "Log" ) );
TabWidget->addTab( hexwindow, "wellenreiter/hex", tr( "Hex" ) );
TabWidget->addTab( statwindow, "wellenreiter/stat", tr( "Stat" ) );
TabWidget->addTab( about, "wellenreiter/about", tr( "About" ) );
#else
TabWidget->addTab( ap, /* "wellenreiter/networks", */ tr( "Networks" ) );
TabWidget->addTab( graphwindow, /* "wellenreiter/graph", */ tr( "Graph" ) );
TabWidget->addTab( logwindow, /* "wellenreiter/log", */ tr( "Log" ) );
TabWidget->addTab( hexwindow, /* "wellenreiter/hex", */ tr( "Hex" ) );
TabWidget->addTab( statwindow, /* "wellenreiter/hex", */ tr( "Stat" ) );
TabWidget->addTab( about, /* "wellenreiter/about", */ tr( "About" ) );
#endif
WellenreiterBaseLayout->addWidget( TabWidget );
#ifdef QWS
TabWidget->setCurrentTab( tr( "Nets" ) );
#endif
+ connect(TabWidget, SIGNAL(currentChanged(QWidget*)),
+ this, SLOT(slotTabChanged(QWidget*)));
}
/*
* Destroys the object and frees any allocated resources
*/
WellenreiterBase::~WellenreiterBase()
{
// no need to delete child widgets, Qt does it all for us
}
/*
* Main event handler. Reimplemented to handle application
* font changes
*/
bool WellenreiterBase::event( QEvent* ev )
{
bool ret = QWidget::event( ev );
if ( ev->type() == QEvent::ApplicationFontChange ) {
//QFont Log_2_font( Log_2->font() );
//Log_2_font.setFamily( "adobe-courier" );
//Log_2_font.setPointSize( 8 );
//Log_2->setFont( Log_2_font );
QFont TextLabel1_4_2_font( TextLabel1_4_2->font() );
TextLabel1_4_2_font.setFamily( "adobe-helvetica" );
TextLabel1_4_2_font.setPointSize( 10 );
TextLabel1_4_2->setFont( TextLabel1_4_2_font );
}
return ret;
}
diff --git a/noncore/net/wellenreiter/opie-wellenreiter.control b/noncore/net/wellenreiter/opie-wellenreiter.control
index cbc287a..e7bc25d 100644
--- a/noncore/net/wellenreiter/opie-wellenreiter.control
+++ b/noncore/net/wellenreiter/opie-wellenreiter.control
@@ -1,10 +1,10 @@
Package: opie-wellenreiter
Files: bin/wellenreiter pics/wellenreiter apps/Applications/wellenreiter.desktop
Priority: optional
Section: opie/applications
Maintainer: Michael 'Mickey' Lauer <mickeyl@handhelds.org>
Architecture: arm
-Version: 1.0.3
+Version: 1.0.3-cvs
Depends: libqpe1, libpcap0 (>=0.7.2), libopiecore2, libopienet2, libopieui2
Description: A WaveLAN Network Monitor
A WaveLAN Network Monitor/Sniffer for the Opie Environment.
diff --git a/noncore/net/wellenreiter/wellenreiter.pro b/noncore/net/wellenreiter/wellenreiter.pro
index eb60c4a..53b762a 100644
--- a/noncore/net/wellenreiter/wellenreiter.pro
+++ b/noncore/net/wellenreiter/wellenreiter.pro
@@ -1,14 +1,15 @@
TEMPLATE = subdirs
+VERSION = 1.0.3-cvs
!contains( platform, x11 ) {
message( Configuring Wellenreiter for build on Opie )
SUBDIRS = gui
include ( $(OPIEDIR)/include.pro )
}
contains( platform, x11 ) {
message( Configuring Wellenreiter for build on Qt/X11 )
SUBDIRS = lib gui
system( mkdir -p $OPIEDIR/lib $OPIEDIR/bin $OPIEDIR/share/pics )
}