Diffstat (limited to 'noncore/applets/wirelessapplet/networkinfo.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/applets/wirelessapplet/networkinfo.cpp | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/noncore/applets/wirelessapplet/networkinfo.cpp b/noncore/applets/wirelessapplet/networkinfo.cpp index 22d7d83..8531fd5 100644 --- a/noncore/applets/wirelessapplet/networkinfo.cpp +++ b/noncore/applets/wirelessapplet/networkinfo.cpp @@ -30,104 +30,109 @@ #include <linux/wireless.h> #include <unistd.h> #include <math.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <qstring.h> #include <qfile.h> #include <qtextstream.h> /* estimated wireless signal strength and noise level values based on experimentation with Orinoco and Prism2 cards. Seem to be correct, but please inform me, if you got values outside these boundaries. :Mickey: */ #define IW_UPPER 220 #define IW_LOWER 140 #define PROCNETDEV "/proc/net/dev" #define PROCNETWIRELESS "/proc/net/wireless" +#define MDEBUG 0 + //--------------------------------------------------------------------------- // class MNetworkInterface // MNetworkInterface::MNetworkInterface( const char* name ) :name( name ) { struct ifreq ifr; struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr; fd = socket( AF_INET, SOCK_DGRAM, 0 ); } MNetworkInterface::~MNetworkInterface() { if ( fd != -1 ) close( fd ); } -void MNetworkInterface::updateStatistics() +bool MNetworkInterface::updateStatistics() { + return true; } //--------------------------------------------------------------------------- // class MWirelessNetworkInterface // MWirelessNetworkInterface::MWirelessNetworkInterface( const char* n ) :MNetworkInterface( n ) { signal = 0; noise = 0; quality = 0; } MWirelessNetworkInterface::~MWirelessNetworkInterface() { } int MWirelessNetworkInterface::qualityPercent() { return ( quality*100 ) / 92; } int MWirelessNetworkInterface::signalPercent() { return ( ( signal-IW_LOWER ) * 100 ) / IW_UPPER; } int MWirelessNetworkInterface::noisePercent() { return ( ( noise-IW_LOWER ) * 100 ) / IW_UPPER; } -void MWirelessNetworkInterface::updateStatistics() +bool MWirelessNetworkInterface::updateStatistics() { - MNetworkInterface::updateStatistics(); + bool base = MNetworkInterface::updateStatistics(); + if ( !base ) + return false; const char* buffer[200]; struct iwreq iwr; memset( &iwr, 0, sizeof( iwr ) ); iwr.u.essid.pointer = (caddr_t) buffer; iwr.u.essid.length = IW_ESSID_MAX_SIZE; iwr.u.essid.flags = 0; // check if it is an IEEE 802.11 standard conform // wireless device by sending SIOCGIWESSID // which also gives back the Extended Service Set ID // (see IEEE 802.11 for more information) strcpy( iwr.ifr_ifrn.ifrn_name, (const char*) name ); int result = ioctl( fd, SIOCGIWESSID, &iwr ); if ( result == 0 ) { hasWirelessExtensions = true; iwr.u.essid.pointer[(unsigned int) iwr.u.essid.length-1] = '\0'; essid = iwr.u.essid.pointer; } else essid = "*** Unknown ***"; @@ -160,112 +165,121 @@ void MWirelessNetworkInterface::updateStatistics() if ( result == 0 ) mode = ( iwr.u.mode == IW_MODE_ADHOC ) ? "Ad-Hoc" : "Managed"; else mode = "*** Unknown ***"; result = ioctl( fd, SIOCGIWFREQ, &iwr ); if ( result == 0 ) freq = double( iwr.u.freq.m ) * pow( 10, iwr.u.freq.e ) / 1000000000; else freq = 0; // gather link quality from /proc/net/wireless char c; QString status; QString name; QFile wfile( PROCNETWIRELESS ); bool hasFile = wfile.open( IO_ReadOnly ); QTextStream wstream( &wfile ); if ( hasFile ) { wstream.readLine(); // skip the first two lines wstream.readLine(); // because they only contain headers } if ( ( !hasFile ) || ( wstream.atEnd() ) ) { +#ifdef MDEBUG qDebug( "WIFIAPPLET: D'oh! Someone removed the card..." ); +#endif quality = -1; signal = IW_LOWER; noise = IW_LOWER; - return; + return false; } wstream >> name >> status >> quality >> c >> signal >> c >> noise; if ( quality > 92 ) +#ifdef MDEBUG qDebug( "WIFIAPPLET: D'oh! Quality %d > estimated max!\n", quality ); +#endif if ( ( signal > IW_UPPER ) || ( signal < IW_LOWER ) ) +#ifdef MDEBUG qDebug( "WIFIAPPLET: Doh! Strength %d > estimated max!\n", signal ); +#endif if ( ( noise > IW_UPPER ) || ( noise < IW_LOWER ) ) +#ifdef MDEBUG qDebug( "WIFIAPPLET: Doh! Noise %d > estimated max!\n", noise ); +#endif + + return true; + } //--------------------------------------------------------------------------- // class Network // MNetwork::MNetwork() { - //qDebug( "MNetwork::MNetwork()" ); procfile = PROCNETDEV; } MNetwork::~MNetwork() { - //qDebug( "MNetwork::~MNetwork()" ); } //--------------------------------------------------------------------------- // class WirelessNetwork // MWirelessNetwork::MWirelessNetwork() { - //qDebug( "MWirelessNetwork::MWirelessNetwork()" ); procfile = PROCNETWIRELESS; } MWirelessNetwork::~MWirelessNetwork() { - //qDebug( "MWirelessNetwork::~MWirelessNetwork()" ); } MNetworkInterface* MWirelessNetwork::createInterface( const char* n ) const { return new MWirelessNetworkInterface( n ); } //--------------------------------------------------------------------------- // class NetworkInterface // MNetworkInterface* MNetwork::getFirstInterface() { enumerateInterfaces(); InterfaceMapIterator it( interfaces ); return ( it.count() > 0 ) ? it.toFirst() : 0; } void MNetwork::enumerateInterfaces() { interfaces.clear(); QString str; QFile f( procfile ); bool hasFile = f.open( IO_ReadOnly ); if ( !hasFile ) return; QTextStream s( &f ); s.readLine(); s.readLine(); while ( !s.atEnd() ) { s >> str; str.truncate( str.find( ':' ) ); +#ifdef MDEBUG qDebug( "WIFIAPPLET: found interface '%s'", (const char*) str ); +#endif interfaces.insert( str, createInterface( str ) ); s.readLine(); } } MNetworkInterface* MNetwork::createInterface( const char* n ) const { return new MNetworkInterface( n ); } |