author | mickeyl <mickeyl> | 2002-08-31 10:43:26 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2002-08-31 10:43:26 (UTC) |
commit | cd33eed8d5eccebdc37dcd0e30d7917b91765222 (patch) (side-by-side diff) | |
tree | cec3d088b58501bcc660686f468c4a968dc2d729 | |
parent | 3b720187b21a3b9b3d17fc2b26489723febdaec2 (diff) | |
download | opie-cd33eed8d5eccebdc37dcd0e30d7917b91765222.zip opie-cd33eed8d5eccebdc37dcd0e30d7917b91765222.tar.gz opie-cd33eed8d5eccebdc37dcd0e30d7917b91765222.tar.bz2 |
- debug output is now #ifdef'd
- wireless applet icon shows on demand (like cardmon
- applet has an advanced configuration dialog
- applet features experimental dhcp renew on change of essid/freq/ap/mode
-rw-r--r-- | noncore/applets/wirelessapplet/advancedconfig.cpp | 55 | ||||
-rw-r--r-- | noncore/applets/wirelessapplet/advancedconfig.h | 36 | ||||
-rw-r--r-- | noncore/applets/wirelessapplet/advancedconfigbase.ui | 159 | ||||
-rw-r--r-- | noncore/applets/wirelessapplet/networkinfo.cpp | 30 | ||||
-rw-r--r-- | noncore/applets/wirelessapplet/networkinfo.h | 4 | ||||
-rw-r--r-- | noncore/applets/wirelessapplet/wireless.cpp | 149 | ||||
-rw-r--r-- | noncore/applets/wirelessapplet/wireless.h | 18 | ||||
-rw-r--r-- | noncore/applets/wirelessapplet/wirelessapplet.pro | 7 |
8 files changed, 432 insertions, 26 deletions
diff --git a/noncore/applets/wirelessapplet/advancedconfig.cpp b/noncore/applets/wirelessapplet/advancedconfig.cpp new file mode 100644 index 0000000..97b008d --- a/dev/null +++ b/noncore/applets/wirelessapplet/advancedconfig.cpp @@ -0,0 +1,55 @@ +/********************************************************************** +** Copyright (C) 2002 Michael 'Mickey' Lauer +** <mickey@tm.informatik.uni-frankfurt.de> +** http://www.Vanille.de +** +** 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 "advancedconfig.h" + +#include <qpe/config.h> +#include <qwidget.h> +#include <qcheckbox.h> + +AdvancedConfig::AdvancedConfig( QWidget* parent, const char* name, bool modal, WFlags fl ) + : AdvancedConfigBase( parent, name, modal, fl ) +{ + Config cfg( "qpe" ); + cfg.setGroup( "Wireless" ); + + bool rocESSID = cfg.readBoolEntry( "renew_dhcp_on_essid_change", false ); + bool rocFREQ = cfg.readBoolEntry( "renew_dhcp_on_freq_change", false ); + bool rocAP = cfg.readBoolEntry( "renew_dhcp_on_ap_change", false ); + bool rocMODE = cfg.readBoolEntry( "renew_dhcp_on_mode_change", false ); + + cbESSID->setChecked( rocESSID ); + cbFrequency->setChecked( rocFREQ ); + cbAccessPoint->setChecked( rocAP ); + cbMODE->setChecked( rocMODE ); +} + +AdvancedConfig::~AdvancedConfig() +{ +} + +void AdvancedConfig::accept() +{ + + Config cfg( "qpe" ); + cfg.setGroup( "Wireless" ); + cfg.writeEntry( "renew_dhcp_on_essid_change", cbESSID->isChecked() ); + cfg.writeEntry( "renew_dhcp_on_freq_change", cbFrequency->isChecked() ); + cfg.writeEntry( "renew_dhcp_on_ap_change", cbAccessPoint->isChecked() ); + cfg.writeEntry( "renew_dhcp_on_mode_change", cbMODE->isChecked() ); + + AdvancedConfigBase::accept(); +} + diff --git a/noncore/applets/wirelessapplet/advancedconfig.h b/noncore/applets/wirelessapplet/advancedconfig.h new file mode 100644 index 0000000..17ba3c5 --- a/dev/null +++ b/noncore/applets/wirelessapplet/advancedconfig.h @@ -0,0 +1,36 @@ +/********************************************************************** +** Copyright (C) 2002 Michael 'Mickey' Lauer +** <mickey@tm.informatik.uni-frankfurt.de> +** http://www.Vanille.de +** +** 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 ADVANCED_CONFIG_H +#define ADVANCED_CONFIG_H + +#include "advancedconfigbase.h" + +#include <qnamespace.h> + +class AdvancedConfig: public AdvancedConfigBase +{ + Q_OBJECT + +public: + AdvancedConfig( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~AdvancedConfig(); + +protected: + virtual void accept(); + +}; + +#endif diff --git a/noncore/applets/wirelessapplet/advancedconfigbase.ui b/noncore/applets/wirelessapplet/advancedconfigbase.ui new file mode 100644 index 0000000..c7c4a10 --- a/dev/null +++ b/noncore/applets/wirelessapplet/advancedconfigbase.ui @@ -0,0 +1,159 @@ +<!DOCTYPE UI><UI> +<class>AdvancedConfigBase</class> +<comment>/********************************************************************** +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qt Palmtop Environment. +** +** 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. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +** $Id$ +** +**********************************************************************/</comment> +<widget> + <class>QDialog</class> + <property stdset="1"> + <name>name</name> + <cstring>AdvancedConfigBase</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>197</width> + <height>158</height> + </rect> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>caption</name> + <string>Advanced Config</string> + </property> + <property> + <name>layoutMargin</name> + </property> + <property> + <name>layoutSpacing</name> + </property> + <widget> + <class>QGroupBox</class> + <property stdset="1"> + <name>name</name> + <cstring>fraStart</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>11</x> + <y>11</y> + <width>175</width> + <height>136</height> + </rect> + </property> + <property stdset="1"> + <name>frameShape</name> + <enum>Box</enum> + </property> + <property stdset="1"> + <name>frameShadow</name> + <enum>Sunken</enum> + </property> + <property stdset="1"> + <name>title</name> + <string>Renew DHCP on changing</string> + </property> + <widget> + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout5</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>10</x> + <y>21</y> + <width>98</width> + <height>96</height> + </rect> + </property> + <grid> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget row="1" column="0" > + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>cbFrequency</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Frequency</string> + </property> + </widget> + <widget row="3" column="0" > + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>cbMODE</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>MODE</string> + </property> + </widget> + <widget row="0" column="0" > + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>cbESSID</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>ESSID</string> + </property> + </widget> + <widget row="2" column="0" > + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>cbAccessPoint</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>AccessPoint</string> + </property> + </widget> + </grid> + </widget> + </widget> +</widget> +<connections> + <slot access="protected">itemUp()</slot> + <slot access="protected">itemDown()</slot> +</connections> +</UI> 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 ); } diff --git a/noncore/applets/wirelessapplet/networkinfo.h b/noncore/applets/wirelessapplet/networkinfo.h index c5eb743..7e50bc4 100644 --- a/noncore/applets/wirelessapplet/networkinfo.h +++ b/noncore/applets/wirelessapplet/networkinfo.h @@ -16,82 +16,82 @@ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** **********************************************************************/ #ifndef NETWORKINFO_H #define NETWORKINFO_H #include <qstring.h> #include <qdict.h> //--------------------------------------------------------------------------- // class MNetworkInterface // class MNetworkInterface { public: MNetworkInterface( const char* name = "eth0" ); virtual ~MNetworkInterface(); bool isLoopback() { return isLoopbackInterface; }; const QString& getName() { return name; }; - virtual void updateStatistics(); + virtual bool updateStatistics(); protected: int fd; const QString name; bool isLoopbackInterface; bool isIrda; bool isTunnel; }; //--------------------------------------------------------------------------- // class MWirelessNetworkInterface // class MWirelessNetworkInterface : public MNetworkInterface { public: MWirelessNetworkInterface( const char* name = "wlan0" ); virtual ~MWirelessNetworkInterface(); int noisePercent(); int qualityPercent(); int signalPercent(); QString APAddr; QString essid; QString mode; QString nick; QString rate; double freq; int channel; - virtual void updateStatistics(); + virtual bool updateStatistics(); private: int quality; int signal; int noise; bool hasWirelessExtensions; }; //--------------------------------------------------------------------------- // class MNetwork // class MNetwork { public: MNetwork(); virtual ~MNetwork(); typedef QDict<MNetworkInterface> InterfaceMap; typedef QDictIterator<MNetworkInterface> InterfaceMapIterator; bool hasInterfaces() const { return interfaces.isEmpty(); }; int numInterfaces() const { return interfaces.count(); }; diff --git a/noncore/applets/wirelessapplet/wireless.cpp b/noncore/applets/wirelessapplet/wireless.cpp index 183aab8..a5aabb0 100644 --- a/noncore/applets/wirelessapplet/wireless.cpp +++ b/noncore/applets/wirelessapplet/wireless.cpp @@ -1,309 +1,432 @@ /********************************************************************** ** Copyright (C) 2002 Michael 'Mickey' Lauer ** <mickey@tm.informatik.uni-frankfurt.de> ** http://www.Vanille.de ** ** 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 "wireless.h" #include <qapplication.h> #include <qpe/qpeapplication.h> #include <qpe/config.h> #include <qpoint.h> #include <qradiobutton.h> -#include <qcheckbox.h> +#include <qpushbutton.h> #include <qpainter.h> #include <qlabel.h> #include <qslider.h> #include <qbuttongroup.h> #include <qlayout.h> #include <qframe.h> #include <qpixmap.h> #include <qstring.h> #include <qfile.h> +#include <qtextstream.h> + +#include <sys/types.h> +#include <signal.h> #include "networkinfo.h" #include "mgraph.h" +#include "advancedconfig.h" + #include "connect0.xpm" #include "connect1.xpm" #include "connect2.xpm" #include "connect3.xpm" #include "connect4.xpm" #include "connect5.xpm" #include "nowireless.xpm" #define STYLE_BARS 0 #define STYLE_ANTENNA 1 +#define MDEBUG 0 + WirelessControl::WirelessControl( WirelessApplet *applet, QWidget *parent, const char *name ) : QFrame( parent, name, WStyle_StaysOnTop | WType_Popup ), applet( applet ) { readConfig(); writeConfigEntry( "UpdateFrequency", updateFrequency ); writeConfigEntry( "DisplayStyle", displayStyle ); setFrameStyle( QFrame::PopupPanel | QFrame::Raised ); QGridLayout *grid = new QGridLayout( this, 3, 2, 6, 2, "top layout" ); /* status label */ statusLabel = new QLabel( this, "statuslabel" ); QString text( "Wireless Status:<br>" "*** Unknown ***<br>" "Card not inserted ?<br>" "Or Sharp ROM ?<br>" "CELL: 00:00:00:00:00:00" ); /* QString text( "Station: Unknown<br>" "ESSID: Unknown<br>" "MODE: Unknown<br>" "FREQ: Unknown<br>" "CELL: AA:BB:CC:DD:EE:FF" ); */ statusLabel->setText( text ); statusLabel->setFixedSize( statusLabel->sizeHint() ); grid->addWidget( statusLabel, 0, 0 ); /* visualization group box */ QButtonGroup* group = new QButtonGroup( 1, Qt::Horizontal, "Visualization", this ); QRadioButton* r1 = new QRadioButton( "Color Bars", group ); QRadioButton* r2 = new QRadioButton( "Antenna", group ); r1->setFocusPolicy( QWidget::NoFocus ); r2->setFocusPolicy( QWidget::NoFocus ); group->setFocusPolicy( QWidget::NoFocus ); group->setButton( displayStyle ); grid->addWidget( group, 0, 1 ); /* quality graph */ mgraph = new MGraph( this ); mgraph->setFrameStyle( QFrame::Panel | QFrame::Sunken ); mgraph->setMin( 0 ); mgraph->setMax( 92 ); grid->addWidget( mgraph, 1, 0 ); mgraph->setFocusPolicy( QWidget::NoFocus ); - /* dhcp renew CheckBox */ + /* advanced configuration Button */ - //FIXME: under construction - //QCheckBox* dhcpCheckBox = new QCheckBox( "DHCP renew", this ); - //dhcpCheckBox->setFocusPolicy( QWidget::NoFocus ); - //grid->addWidget( dhcpCheckBox, 2, 0, Qt::AlignCenter ); + QPushButton* advanced = new QPushButton( "Advanced...", this ); + advanced->setFocusPolicy( QWidget::NoFocus ); + grid->addWidget( advanced, 2, 0, Qt::AlignCenter ); + connect( advanced, SIGNAL( clicked() ), + this, SLOT( advancedConfigClicked() ) ); /* update Frequency Label */ updateLabel = new QLabel( this ); text.sprintf( "Update every %d s", updateFrequency ); updateLabel->setText( text ); grid->addWidget( updateLabel, 2, 1 ); /* update Frequency Slider */ QSlider* updateSlider = new QSlider( QSlider::Horizontal, this ); updateSlider->setRange( 0, 9 ); updateSlider->setValue( updateFrequency ); updateSlider->setTickmarks( QSlider::Both ); updateSlider->setTickInterval( 1 ); updateSlider->setSteps( 1, 1 ); updateSlider->setFocusPolicy( QWidget::NoFocus ); grid->addWidget( updateSlider, 1, 1 ); connect( updateSlider, SIGNAL( valueChanged( int ) ), this, SLOT( updateDelayChange( int ) ) ); setFixedSize( sizeHint() ); setFocusPolicy( QWidget::NoFocus ); applet->displayStyleChange( displayStyle ); applet->updateDelayChange( updateFrequency ); connect( group, SIGNAL( clicked( int ) ), - this, SLOT( displayStyleChange( int ) ) ); + this, SLOT( displayStyleChange( int ) ) ); + + applet->updateDHCPConfig( rocESSID, rocFREQ, rocAP, rocMODE ); +} + +void WirelessControl::advancedConfigClicked() +{ + AdvancedConfig* a = new AdvancedConfig( this, "dialog", TRUE ); + int result = a->exec(); + a->hide(); + delete a; + if ( result == QDialog::Accepted ) + { + readConfig(); + applet->updateDHCPConfig( rocESSID, rocFREQ, rocAP, rocMODE ); + } } void WirelessControl::updateDelayChange( int delay ) { QString text; text.sprintf( "Update every %d s", delay ); updateLabel->setText( text ); applet->updateDelayChange( delay ); writeConfigEntry( "UpdateFrequency", delay ); } void WirelessControl::displayStyleChange( int style ) { applet->displayStyleChange( style ); writeConfigEntry( "DisplayStyle", style ); } void WirelessControl::show ( bool ) { QPoint curPos = applet->mapToGlobal( QPoint ( 0, 0 ) ); int w = sizeHint().width(); int x = curPos.x() - ( w / 2 ); if ( ( x + w ) > QPEApplication::desktop()->width() ) x = QPEApplication::desktop ( )-> width ( ) - w; move( x, curPos.y () - sizeHint().height () ); QFrame::show(); } void WirelessControl::readConfig() { Config cfg( "qpe" ); cfg.setGroup( "Wireless" ); updateFrequency = cfg.readNumEntry( "UpdateFrequency", 2 ); - displayStyle = cfg. readNumEntry( "DisplayStyle", STYLE_ANTENNA ); + displayStyle = cfg.readNumEntry( "DisplayStyle", STYLE_ANTENNA ); + rocESSID = cfg.readBoolEntry( "renew_dhcp_on_essid_change", false ); + rocFREQ = cfg.readBoolEntry( "renew_dhcp_on_freq_change", false ); + rocAP = cfg.readBoolEntry( "renew_dhcp_on_ap_change", false ); + rocMODE = cfg.readBoolEntry( "renew_dhcp_on_mode_change", false ); } void WirelessControl::writeConfigEntry( const char *entry, int val ) { Config cfg( "qpe" ); cfg.setGroup( "Wireless" ); cfg.writeEntry( entry, val ); } //=========================================================================== WirelessApplet::WirelessApplet( QWidget *parent, const char *name ) : QWidget( parent, name ), visualStyle( STYLE_ANTENNA ), - timer( 0 ), interface( 0 ) + timer( 0 ), interface( 0 ), + rocESSID( false ), rocFREQ( false ), rocAP( false ), rocMODE( false ) { setFixedHeight( 18 ); setFixedWidth( 14 ); network = new MWirelessNetwork(); status = new WirelessControl( this, 0, "wireless status" ); } void WirelessApplet::checkInterface() { interface = network->getFirstInterface(); if ( interface ) { +#ifdef MDEBUG qDebug( "WIFIAPPLET: using interface '%s'", (const char*) +#endif interface->getName() ); } else { +#ifdef MDEBUG qDebug( "WIFIAPPLET: D'oh! No Wireless interface present... :(" ); + hide(); +#endif } } +void WirelessApplet::renewDHCP() +{ +#ifdef MDEBUG + qDebug( "WIFIAPPLET: Going to request a DHCP configuration renew." ); +#endif + + QString pidfile; + if ( !interface ) + return; + QString ifacename( interface->getName() ); + pidfile.sprintf( "/var/run/dhcpcd-%s.pid", (const char* ) ifacename ); +#ifdef MDEBUG + qDebug( "WIFIAPPLET: pidfile is '%s'", (const char*) pidfile ); +#endif + int pid; + QFile pfile( pidfile ); + bool hasFile = pfile.open( IO_ReadOnly ); + QTextStream s( &pfile ); + if ( hasFile ) + s >> pid; +#ifdef MDEBUG + qDebug( "WIFIAPPLET: sent -14 to pid %d", pid ); +#endif + kill( pid, -14 ); + +} + +void WirelessApplet::updateDHCPConfig( bool ESSID, bool FREQ, bool AP, bool MODE ) +{ + rocESSID = ESSID; + rocFREQ = FREQ; + rocAP = AP; + rocMODE = MODE; +} + void WirelessApplet::updateDelayChange( int delay ) { if ( timer ) killTimer( timer ); delay *= 1000; if ( delay == 0 ) delay = 50; timer = startTimer( delay ); } void WirelessApplet::displayStyleChange( int style ) { visualStyle = style; repaint(); } WirelessApplet::~WirelessApplet() { } void WirelessApplet::timerEvent( QTimerEvent* ) { MWirelessNetworkInterface* iface = ( MWirelessNetworkInterface* ) interface; if ( iface ) { - iface->updateStatistics(); + bool statResult = iface->updateStatistics(); + if ( !statResult ) + { + interface = 0; + mustRepaint(); + return; + } else if ( mustRepaint() ) { //qDebug( "WIFIAPPLET: A value has changed -> repainting." ); repaint(); } if ( status->isVisible() ) updatePopupWindow(); } else checkInterface(); } void WirelessApplet::mousePressEvent( QMouseEvent *) { if ( status->isVisible() ) status->hide(); else status->show( true ); } bool WirelessApplet::mustRepaint() { MWirelessNetworkInterface* iface = ( MWirelessNetworkInterface* ) interface; // check if there are enough changes to justify a (flickering) repaint // has the interface changed? if ( iface != oldiface ) { - oldiface = iface; - return true; + oldiface = iface; + if ( iface ) + { +#ifdef MDEBUG + qDebug( "WIFIAPPLET: We had no interface but now we have one! :-)" ); +#endif + show(); + } + else + { +#ifdef MDEBUG + qDebug( "WIFIAPPLET: We had a interface but now we don't have one! ;-(" ); +#endif + hide(); + return true; + } } const char** pixmap = getQualityPixmap(); if ( pixmap && ( pixmap != oldpixmap ) ) { oldpixmap = pixmap; return true; } int noiseH = iface->noisePercent() * ( height() - 3 ) / 100; int signalH = iface->signalPercent() * ( height() - 3 ) / 100; int qualityH = iface->qualityPercent() * ( height() - 3 ) / 100; if ( ( noiseH != oldnoiseH ) || ( signalH != oldsignalH ) || ( qualityH != oldqualityH ) ) { oldnoiseH = noiseH; oldsignalH = signalH; oldqualityH = qualityH; return true; } + + if ( rocESSID && ( oldESSID != iface->essid ) ) + { +#ifdef MDEBUG + qDebug( "WIFIAPPLET: ESSID has changed."); +#endif + renewDHCP(); + } + else if ( rocFREQ && ( oldFREQ != iface->freq ) ) + { +#ifdef MDEBUG + qDebug( "WIFIAPPLET: FREQ has changed."); +#endif + renewDHCP(); + } + else if ( rocAP && ( oldAP != iface->APAddr ) ) + { +#ifdef MDEBUG + qDebug( "WIFIAPPLET: AP has changed."); +#endif + renewDHCP(); + } + else if ( rocMODE && ( oldMODE != iface->mode ) ) + { +#ifdef MDEBUG + qDebug( "WIFIAPPLET: MODE has changed."); +#endif + renewDHCP(); + } + + oldESSID = iface->essid; + oldMODE = iface->mode; + oldFREQ = iface->freq; + oldAP = iface->APAddr; return false; } void WirelessApplet::updatePopupWindow() { MWirelessNetworkInterface* iface = ( MWirelessNetworkInterface* ) interface; int qualityH = iface->qualityPercent(); if ( status->mgraph ) status->mgraph->addValue( qualityH, false ); QString freqString; QString cell = ( iface->mode == "Managed" ) ? "AP: " : "Cell: "; freqString.sprintf( "%.3f GHz", iface->freq ); status->statusLabel->setText( "Station: " + iface->nick + "<br>" + "ESSID: " + iface->essid + "<br>" + "MODE: " + iface->mode + "<br>" + "FREQ: " + freqString + "<br>" + cell + " " + iface->APAddr ); } const char** WirelessApplet::getQualityPixmap() { @@ -313,49 +436,49 @@ const char** WirelessApplet::getQualityPixmap() int qualityH = iface->qualityPercent(); if ( qualityH < 0 ) return ( const char** ) nowireless_xpm; if ( visualStyle == STYLE_ANTENNA ) { if ( qualityH < 1 ) return ( const char** ) connect0_xpm; if ( qualityH < 17 ) return ( const char** ) connect1_xpm; if ( qualityH < 34 ) return ( const char** ) connect2_xpm; if ( qualityH < 50 ) return ( const char** ) connect3_xpm; if ( qualityH < 65 ) return ( const char** ) connect4_xpm; return ( const char** ) connect5_xpm; } return 0; // please draw your bars } void WirelessApplet::paintEvent( QPaintEvent* ) { MWirelessNetworkInterface* iface = ( MWirelessNetworkInterface* ) interface; QPainter p(this); QColor color; const char** pixmap = getQualityPixmap(); - + if ( pixmap ) p.drawPixmap( 0, 1, pixmap ); else { int noiseH = iface->noisePercent() * ( height() - 3 ) / 100; int signalH = iface->signalPercent() * ( height() - 3 ) / 100; int qualityH = iface->qualityPercent() * ( height() - 3 ) / 100; double intensity; int pixelHeight; int pixelWidth = 2; int Hue; int barSpace = 3; int leftoffset = 0; int bottomoffset = 2; // draw noise indicator pixelHeight = noiseH; Hue = 50; for ( int i = 0; i < pixelHeight; ++i ) { intensity = 50 + ( (double) i / (double) pixelHeight ) * 205; color.setHsv( Hue, 255, intensity ); diff --git a/noncore/applets/wirelessapplet/wireless.h b/noncore/applets/wirelessapplet/wireless.h index 45c519d..51a3fab 100644 --- a/noncore/applets/wirelessapplet/wireless.h +++ b/noncore/applets/wirelessapplet/wireless.h @@ -24,72 +24,90 @@ class MWirelessNetwork; class MNetworkInterface; class MWirelessNetworkInterface; class Y; class QLabel; class WirelessApplet; class MGraph; class WirelessControl : public QFrame { Q_OBJECT public: WirelessControl( WirelessApplet* icon, QWidget *parent=0, const char *name=0 ); void show( bool ); void readConfig(); void writeConfigEntry( const char* entry, int val ); MGraph* mgraph; QLabel* statusLabel; QLabel* updateLabel; public slots: void updateDelayChange( int ); void displayStyleChange( int ); + void advancedConfigClicked(); private: WirelessApplet* applet; int displayStyle; int updateFrequency; + bool rocESSID; + bool rocFREQ; + bool rocAP; + bool rocMODE; }; class WirelessApplet : public QWidget { Q_OBJECT public: WirelessApplet( QWidget *parent = 0, const char *name=0 ); ~WirelessApplet(); WirelessControl* status; virtual void timerEvent( QTimerEvent* ); void updateDelayChange( int delay ); void displayStyleChange( int style ); + + void updateDHCPConfig( bool, bool, bool, bool ); private: void mousePressEvent( QMouseEvent * ); void paintEvent( QPaintEvent* ); void checkInterface(); + void renewDHCP(); bool mustRepaint(); void updatePopupWindow(); const char** getQualityPixmap(); private: QPixmap snapshotPixmap; int visualStyle; int timer; MWirelessNetwork* network; MNetworkInterface* interface; private: const char** oldpixmap; MWirelessNetworkInterface* oldiface; int oldqualityH; int oldsignalH; int oldnoiseH; + + QString oldESSID; + QString oldAP; + QString oldMODE; + double oldFREQ; + + bool rocESSID; + bool rocFREQ; + bool rocAP; + bool rocMODE; }; #endif // __WIRELESS_APPLET_H__ diff --git a/noncore/applets/wirelessapplet/wirelessapplet.pro b/noncore/applets/wirelessapplet/wirelessapplet.pro index b758d4f..390b271 100644 --- a/noncore/applets/wirelessapplet/wirelessapplet.pro +++ b/noncore/applets/wirelessapplet/wirelessapplet.pro @@ -1,25 +1,26 @@ TEMPLATE = lib CONFIG += qt warn_on release -HEADERS = wireless.h wirelessappletimpl.h networkinfo.h mgraph.h -SOURCES = wireless.cpp wirelessappletimpl.cpp networkinfo.cpp mgraph.cpp +HEADERS = wireless.h wirelessappletimpl.h networkinfo.h mgraph.h advancedconfig.h +SOURCES = wireless.cpp wirelessappletimpl.cpp networkinfo.cpp mgraph.cpp advancedconfig.cpp +INTERFACES = advancedconfigbase.ui TARGET = wirelessapplet DESTDIR = $(OPIEDIR)/plugins/applets INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += ../$(OPIEDIR)/include LIBS += -lqpe -VERSION = 0.0.3 +VERSION = 0.1.0 TRANSLATIONS = ../../../i18n/de/libwirelessapplet.ts \ ../../../i18n/en/libwirelessapplet.ts \ ../../../i18n/es/libwirelessapplet.ts \ ../../../i18n/fr/libwirelessapplet.ts \ ../../../i18n/hu/libwirelessapplet.ts \ ../../../i18n/ja/libwirelessapplet.ts \ ../../../i18n/ko/libwirelessapplet.ts \ ../../../i18n/no/libwirelessapplet.ts \ ../../../i18n/pl/libwirelessapplet.ts \ ../../../i18n/pt/libwirelessapplet.ts \ ../../../i18n/pt_BR/libwirelessapplet.ts \ ../../../i18n/sl/libwirelessapplet.ts \ ../../../i18n/zh_CN/libwirelessapplet.ts \ ../../../i18n/zh_TW/libwirelessapplet.ts |