author | mickeyl <mickeyl> | 2004-05-02 20:08:30 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2004-05-02 20:08:30 (UTC) |
commit | 109ed5f2a1cdfeb3680c9ec057a1083fcf8fab95 (patch) (side-by-side diff) | |
tree | f7484ada7bff7e4f7a91184f6a8e078af6053dca | |
parent | 8602449caa5a055bd5f033e3792d0a59a0b41bfa (diff) | |
download | opie-109ed5f2a1cdfeb3680c9ec057a1083fcf8fab95.zip opie-109ed5f2a1cdfeb3680c9ec057a1083fcf8fab95.tar.gz opie-109ed5f2a1cdfeb3680c9ec057a1083fcf8fab95.tar.bz2 |
PacketViewer improvements:
- expose buffer size through API
- improve packet viewer logic
- display time/date of capture + capture length
-rw-r--r-- | noncore/net/wellenreiter/gui/configwindow.cpp | 27 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/configwindow.h | 2 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/packetview.cpp | 68 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/packetview.h | 12 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/wellenreiter.cpp | 2 |
5 files changed, 76 insertions, 35 deletions
diff --git a/noncore/net/wellenreiter/gui/configwindow.cpp b/noncore/net/wellenreiter/gui/configwindow.cpp index 279b39c..89ed24c 100644 --- a/noncore/net/wellenreiter/gui/configwindow.cpp +++ b/noncore/net/wellenreiter/gui/configwindow.cpp @@ -28,27 +28,28 @@ 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 <qspinbox.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; @@ -103,46 +104,46 @@ void WellenreiterConfigWindow::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; + 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; + odebug << "Wellenreiter: guessed device type to be #" << devicetype << "" << oendl; } } } int WellenreiterConfigWindow::driverType() const { QString name = deviceType->currentText(); if ( _devicetype.contains( name ) ) { return _devicetype[name]; } @@ -228,25 +229,25 @@ void WellenreiterConfigWindow::changedClientAction(int t) } void WellenreiterConfigWindow::changedStationAction(int t) { synchronizeActionsAndScripts(); } void WellenreiterConfigWindow::getCaptureFileNameClicked() { QString name = ( (WellenreiterMainWindow*) qApp->mainWidget() )->getFileName(true); - odebug << "name = " << name << "" << oendl; + odebug << "name = " << name << "" << oendl; if ( !name.isEmpty() ) { captureFileName->setText( name ); } } void WellenreiterConfigWindow::channelAllClicked(int state) { bool b = state; channel1->setChecked( b ); channel2->setChecked( b ); @@ -303,70 +304,70 @@ void WellenreiterConfigWindow::performAction( const QString& type, 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; + 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 '" << (const char*) 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; + odebug << "going to call script '" << script << "'" << oendl; ::system( script ); - odebug << "script returned." << oendl; + 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; + 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 ); @@ -426,25 +427,25 @@ void WellenreiterConfigWindow::load() 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; + 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() ); @@ -465,12 +466,18 @@ void WellenreiterConfigWindow::save() 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/configwindow.h b/noncore/net/wellenreiter/gui/configwindow.h index 0a5b3bd..2d478e7 100644 --- a/noncore/net/wellenreiter/gui/configwindow.h +++ b/noncore/net/wellenreiter/gui/configwindow.h @@ -49,24 +49,26 @@ class WellenreiterConfigWindow : public WellenreiterConfigBase int hoppingInterval() const; bool usePrismHeader() const; bool isChannelChecked( int ) const; bool useGPS() const; const QString gpsHost() const; int gpsPort() const; void save(); void load(); + int hexViewBuffer() const; + public slots: void changedDeviceType(int); void changedNetworkAction(int t); void changedClientAction(int t); void changedStationAction(int t); void getCaptureFileNameClicked(); void performAutodetection(); void channelAllClicked(int); void performAction( const QString&, const QString&, const QString&, bool, int, int /* , const GpsLocation& */ ); protected slots: void synchronizeActionsAndScripts(); diff --git a/noncore/net/wellenreiter/gui/packetview.cpp b/noncore/net/wellenreiter/gui/packetview.cpp index 4df01da..f0f16ff 100644 --- a/noncore/net/wellenreiter/gui/packetview.cpp +++ b/noncore/net/wellenreiter/gui/packetview.cpp @@ -10,112 +10,142 @@ ** ** 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( "Packet # " ); + _number->setPrefix( "Pkt# " ); _label = new QLabel( this ); - _label->setText( "eth0 2004/03/08 - 00:00:21" ); - _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 ); - hb->addWidget( _number ); - vb->addWidget( _list ); - vb->addWidget( _hex ); + 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 ) +void PacketView::add( const OPacket* p, int size ) { - _packets.append( p ); - // Add Circular Buffer and check for number of elements here + odebug << "PacketView::add() size = " << size << oendl; + if ( size == -1 ) // unlimited buffer + { + _packets.append( p ); + } + else + // limited buffer, limit = size + if ( _packets.count() < size ) + { + _packets.append( p ); + } + + _number->setMinValue( 1 ); + _number->setMaxValue( _packets.count() ); + _number->setValue( _packets.count() ); } void PacketView::showPacket( int number ) { _list->clear(); _hex->setText(""); - const OPacket* p = _packets.at( number ); - + 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; + 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 ) -{ - _hex->setText( p->dump( 16 ) ); +{ + if ( oApp->desktop()->width() > 320 ) + _hex->setText( p->dump( 16 ) ); + else + _hex->setText( p->dump( 8 ) ); } const QString PacketView::getLog() const { } void PacketView::clear() { _packets.clear(); _number->setMinValue( 0 ); _number->setMaxValue( 0 ); _label->setText( "---" ); _list->clear(); - _hex->setText( " <i>-- no Packet available --</i> " ); + _hex->setText( " <center><i>-- no Packet available --</i></center> " ); } diff --git a/noncore/net/wellenreiter/gui/packetview.h b/noncore/net/wellenreiter/gui/packetview.h index 42e8f5d..bb366c5 100644 --- a/noncore/net/wellenreiter/gui/packetview.h +++ b/noncore/net/wellenreiter/gui/packetview.h @@ -12,49 +12,51 @@ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** **********************************************************************/ #ifndef PACKETVIEW_H #define PACKETVIEW_H #include <qlist.h> #include <qframe.h> #include <opie2/opcap.h> +class QWidget; class QLabel; class QString; class QSpinBox; class QTextView; class QObjectList; namespace Opie {namespace Net {class OPacket;}} namespace Opie {namespace Ui {class OListView;}} class PacketView: public QFrame { - Q_OBJECT - + Q_OBJECT + public: PacketView( QWidget * parent = 0, const char * name = "PacketView", WFlags f = 0 ); - void add( const Opie::Net::OPacket* p ); + void add( const Opie::Net::OPacket* p, int size ); const QString getLog() const; void clear(); - + public slots: void showPacket( int number ); + void activated( QWidget* ); protected: QSpinBox* _number; QLabel* _label; Opie::Ui::OListView* _list; QTextView* _hex; QList<const Opie::Net::OPacket> _packets; - + protected: void _doSubPackets( QObjectList*, int ); void _doHexPacket( const Opie::Net::OPacket* ); }; #endif diff --git a/noncore/net/wellenreiter/gui/wellenreiter.cpp b/noncore/net/wellenreiter/gui/wellenreiter.cpp index 12b3978..fe8f22d 100644 --- a/noncore/net/wellenreiter/gui/wellenreiter.cpp +++ b/noncore/net/wellenreiter/gui/wellenreiter.cpp @@ -404,25 +404,25 @@ bool Wellenreiter::checkDumpPacket( OPacket* p ) else { odebug << "protocol '" << name << "' not checked in capturePackets." << oendl; } ++it; } return true; } void Wellenreiter::receivePacket( OPacket* p ) { - hexWindow()->add( 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; |