summaryrefslogtreecommitdiff
authormickeyl <mickeyl>2004-05-02 20:08:30 (UTC)
committer mickeyl <mickeyl>2004-05-02 20:08:30 (UTC)
commit109ed5f2a1cdfeb3680c9ec057a1083fcf8fab95 (patch) (side-by-side diff)
treef7484ada7bff7e4f7a91184f6a8e078af6053dca
parent8602449caa5a055bd5f033e3792d0a59a0b41bfa (diff)
downloadopie-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
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/wellenreiter/gui/configwindow.cpp27
-rw-r--r--noncore/net/wellenreiter/gui/configwindow.h2
-rw-r--r--noncore/net/wellenreiter/gui/packetview.cpp68
-rw-r--r--noncore/net/wellenreiter/gui/packetview.h12
-rw-r--r--noncore/net/wellenreiter/gui/wellenreiter.cpp2
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;