summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-03-01 19:19:25 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-03-01 19:19:25 +0000
commite0311ffdf88fc311006351582b959a69d8aad328 (patch)
treedccf6212f21ef7e3824b54837be7b1d14139d2e1 /src
downloadwlassistant-e0311ffdf88fc311006351582b959a69d8aad328.tar.gz
wlassistant-e0311ffdf88fc311006351582b959a69d8aad328.zip
Added KDE3 version of wlassistant
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/wlassistant@1097621 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'src')
-rw-r--r--src/SConscript26
-rw-r--r--src/main.cpp56
-rw-r--r--src/netlistviewitem.cpp239
-rw-r--r--src/netlistviewitem.h176
-rw-r--r--src/netparams.h289
-rw-r--r--src/ui_NetParamsEdit.ui1111
-rw-r--r--src/ui_NetParamsWizard.ui892
-rw-r--r--src/ui_main.ui759
-rw-r--r--src/ui_netparamsedit.cpp174
-rw-r--r--src/ui_netparamsedit.h53
-rw-r--r--src/ui_netparamswizard.cpp107
-rw-r--r--src/ui_netparamswizard.h53
-rw-r--r--src/waconfig.cpp29
-rw-r--r--src/waconfig.h45
-rw-r--r--src/watools.cpp312
-rw-r--r--src/watools.h76
-rw-r--r--src/wlassistant.cpp1264
-rw-r--r--src/wlassistant.desktop55
-rw-r--r--src/wlassistant.h120
19 files changed, 5836 insertions, 0 deletions
diff --git a/src/SConscript b/src/SConscript
new file mode 100644
index 0000000..85a3fee
--- /dev/null
+++ b/src/SConscript
@@ -0,0 +1,26 @@
+#! /usr/bin/env python
+## Thomas Nagy, 2005
+## This file can be reused freely for any project (see COPYING)
+
+Import( 'env' )
+
+obj=env.kobject('program')
+obj.target='wlassistant'
+obj.source="""
+main.cpp
+netlistviewitem.cpp
+ui_NetParamsEdit.ui
+ui_netparamsedit.cpp
+ui_NetParamsWizard.ui
+ui_netparamswizard.cpp
+ui_main.ui
+waconfig.cpp
+watools.cpp
+wlassistant.cpp
+"""
+
+obj.cxxflags='-DQT_THREAD_SUPPORT'
+obj.libs='qt-mt kdecore kdeui iw'
+obj.execute()
+
+#env.KDEinstall( 'KDEMENU', 'Utilities', 'wlassistant.desktop' ) \ No newline at end of file
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000..a06f95e
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,56 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Pawel Nawrocki *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+
+#include "wlassistant.h"
+
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+
+static const char description[] =
+ I18N_NOOP("Wireless Assistant");
+
+static const char version[] = "0.5.7";
+
+static KCmdLineOptions options[] =
+ {
+ // { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+ KCmdLineLastOption
+ };
+
+int main(int argc, char **argv)
+{
+ KAboutData about("wlassistant", I18N_NOOP("Wireless Assistant"), version, description,
+ KAboutData::License_GPL, "(C) %{YEAR} Pawel Nawrocki", 0, 0, "[email protected]");
+ about.addAuthor( "Pawel Nawrocki", 0, "[email protected]" );
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions( options );
+ KApplication app;
+ WirelessAssistant *mainWin = 0;
+ mainWin = new WirelessAssistant();
+ mainWin->setCaption( QString("%1 %2").arg(description).arg(version) );
+ app.setMainWidget( mainWin );
+ mainWin->show();
+
+ // mainWin has WDestructiveClose flag by default, so it will delete itself.
+ return app.exec();
+}
diff --git a/src/netlistviewitem.cpp b/src/netlistviewitem.cpp
new file mode 100644
index 0000000..a607eee
--- /dev/null
+++ b/src/netlistviewitem.cpp
@@ -0,0 +1,239 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Pawel Nawrocki *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include "netlistviewitem.h"
+
+#include <iostream>
+
+#include <kiconloader.h>
+#include <kiconeffect.h>
+#include <kdeversion.h>
+
+void NetListViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment)
+{
+ /// HACK fixes: higher item (connected) is drawn using regular height upon widget change (widgetStack);
+ if ( height()!=mHeight )
+ setHeight( mHeight );
+
+ /// PREPARE COLORS ///
+ QColor bgColor, fgColor;
+ /// colors of selected item
+ if ( listView()->isSelected(this) ) {
+ bgColor = cg.color( QColorGroup::Highlight ); /// settings for selected item;
+ fgColor = cg.color( QColorGroup::HighlightedText );
+ /// colors of deselected item`
+ } else {
+ if (mConnected)
+ bgColor = cg.color( QColorGroup::Background);
+ else {
+#if KDE_IS_VERSION(3,4,0)
+ bgColor = ((KListViewItem*)this)->backgroundColor(column);
+#else
+
+ bgColor = ((KListViewItem*)this)->backgroundColor();
+#endif
+
+ }
+ fgColor = cg.color( QColorGroup::Text);
+ if (mQuality<8)
+ fgColor = fgColor.light();
+ }
+
+ /// DRAW BACKGROUND ///
+ p->fillRect(0,0,width,height(),bgColor);
+ if (mConnected) {
+ /// draw a line separating connectedItem from the rest of the list.
+ p->setPen( bgColor.dark(130) );
+ p->drawLine(0, height()-1, width, height()-1);
+ }
+
+ switch (column) {
+
+ /// DRAW QUALITY ///
+ case mQualityColumn: {
+ QPixmap qualityIcon = SmallIcon("knewstuff");
+ QPixmap qualityIconGray = KIconEffect().apply( qualityIcon, KIconEffect::ToGray, 1, Qt::black, true );
+ int barWidth = int(mQuality/8)*8;
+ if (mQuality>0)
+ barWidth+=8; //add 8 (half a star) b/c int rounds down.
+ if (barWidth>96)
+ barWidth=96;
+ int icoTop = int( ( this->height()-16 )/2 );
+ p->drawTiledPixmap(listView()->itemMargin(),icoTop,6*16, 16, qualityIconGray );
+ p->drawTiledPixmap(listView()->itemMargin(),icoTop,barWidth, 16, qualityIcon );
+ break;
+ }
+
+ /// DRAW ENCRYPTION ///
+ case mEncColumn: {
+ if (mEnc) {
+ int icoTop = int( ( this->height()-16 )/2 );
+ int icoLeft = int( ( width-listView()->itemMargin()-16 )/2 );
+ QPixmap encIcon = SmallIcon("encrypted");
+ p->drawPixmap(icoLeft,icoTop, encIcon );
+ }
+ break;
+ }
+
+ /// DRAW ESSID ///
+ case mEssidColumn: {
+ /// draw icon and its shadow.
+ if (mConnected) {
+ QPixmap connectedIcon;
+ connectedIcon = SmallIcon("forward");
+ int icoTop = int( ( this->height()-16 )/2 );
+ p->drawPixmap(listView()->itemMargin(),icoTop, connectedIcon );
+ }
+
+ QFont mFont = listView()->font();
+ if (mConnected)
+ mFont.setBold( true );
+ if (mHidden)
+ mFont.setItalic( true );
+ p->setFont( mFont );
+ /// draw shadow + essid name(not connected)
+ if (mConnected) {
+ p->setPen( bgColor.dark(130) );
+ p->drawText(16+(listView()->itemMargin()*2),0,width, height(), AlignVCenter, mEssid);
+ p->setPen( bgColor.dark(220) );
+ p->drawText(16+(listView()->itemMargin()*2)-1,-1,width, height(), AlignVCenter, mEssid);
+ p->setPen( fgColor );
+ p->drawText(16+(listView()->itemMargin()*2)-2,-2,width, height(), AlignVCenter, mEssid);
+
+ } else {
+ /// draw essid name (not connected)
+ p->setPen( fgColor );
+ p->drawText(listView()->itemMargin(),0,width, height(), AlignVCenter, mEssid);
+ }
+ break;
+ }
+
+ /// DRAW CHANNEL ///
+ case mChanColumn: {
+ QFont mFont = listView()->font();
+ mFont.setItalic(true);
+ if (mConnected)
+ mFont.setBold( true );
+ p->setFont( mFont );
+ if (mConnected) {
+ p->setPen( bgColor.dark(130) );
+ p->drawText(listView()->itemMargin(),0,width, height(), AlignCenter, mChannel);
+ p->setPen( bgColor.dark(220) );
+ p->drawText(listView()->itemMargin()-1,-1,width, height(), AlignCenter, mChannel);
+ } else {
+ p->setPen( bgColor.dark(220) );
+ p->drawText(listView()->itemMargin(),0,width, height(), AlignCenter, mChannel);
+ }
+ break;
+ }
+ /// DRAW ACCESS POINT ///
+ case mAPColumn: {
+ QFont mFont = listView()->font();
+ if (mHidden)
+ mFont.setItalic( true );
+ if (mConnected)
+ mFont.setBold( true );
+ p->setFont( mFont );
+ if (mConnected) {
+ p->setPen( bgColor.dark(130) );
+ p->drawText(listView()->itemMargin(),0,width, height(), AlignVCenter, mAP);
+ p->setPen( bgColor.dark(220) );
+ p->drawText(listView()->itemMargin()-1,-1,width, height(), AlignVCenter, mAP);
+
+ } else {
+ p->setPen( bgColor.dark(220) );
+ p->drawText(listView()->itemMargin(),0,width, height(), AlignVCenter, mAP);
+ }
+ break;
+ }
+
+ default:
+ KListViewItem::paintCell(p, cg, column, width, alignment);
+
+ } //switch
+}
+
+int NetListViewItem::width(const QFontMetrics &fm, const QListView *lv, int column) const
+{
+ int w;
+ QFont mFont = listView()->font();
+ if (mConnected)
+ mFont.setBold(true);
+ if (mHidden)
+ mFont.setItalic(true);
+ QFontMetrics mFm( mFont );
+
+ if (column == mQualityColumn)
+ w = 6*16 + (lv->itemMargin()*2);
+ else if (column == mEncColumn)
+ w = 16 + (lv->itemMargin()*2);
+ else if (column == mChanColumn)
+ w = mFm.width( mChannel ) + (lv->itemMargin()*2);
+ else if (column == mEssidColumn)
+ w = mFm.width( mEssid ) + (lv->itemMargin()*2);
+ else if (column == mAPColumn)
+ w = mFm.width( mAP ) + (lv->itemMargin()*2);
+ /*else if (column == mModeColumn)
+ w = fm.width( mMode ) + (lv->itemMargin()*2);*/
+
+ else
+ w = 0;
+
+ int headerw = fm.width( listView()->columnText(column) ) + (lv->itemMargin()*2);
+ if (w < headerw)
+ w = headerw;
+
+ return w;
+}
+
+QString NetListViewItem::key( int column, bool ascending ) const
+{
+ if (mConnected) { // make sure that connected item is always 1st.
+ if (ascending)
+ return "0";
+ else
+ return "ZZZ";
+ }
+ QString t = QString::null;
+ if (column == mQualityColumn) {
+ t = QString::number( mQuality );
+ if (mQuality < 10)
+ t.prepend("0");
+ } else if (column == mEncColumn) {
+ if (mEnc)
+ t = "1";
+ else
+ t="0";
+ } else if (column == mEssidColumn) {
+ t = mEssid.upper(); // add .upper() to make it case-insensitive;
+ } else if (column == mChanColumn) {
+ t = mChannel;
+ if ( mChannel.length() == 1 )
+ t.prepend("0");
+ } else if (column == mAPColumn) {
+ t = mAP.upper();
+ /*} else if (column == mModeColumn) {
+ t = mMode.upper();*/
+
+ }
+
+
+ return t;
+}
diff --git a/src/netlistviewitem.h b/src/netlistviewitem.h
new file mode 100644
index 0000000..6410c86
--- /dev/null
+++ b/src/netlistviewitem.h
@@ -0,0 +1,176 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Pawel Nawrocki *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef WA_NETLISTVIEWITEM_H
+#define WA_NETLISTVIEWITEM_H
+
+#include <iostream>
+
+#include <qpainter.h>
+
+#include <klistview.h>
+#include <kmessagebox.h>
+
+class NetListViewItem : public KListViewItem
+{
+public:
+ //NetListViewItem(KListView *parent) : KListViewItem(parent) {}
+ //NetListViewItem(KListView *parent, KListViewItem *after) : KListViewItem(parent, after) {}
+ //NetListViewItem(KListView *parent, KListViewItem *after, QString essid, QString mode) : KListViewItem(parent, after, essid, mode) {}
+ NetListViewItem(KListView *parent, QString essid, QString chan, int quality, bool enc, QString ap, bool hidden, bool connected = 0 )
+ : KListViewItem(parent, QString::null, QString::null, QString::null, QString::null, QString::null)
+ {
+ mEssid = essid;
+ mChannel = chan;
+ //mMode = mode;
+ mQuality = quality;
+ mEnc = enc;
+ mAP = ap;
+ mHidden = hidden;
+ mConnected = connected;
+ mHeight = height();
+ mWpaSettings = QStringList();
+ }
+
+ ~NetListViewItem()
+ {}
+
+ void setEssid(const QString& theValue)
+ {
+ mEssid = theValue;
+ setText(mEssidColumn, mEssid);
+ //update();
+ }
+ QString essid() const
+ {
+ return mEssid;
+ }
+
+ void setChannel(const QString& theValue)
+ {
+ if ( mChannel != theValue ) { //repaint only if difference visible in quality stars
+ mChannel = theValue;
+ repaint();
+ }
+ }
+
+
+ QString channel() const
+ {
+ return mChannel;
+ }
+
+ /*QString mode() const
+ {
+ return mMode;
+ }*/
+
+ bool enc() const
+ {
+ return mEnc;
+ }
+
+ QString ap() const
+ {
+ return mAP;
+ }
+
+ void setAp(const QString& ap) {
+ mAP = ap;
+ setText(mAPColumn, mAP);
+ }
+
+ bool hidden() const
+ {
+ return mHidden;
+ }
+
+ void setConnected(bool theValue)
+ {
+ mConnected = theValue;
+ if (mConnected)
+ mHeight+=10;
+ else {
+ mHeight-=10;
+ }
+ setHeight( mHeight );
+ repaint();
+ }
+
+
+ bool isConnected() const
+ {
+ return mConnected;
+ }
+
+ void setQuality(const int& theValue)
+ {
+ if ( int(mQuality/8) != int(theValue/8) ) { //repaint only if difference visible in quality stars
+ mQuality = theValue;
+ repaint();
+ } else
+ mQuality = theValue;
+ }
+
+ int quality() const
+ {
+ return mQuality;
+ }
+
+ void setWpaSettings(const QStringList& theValue)
+ {
+ mWpaSettings = theValue;
+ }
+
+
+ QStringList wpaSettings() const
+ {
+ return mWpaSettings;
+ }
+
+
+
+
+
+private:
+ virtual void paintCell (QPainter *p, const QColorGroup &cg, int column, int width, int alignment);
+ virtual int width(const QFontMetrics &fm, const QListView *lv, int column) const;
+ virtual QString key( int column, bool ascending ) const;
+
+ QString mEssid;
+ QString mChannel;
+ //QString mMode;
+ int mQuality;
+ bool mEnc;
+ QString mAP;
+ bool mHidden;
+ bool mConnected;
+ int mHeight;
+ QStringList mWpaSettings;
+
+ static const int mEssidColumn = 0;
+ static const int mChanColumn = 1;
+ static const int mQualityColumn = 2;
+ static const int mEncColumn = 3;
+ static const int mAPColumn = 4;
+
+};
+
+#endif // WA_NETLISTVIEWITEM_H
diff --git a/src/netparams.h b/src/netparams.h
new file mode 100644
index 0000000..3ec8352
--- /dev/null
+++ b/src/netparams.h
@@ -0,0 +1,289 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Pawel Nawrocki *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef WA_NETPARAMS_H
+#define WA_NETPARAMS_H
+
+#include <iostream>
+#include <qfile.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+class WANetParams
+{
+public:
+ QString iface;
+ QString essid;
+ //QString mode;
+ QString channel;
+ QString ap;
+ bool wep;
+ QString wepMode;
+ QString wepKey;
+ bool wpa;
+ QStringList wpaSettings;
+ QString wpaKey;
+
+ bool dhcp;
+ QString ip;
+ QString netmask;
+ QString broadcast;
+ QString gateway;
+ QString domain;
+ QString dns1;
+ QString dns2;
+
+ bool hiddenEssid;
+ bool wasHiddenEssid;
+ bool wasWep;
+
+ QString preConnectionCommand;
+ QString postConnectionCommand;
+ QString preDisconnectionCommand;
+ QString postDisconnectionCommand;
+ int preConnectionTimeout;
+ int postConnectionTimeout;
+ int preDisconnectionTimeout;
+ int postDisconnectionTimeout;
+ bool preConnectionDetached;
+ bool postConnectionDetached;
+ bool preDisconnectionDetached;
+ bool postDisconnectionDetached;
+
+ bool review()
+ {
+ bool r = false; //DEFAULTS TO 'no review needed'
+ if (wep)
+ if ( (wepMode.isEmpty()) || (wepKey.isEmpty()) ) {
+ if (!wasWep) {
+ KMessageBox::information(0, i18n("<qt><p>The network changed its security settings.</p><p>Please go to <i>Security</i> tab of the following dialog and configure WEP settings.</p></qt>") );
+ } else
+ KMessageBox::error(0, i18n("<qt><p>Your WEP Key is not set properly.</p><p>Please go to <i>Security</i> tab of the following dialog and enter the required key.</p></qt>") );
+ r = true;
+ }
+ if ( (hiddenEssid) && (!wasHiddenEssid) )
+ if ( KMessageBox::questionYesNo(0, i18n("<qt><p>The network has stopped broadcasting its ESSID since the last time you were connected.</p><p>Would you like to use '<b>%1</b>' as an ESSID for this network?</p><p><i>NOTE: If you answer No, a dialog will appear where you will be able to specify a different ESSID.</i></p></qt>").arg(essid) ) != 3 ) // !=YES
+ r = true;
+
+ wasHiddenEssid = hiddenEssid;
+ wasWep = wep;
+ return r;
+ }
+
+ QString netParamsString()
+ {
+ QStringList mNPS;
+ mNPS << boolToString(hiddenEssid) << essid << ap << channel << boolToString(wep) << wepMode << wepKey << boolToString(dhcp) << ip << netmask << broadcast << gateway << domain << dns1 << dns2 << boolToString(wasHiddenEssid) << boolToString(wasWep) << \
+ preConnectionCommand << QString::number(preConnectionTimeout) << boolToString(preConnectionDetached) << \
+ postConnectionCommand << QString::number(postConnectionTimeout) << boolToString(postConnectionDetached) << \
+ preDisconnectionCommand << QString::number(preDisconnectionTimeout) << boolToString(preDisconnectionDetached) << \
+ postDisconnectionCommand << QString::number(postDisconnectionTimeout) << boolToString(postDisconnectionDetached) << \
+ wpaSettings.join(",") << wpaKey;
+ return mNPS.join(",");
+ }
+
+ void loadNetParamsString( const QString & nps )
+ {
+ /*if (nps.section(",",0,0)=="true")
+ hiddenEssid=true;
+ else
+ hiddenEssid=false;*/ // COMMENTED OUT because hiddenEssid boolean is set from the list item
+ essid = nps.section(",",1,1);
+ ap = nps.section(",",2,2);
+ //channel = nps.section(",",3,3); COMMENTED OUT because channel is set from the list item
+ /*if (nps.section(",",4,4)=="true")
+ wep=true;
+ else
+ wep=false;*/ // COMMENTED OUT because wep boolean is set from the list item
+ wepMode = nps.section(",",5,5);
+ wepKey = nps.section(",",6,6);
+ dhcp = ( nps.section(",",7,7) == "true" );
+ ip = nps.section(",",8,8);
+ netmask = nps.section(",",9,9);
+ broadcast = nps.section(",",10,10);
+ gateway = nps.section(",",11,11);
+ domain = nps.section(",",12,12);
+ dns1 = nps.section(",",13,13);
+ dns2 = nps.section(",",14,14);
+ wasHiddenEssid = ( nps.section(",",15,15)=="true" );
+ wasWep = ( nps.section(",",16,16)=="true" );
+
+ preConnectionCommand = nps.section(",",17,17);
+ preConnectionTimeout = nps.section(",",18,18).toInt();
+ preConnectionDetached = ( nps.section(",",19,19) == "true" );
+
+ postConnectionCommand = nps.section(",",20,20);
+ postConnectionTimeout = nps.section(",",21,21).toInt();
+ postConnectionDetached = ( nps.section(",",22,22) == "true" );
+
+ preDisconnectionCommand = nps.section(",",23,23);
+ preDisconnectionTimeout = nps.section(",",24,24).toInt();
+ preDisconnectionDetached = ( nps.section(",",25,25) == "true" );
+
+ postDisconnectionCommand = nps.section(",",26,26);
+ postDisconnectionTimeout = nps.section(",",27,27).toInt();
+ postDisconnectionDetached = ( nps.section(",",28,28) == "true" );
+ wpaSettings = QStringList::split( ",", nps.section(",",29,32) ); // 4 fields
+ wpaKey = nps.section(",",33,33);
+
+ }
+private:
+ QString boolToString( bool b )
+ {
+ QString result;
+ b ? result = "true" : result = "false";
+ return result;
+ }
+};
+
+class WACommands
+{
+public:
+ bool allFound;
+ QStringList notFound;
+
+ void init()
+ {
+ QStringList binDirs;
+ binDirs << "/sbin" << "/usr/sbin" << "/usr/local/sbin" << "/bin" << "/usr/bin" << "/usr/local/bin";
+
+ wpa_supplicant = getPath("wpa_supplicant", binDirs);
+ wpa_cli = getPath("wpa_cli", binDirs);
+ dhcp = getPath("dhcpcd", binDirs); //these 2 checks have to be first, so allFound flag is properly set.
+ if (dhcp.isEmpty())
+ dhcp = getPath("dhclient", binDirs);
+ if (!dhcp.isEmpty()) {
+ allFound=1;
+ dhcpClient = dhcp.section("/",-1,-1);
+ std::cout << "DHCP Client: " << dhcpClient << std::endl;
+ }
+
+ ifconfig = getPath("ifconfig", binDirs);
+ iwconfig = getPath("iwconfig", binDirs);
+ iwlist = getPath("iwlist", binDirs);
+ route = getPath("route", binDirs);
+ pidof = getPath("pidof", binDirs);
+
+ if (!allFound)
+ std::cout << "Executable(s) not found:" << notFound.join(", ") << std::endl;
+ else
+ std::cout << "All executables found." << std::endl;
+ }
+
+ QStringList cmd( const QString & action, const WANetParams & np, const bool & quiet = false )
+ {
+ QStringList mCmd;
+
+ /*if (action=="ifup")
+ mCmd << ifconfig << np.iface << "up";
+
+ else if (action=="ifdown")
+ mCmd << ifconfig << np.iface << "down";
+
+ else*/ if (action=="radio_on")
+ mCmd << iwconfig << np.iface << "txpower" << "auto";
+
+ else if (action=="scan")
+ mCmd << iwlist << np.iface << "scan";
+
+ else if (action=="disconnect")
+ mCmd << iwconfig << np.iface << "mode" << "managed" << "key" << "off" << "ap" << "off" << "essid" << "off";
+
+ else if (action=="iwconfig_set") {
+ mCmd << iwconfig << np.iface << "mode" << "managed";
+ if (np.channel.toInt()>0)
+ mCmd << "channel" << np.channel;
+ mCmd << "key";
+ if (np.wep && !np.wepKey.isEmpty())
+ mCmd << np.wepMode << np.wepKey;
+ else
+ mCmd << "off";
+ mCmd << "essid" << np.essid;
+
+ } else if (action=="iwconfig_ap") {
+ mCmd << iwconfig << np.iface << "ap" << np.ap;
+
+ } else if (action=="ifconfig_dhcp") {
+ if (dhcpClient=="dhcpcd")
+ mCmd << dhcp << "-nd" << np.iface;
+ else if (dhcpClient=="dhclient")
+ mCmd << dhcp << np.iface; // << "-1" << "-q"
+
+ } else if (action=="kill_dhcp") {
+ if ( dhcpClient=="dhcpcd") //dhcpcd
+ mCmd << dhcp << "-k" << np.iface;
+ else //dhclient
+ mCmd << dhcp << "-r" << np.iface;
+
+ } else if (action=="ifconfig_manual") {
+ mCmd << ifconfig << np.iface << np.ip;
+ if (!np.netmask.isEmpty())
+ mCmd << "netmask" << np.netmask;
+ if (!np.broadcast.isEmpty())
+ mCmd << "broadcast" << np.broadcast;
+
+ } else if (action=="route_add") {
+ if (!np.gateway.isEmpty())
+ mCmd << route << "add" << "default" << "gw" << np.gateway;
+
+ } else if (action=="route_del") {
+ if (!np.gateway.isEmpty())
+ mCmd << route << "del" << "default" << "gw" << np.gateway;
+
+ } else
+ std::cout << "Unknown action: " << action << std::endl;
+
+ if ( (!mCmd.isEmpty()) && (!quiet) ) {//mCmd = QStringList();
+ QString mCmdString = mCmd.join(" ");
+ if (!np.wepKey.isEmpty()) mCmdString.replace(np.wepKey, "xxxxxxxxxx");
+ std::cout << action << ": " << mCmdString << std::endl;
+ }
+ return mCmd;
+ }
+
+ QString route;
+ QString dhcpClient;
+ QString wpa_supplicant;
+ QString wpa_cli;
+private:
+ QString ifconfig;
+ QString iwconfig;
+ QString iwlist;
+ QString dhcp;
+ QString pidof;
+
+ QString getPath(QString file, QStringList dirs)
+ {
+ QString s;
+ for ( QStringList::Iterator it = dirs.begin(); it != dirs.end(); it++ ) {
+ if (QFile( QString(*it+"/"+file) ).exists()) {
+ s = QString(*it+"/"+file);
+ break;
+ }
+ }
+ if (s.isEmpty()) {
+ allFound = 0;
+ notFound << file;
+ }
+ return s;
+ }
+};
+
+#endif //WA_NETPARAMS_H
diff --git a/src/ui_NetParamsEdit.ui b/src/ui_NetParamsEdit.ui
new file mode 100644
index 0000000..b10b5f3
--- /dev/null
+++ b/src/ui_NetParamsEdit.ui
@@ -0,0 +1,1111 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>netProperties</class>
+<widget class="QDialog">
+<property name="name">
+<cstring>netProperties</cstring>
+</property>
+<property name="geometry">
+<rect>
+<x>0</x>
+<y>0</y>
+<width>420</width>
+<height>504</height>
+</rect>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>5</hsizetype>
+<vsizetype>1</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="caption">
+<string>Properties</string>
+</property>
+<property name="sizeGripEnabled">
+<bool>false</bool>
+</property>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<property name="margin">
+<number>11</number>
+</property>
+<property name="spacing">
+<number>6</number>
+</property>
+<widget class="QLayoutWidget" row="1" column="0">
+<property name="name">
+<cstring>Layout1</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<property name="margin">
+<number>0</number>
+</property>
+<property name="spacing">
+<number>6</number>
+</property>
+<widget class="QPushButton">
+<property name="name">
+<cstring>buttonHelp</cstring>
+</property>
+<property name="text">
+<string>&amp;Help</string>
+</property>
+<property name="accel">
+<string>F1</string>
+</property>
+<property name="autoDefault">
+<bool>true</bool>
+</property>
+</widget>
+<spacer>
+<property name="name">
+<cstring>Horizontal Spacing2</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>20</width>
+<height>20</height>
+</size>
+</property>
+</spacer>
+<widget class="QPushButton">
+<property name="name">
+<cstring>buttonOk</cstring>
+</property>
+<property name="text">
+<string>&amp;OK</string>
+</property>
+<property name="accel">
+<string></string>
+</property>
+<property name="autoDefault">
+<bool>true</bool>
+</property>
+<property name="default">
+<bool>true</bool>
+</property>
+</widget>
+<widget class="QPushButton">
+<property name="name">
+<cstring>buttonCancel</cstring>
+</property>
+<property name="text">
+<string>&amp;Cancel</string>
+</property>
+<property name="accel">
+<string></string>
+</property>
+<property name="autoDefault">
+<bool>true</bool>
+</property>
+</widget>
+</hbox>
+</widget>
+<widget class="QTabWidget" row="0" column="0">
+<property name="name">
+<cstring>tabNetParams</cstring>
+</property>
+<widget class="QWidget">
+<property name="name">
+<cstring>tabInterface</cstring>
+</property>
+<attribute name="title">
+<string>I&amp;nterface</string>
+</attribute>
+<vbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QGroupBox">
+<property name="name">
+<cstring>boxEssid</cstring>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>5</hsizetype>
+<vsizetype>1</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="title">
+<string>ESSID</string>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1</cstring>
+</property>
+<property name="text">
+<string>ESSID:</string>
+</property>
+</widget>
+<widget class="QLineEdit">
+<property name="name">
+<cstring>essid</cstring>
+</property>
+</widget>
+</hbox>
+</widget>
+<widget class="QButtonGroup">
+<property name="name">
+<cstring>buttonGroup1</cstring>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>5</hsizetype>
+<vsizetype>3</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="title">
+<string>Configuration</string>
+</property>
+<vbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLayoutWidget">
+<property name="name">
+<cstring>layout3</cstring>
+</property>
+<vbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QRadioButton">
+<property name="name">
+<cstring>radioDhcp</cstring>
+</property>
+<property name="text">
+<string>Automatic (DHCP)</string>
+</property>
+</widget>
+<widget class="QRadioButton">
+<property name="name">
+<cstring>radioManualConfig</cstring>
+</property>
+<property name="text">
+<string>&amp;Manual</string>
+</property>
+</widget>
+</vbox>
+</widget>
+<widget class="QFrame">
+<property name="name">
+<cstring>boxManualConfig</cstring>
+</property>
+<property name="frameShape">
+<enum>NoFrame</enum>
+</property>
+<property name="frameShadow">
+<enum>Raised</enum>
+</property>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLineEdit" row="2" column="1">
+<property name="name">
+<cstring>netmask</cstring>
+</property>
+</widget>
+<widget class="QLabel" row="2" column="0">
+<property name="name">
+<cstring>textLabel4</cstring>
+</property>
+<property name="text">
+<string>Netmask:</string>
+</property>
+</widget>
+<widget class="QLineEdit" row="0" column="1">
+<property name="name">
+<cstring>ip</cstring>
+</property>
+</widget>
+<widget class="QLineEdit" row="4" column="1">
+<property name="name">
+<cstring>domain</cstring>
+</property>
+</widget>
+<widget class="QLabel" row="0" column="0">
+<property name="name">
+<cstring>textLabel2</cstring>
+</property>
+<property name="text">
+<string>IP:</string>
+</property>
+</widget>
+<widget class="QLabel" row="1" column="0">
+<property name="name">
+<cstring>textLabel3</cstring>
+</property>
+<property name="text">
+<string>Broadcast:</string>
+</property>
+</widget>
+<widget class="QLabel" row="3" column="0">
+<property name="name">
+<cstring>textLabel5</cstring>
+</property>
+<property name="text">
+<string>Gateway:</string>
+</property>
+</widget>
+<widget class="QLineEdit" row="5" column="1">
+<property name="name">
+<cstring>dns1</cstring>
+</property>
+</widget>
+<widget class="QLabel" row="4" column="0">
+<property name="name">
+<cstring>textLabel6</cstring>
+</property>
+<property name="text">
+<string>Domain:</string>
+</property>
+</widget>
+<widget class="QLineEdit" row="1" column="1">
+<property name="name">
+<cstring>broadcast</cstring>
+</property>
+</widget>
+<widget class="QLineEdit" row="3" column="1">
+<property name="name">
+<cstring>gateway</cstring>
+</property>
+</widget>
+<widget class="QLineEdit" row="6" column="1">
+<property name="name">
+<cstring>dns2</cstring>
+</property>
+</widget>
+<widget class="QLabel" row="6" column="0">
+<property name="name">
+<cstring>textLabel8</cstring>
+</property>
+<property name="text">
+<string>Secondary DNS:</string>
+</property>
+</widget>
+<widget class="QLabel" row="5" column="0">
+<property name="name">
+<cstring>textLabel7</cstring>
+</property>
+<property name="text">
+<string>Primary DNS:</string>
+</property>
+</widget>
+</grid>
+</widget>
+</vbox>
+</widget>
+<spacer>
+<property name="name">
+<cstring>spacer2</cstring>
+</property>
+<property name="orientation">
+<enum>Vertical</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>20</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+</vbox>
+</widget>
+<widget class="QWidget">
+<property name="name">
+<cstring>tabSecurity</cstring>
+</property>
+<attribute name="title">
+<string>Securit&amp;y</string>
+</attribute>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<spacer row="2" column="0">
+<property name="name">
+<cstring>spacer3</cstring>
+</property>
+<property name="orientation">
+<enum>Vertical</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>21</width>
+<height>40</height>
+</size>
+</property>
+</spacer>
+<widget class="QButtonGroup" row="1" column="0">
+<property name="name">
+<cstring>groupWpa</cstring>
+</property>
+<property name="title">
+<string>WPA Settings</string>
+</property>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLayoutWidget" row="1" column="0">
+<property name="name">
+<cstring>layout33</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1_2_2</cstring>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>1</hsizetype>
+<vsizetype>5</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="text">
+<string>Key:</string>
+</property>
+</widget>
+<widget class="QLineEdit">
+<property name="name">
+<cstring>wpaKey</cstring>
+</property>
+<property name="echoMode">
+<enum>Password</enum>
+</property>
+</widget>
+<widget class="QCheckBox">
+<property name="name">
+<cstring>checkWpaAscii</cstring>
+</property>
+<property name="text">
+<string>ASCII</string>
+</property>
+</widget>
+</hbox>
+</widget>
+<widget class="QLayoutWidget" row="0" column="0">
+<property name="name">
+<cstring>layout34</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1_3_5</cstring>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>3</hsizetype>
+<vsizetype>5</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="text">
+<string>WPA Version:&lt;br&gt;Group Cipher:&lt;br&gt;Pairwise Cipher:&lt;br&gt;Authentication Suite:</string>
+</property>
+</widget>
+<widget class="QLabel">
+<property name="name">
+<cstring>labelWpaSettings</cstring>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>1</hsizetype>
+<vsizetype>5</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="text">
+<string>&lt;b&gt;?&lt;br&gt;?&lt;br&gt;?&lt;br&gt;?&lt;/b&gt;</string>
+</property>
+</widget>
+<spacer>
+<property name="name">
+<cstring>spacer71</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>131</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+</hbox>
+</widget>
+</grid>
+</widget>
+<widget class="QButtonGroup" row="0" column="0">
+<property name="name">
+<cstring>groupWep</cstring>
+</property>
+<property name="title">
+<string>WEP Settings</string>
+</property>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QRadioButton" row="0" column="0">
+<property name="name">
+<cstring>radioWepOpen</cstring>
+</property>
+<property name="text">
+<string>Open Syste&amp;m</string>
+</property>
+<property name="accel">
+<string>Alt+M</string>
+</property>
+</widget>
+<widget class="QLayoutWidget" row="2" column="0">
+<property name="name">
+<cstring>layout35</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1_2</cstring>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>1</hsizetype>
+<vsizetype>5</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="text">
+<string>Key:</string>
+</property>
+</widget>
+<widget class="QLineEdit">
+<property name="name">
+<cstring>wepKey</cstring>
+</property>
+<property name="echoMode">
+<enum>Password</enum>
+</property>
+</widget>
+<widget class="QCheckBox">
+<property name="name">
+<cstring>checkWepAscii</cstring>
+</property>
+<property name="text">
+<string>ASCII</string>
+</property>
+</widget>
+</hbox>
+</widget>
+<widget class="QRadioButton" row="1" column="0">
+<property name="name">
+<cstring>radioWepRestricted</cstring>
+</property>
+<property name="text">
+<string>Shared &amp;Key</string>
+</property>
+<property name="accel">
+<string>Alt+K</string>
+</property>
+</widget>
+</grid>
+</widget>
+</grid>
+</widget>
+<widget class="QWidget">
+<property name="name">
+<cstring>tabAdvanced</cstring>
+</property>
+<attribute name="title">
+<string>Advanced</string>
+</attribute>
+<vbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1_4</cstring>
+</property>
+<property name="text">
+<string>&lt;b&gt;Security Warning:&lt;/b&gt; the commands specified below will be ran with the same privileges as Wireless Assistant has.</string>
+</property>
+</widget>
+<widget class="QGroupBox">
+<property name="name">
+<cstring>groupBox3</cstring>
+</property>
+<property name="title">
+<string>Pre-Connection Command</string>
+</property>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLayoutWidget" row="1" column="0">
+<property name="name">
+<cstring>layout6</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<spacer>
+<property name="name">
+<cstring>spacer7</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>130</width>
+<height>20</height>
+</size>
+</property>
+</spacer>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1_3</cstring>
+</property>
+<property name="text">
+<string>Timeout:</string>
+</property>
+</widget>
+<widget class="QSpinBox">
+<property name="name">
+<cstring>preConnectionTimeout</cstring>
+</property>
+<property name="suffix">
+<string>s</string>
+</property>
+<property name="maxValue">
+<number>60</number>
+</property>
+<property name="minValue">
+<number>1</number>
+</property>
+<property name="value">
+<number>20</number>
+</property>
+<property name="toolTip" stdset="0">
+<string>Amount of time after which the process will be killed.</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Timeout&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;This option specifies how long should Wireless Assistant wait for the process to finish, before it will be killed.&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="QCheckBox">
+<property name="name">
+<cstring>preConnectionDetached</cstring>
+</property>
+<property name="text">
+<string>Run detached</string>
+</property>
+<property name="toolTip" stdset="0">
+<string>Don't wait for the process to finish.</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Run Detached&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;If this checkbox is selected Wireless Assistant will not wait for the process to finish.&lt;/p&gt;</string>
+</property>
+</widget>
+</hbox>
+</widget>
+<widget class="QLayoutWidget" row="0" column="0">
+<property name="name">
+<cstring>layout7</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1_3_2</cstring>
+</property>
+<property name="text">
+<string>Command:</string>
+</property>
+</widget>
+<widget class="QLineEdit">
+<property name="name">
+<cstring>preConnectionCommand</cstring>
+</property>
+</widget>
+</hbox>
+</widget>
+</grid>
+</widget>
+<widget class="QGroupBox">
+<property name="name">
+<cstring>groupBox3_2</cstring>
+</property>
+<property name="title">
+<string>Post-Connection Command</string>
+</property>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLayoutWidget" row="1" column="0">
+<property name="name">
+<cstring>layout6_2</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<spacer>
+<property name="name">
+<cstring>spacer7_2</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>130</width>
+<height>20</height>
+</size>
+</property>
+</spacer>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1_3_3</cstring>
+</property>
+<property name="text">
+<string>Timeout:</string>
+</property>
+</widget>
+<widget class="QSpinBox">
+<property name="name">
+<cstring>postConnectionTimeout</cstring>
+</property>
+<property name="suffix">
+<string>s</string>
+</property>
+<property name="maxValue">
+<number>60</number>
+</property>
+<property name="minValue">
+<number>1</number>
+</property>
+<property name="value">
+<number>20</number>
+</property>
+<property name="toolTip" stdset="0">
+<string>Amount of time after which the process will be killed.</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Timeout&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;This option specifies how long should Wireless Assistant wait for the process to finish, before it will be killed.&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="QCheckBox">
+<property name="name">
+<cstring>postConnectionDetached</cstring>
+</property>
+<property name="text">
+<string>Run detached</string>
+</property>
+<property name="toolTip" stdset="0">
+<string>Don't wait for the process to finish.</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Run Detached&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;If this checkbox is selected Wireless Assistant will not wait for the process to finish.&lt;/p&gt;</string>
+</property>
+</widget>
+</hbox>
+</widget>
+<widget class="QLayoutWidget" row="0" column="0">
+<property name="name">
+<cstring>layout7_2</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1_3_2_2</cstring>
+</property>
+<property name="text">
+<string>Command:</string>
+</property>
+</widget>
+<widget class="QLineEdit">
+<property name="name">
+<cstring>postConnectionCommand</cstring>
+</property>
+</widget>
+</hbox>
+</widget>
+</grid>
+</widget>
+<widget class="QGroupBox">
+<property name="name">
+<cstring>groupBox3_3</cstring>
+</property>
+<property name="title">
+<string>Pre-Disconnection Command</string>
+</property>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLayoutWidget" row="1" column="0">
+<property name="name">
+<cstring>layout6_3</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<spacer>
+<property name="name">
+<cstring>spacer7_3</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>130</width>
+<height>20</height>
+</size>
+</property>
+</spacer>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1_3_4</cstring>
+</property>
+<property name="text">
+<string>Timeout:</string>
+</property>
+</widget>
+<widget class="QSpinBox">
+<property name="name">
+<cstring>preDisconnectionTimeout</cstring>
+</property>
+<property name="suffix">
+<string>s</string>
+</property>
+<property name="maxValue">
+<number>60</number>
+</property>
+<property name="minValue">
+<number>1</number>
+</property>
+<property name="value">
+<number>20</number>
+</property>
+<property name="toolTip" stdset="0">
+<string>Amount of time after which the process will be killed.</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Timeout&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;This option specifies how long should Wireless Assistant wait for the process to finish, before it will be killed.&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="QCheckBox">
+<property name="name">
+<cstring>preDisconnectionDetached</cstring>
+</property>
+<property name="text">
+<string>Run detached</string>
+</property>
+<property name="toolTip" stdset="0">
+<string>Don't wait for the process to finish.</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Run Detached&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;If this checkbox is selected Wireless Assistant will not wait for the process to finish.&lt;/p&gt;</string>
+</property>
+</widget>
+</hbox>
+</widget>
+<widget class="QLayoutWidget" row="0" column="0">
+<property name="name">
+<cstring>layout7_3</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1_3_2_3</cstring>
+</property>
+<property name="text">
+<string>Command:</string>
+</property>
+</widget>
+<widget class="QLineEdit">
+<property name="name">
+<cstring>preDisconnectionCommand</cstring>
+</property>
+</widget>
+</hbox>
+</widget>
+</grid>
+</widget>
+<widget class="QGroupBox">
+<property name="name">
+<cstring>groupBox3_3_2</cstring>
+</property>
+<property name="title">
+<string>Post-Disconnection Command</string>
+</property>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLayoutWidget" row="1" column="0">
+<property name="name">
+<cstring>layout6_3_2</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<spacer>
+<property name="name">
+<cstring>spacer7_3_2</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>130</width>
+<height>20</height>
+</size>
+</property>
+</spacer>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1_3_4_2</cstring>
+</property>
+<property name="text">
+<string>Timeout:</string>
+</property>
+</widget>
+<widget class="QSpinBox">
+<property name="name">
+<cstring>postDisconnectionTimeout</cstring>
+</property>
+<property name="suffix">
+<string>s</string>
+</property>
+<property name="maxValue">
+<number>60</number>
+</property>
+<property name="minValue">
+<number>1</number>
+</property>
+<property name="value">
+<number>20</number>
+</property>
+<property name="toolTip" stdset="0">
+<string>Amount of time after which the process will be killed.</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Timeout&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;This option specifies how long should Wireless Assistant wait for the process to finish, before it will be killed.&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="QCheckBox">
+<property name="name">
+<cstring>postDisconnectionDetached</cstring>
+</property>
+<property name="text">
+<string>Run detached</string>
+</property>
+<property name="toolTip" stdset="0">
+<string>Don't wait for the process to finish.</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Run Detached&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;If this checkbox is selected Wireless Assistant will not wait for the process to finish.&lt;/p&gt;</string>
+</property>
+</widget>
+</hbox>
+</widget>
+<widget class="QLayoutWidget" row="0" column="0">
+<property name="name">
+<cstring>layout7_3_2</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1_3_2_3_2</cstring>
+</property>
+<property name="text">
+<string>Command:</string>
+</property>
+</widget>
+<widget class="QLineEdit">
+<property name="name">
+<cstring>postDisconnectionCommand</cstring>
+</property>
+</widget>
+</hbox>
+</widget>
+</grid>
+</widget>
+<spacer>
+<property name="name">
+<cstring>spacer4</cstring>
+</property>
+<property name="orientation">
+<enum>Vertical</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>31</width>
+<height>20</height>
+</size>
+</property>
+</spacer>
+</vbox>
+</widget>
+</widget>
+</grid>
+</widget>
+<connections>
+<connection>
+<sender>buttonOk</sender>
+<signal>clicked()</signal>
+<receiver>netProperties</receiver>
+<slot>accept()</slot>
+</connection>
+<connection>
+<sender>buttonCancel</sender>
+<signal>clicked()</signal>
+<receiver>netProperties</receiver>
+<slot>reject()</slot>
+</connection>
+<connection>
+<sender>radioManualConfig</sender>
+<signal>toggled(bool)</signal>
+<receiver>boxManualConfig</receiver>
+<slot>setEnabled(bool)</slot>
+</connection>
+<connection>
+<sender>radioDhcp</sender>
+<signal>toggled(bool)</signal>
+<receiver>boxManualConfig</receiver>
+<slot>setDisabled(bool)</slot>
+</connection>
+<connection>
+<sender>preConnectionDetached</sender>
+<signal>toggled(bool)</signal>
+<receiver>preConnectionTimeout</receiver>
+<slot>setDisabled(bool)</slot>
+</connection>
+<connection>
+<sender>postConnectionDetached</sender>
+<signal>toggled(bool)</signal>
+<receiver>postConnectionTimeout</receiver>
+<slot>setDisabled(bool)</slot>
+</connection>
+<connection>
+<sender>preDisconnectionDetached</sender>
+<signal>toggled(bool)</signal>
+<receiver>preDisconnectionTimeout</receiver>
+<slot>setDisabled(bool)</slot>
+</connection>
+<connection>
+<sender>postDisconnectionDetached</sender>
+<signal>toggled(bool)</signal>
+<receiver>postDisconnectionTimeout</receiver>
+<slot>setDisabled(bool)</slot>
+</connection>
+</connections>
+<tabstops>
+<tabstop>essid</tabstop>
+<tabstop>radioDhcp</tabstop>
+<tabstop>radioManualConfig</tabstop>
+<tabstop>ip</tabstop>
+<tabstop>broadcast</tabstop>
+<tabstop>netmask</tabstop>
+<tabstop>gateway</tabstop>
+<tabstop>domain</tabstop>
+<tabstop>dns1</tabstop>
+<tabstop>dns2</tabstop>
+<tabstop>tabNetParams</tabstop>
+<tabstop>radioWepOpen</tabstop>
+<tabstop>radioWepRestricted</tabstop>
+<tabstop>wepKey</tabstop>
+<tabstop>buttonHelp</tabstop>
+<tabstop>buttonOk</tabstop>
+<tabstop>buttonCancel</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/ui_NetParamsWizard.ui b/src/ui_NetParamsWizard.ui
new file mode 100644
index 0000000..14e8a46
--- /dev/null
+++ b/src/ui_NetParamsWizard.ui
@@ -0,0 +1,892 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>NetParamsWizard</class>
+<widget class="QWizard">
+<property name="name">
+<cstring>NetParamsWizard</cstring>
+</property>
+<property name="geometry">
+<rect>
+<x>0</x>
+<y>0</y>
+<width>427</width>
+<height>356</height>
+</rect>
+</property>
+<property name="caption">
+<string>First Connection Wizard</string>
+</property>
+<property name="sizeGripEnabled">
+<bool>false</bool>
+</property>
+<property name="modal">
+<bool>true</bool>
+</property>
+<property name="titleFont">
+<font>
+<bold>1</bold>
+</font>
+</property>
+<widget class="QWidget">
+<property name="name">
+<cstring>welcome</cstring>
+</property>
+<attribute name="title">
+<string>Welcome to First Connection Wizard</string>
+</attribute>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel" row="0" column="0">
+<property name="name">
+<cstring>textLabel1_2</cstring>
+</property>
+<property name="text">
+<string>&lt;b&gt;&lt;p&gt;This is the first time you are trying to connect to the selected network.&lt;/p&gt;&lt;/b&gt;
+&lt;p&gt;You will be asked a few questions necessary to configure this connection.&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Press Next to continue.&lt;/i&gt;&lt;/p&gt;</string>
+</property>
+<property name="alignment">
+<set>WordBreak|AlignTop</set>
+</property>
+</widget>
+</grid>
+</widget>
+<widget class="QWidget">
+<property name="name">
+<cstring>WizardPage</cstring>
+</property>
+<attribute name="title">
+<string>ESSID</string>
+</attribute>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<property name="spacing">
+<number>15</number>
+</property>
+<widget class="QLabel" row="0" column="0" rowspan="1" colspan="4">
+<property name="name">
+<cstring>textLabel8_2</cstring>
+</property>
+<property name="text">
+<string>&lt;p&gt;&lt;b&gt;You are trying to connect to a network that does not broadcast its ESSID.&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;Please specify ESSID that you would like to use when connecting to this access point.&lt;/p&gt;</string>
+</property>
+</widget>
+<spacer row="2" column="2">
+<property name="name">
+<cstring>spacer54</cstring>
+</property>
+<property name="orientation">
+<enum>Vertical</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>21</width>
+<height>100</height>
+</size>
+</property>
+</spacer>
+<widget class="QLabel" row="1" column="1">
+<property name="name">
+<cstring>textLabel9</cstring>
+</property>
+<property name="text">
+<string>ESSID:</string>
+</property>
+<property name="alignment">
+<set>AlignVCenter|AlignRight</set>
+</property>
+</widget>
+<widget class="QLineEdit" row="1" column="2">
+<property name="name">
+<cstring>essid</cstring>
+</property>
+</widget>
+<spacer row="1" column="3">
+<property name="name">
+<cstring>spacer55</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>101</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+<spacer row="1" column="0">
+<property name="name">
+<cstring>spacer56</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>61</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+</grid>
+</widget>
+<widget class="QWidget">
+<property name="name">
+<cstring>ConfigMode</cstring>
+</property>
+<attribute name="title">
+<string>Interface Configuration</string>
+</attribute>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<property name="spacing">
+<number>15</number>
+</property>
+<spacer row="1" column="2">
+<property name="name">
+<cstring>spacer5</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>80</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+<spacer row="1" column="0">
+<property name="name">
+<cstring>spacer4</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>60</width>
+<height>31</height>
+</size>
+</property>
+</spacer>
+<spacer row="2" column="1">
+<property name="name">
+<cstring>spacer6</cstring>
+</property>
+<property name="orientation">
+<enum>Vertical</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>21</width>
+<height>20</height>
+</size>
+</property>
+</spacer>
+<widget class="QButtonGroup" row="1" column="1">
+<property name="name">
+<cstring>buttonGroup3</cstring>
+</property>
+<property name="focusPolicy">
+<enum>TabFocus</enum>
+</property>
+<property name="lineWidth">
+<number>0</number>
+</property>
+<property name="title">
+<string></string>
+</property>
+<property name="flat">
+<bool>true</bool>
+</property>
+<vbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QRadioButton">
+<property name="name">
+<cstring>radioDhcp</cstring>
+</property>
+<property name="text">
+<string>Automatic (DHCP)</string>
+</property>
+<property name="accel">
+<string></string>
+</property>
+<property name="checked">
+<bool>true</bool>
+</property>
+</widget>
+<widget class="QRadioButton">
+<property name="name">
+<cstring>radioManualConfig</cstring>
+</property>
+<property name="text">
+<string>Manual</string>
+</property>
+<property name="accel">
+<string></string>
+</property>
+</widget>
+</vbox>
+</widget>
+<widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+<property name="name">
+<cstring>textLabel2_2</cstring>
+</property>
+<property name="text">
+<string>&lt;p&gt;&lt;b&gt;Your IP and other parameters need to be configured to connect to any network.&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;Which configuration option would you like to use when connecting to this network?&lt;/p&gt;</string>
+</property>
+</widget>
+</grid>
+</widget>
+<widget class="QWidget">
+<property name="name">
+<cstring>ManualConfig</cstring>
+</property>
+<attribute name="title">
+<string>Interface Parameters</string>
+</attribute>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<property name="spacing">
+<number>15</number>
+</property>
+<widget class="QLayoutWidget" row="1" column="1">
+<property name="name">
+<cstring>layout12</cstring>
+</property>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLineEdit" row="5" column="1">
+<property name="name">
+<cstring>dns1</cstring>
+</property>
+<property name="maxLength">
+<number>32767</number>
+</property>
+</widget>
+<widget class="QLineEdit" row="3" column="1">
+<property name="name">
+<cstring>gateway</cstring>
+</property>
+<property name="maxLength">
+<number>32767</number>
+</property>
+</widget>
+<widget class="QLabel" row="6" column="0">
+<property name="name">
+<cstring>textLabel6</cstring>
+</property>
+<property name="text">
+<string>Secondary DNS:</string>
+</property>
+<property name="alignment">
+<set>AlignVCenter|AlignRight</set>
+</property>
+</widget>
+<widget class="QLineEdit" row="0" column="1">
+<property name="name">
+<cstring>ip</cstring>
+</property>
+<property name="maxLength">
+<number>32767</number>
+</property>
+</widget>
+<widget class="QLineEdit" row="1" column="1">
+<property name="name">
+<cstring>broadcast</cstring>
+</property>
+<property name="maxLength">
+<number>32767</number>
+</property>
+</widget>
+<widget class="QLabel" row="0" column="0">
+<property name="name">
+<cstring>textLabel1</cstring>
+</property>
+<property name="text">
+<string>IP:</string>
+</property>
+<property name="alignment">
+<set>AlignVCenter|AlignRight</set>
+</property>
+</widget>
+<widget class="QLabel" row="2" column="0">
+<property name="name">
+<cstring>textLabel3</cstring>
+</property>
+<property name="text">
+<string>Netmask:</string>
+</property>
+<property name="alignment">
+<set>AlignVCenter|AlignRight</set>
+</property>
+</widget>
+<widget class="QLineEdit" row="6" column="1">
+<property name="name">
+<cstring>dns2</cstring>
+</property>
+<property name="maxLength">
+<number>32767</number>
+</property>
+</widget>
+<widget class="QLabel" row="5" column="0">
+<property name="name">
+<cstring>textLabel5</cstring>
+</property>
+<property name="text">
+<string>Primary DNS:</string>
+</property>
+<property name="alignment">
+<set>AlignVCenter|AlignRight</set>
+</property>
+</widget>
+<widget class="QLabel" row="3" column="0">
+<property name="name">
+<cstring>textLabel7</cstring>
+</property>
+<property name="text">
+<string>Gateway:</string>
+</property>
+<property name="alignment">
+<set>AlignVCenter|AlignRight</set>
+</property>
+</widget>
+<widget class="QLineEdit" row="4" column="1">
+<property name="name">
+<cstring>domain</cstring>
+</property>
+</widget>
+<widget class="QLineEdit" row="2" column="1">
+<property name="name">
+<cstring>netmask</cstring>
+</property>
+<property name="maxLength">
+<number>32767</number>
+</property>
+</widget>
+<widget class="QLabel" row="4" column="0">
+<property name="name">
+<cstring>textLabel4</cstring>
+</property>
+<property name="text">
+<string>Domain:</string>
+</property>
+<property name="alignment">
+<set>AlignVCenter|AlignRight</set>
+</property>
+</widget>
+<widget class="QLabel" row="1" column="0">
+<property name="name">
+<cstring>textLabel2</cstring>
+</property>
+<property name="text">
+<string>Broadcast:</string>
+</property>
+<property name="alignment">
+<set>AlignVCenter|AlignRight</set>
+</property>
+</widget>
+</grid>
+</widget>
+<spacer row="1" column="2">
+<property name="name">
+<cstring>spacer7</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>60</width>
+<height>31</height>
+</size>
+</property>
+</spacer>
+<spacer row="1" column="0">
+<property name="name">
+<cstring>spacer8</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>50</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+<spacer row="2" column="1">
+<property name="name">
+<cstring>spacer9</cstring>
+</property>
+<property name="orientation">
+<enum>Vertical</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>21</width>
+<height>16</height>
+</size>
+</property>
+</spacer>
+<widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+<property name="name">
+<cstring>textLabel3_2</cstring>
+</property>
+<property name="text">
+<string>&lt;p&gt;&lt;b&gt;Please specify interface parameters to be used to connect to this network.&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;You may leave some fields blank.&lt;/p&gt;</string>
+</property>
+</widget>
+</grid>
+</widget>
+<widget class="QWidget">
+<property name="name">
+<cstring>WepConfig</cstring>
+</property>
+<attribute name="title">
+<string>WEP Configuration</string>
+</attribute>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel" row="0" column="0" rowspan="1" colspan="6">
+<property name="name">
+<cstring>textLabel5_2</cstring>
+</property>
+<property name="text">
+<string>&lt;p&gt;&lt;b&gt;The network you are trying to connect to requires WEP authentication.&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;Which WEP mode would you like to use?&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="QButtonGroup" row="1" column="3">
+<property name="name">
+<cstring>buttonGroup3_2_2</cstring>
+</property>
+<property name="lineWidth">
+<number>0</number>
+</property>
+<property name="title">
+<string></string>
+</property>
+<property name="flat">
+<bool>true</bool>
+</property>
+<vbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QRadioButton">
+<property name="name">
+<cstring>radioWepOpen</cstring>
+</property>
+<property name="text">
+<string>Open S&amp;ystem</string>
+</property>
+<property name="checked">
+<bool>true</bool>
+</property>
+</widget>
+<widget class="QRadioButton">
+<property name="name">
+<cstring>radioButton2_2_2</cstring>
+</property>
+<property name="text">
+<string>Shared Key</string>
+</property>
+</widget>
+</vbox>
+</widget>
+<spacer row="1" column="0" rowspan="1" colspan="3">
+<property name="name">
+<cstring>spacer4_2_2</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>122</width>
+<height>31</height>
+</size>
+</property>
+</spacer>
+<spacer row="1" column="4" rowspan="1" colspan="2">
+<property name="name">
+<cstring>spacer5_2_2</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>150</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+<widget class="QLabel" row="2" column="0" rowspan="1" colspan="6">
+<property name="name">
+<cstring>textLabel6_2</cstring>
+</property>
+<property name="text">
+<string>&lt;p&gt;&lt;b&gt;Please provide a key to be used with this network.&lt;/b&gt;&lt;/p&gt;</string>
+</property>
+</widget>
+<spacer row="4" column="3">
+<property name="name">
+<cstring>spacer17</cstring>
+</property>
+<property name="orientation">
+<enum>Vertical</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>31</width>
+<height>16</height>
+</size>
+</property>
+</spacer>
+<spacer row="3" column="5">
+<property name="name">
+<cstring>spacer15</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>50</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+<spacer row="3" column="0">
+<property name="name">
+<cstring>spacer16</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>30</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+<widget class="QLabel" row="3" column="1">
+<property name="name">
+<cstring>textLabel8</cstring>
+</property>
+<property name="text">
+<string>WEP key:</string>
+</property>
+<property name="alignment">
+<set>AlignVCenter|AlignRight</set>
+</property>
+</widget>
+<widget class="QLineEdit" row="3" column="2" rowspan="1" colspan="2">
+<property name="name">
+<cstring>wepKey</cstring>
+</property>
+<property name="minimumSize">
+<size>
+<width>140</width>
+<height>0</height>
+</size>
+</property>
+<property name="echoMode">
+<enum>Password</enum>
+</property>
+</widget>
+<widget class="QCheckBox" row="3" column="4">
+<property name="name">
+<cstring>checkWepAscii</cstring>
+</property>
+<property name="text">
+<string>ASCII</string>
+</property>
+</widget>
+</grid>
+</widget>
+<widget class="QWidget">
+<property name="name">
+<cstring>WizardPage</cstring>
+</property>
+<attribute name="title">
+<string>WPA Configuration</string>
+</attribute>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<spacer row="4" column="3">
+<property name="name">
+<cstring>spacer17_2</cstring>
+</property>
+<property name="orientation">
+<enum>Vertical</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>31</width>
+<height>54</height>
+</size>
+</property>
+</spacer>
+<spacer row="3" column="6">
+<property name="name">
+<cstring>spacer15_2</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>80</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+<spacer row="3" column="0">
+<property name="name">
+<cstring>spacer16_2</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>49</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+<widget class="QLabel" row="0" column="0" rowspan="1" colspan="7">
+<property name="name">
+<cstring>textLabel5_2_2</cstring>
+</property>
+<property name="text">
+<string>&lt;p&gt;&lt;b&gt;The network you are trying to connect to requires WPA authentication.&lt;/b&gt;&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="QLabel" row="3" column="1" rowspan="1" colspan="2">
+<property name="name">
+<cstring>textLabel8_3</cstring>
+</property>
+<property name="text">
+<string>WPA Key:</string>
+</property>
+<property name="alignment">
+<set>AlignVCenter|AlignRight</set>
+</property>
+</widget>
+<widget class="QLineEdit" row="3" column="3" rowspan="1" colspan="2">
+<property name="name">
+<cstring>wpaKey</cstring>
+</property>
+<property name="minimumSize">
+<size>
+<width>140</width>
+<height>0</height>
+</size>
+</property>
+<property name="echoMode">
+<enum>Password</enum>
+</property>
+</widget>
+<widget class="QCheckBox" row="3" column="5">
+<property name="name">
+<cstring>checkWpaAscii</cstring>
+</property>
+<property name="text">
+<string>ASCII</string>
+</property>
+</widget>
+<widget class="QLabel" row="2" column="0" rowspan="1" colspan="7">
+<property name="name">
+<cstring>textLabel6_2_2</cstring>
+</property>
+<property name="text">
+<string>&lt;p&gt;&lt;b&gt;Please provide a key to be used with this network.&lt;/b&gt;&lt;/p&gt;</string>
+</property>
+</widget>
+<spacer row="1" column="0" rowspan="1" colspan="2">
+<property name="name">
+<cstring>spacer43</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>80</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+<spacer row="1" column="6">
+<property name="name">
+<cstring>spacer42</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>60</width>
+<height>31</height>
+</size>
+</property>
+</spacer>
+<widget class="QLabel" row="1" column="4" rowspan="1" colspan="2">
+<property name="name">
+<cstring>labelWpaSettings</cstring>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>1</hsizetype>
+<vsizetype>5</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="text">
+<string>&lt;b&gt;?&lt;br&gt;?&lt;br&gt;?&lt;br&gt;?&lt;/b&gt;</string>
+</property>
+</widget>
+<widget class="QLabel" row="1" column="2" rowspan="1" colspan="2">
+<property name="name">
+<cstring>textLabel1_3</cstring>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>3</hsizetype>
+<vsizetype>5</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="text">
+<string>WPA Version:&lt;br&gt;Group Cipher:&lt;br&gt;Pairwise Cipher:&lt;br&gt;Authentication Suite:</string>
+</property>
+</widget>
+</grid>
+</widget>
+<widget class="QWidget">
+<property name="name">
+<cstring>done</cstring>
+</property>
+<attribute name="title">
+<string>Done!</string>
+</attribute>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel" row="0" column="0">
+<property name="name">
+<cstring>textLabel7_2</cstring>
+</property>
+<property name="text">
+<string>&lt;p&gt;&lt;b&gt;Congratulations!&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;You have successfully finished configuring this connection.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Press Finish to connect!&lt;/b&gt;&lt;/p&gt;</string>
+</property>
+<property name="alignment">
+<set>WordBreak|AlignTop</set>
+</property>
+</widget>
+</grid>
+</widget>
+</widget>
+<tabstops>
+<tabstop>buttonGroup3</tabstop>
+<tabstop>ip</tabstop>
+<tabstop>broadcast</tabstop>
+<tabstop>netmask</tabstop>
+<tabstop>gateway</tabstop>
+<tabstop>domain</tabstop>
+<tabstop>dns1</tabstop>
+<tabstop>dns2</tabstop>
+<tabstop>radioWepOpen</tabstop>
+<tabstop>wepKey</tabstop>
+<tabstop>radioDhcp</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/ui_main.ui b/src/ui_main.ui
new file mode 100644
index 0000000..eca55a9
--- /dev/null
+++ b/src/ui_main.ui
@@ -0,0 +1,759 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>mainWindow</class>
+<widget class="QDialog">
+<property name="name">
+<cstring>mainWindow</cstring>
+</property>
+<property name="geometry">
+<rect>
+<x>0</x>
+<y>0</y>
+<width>588</width>
+<height>324</height>
+</rect>
+</property>
+<property name="caption">
+<string>Wireless Assistant</string>
+</property>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="KPushButton" row="2" column="1">
+<property name="name">
+<cstring>buttonOptions</cstring>
+</property>
+<property name="minimumSize">
+<size>
+<width>0</width>
+<height>0</height>
+</size>
+</property>
+<property name="text">
+<string>&amp;Options</string>
+</property>
+<property name="accel">
+<string>Alt+O</string>
+</property>
+<property name="toggleButton">
+<bool>true</bool>
+</property>
+<property name="toolTip" stdset="0">
+<string>Toggle network list/options</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Options Button&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;Pressing this toggle button will show the available application options.&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;HINT: Press this button again to return to the network list.&lt;/i&gt;&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="KPushButton" row="4" column="1">
+<property name="name">
+<cstring>buttonClose</cstring>
+</property>
+<property name="text">
+<string>&amp;Quit</string>
+</property>
+<property name="accel">
+<string>Alt+Q</string>
+</property>
+<property name="default">
+<bool>true</bool>
+</property>
+<property name="toolTip" stdset="0">
+<string>Quit the application</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Quit Button&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;Pressing this button will quit the application.&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="KPushButton" row="1" column="1">
+<property name="name">
+<cstring>buttonConnect</cstring>
+</property>
+<property name="enabled">
+<bool>false</bool>
+</property>
+<property name="minimumSize">
+<size>
+<width>120</width>
+<height>0</height>
+</size>
+</property>
+<property name="text">
+<string>Co&amp;nnect</string>
+</property>
+<property name="accel">
+<string>Alt+N</string>
+</property>
+<property name="toolTip" stdset="0">
+<string>Connect to the selected network</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Connect/Disconnect Button&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;Pressing this button will connect to/disconnect from the network currently selected in the network list.&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="KPushButton" row="0" column="1">
+<property name="name">
+<cstring>buttonScan</cstring>
+</property>
+<property name="enabled">
+<bool>false</bool>
+</property>
+<property name="text">
+<string>Refresh</string>
+</property>
+<property name="accel">
+<string></string>
+</property>
+<property name="flat">
+<bool>false</bool>
+</property>
+<property name="toolTip" stdset="0">
+<string>Refresh network list</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Scan Button&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;Pressing this button will scan for wireless networks and refresh the network list.&lt;/p&gt;</string>
+</property>
+</widget>
+<spacer row="3" column="1">
+<property name="name">
+<cstring>spacer14</cstring>
+</property>
+<property name="orientation">
+<enum>Vertical</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>21</width>
+<height>120</height>
+</size>
+</property>
+</spacer>
+<widget class="QLayoutWidget" row="0" column="0" rowspan="5" colspan="1">
+<property name="name">
+<cstring>layout16</cstring>
+</property>
+<vbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<property name="margin">
+<number>0</number>
+</property>
+<widget class="QFrame">
+<property name="name">
+<cstring>frameDevice</cstring>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>5</hsizetype>
+<vsizetype>1</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="frameShape">
+<enum>NoFrame</enum>
+</property>
+<property name="frameShadow">
+<enum>Plain</enum>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<property name="margin">
+<number>0</number>
+</property>
+<widget class="QLabel">
+<property name="name">
+<cstring>devLabel</cstring>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>1</hsizetype>
+<vsizetype>0</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="minimumSize">
+<size>
+<width>0</width>
+<height>20</height>
+</size>
+</property>
+<property name="text">
+<string>Device:</string>
+</property>
+</widget>
+<widget class="KComboBox">
+<property name="name">
+<cstring>devCombo</cstring>
+</property>
+<property name="enabled">
+<bool>false</bool>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>3</hsizetype>
+<vsizetype>0</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="minimumSize">
+<size>
+<width>60</width>
+<height>0</height>
+</size>
+</property>
+<property name="toolTip" stdset="0">
+<string>Pick a network device to use</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Device Selection&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;This combo box allows you to select which wireless card to use.&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;NOTE: Selecting a different card will refresh the network list.&lt;/i&gt;&lt;/p&gt;</string>
+</property>
+</widget>
+</hbox>
+</widget>
+<widget class="QWidgetStack">
+<property name="name">
+<cstring>widgetStack</cstring>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>7</hsizetype>
+<vsizetype>7</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="frameShape">
+<enum>PopupPanel</enum>
+</property>
+<property name="frameShadow">
+<enum>Sunken</enum>
+</property>
+<property name="lineWidth">
+<number>2</number>
+</property>
+<widget class="QWidget">
+<property name="name">
+<cstring>netPage</cstring>
+</property>
+<attribute name="id">
+<number>0</number>
+</attribute>
+<grid>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<property name="margin">
+<number>0</number>
+</property>
+<property name="spacing">
+<number>0</number>
+</property>
+<widget class="KListView" row="0" column="0">
+<column>
+<property name="text">
+<string>ESSID</string>
+</property>
+<property name="clickable">
+<bool>true</bool>
+</property>
+<property name="resizable">
+<bool>true</bool>
+</property>
+</column>
+<column>
+<property name="text">
+<string>Channel</string>
+</property>
+<property name="clickable">
+<bool>true</bool>
+</property>
+<property name="resizable">
+<bool>true</bool>
+</property>
+</column>
+<column>
+<property name="text">
+<string>Link Quality</string>
+</property>
+<property name="clickable">
+<bool>true</bool>
+</property>
+<property name="resizable">
+<bool>false</bool>
+</property>
+</column>
+<column>
+<property name="text">
+<string>WEP/WPA</string>
+</property>
+<property name="clickable">
+<bool>true</bool>
+</property>
+<property name="resizable">
+<bool>false</bool>
+</property>
+</column>
+<column>
+<property name="text">
+<string>AP</string>
+</property>
+<property name="clickable">
+<bool>true</bool>
+</property>
+<property name="resizable">
+<bool>true</bool>
+</property>
+</column>
+<property name="name">
+<cstring>netList</cstring>
+</property>
+<property name="frameShape">
+<enum>NoFrame</enum>
+</property>
+<property name="frameShadow">
+<enum>Plain</enum>
+</property>
+<property name="lineWidth">
+<number>1</number>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Network List&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;This list shows all the wireless networks that have been found.&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;HINT: Click the Refresh button to update this list.&lt;/i&gt;&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="QLabel" row="1" column="0">
+<property name="name">
+<cstring>statusLabel</cstring>
+</property>
+<property name="sizePolicy">
+<sizepolicy>
+<hsizetype>7</hsizetype>
+<vsizetype>0</vsizetype>
+<horstretch>0</horstretch>
+<verstretch>0</verstretch>
+</sizepolicy>
+</property>
+<property name="minimumSize">
+<size>
+<width>0</width>
+<height>20</height>
+</size>
+</property>
+<property name="margin">
+<number>5</number>
+</property>
+<property name="text">
+<string>Ready</string>
+</property>
+<property name="alignment">
+<set>WordBreak|AlignVCenter</set>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Status Bar&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;Messages describing current process are shown in this area.&lt;/p&gt;</string>
+</property>
+</widget>
+</grid>
+</widget>
+<widget class="QWidget">
+<property name="name">
+<cstring>optionsPage</cstring>
+</property>
+<attribute name="id">
+<number>1</number>
+</attribute>
+<vbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLayoutWidget">
+<property name="name">
+<cstring>layout20</cstring>
+</property>
+<vbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QCheckBox">
+<property name="name">
+<cstring>checkAutoConnect</cstring>
+</property>
+<property name="text">
+<string>Automatically connect on startup</string>
+</property>
+<property name="accel">
+<string></string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;AutomaticallyConnect on Startup&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;Checking this box will make the application try to connect to the best available network. Only networks that have been previously configured will be taken into account.&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="QCheckBox">
+<property name="name">
+<cstring>checkAutoReconnect</cstring>
+</property>
+<property name="text">
+<string>Automaticall&amp;y reconnect if connection is lost</string>
+</property>
+<property name="accel">
+<string>Alt+Y</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Automatically Reconnect if Connection is Lost&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;Checking this box will make the application try to reconnect after the connection is lost.&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="QCheckBox">
+<property name="name">
+<cstring>checkAutoQuit</cstring>
+</property>
+<property name="text">
+<string>Quit upon successful connection</string>
+</property>
+<property name="accel">
+<string></string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Quit Upon Successful Connection&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;Checking this box will make the application close after successfully establishing a connection to a wireless network.&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="QCheckBox">
+<property name="name">
+<cstring>checkGroupAPs</cstring>
+</property>
+<property name="text">
+<string>&amp;Group access points with the same ESSID</string>
+</property>
+<property name="accel">
+<string>Alt+G</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Group Access Points with the Same ESSID&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;Checking this box will make all access points with the same ESSID appear as one item in the network list.&lt;/p&gt;</string>
+</property>
+</widget>
+</vbox>
+</widget>
+<widget class="QLayoutWidget">
+<property name="name">
+<cstring>layout17</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLayoutWidget">
+<property name="name">
+<cstring>layout12</cstring>
+</property>
+<vbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel2_2</cstring>
+</property>
+<property name="text">
+<string>Delay before scanning:</string>
+</property>
+<property name="toolTip" stdset="0">
+<string>Specify how long to wait for an IP</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;DHCP Client Timeout&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;This option specifies the amount of time after which the application should stop waiting for an IP address and assume that the connection has failed.&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;HINT: Increasing this number can help if you have problems connecting to some networks.&lt;/i&gt;&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel2</cstring>
+</property>
+<property name="text">
+<string>DHCP client timeout:</string>
+</property>
+<property name="toolTip" stdset="0">
+<string>Specify how long to wait for an IP</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;DHCP Client Timeout&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;This option specifies the amount of time after which the application should stop waiting for an IP address and assume that the connection has failed.&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;HINT: Increasing this number can help if you have problems connecting to some networks.&lt;/i&gt;&lt;/p&gt;</string>
+</property>
+</widget>
+</vbox>
+</widget>
+<widget class="QLayoutWidget">
+<property name="name">
+<cstring>layout13</cstring>
+</property>
+<vbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<spacer>
+<property name="name">
+<cstring>spacer24_2</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Fixed</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>21</width>
+<height>20</height>
+</size>
+</property>
+</spacer>
+<spacer>
+<property name="name">
+<cstring>spacer24</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Fixed</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>21</width>
+<height>20</height>
+</size>
+</property>
+</spacer>
+</vbox>
+</widget>
+<widget class="QLayoutWidget">
+<property name="name">
+<cstring>layout14</cstring>
+</property>
+<vbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<widget class="QSpinBox">
+<property name="name">
+<cstring>spinDelayBeforeScanning</cstring>
+</property>
+<property name="suffix">
+<string>s</string>
+</property>
+<property name="maxValue">
+<number>20</number>
+</property>
+<property name="minValue">
+<number>0</number>
+</property>
+<property name="value">
+<number>0</number>
+</property>
+<property name="toolTip" stdset="0">
+<string>Specify how long to wait before scanning</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Delay Before Scanning&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;This option specifies the amount of time to wait between bringing the interface up and performing a scan.&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;HINT: Increasing this number can help if you have to refresh the list manually to see all the available networks.&lt;/i&gt;&lt;/p&gt;</string>
+</property>
+</widget>
+<widget class="QSpinBox">
+<property name="name">
+<cstring>spinDhcpTimeout</cstring>
+</property>
+<property name="suffix">
+<string>s</string>
+</property>
+<property name="maxValue">
+<number>60</number>
+</property>
+<property name="minValue">
+<number>5</number>
+</property>
+<property name="value">
+<number>15</number>
+</property>
+<property name="toolTip" stdset="0">
+<string>Specify how long to wait for an IP</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;DHCP Client Timeout&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;This option specifies the amount of time after which the application should stop waiting for an IP address and assume that the connection has failed.&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;HINT: Increasing this number can help if you have problems connecting to some networks.&lt;/i&gt;&lt;/p&gt;</string>
+</property>
+</widget>
+</vbox>
+</widget>
+<widget class="QLayoutWidget">
+<property name="name">
+<cstring>layout15</cstring>
+</property>
+<vbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<spacer>
+<property name="name">
+<cstring>spacer25_2</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>101</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+<spacer>
+<property name="name">
+<cstring>spacer25</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>118</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+</vbox>
+</widget>
+</hbox>
+</widget>
+<widget class="QLabel">
+<property name="name">
+<cstring>textLabel1</cstring>
+</property>
+<property name="text">
+<string>&lt;i&gt;Press the button below to enable all messages which have been turned off with the 'Don't Show Again' feature.&lt;/i&gt;</string>
+</property>
+</widget>
+<widget class="QLayoutWidget">
+<property name="name">
+<cstring>layout19</cstring>
+</property>
+<hbox>
+<property name="name">
+<cstring>unnamed</cstring>
+</property>
+<spacer>
+<property name="name">
+<cstring>spacer22</cstring>
+</property>
+<property name="orientation">
+<enum>Horizontal</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>201</width>
+<height>21</height>
+</size>
+</property>
+</spacer>
+<widget class="QPushButton">
+<property name="name">
+<cstring>buttonEnableAllMessages</cstring>
+</property>
+<property name="text">
+<string>E&amp;nable All Messages</string>
+</property>
+<property name="accel">
+<string>Alt+N</string>
+</property>
+<property name="whatsThis" stdset="0">
+<string>&lt;p&gt;&lt;b&gt;Enable All Messages&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;Pressing this button will enable all messages which have been turned off with the 'Don't Show Again' feature.&lt;/p&gt;</string>
+</property>
+</widget>
+</hbox>
+</widget>
+<spacer>
+<property name="name">
+<cstring>spacer16</cstring>
+</property>
+<property name="orientation">
+<enum>Vertical</enum>
+</property>
+<property name="sizeType">
+<enum>Expanding</enum>
+</property>
+<property name="sizeHint">
+<size>
+<width>20</width>
+<height>31</height>
+</size>
+</property>
+</spacer>
+</vbox>
+</widget>
+</widget>
+</vbox>
+</widget>
+</grid>
+</widget>
+<tabstops>
+<tabstop>devCombo</tabstop>
+<tabstop>netList</tabstop>
+<tabstop>buttonScan</tabstop>
+<tabstop>buttonConnect</tabstop>
+<tabstop>buttonOptions</tabstop>
+<tabstop>buttonClose</tabstop>
+<tabstop>checkAutoQuit</tabstop>
+<tabstop>spinDhcpTimeout</tabstop>
+<tabstop>buttonEnableAllMessages</tabstop>
+</tabstops>
+<slots>
+<slot>netScan()</slot>
+<slot>netConnect()</slot>
+<slot>showCfgDlg()</slot>
+<slot>setDeviceList()</slot>
+</slots>
+<functions>
+<function>updateStatus(char sts)</function>
+</functions>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+<includehint>kpushbutton.h</includehint>
+<includehint>kpushbutton.h</includehint>
+<includehint>kpushbutton.h</includehint>
+<includehint>kpushbutton.h</includehint>
+<includehint>kcombobox.h</includehint>
+<includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/src/ui_netparamsedit.cpp b/src/ui_netparamsedit.cpp
new file mode 100644
index 0000000..0e994d6
--- /dev/null
+++ b/src/ui_netparamsedit.cpp
@@ -0,0 +1,174 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Pawel Nawrocki *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+
+#include "ui_netparamsedit.h"
+#include "netparams.h"
+
+#include <qgroupbox.h>
+#include <qlineedit.h>
+#include <qradiobutton.h>
+#include <qcheckbox.h>
+#include <qtabwidget.h>
+#include <qpushbutton.h>
+#include <qspinbox.h>
+#include <qbuttongroup.h>
+#include <qlabel.h>
+
+#include <kiconloader.h>
+
+ui_NetParamsEdit::ui_NetParamsEdit(QWidget* parent, const char* name, bool modal, WFlags fl)
+ : netProperties(parent,name, modal,fl)
+{
+ buttonHelp->hide();
+ buttonOk->setIconSet( SmallIconSet("ok") );
+ buttonCancel->setIconSet( SmallIconSet("cancel") );
+}
+
+ui_NetParamsEdit::~ui_NetParamsEdit()
+{}
+
+/*$SPECIALIZATION$*/
+
+/*void ui_NetParamsEdit::setWepEnabled( bool w )
+{
+ tabSecurity->setShown(w);
+}*/
+
+/*void ui_NetParamsEdit::setEssidEnabled( bool e )
+{
+ boxEssid->setShown(e);
+}*/
+
+void ui_NetParamsEdit::setValues( const WANetParams & np )
+{
+ boxEssid->setShown(np.hiddenEssid);
+ essid->setText(np.essid);
+
+ tabNetParams->setTabEnabled( tabSecurity, (np.wep || np.wpa) );
+
+ if ( tabSecurity->isEnabled() ) {
+ groupWep->setEnabled( np.wep );
+ groupWpa->setEnabled( np.wpa );
+ if (np.wep) {
+ if (np.wepMode=="open")
+ radioWepOpen->setChecked(1);
+ else
+ radioWepRestricted->setChecked(1);
+ if ( np.wepKey.left(2)=="s:" ) { //ASCII key
+ checkWepAscii->setChecked(true);
+ wepKey->setText( np.wepKey.right(np.wepKey.length()-2) );
+ } else { //HEX key
+ checkWepAscii->setChecked(false);
+ wepKey->setText( np.wepKey );
+ }
+ }
+ if (np.wpa) {
+ labelWpaSettings->setText( QString("<i>%1</i>").arg( np.wpaSettings.join("<br>") ) );
+ if ( np.wpaKey.left(2)=="s:" ) { //ASCII key
+ checkWpaAscii->setChecked(true);
+ wpaKey->setText( np.wpaKey.right(np.wpaKey.length()-2) );
+ } else { //HEX key
+ checkWpaAscii->setChecked(false);
+ wpaKey->setText( np.wpaKey );
+ }
+ }
+ }
+
+ radioDhcp->setChecked( np.dhcp );
+ radioManualConfig->setChecked( !np.dhcp );
+
+ ip->setText(np.ip);
+ broadcast->setText( np.broadcast );
+ netmask->setText( np.netmask );
+ gateway->setText( np.gateway );
+ domain->setText( np.domain );
+ dns1->setText( np.dns1 );
+ dns2->setText( np.dns2 );
+
+ preConnectionCommand->setText( np.preConnectionCommand );
+ preConnectionDetached->setChecked( np.preConnectionDetached );
+ preConnectionTimeout->setValue( np.preConnectionTimeout );
+
+ postConnectionCommand->setText( np.postConnectionCommand );
+ postConnectionDetached->setChecked( np.postConnectionDetached );
+ postConnectionTimeout->setValue( np.postConnectionTimeout );
+
+ preDisconnectionCommand->setText( np.preDisconnectionCommand );
+ preDisconnectionDetached->setChecked( np.preDisconnectionDetached );
+ preDisconnectionTimeout->setValue( np.preDisconnectionTimeout );
+
+ postDisconnectionCommand->setText( np.postDisconnectionCommand );
+ postDisconnectionDetached->setChecked( np.postDisconnectionDetached );
+ postDisconnectionTimeout->setValue( np.postDisconnectionTimeout );
+}
+
+WANetParams ui_NetParamsEdit::readNetParams( WANetParams & np )
+{
+ if (np.hiddenEssid) {
+ np.wasHiddenEssid = true;
+ np.essid = essid->text();
+ }
+ np.dhcp = radioDhcp->isChecked();
+ np.ip = ip->text();
+ np.broadcast = broadcast->text();
+ np.netmask = netmask->text();
+ np.gateway = gateway->text();
+ np.domain = domain->text();
+ np.dns1 = dns1->text();
+ np.dns2 = dns2->text();
+ if (np.wep) { // WEP authentication needed
+ np.wasWep = true;
+ if (radioWepOpen->isChecked())
+ np.wepMode = "open";
+ else
+ np.wepMode = "restricted";
+ np.wepKey = wepKey->text();
+ if (checkWepAscii->isChecked())
+ np.wepKey.prepend("s:");
+ }
+ if (np.wpa) { // WPA authentication needed
+ np.wpaKey = wpaKey->text();
+ if (checkWpaAscii->isChecked())
+ np.wpaKey.prepend("s:");
+ }
+
+
+ np.preConnectionCommand = preConnectionCommand->text();
+ np.preConnectionTimeout = preConnectionTimeout->value();
+ np.preConnectionDetached = preConnectionDetached->isChecked();
+
+ np.postConnectionCommand = postConnectionCommand->text();
+ np.postConnectionTimeout = postConnectionTimeout->value();
+ np.postConnectionDetached = postConnectionDetached->isChecked();
+
+ np.preDisconnectionCommand = preDisconnectionCommand->text();
+ np.preDisconnectionTimeout = preDisconnectionTimeout->value();
+ np.preDisconnectionDetached = preDisconnectionDetached->isChecked();
+
+ np.postDisconnectionCommand = postDisconnectionCommand->text();
+ np.postDisconnectionTimeout = postDisconnectionTimeout->value();
+ np.postDisconnectionDetached = postDisconnectionDetached->isChecked();
+
+ return np;
+}
+
+#include "ui_netparamsedit.moc"
+
diff --git a/src/ui_netparamsedit.h b/src/ui_netparamsedit.h
new file mode 100644
index 0000000..4c3b8b0
--- /dev/null
+++ b/src/ui_netparamsedit.h
@@ -0,0 +1,53 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Pawel Nawrocki *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef UI_NETPARAMSEDIT_H
+#define UI_NETPARAMSEDIT_H
+
+#include "ui_NetParamsEdit.h"
+
+class WANetParams;
+
+class ui_NetParamsEdit : public netProperties
+{
+ Q_OBJECT
+
+public:
+ ui_NetParamsEdit(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~ui_NetParamsEdit();
+ /*$PUBLIC_FUNCTIONS$*/
+ //void setWepEnabled( bool w );
+ //void setEssidEnabled( bool e );
+ void setValues( const WANetParams & np );
+ WANetParams readNetParams( WANetParams & np );
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+
+};
+
+#endif
+
diff --git a/src/ui_netparamswizard.cpp b/src/ui_netparamswizard.cpp
new file mode 100644
index 0000000..9945eea
--- /dev/null
+++ b/src/ui_netparamswizard.cpp
@@ -0,0 +1,107 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Pawel Nawrocki *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+
+#include "ui_netparamswizard.h"
+#include "netparams.h"
+
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+
+#include <kiconloader.h>
+
+ui_NetParamsWizard::ui_NetParamsWizard(QWidget* parent, const char* name, bool modal, WFlags fl)
+ : NetParamsWizard(parent,name, modal,fl)
+{
+ backButton()->setIconSet( SmallIconSet("back") );
+ nextButton()->setIconSet( SmallIconSet("forward") );
+ cancelButton()->setIconSet( SmallIconSet("cancel") );
+ finishButton()->setIconSet( SmallIconSet("ok") );
+ //helpButton()->setIconSet( SmallIconSet("help") );
+ helpButton()->hide();
+ setFinishEnabled( page( pageCount()-1 ), true );
+}
+
+ui_NetParamsWizard::~ui_NetParamsWizard()
+{}
+
+/*$SPECIALIZATION$*/
+
+void ui_NetParamsWizard::setWepEnabled( bool w )
+{
+ setAppropriate( page(4), w );
+}
+
+void ui_NetParamsWizard::setWpaEnabled( bool w, QStringList settings )
+{
+ setAppropriate( page(5), w );
+ if (w) labelWpaSettings->setText( QString("<i>%1</i>").arg( settings.join("<br>") ) );
+}
+
+
+void ui_NetParamsWizard::setEssidEnabled( bool e )
+{
+ setAppropriate( page(1), e );
+}
+
+void ui_NetParamsWizard::next()
+{
+ if (indexOf(currentPage())==2)
+ setAppropriate( page(3), radioManualConfig->isChecked() );
+ QWizard::next();
+}
+
+WANetParams ui_NetParamsWizard::readNetParams( WANetParams & np )
+{
+ if (appropriate(page(1)))
+ np.essid = essid->text();
+ np.dhcp = radioDhcp->isChecked();
+ if (!np.dhcp) { // manual configuration option selected
+ np.ip = ip->text();
+ np.broadcast = broadcast->text();
+ np.netmask = netmask->text();
+ np.gateway = gateway->text();
+ np.domain = domain->text();
+ np.dns1 = dns1->text();
+ np.dns2 = dns2->text();
+ }
+ if (np.wep) { // WEP authentication needed
+ if (radioWepOpen->isChecked())
+ np.wepMode = "open";
+ else
+ np.wepMode = "restricted";
+ np.wepKey = wepKey->text();
+ if (checkWepAscii->isChecked())
+ np.wepKey.prepend("s:");
+ }
+ if (np.wpa) { // WPA authentication needed
+ np.wpaKey = wpaKey->text();
+ if (checkWpaAscii->isChecked())
+ np.wpaKey.prepend("s:");
+ }
+
+ return np;
+}
+
+#include "ui_netparamswizard.moc"
+
diff --git a/src/ui_netparamswizard.h b/src/ui_netparamswizard.h
new file mode 100644
index 0000000..fc3dfcb
--- /dev/null
+++ b/src/ui_netparamswizard.h
@@ -0,0 +1,53 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Pawel Nawrocki *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef UI_NETPARAMSWIZARD_H
+#define UI_NETPARAMSWIZARD_H
+
+#include "ui_NetParamsWizard.h"
+
+
+class WANetParams;
+class ui_NetParamsWizard : public NetParamsWizard
+{
+ Q_OBJECT
+
+public:
+ ui_NetParamsWizard(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~ui_NetParamsWizard();
+ /*$PUBLIC_FUNCTIONS$*/
+ void setWepEnabled( bool w );
+ void setWpaEnabled( bool w, QStringList settings = QStringList() );
+ void setEssidEnabled( bool e );
+ WANetParams readNetParams( WANetParams & np );
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ virtual void next();
+};
+
+#endif
+
diff --git a/src/waconfig.cpp b/src/waconfig.cpp
new file mode 100644
index 0000000..aadad38
--- /dev/null
+++ b/src/waconfig.cpp
@@ -0,0 +1,29 @@
+#include "waconfig.h"
+
+#include <kstaticdeleter.h>
+
+WAConfig *WAConfig::mSelf = 0;
+static KStaticDeleter<WAConfig> staticWAConfigDeleter;
+
+WAConfig *WAConfig::self()
+{
+ if ( !mSelf ) {
+ staticWAConfigDeleter.setObject( mSelf, new WAConfig() );
+ mSelf->readConfig();
+ }
+
+ return mSelf;
+}
+
+WAConfig::WAConfig( )
+ : KConfigSkeleton( QString::fromLatin1( "wlassistantrc" ) )
+{
+ mSelf = this;
+}
+
+WAConfig::~WAConfig()
+{
+ if ( mSelf == this )
+ staticWAConfigDeleter.setObject( mSelf, 0, false );
+}
+
diff --git a/src/waconfig.h b/src/waconfig.h
new file mode 100644
index 0000000..bedcaf1
--- /dev/null
+++ b/src/waconfig.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Pawel Nawrocki *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef WACONFIG_H
+#define WACONFIG_H
+
+#include <kconfigskeleton.h>
+
+class WAConfig : public KConfigSkeleton
+{
+ public:
+
+ static WAConfig *self();
+ ~WAConfig();
+
+ static
+ void writeConfig()
+ {
+ static_cast<KConfigSkeleton*>(self())->writeConfig();
+ }
+ protected:
+
+ WAConfig();
+ static WAConfig *mSelf;
+};
+
+#endif
+
diff --git a/src/watools.cpp b/src/watools.cpp
new file mode 100644
index 0000000..5814274
--- /dev/null
+++ b/src/watools.cpp
@@ -0,0 +1,312 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Pawel Nawrocki *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include "watools.h"
+
+#include <unistd.h> //provides readlink
+#include <dirent.h>
+#include <stdio.h> //to get values from /sys
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h> //inet_ntoa
+#include <iostream> //debugging
+
+char* WATools::ifname = 0;
+int WATools::iw_socket = -1;
+int WATools::prev_tx_packets = 0;
+int WATools::prev_rx_packets = 0;
+
+//////////////////////
+///// GENERAL INTERFACE CALLS
+bool WATools::isUp( const char* _ifname ) ///returns true if specified interface is up. Uses request SIOCGIFFLAGS
+{
+ if (_ifname==0)
+ _ifname = ifname;
+
+ struct ifreq req;
+ if ( doRequest( SIOCGIFFLAGS, &req, _ifname ) < 0) // get interface flags
+ return 0;
+// ( req.ifr_flags & IFF_UP ) ? std::cout << "* UP: YES" << std::endl : std::cout << "* UP: NO" << std::endl;
+ return ( req.ifr_flags & IFF_UP );
+}
+
+bool WATools::setUp( bool u, const char* _ifname ) /// brings interface up or down. Requests SIOCGIFFLAGS and SIOCSIFFLAGS
+{
+ if (_ifname==0)
+ _ifname = ifname;
+
+ struct ifreq req;
+ if ( doRequest( SIOCGIFFLAGS, &req, _ifname ) < 0 ) //get current flags, so they're not reset
+ return 0;
+
+ if ( u != (req.ifr_flags & IFF_UP) )
+ req.ifr_flags ^= IFF_UP; //change value of IFF_UP flag (XOR)
+
+ return ( doRequest( SIOCSIFFLAGS, &req, _ifname ) > -1 ); //set up/down flag, > -1 if succeeded
+}
+
+char* WATools::ip( const char* _ifname ) ///returns current IP. Request SIOCGIFADDR
+{
+ if (_ifname==0)
+ _ifname = ifname;
+
+ struct ifreq req;
+ static char buffer[16];
+ if ( doRequest( SIOCGIFADDR, &req, _ifname ) < 0 )
+ strcpy( buffer, "0.0.0.0" );
+ else
+ strcpy( buffer, inet_ntoa( ((sockaddr_in*)&req.ifr_addr)->sin_addr ) );
+// std::cout << "* IP ADDRESS: " << buffer << std::endl;
+ return buffer;
+}
+
+int WATools::txpackets( const char* _ifname ) ///returns number of packets send via _iface
+{
+ if (_ifname==0)
+ _ifname = ifname;
+
+ return getStatistic( "tx_packets", _ifname );
+}
+
+int WATools::rxpackets( const char* _ifname ) ///returns number of packets received via _iface
+{
+ if (_ifname==0)
+ _ifname = ifname;
+
+ return getStatistic( "rx_packets", _ifname );
+}
+
+
+//////////////////////
+///// WIRELESS EXTENSIONS CALLS
+
+bool WATools::isWireless( const char* _ifname ) /// returns TRUE if the specified interface supports Wireless Extensions
+{
+ static iwreq req;
+ memset( &req, 0, sizeof(req) );
+ return ( doWirelessRequest(SIOCGIWNAME, &req, _ifname ) > -1 );
+}
+
+char* WATools::essid( const char* _ifname ) ///returns current ESSID (for the specified interface). Request SIOCGIWESSID
+{
+ static iwreq req;
+ static char buffer[IW_ESSID_MAX_SIZE + 1];
+
+ memset( buffer, 0, sizeof(buffer) );
+ req.u.essid.pointer = buffer; //set pointer of essid string resulting from request to buffer
+ req.u.essid.length = IW_ESSID_MAX_SIZE;
+ if( doWirelessRequest(SIOCGIWESSID, &req, _ifname) < 0 ) // try to get ap address.
+ return 0; // no ap address
+ return buffer;
+}
+
+char* WATools::ap( const char* _ifname ) ///returns current AP (for the specified interface). Request SIOCGIWAP
+{
+ static iwreq req;
+ if( doWirelessRequest(SIOCGIWAP, &req, _ifname) < 0 ) // try to get ap address.
+ return 0; // no ap address
+ static char buffer[32];
+ iw_ether_ntop( (const struct ether_addr *)req.u.ap_addr.sa_data, buffer );
+
+// std::cout << "* AP ADDRESS: " << buffer << std::endl;
+ return buffer;
+}
+
+int WATools::quality( const char* _ifname ) ///returns active link quality in range 0-100 (for the specified interface)
+{
+ static iw_statistics stats;
+ if ( doWirelessStatisticsRequest( &stats, _ifname ) < 0 )
+ return 0;
+ unsigned int std_qual = (100*stats.qual.qual)/50; //calculate normalized quality (0-100). 50 is the best noise/signal difference
+ if (std_qual > 100) std_qual = 100;
+
+// std::cout << "* QUALITY: " << std_qual << std::endl;
+ return std_qual;
+}
+
+int WATools::txpower( const char* _ifname ) ///returns current txpower in mW (for the specified interface). Request SIOCGIWTXPOW
+{
+ static iwreq req;
+ if( doWirelessRequest(SIOCGIWTXPOW, &req, _ifname) < 0 ) // try to get txpower.
+ return 0; // no txpower
+ else {
+ if (req.u.txpower.disabled)
+ return -1;
+ else
+ return req.u.txpower.value;
+ }
+}
+
+bool WATools::hasKey( const char* _ifname ) ///returns true if WEP key for the specified interface is set. Request SIOCGIWENCODE
+{
+ static iwreq req;
+ static char buffer[IW_ENCODING_TOKEN_MAX + 1];
+
+ memset( buffer, 0, sizeof(buffer) );
+ req.u.encoding.pointer = buffer; //set pointer of encoding string resulting from request to buffer
+ req.u.encoding.length = IW_ENCODING_TOKEN_MAX;
+
+ if( doWirelessRequest(SIOCGIWENCODE, &req, _ifname) < 0 ) // try to get current key flags.
+ return 0;
+// ( strlen(buffer)!=0 ) ? std::cout << "* KEY: YES" << std::endl : std::cout << "*KEY: NO" << std::endl;
+ return ( strlen(buffer)!=0 ); // not encoding token empty
+}
+
+int WATools::availableNetworks( const char* _ifname ) //returns a list of available networks
+{
+ static struct wireless_scan_head context;
+ static struct wireless_scan* scan;
+
+ if (_ifname==0)
+ _ifname = ifname;
+ if (iw_socket<0)
+ iw_socket = iw_sockets_open(); //get kernel socket
+ if (iw_socket<0)
+ return 0;
+
+ iw_scan( iw_socket, (char*)_ifname, iw_get_kernel_we_version(), &context );
+ scan = context.result;
+
+ int i = 0;
+ if ( scan = context.result ) do {
+ char buffer[32];
+ //iw_ether_ntop( (const struct ether_addr *)scan->ap_addr.sa_data, buffer );
+ //printf( "ESSID: %s, quality: %i\n", scan->b.essid, scan->stats.qual.qual );
+ i++;
+ } while (scan = scan->next);
+ printf( "WATools: Networks found: %i\n", i );
+}
+
+
+//////////////////////
+///// MISC FUNCTIONS
+
+bool WATools::isConnected( const char* _ifname ) ///returns true if interface is properly configured and associated
+{
+ bool ret;
+ if ( WATools::isUp( _ifname ) && \
+ (strcmp( WATools::ip( _ifname ), "0.0.0.0" ) != 0) && \
+ (strcmp( WATools::ap( _ifname ), "00:00:00:00:00:00" ) != 0) && \
+ (WATools::quality( _ifname ) > 0) ) {
+ int tx = txpackets( _ifname);
+ if ( tx > prev_tx_packets + WA_TX_THRESHOLD ) {
+ prev_tx_packets = tx;
+ int rx = rxpackets( _ifname );
+ if ( rx > prev_rx_packets ) {
+ prev_rx_packets = rx;
+ ret = 1;
+ } else { // no packets received since last change
+ std::cout << "Connection lost (TX threshold exceeded)" << std::endl;
+ ret = 0;
+ }
+ } else ret = 1; // no packets sent since last check
+ } else ret = 0;
+ return ret;
+}
+
+char* WATools::kernelModule( const char* _ifname ) ///returns KERNEL MODULE name for the given interface
+{
+ /// DOES SOMEONE KNOW A BETTER WAY TO RETRIEVE IT?
+ char origPath[64], symPath[64];
+ static char module[32];
+ char* p;
+ sprintf( origPath, "/sys/class/net/%s/device/driver", _ifname );
+ memset( &symPath, 0, sizeof(symPath) );
+ readlink( (const char*)origPath, symPath, sizeof(symPath) );
+ p = strtok( symPath, "/" );
+ do {
+ strcpy( module, p );
+ p = strtok( NULL, "/" );
+ } while ( p != NULL ); //last part of the symlinked directory is the module name used for the interface.
+ return module;
+}
+
+
+//////////////////////
+///// PRIVATE CONVENIENCE FUNCTIONS
+
+int WATools::getStatistic( const char* statName, const char* _ifname )
+{
+ if (_ifname==0)
+ _ifname = ifname;
+
+ char path[64];
+ sprintf( path, "/sys/class/net/%s/statistics/%s", _ifname, statName );
+
+ FILE* f = fopen( path, "r" );
+ void* ptr;
+ static char buffer[16];
+ fgets(buffer, sizeof(buffer), f);
+ fclose(f);
+ return atoi( buffer ); //convert string to integer
+}
+
+int WATools::doRequest( int request, struct ifreq* reqStruct, const char* _ifname )
+{
+ if (_ifname==0)
+ _ifname = ifname;
+ if (iw_socket<0)
+ iw_socket = iw_sockets_open(); //get kernel socket
+ if (iw_socket<0)
+ return 0;
+
+ memset( reqStruct, 0, sizeof(reqStruct) );
+ strncpy(reqStruct->ifr_name, _ifname, IFNAMSIZ);
+ return ioctl(iw_socket, request, reqStruct);
+}
+
+int WATools::doWirelessRequest( int request, struct iwreq* reqStruct, const char* _ifname )
+{
+ if (_ifname==0)
+ _ifname = ifname;
+ if (iw_socket<0)
+ iw_socket = iw_sockets_open(); //get kernel socket
+ if (iw_socket<0)
+ return 0;
+
+ memset( reqStruct, 0, sizeof(reqStruct) );
+ strncpy(reqStruct->ifr_name, _ifname, IFNAMSIZ);
+ return ioctl(iw_socket, request, reqStruct);
+}
+
+int WATools::doWirelessStatisticsRequest( iw_statistics* iwStats, const char* _ifname )
+{
+ if (_ifname==0)
+ _ifname = ifname;
+ if (iw_socket<0)
+ iw_socket = iw_sockets_open();//get kernel socket
+ if (iw_socket<0)
+ return 0;
+
+ unsigned int has_range;
+ iw_range range;
+
+ if ( iw_get_range_info(iw_socket, _ifname, &range) < 0 )
+ has_range = 0;
+ else
+ has_range = 1;
+ return iw_get_stats(iw_socket, _ifname, iwStats, &range, has_range);
+}
+
+void WATools::cleanup()
+{
+ if (!iw_socket<0)
+ iw_sockets_close(iw_socket);
+}
diff --git a/src/watools.h b/src/watools.h
new file mode 100644
index 0000000..e2088e5
--- /dev/null
+++ b/src/watools.h
@@ -0,0 +1,76 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Pawel Nawrocki *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef WATOOLS_H
+#define WATOOLS_H
+
+//maximum number of packets send without any received. When it's exceeded, the connection is considered lost.
+#define WA_TX_THRESHOLD 14
+
+#include <iwlib.h>
+#include <time.h>
+class QStringList;
+
+class WATools
+{
+public:
+ static inline void setInterface( const char* new_ifname ) //sets default (fallback) interface
+ {
+ ifname = (char*)new_ifname;
+ }
+ static inline char* interface() //returns default (fallback) interface
+ {
+ return ifname;
+ }
+ // general interface functions
+ static bool isUp( const char* _ifname = 0 ); //returns current STATUS
+ static bool setUp( bool u, const char* _ifname = 0 ); //bring interface up/down
+ static char* ip( const char* _ifname = 0 ); //returns current IP
+ static int txpackets( const char* _ifname = 0 ); //returns number of packets send via _iface
+ static int rxpackets( const char* _ifname = 0 ); //returns number of packets received via _iface
+
+ // wireless extensions calls
+ static bool isWireless( const char* _ifname ); //returns true if iface is a valid wireless interface
+ static char* essid( const char* _ifname = 0 ); //returns current ESSID
+ static char* ap( const char* _ifname = 0 ); //returns current AP
+ static int quality( const char* _ifname = 0 ); //returns current QUALITY
+ static int txpower( const char* _ifname = 0 ); //returns current TXPOWER
+
+ static bool hasKey( const char* _ifname = 0 ); //returns true if WEP key for the specified interface is set
+
+ static int availableNetworks( const char* _ifname = 0 ); //returns a list of available networks
+
+ // misc functions
+ static bool isConnected( const char* _ifname = 0 ); //returns true if the interface is properly CONFIGURED AND ASSOCIATED
+ static char* kernelModule( const char* _ifname = 0 ); //returns KERNEL MODULE name for the given interface
+ static void cleanup(); //closes open socket etc.
+
+private:
+ static char* ifname;
+ static int iw_socket;
+ static int prev_tx_packets, prev_rx_packets;
+
+ static int getStatistic( const char* statName, const char* _ifname = 0 );
+ static int doRequest( int request, struct ifreq* reqStruct, const char* _ifname = 0 );
+ static int doWirelessRequest( int request, struct iwreq* reqStruct, const char* _ifname = 0 );
+ static int doWirelessStatisticsRequest( iw_statistics* iwStats, const char* _ifname = 0 );
+};
+
+#endif //WATOOLS_H
diff --git a/src/wlassistant.cpp b/src/wlassistant.cpp
new file mode 100644
index 0000000..bf58914
--- /dev/null
+++ b/src/wlassistant.cpp
@@ -0,0 +1,1264 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Pawel Nawrocki *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#include "wlassistant.h"
+#include "netlistviewitem.h"
+#include "waconfig.h"
+#include "watools.h"
+#include "ui_netparamswizard.h"
+#include "ui_netparamsedit.h"
+
+#include <iostream>
+#include <linux/version.h> //provides LINUX_VERSION* macros
+
+#include <qregexp.h>
+#include <qlabel.h>
+#include <qprocess.h>
+#include <qcursor.h>
+#include <qeventloop.h>
+#include <qtimer.h>
+#include <qcheckbox.h>
+#include <qspinbox.h>
+#include <qwidgetstack.h>
+#include <qtooltip.h>
+
+#include <kpushbutton.h>
+#include <kcombobox.h>
+#include <klistview.h>
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kpopupmenu.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+WirelessAssistant::WirelessAssistant(QWidget* parent, const char* name, bool modal, WFlags fl)
+ : mainWindow(parent,name, modal,fl)
+{
+ buttonScan->setIconSet( SmallIconSet("reload") );
+ buttonConnect->setIconSet( SmallIconSet("connect_creating") );
+ buttonOptions->setIconSet( SmallIconSet("configure") );
+ buttonClose->setIconSet( SmallIconSet("fileclose") );
+
+ netList->setAllColumnsShowFocus(1);
+ netList->setItemMargin(8);
+ frameDevice->hide();
+
+ /// Network List Widget
+ connect( buttonScan, SIGNAL(clicked()),
+ this, SLOT(netScan()) );
+
+ connect( buttonConnect, SIGNAL(clicked()),
+ this, SLOT(itemAction()) );
+
+ connect( buttonClose, SIGNAL(clicked()),
+ this, SLOT(close()) );
+
+ connect( devCombo, SIGNAL(activated( const QString & )),
+ this, SLOT(setDev( const QString & )) );
+
+ connect( netList, SIGNAL(rightButtonPressed( QListViewItem*, const QPoint&, int )),
+ SLOT(showItemContextMenu( QListViewItem*, const QPoint&, int )) );
+
+ /// Settings Widget
+ connect( buttonOptions, SIGNAL(toggled(bool)),
+ this, SLOT(togglePage(bool)) );
+
+ connect( buttonEnableAllMessages, SIGNAL(clicked()),
+ this, SLOT(enableAllMessages()) );
+
+ /// Global KDE Options
+ connect( KApplication::kApplication(), SIGNAL(settingsChanged(int)),
+ this, SLOT(updateConfiguration(int)) );
+
+ setMouseBehaviour();
+
+ QTimer::singleShot(10, this, SLOT(init()) ); //WAIT FOR THE UI TO BE READY BEFORE FURTHER SETUP (msec)
+}
+
+WirelessAssistant::~WirelessAssistant()
+{}
+
+/*$SPECIALIZATION$*/
+
+
+void WirelessAssistant::init()
+{
+ statusLabel->setText(i18n("Initializing..."));
+ statusLabel->repaint();
+
+ ////////////////////////////////////////
+ ///// CHECK FOR SYSFS (KERNEL 2.6) /////
+ if ( !QFile::exists("/sys") ) {
+ std::cout << "Sysfs not present. Exiting." << std::endl;
+ KMessageBox::error( 0, i18n("Kernel 2.6 or later not present.\nWireless Assistant will now quit.") );
+ close();
+ return;
+ }
+
+ /////////////////////////////////////////////////////
+ ///// LOAD CONFIG FILE INCL. ALL NET PARAMETERS /////
+ WAConfig::self()->setCurrentGroup("Global Options");
+ WAConfig::self()->addItemBool("Auto Quit", autoQuit);
+ WAConfig::self()->addItemBool("Auto Reconnect", autoReconnect);
+ WAConfig::self()->addItemBool("Auto Connect", autoConnect);
+ WAConfig::self()->addItemInt("Delay Before Scanning", DelayBeforeScanning);
+ WAConfig::self()->addItemBool("Group APs", groupAPs);
+ WAConfig::self()->addItemInt("DHCP Client Timeout", DhcpTimeout);
+ WAConfig::self()->addItemString("Interface", NetParams.iface);
+
+ WAConfig::self()->setCurrentGroup("Paths");
+ // Commented out cos no longer needed. Paths are detected when necessary.
+ /*WAConfig::self()->addItemString("DHCP Info (dhcpcd)", dhcpcdInfoPath);
+ WAConfig::self()->addItemString("DHCP PID File (dhcpcd)", dhcpcdPidPath);
+ WAConfig::self()->addItemString("DHCP Info (dhclient)", dhclientInfoPath);
+ WAConfig::self()->addItemString("DHCP PID File (dhclient)", dhclientPidPath);*/
+
+ WAConfig::self()->setCurrentGroup("Network Parameters");
+ WAConfig::self()->addItemStringList("NetParamsList", NetParamsList );
+ WAConfig::self()->readConfig();
+ checkAutoQuit->setChecked(autoQuit);
+ checkAutoReconnect->setChecked(autoReconnect);
+ checkAutoConnect->setChecked(autoConnect);
+ checkGroupAPs->setChecked(groupAPs);
+ if (!DelayBeforeScanning)
+ DelayBeforeScanning = spinDelayBeforeScanning->value();
+ else
+ spinDelayBeforeScanning->setValue(DelayBeforeScanning);
+ if (!DhcpTimeout)
+ DhcpTimeout = spinDhcpTimeout->value();
+ else
+ spinDhcpTimeout->setValue(DhcpTimeout);
+
+ std::cout << "Loaded application options." << std::endl;
+
+ ///////////////////////////////////
+ ///// DETECT WIRELESS DEVICES /////
+ QStringList devList = interfaceList();
+ if ( devList.count()==0 ) {
+ std::cout << "No wireless interfaces found. Exiting." << std::endl;
+ KMessageBox::error(0, i18n("No usable wireless devices found.\nWireless Assistant will now quit."));
+ close();
+ return;
+ }
+ std::cout << "Wireless interface(s): " << devList.join(", ") << std::endl;
+ devCombo->insertStringList(devList);
+
+ if (devCombo->count() > 1) { //check if last used (saved) interface is available (only if more that 1 interface present).
+ for (int i=0; i<devCombo->count(); i++) {
+ if ( devCombo->text(i)==NetParams.iface ) { //select matching interface.
+ devCombo->setCurrentItem( i );
+ break;
+ }
+ }
+ frameDevice->show(); //only if more than 1 wireless device.
+ }
+ NetParams.iface = devCombo->currentText(); // set interface name
+ WATools::setInterface( NetParams.iface ); // set fallback interface for WATools
+
+ //////////////////////////////////
+ ///// CHECK FILE PERMISSIONS /////
+ if (!QFileInfo("/etc/resolv.conf").isWritable()) {
+ std::cout << "warning: /etc/resolv.conf not writable" << std::endl;
+ KMessageBox::information(0, i18n("<qt><p>You might have insufficient permissions for Wireless Assistant to function properly.</p><p>Did you run it using '<tt>sudo</tt>'?</p></qt>") );
+ }
+ std::cout << "Permissions checked." << std::endl;
+
+ //////////////////////////////////
+ ///// INITIALIZE COMMANDS
+ Commands.init();
+
+ ///////////////////////////////////////
+ ///// INITIALIZE GLOBAL VARIABLES /////
+ wpaAvailable = ( !( Commands.wpa_supplicant.isEmpty() || Commands.wpa_cli.isEmpty() ) );
+ connectedItem = 0;
+ timerGui = new QTimer();
+ timerConnectionCheck = new QTimer();
+ connect( timerGui, SIGNAL(timeout()), SLOT(updateConnectedItem()) );
+ connect( timerConnectionCheck, SIGNAL(timeout()), SLOT(checkConnectionStatus()) );
+
+ ////////////////////////
+ ///// DETECT & SET PATHS /////
+ if (!Commands.allFound) { //all ok or ONLY dhcpcd not found (i.e. dhclient present).
+ std::cout << "Missing executables (" << Commands.notFound.join("', '") << "). Exiting." << std::endl;
+ KMessageBox::error(0, i18n("Executable(s) '%1' could not be found.\nWireless Assistant will now quit.").arg(Commands.notFound.join("', '")) );
+ close();
+ return;
+ }
+
+ KStandardDirs standardDirs;
+ wpaConfigFile = standardDirs.saveLocation("config").append("wlassistantwpa");
+
+ ///////////////////////////////////////
+ ///// SCAN FOR AVAILABLE NETWORKS /////
+ if ( autoConnect )
+ QTimer::singleShot( 0, this, SLOT(netAutoConnect()) );
+ else
+ QTimer::singleShot( 0, this, SLOT(netScan()) );
+}
+
+void WirelessAssistant::checkConnectionStatus()
+{
+ QListViewItem* lvi;
+ if (groupAPs) lvi = getItemByEssid( WATools::essid(NetParams.iface));
+ else lvi = getItemByAp( WATools::ap(NetParams.iface ));
+ bool needsKey;
+ lvi ? needsKey = static_cast<NetListViewItem*>(lvi)->enc() : needsKey = 0;
+ if ( WATools::isConnected(NetParams.iface) && WATools::hasKey(NetParams.iface)==needsKey ) { //connection OK
+ if (!connectedItem) {
+ std::cout << "Now connected to '" << WATools::essid(NetParams.iface) << "'" << std::endl;
+ if (groupAPs && NetParams.ap=="any") {
+ setConnectedItem( WATools::essid( NetParams.iface ) );
+ setNetParamsFromConfig( WATools::essid( NetParams.iface ) );
+ } else {
+ setConnectedItem( WATools::ap( NetParams.iface ) );
+ setNetParamsFromConfig( WATools::ap( NetParams.iface ) );
+ }
+ setNetParamsFromList( connectedItem );
+ }
+ } else if (connectedItem) { //connection LOST
+ setConnectedItem(0);
+ timerConnectionCheck->stop();
+ if ( autoReconnect || KMessageBox::questionYesNo(0, i18n("Connection to '%1' has been lost!\nWould you like to reconnect?").arg(NetParams.essid), i18n("Connection Lost") , KStdGuiItem::yes(), KStdGuiItem::no() ) == KMessageBox::Yes ) {
+ netDisconnect( true );
+ netConnect();
+ }
+ timerConnectionCheck->start( WA_CONNECTION_CHECK_INTERVAL );
+ }
+}
+
+void WirelessAssistant::removeNetParams()
+{
+ NetListViewItem *nvi = static_cast<NetListViewItem*>(netList->selectedItem());
+ QString ap = nvi->ap(); QString essid = nvi->essid();
+ for (QStringList::Iterator nps = NetParamsList.begin(); nps != NetParamsList.end(); nps++) {
+ if ( (*nps).section(",",2,2)==ap && (*nps).section(",",1,1)==essid) {
+ if ( KMessageBox::warningContinueCancel(0, i18n("<qt><p>Settings for network '<b>%1</b>' are about to be deleted.</p><p>Would you like to continue?</p></qt>").arg(essid)) == KMessageBox::Continue ) {
+ if (nvi->hidden()) // hiddenEssid = 1
+ nvi->setEssid("<hidden>");
+ NetParamsList.remove(nps);
+ WAConfig::self()->writeConfig();
+ statusLabel->setText( i18n("Settings deleted.") );
+ }
+ break;
+ }
+ }
+}
+
+
+void WirelessAssistant::setDNS( const WANetParams & np )
+{
+ QFile f("/etc/resolv.conf");
+ if (f.open( IO_WriteOnly | IO_Truncate )) {
+ QTextStream s( &f );
+ if (!np.domain.isEmpty()) {
+ s << QString("domain " + np.domain + "\n");
+ std::cout << "resolv.conf: domain " << np.domain << std::endl;
+ }
+ if (!np.dns1.isEmpty()) {
+ s << QString("nameserver " + np.dns1 + "\n");
+ std::cout << "resolv.conf: nameserver " << np.dns1 << std::endl;
+ }
+ if (!np.dns2.isEmpty()) {
+ s << QString("nameserver " + np.dns2 + "\n");
+ std::cout << "resolv.conf: nameserver " << np.dns2 << std::endl;
+ }
+ f.close();
+ } else {
+ std::cout << "dns setup error: " << f.name() << " is not writeable." << std::endl;
+ KMessageBox::error(0, i18n("<qt><p>File '<i>%1</i>' could not be opened for writing.</p><p>Nameserver(s) and/or domain are not set.</p></qt>").arg(f.name()) );
+ }
+}
+
+void WirelessAssistant::netScan()
+{
+ timerConnectionCheck->stop(); //stop while scanning.
+ netScan( NetParams );
+ if (netList->childCount() > 0) {
+ QTimer::singleShot( 0, this, SLOT(checkConnectionStatus()) );
+ timerConnectionCheck->start(WA_CONNECTION_CHECK_INTERVAL);
+ }
+}
+
+void WirelessAssistant::netScan( const WANetParams & np )
+{
+ if (!radioEnabled()) {
+ statusLabel->setText("Radio off. Scanning aborted.");
+ std::cout << "Radio is off!" << std::endl;
+ setUi(1);
+ return;
+ }
+
+ setUi(0);
+
+ bool wasConnected = false;
+ if (connectedItem) {
+ wasConnected = true;
+ setConnectedItem( 0 );
+ }
+
+ if ( !WATools::isUp(np.iface) ) {
+ statusLabel->setText(i18n("Bringing interface %1 up...").arg(np.iface));
+ //runCommand( Commands.cmd("ifup",np) );
+ WATools::setUp(true, np.iface);
+ if (DelayBeforeScanning>0) {
+ statusLabel->setText(i18n("Waiting before scanning..."));
+ statusLabel->repaint();
+ KApplication::eventLoop()->processEvents( QEventLoop::ExcludeUserInput );
+ usleep(DelayBeforeScanning * 1000000); // delay * 1000ms
+ }
+ }
+
+ statusLabel->setText(i18n("Scanning..."));
+ statusLabel->repaint();
+
+ netList->clear();
+
+ QString result;
+ statusLabel->setText(i18n("Scanning..."));
+ result = runCommand( Commands.cmd("scan",np) );
+
+ parseScan( result );
+
+ if (netList->childCount() > 0) {
+ std::cout << "Networks found: " << QString::number( netList->childCount() ) << std::endl;
+ if (wasConnected)
+ groupAPs ? setConnectedItem( WATools::essid() ) : setConnectedItem( WATools::ap() ); //mark item as connected.
+ statusLabel->setText( i18n("Done.") );
+ } else {
+ //Workaround for cards overusing cache - bringing if down seems to solve it.
+ //runCommand( Commands.cmd("ifdown", NetParams) ); //Commented out b/c it seems to cause more problems than it solves. (like no scan results)
+ std::cout << "No networks found!" << std::endl;
+ statusLabel->setText( i18n("No networks found.") );
+ if ( result.find("Resource temporarily unavailable")>-1 ) {
+ std::cout << "Radio switch seems to be off." << std::endl;
+ KMessageBox::information(0, i18n("Radio of your wireless card seems to be turned off using an external switch on your computer.\nYou need turn it on to be able to use wireless networks.") );
+ }
+ }
+ setNetListColumns();
+}
+
+void WirelessAssistant::parseScan( const QString & output )
+{
+ QString essid;
+ QStringList essidList;
+ QString channel;
+ QString mode;
+ int qualInt;
+ bool enc; //default to false
+ bool hidden; //default to false
+ QString ap;
+
+ // security parameters
+ bool wpa;
+ QStringList wpaSettings;
+ //QString wpaVersion, wpaGroupCipher, wpaPairwiseCipher, wpaAuthenticationSuite;
+
+
+ bool ok_channel = true; //does iwlist return channel?
+ QString section;
+
+ netList->setUpdatesEnabled( false ); //do not redraw while adding items to avoid flicker.
+
+ for (int i=1; (!output.section("Cell ",i,i).isEmpty()); i++ ) {
+ section = output.section("Cell ",i,i);
+
+ // GET ESSID VALUE
+ essid = getVal(section, "ESSID\\W+\"(.+)\"");
+
+ // GET CHANNEL NUMBER
+ channel = getVal(section, "Channel\\D+(\\d+)" );
+ if (channel.isEmpty()) {
+ channel = getVal(section, "Frequency\\D+(\\d.+)Hz");
+ ok_channel = false;
+ }
+
+ // GET MODE VALUE
+ mode = getVal(section, "Mode:(\\w)"); //get 1st letter of mode.
+ if (mode.upper()!="M") //this covers both Managed and Master. Other are unsupported.
+ continue;
+
+ // GET AP
+ ap = getVal(section, "Address\\W+(\\S+)");
+
+ if (essid.isEmpty()) {
+ if (!ap.isEmpty()) //older wireless-tools report "", not "<hidden>"
+ essid = "<hidden>";
+ else
+ continue; //some cards report one '' essid even when no network's present. Workaround.
+ }
+
+ if (essid=="<hidden>") {
+ hidden = true;
+ essid = matchEssidForAp( ap );
+ } else
+ hidden=false;
+
+ // GET QUALITY
+ int wsignal;
+ //check if driver reports quality directly
+ qualInt = getVal(section, "Quality\\D+(\\d+)").toInt();
+
+ if (qualInt == 0) { //noise not reported? estimate.
+ wsignal = getVal(section, "Signal level\\D+(\\d+)" ).toInt();
+ qualInt = 100-wsignal;
+ }
+ qualInt = (100*qualInt)/50; //adjust and normalize quality (0-100). 50 is the best (6 stars) noise/signal difference
+ if (qualInt > 100) qualInt = 100;
+
+ // GET ENCRYPTION
+ if (getVal(section, "Encryption key\\W+(\\w+)" ).upper()=="OFF")
+ enc = false;
+ else {
+ enc = true;
+
+ wpaSettings.clear();
+ if ( section.contains("WPA2 Version") ) wpaSettings << "WPA2"; //prefer WPA2 over WPA
+ else if ( section.contains("WPA Version") ) wpaSettings << "WPA";
+
+ wpa = ( !wpaSettings.isEmpty() );
+ if (wpa) {
+ wpaSettings << getVal(section, "Group Cipher : (\\w+)") \
+ << getVal(section, "Pairwise Ciphers \\(\\d+\\) : ([\\w ]+)[\n\r]") \
+ << getVal(section, "Authentication Suites \\(\\d+\\) : ([\\w ]+)[\n\r]");
+ }
+ }
+
+ // CHECK IF SAME ESSID ALREADY FOUND, if necessary
+ if (groupAPs) {
+ if ( !hidden && essidList.contains(essid) ) {
+ NetListViewItem* sameEssid = static_cast<NetListViewItem*>(getItemByEssid(essid));
+ sameEssid->setAp("any");
+ if (sameEssid->quality() < qualInt) {
+ sameEssid->setQuality(qualInt);
+ sameEssid->setChannel(channel);
+ }
+ continue;
+ }
+ essidList << essid;
+ }
+
+ NetListViewItem* nvi = new NetListViewItem( netList, essid, channel, qualInt, enc, ap, hidden );
+ if (wpa) nvi->setWpaSettings( wpaSettings );
+ }
+
+ if (!ok_channel)
+ netList->setColumnText( 1, i18n("Freq (Hz)") );
+
+ /// @fixme HACK: Test item for the network list.
+ /// new NetListViewItem( netList, "Test Net", "9", 76, 1, "00:00:00:00:00:11", 0 );
+
+
+ netList->setUpdatesEnabled( true );
+ setUi(1);
+}
+
+bool WirelessAssistant::radioEnabled()
+{
+ bool r;
+ if ( WATools::txpower()==-1 ) {
+ if (KMessageBox::questionYesNo(0, i18n("Radio of your wireless card is off.\nWould you like to turn it on?") )== KMessageBox::Yes) {
+ runCommand( Commands.cmd("radio_on", NetParams) );
+ r = true;
+ } else {
+ r = false;
+ }
+ } else
+ r = true;
+
+ return r;
+}
+
+void WirelessAssistant::setNetParamsFromList( QListViewItem* lvi )
+{
+ NetListViewItem *nvi = static_cast<NetListViewItem*>(lvi);
+ NetParams.essid = nvi->essid();
+ NetParams.hiddenEssid = nvi->hidden();
+ //NetParams.mode = nvi->mode();
+ NetParams.channel = nvi->channel();
+ NetParams.ap = nvi->ap();
+ NetParams.wpaSettings = nvi->wpaSettings();
+ NetParams.wep = ( nvi->enc() && NetParams.wpaSettings.isEmpty() );
+ NetParams.wpa = ( nvi->enc() && !NetParams.wpaSettings.isEmpty() );
+}
+
+bool WirelessAssistant::setNetParamsFromConfig( const QString & s )
+{
+ for (QStringList::Iterator nps = NetParamsList.begin(); nps != NetParamsList.end(); nps++) {
+ if ( (*nps).section(",",2,2)==s || ( (*nps).section(",",1,1)==s && (*nps).section(",",2,2)=="any") ) {
+ NetParams.loadNetParamsString( *nps );
+ if (!s.contains(":")) NetParams.ap = "any"; //if searched by essid
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void WirelessAssistant::itemAction()
+{
+ QListViewItem* lvi = netList->selectedItem();
+ if (!lvi)
+ return;
+
+ NetListViewItem* nvi = static_cast<NetListViewItem*>(lvi);
+ ///////////////////
+ ///// ACTIONS /////
+ if (nvi->isConnected()) {
+ std::cout << "ACTION: DISCONNECT." << std::endl;
+ netDisconnect();
+ return;
+ } else {
+ std::cout << "ACTION: CONNECT." << std::endl;
+ netConnect();
+ return;
+ }
+}
+
+void WirelessAssistant::netAutoConnect()
+{
+ netScan();
+ if ( WATools::isConnected(NetParams.iface) ) return;
+
+ int bestItem = -1;
+ int bestQuality = 0;
+ for ( int i = 0; i < netList->childCount(); i++ ) {
+ NetListViewItem* nvi = static_cast<NetListViewItem*>( netList->itemAtIndex(i) );
+ QString search = nvi->ap();
+ if (search == "any") search = nvi->essid();
+ if ( setNetParamsFromConfig(search) ) {
+ if ( nvi->quality() > bestQuality ) {
+ bestQuality = nvi->quality();
+ bestItem = i;
+ }
+ }
+ }
+
+ if ( bestItem != -1 ) {
+ NetListViewItem* nvi = static_cast<NetListViewItem*>( netList->itemAtIndex( bestItem ) );
+ setNetParamsFromList( nvi );
+ QString search = nvi->ap();
+ if (search == "any") search = nvi->essid();
+ setNetParamsFromConfig( search );
+ timerConnectionCheck->stop();
+ netConnect( NetParams );
+ timerConnectionCheck->start(WA_CONNECTION_CHECK_INTERVAL);
+ } else {
+ statusLabel->setText( i18n("Auto connection failed.") );
+ std::cout << "Auto connection failed: no available configured networks found." << std::endl;
+ }
+}
+
+void WirelessAssistant::netConnect()
+{
+ timerConnectionCheck->stop();
+ setNetParamsFromList( netList->selectedItem() );
+ //can't connect if WPA needed, and wpa_supplicant and wpa_cli not available
+ if ( NetParams.wpa && !wpaAvailable ) {
+ KMessageBox::error(0, i18n("<qt><p><b>Can not connect to network '%1'.<b></p><p>The network you are trying to connect to requires WPA authentication. The necessary executables <i>wpa_supplicant</i> and <i>wpa_cli</i> could not be found. Install <i>wpa_supplicant</i> and restart Wireless Assistant to connect.</p></qt>").arg(NetParams.essid) );
+ timerConnectionCheck->start(WA_CONNECTION_CHECK_INTERVAL); //resume connection checking
+ return;
+ }
+ QString search = NetParams.ap;
+ if (search == "any") search = NetParams.essid;
+ if ( (NetParams.essid=="<hidden>") || (!setNetParamsFromConfig( search )) ) {
+ ui_NetParamsWizard *netwiz = new ui_NetParamsWizard;
+ if (!NetParams.hiddenEssid)
+ netwiz->setCaption( i18n("%1 - First Connection Wizard").arg(NetParams.essid) );
+ netwiz->setEssidEnabled( NetParams.hiddenEssid );
+ netwiz->setWepEnabled( NetParams.wep );
+ netwiz->setWpaEnabled( NetParams.wpa, NetParams.wpaSettings );
+ netwiz->exec();
+ if (netwiz->result()==QDialog::Rejected) {
+ delete netwiz;
+ timerConnectionCheck->start(WA_CONNECTION_CHECK_INTERVAL); //resume connection checking
+ return;
+ } else {
+ NetParams = netwiz->readNetParams( NetParams );
+ NetParams.wasHiddenEssid = NetParams.hiddenEssid; //first time values.
+ NetParams.wasWep = NetParams.wep;
+ NetParamsList << NetParams.netParamsString();
+ if (NetParams.hiddenEssid)
+ static_cast<NetListViewItem*>(netList->selectedItem())->setEssid( NetParams.essid );
+ WAConfig::self()->writeConfig();
+ delete netwiz;
+ }
+ }
+
+ if (NetParams.review())
+ editNetParams();
+ updateNetParams();
+ netConnect( NetParams );
+ timerConnectionCheck->start(WA_CONNECTION_CHECK_INTERVAL);
+}
+
+void WirelessAssistant::updateNetParams()
+{
+ for (QStringList::Iterator nps = NetParamsList.begin(); nps != NetParamsList.end(); nps++) {
+ if ( (*nps).section(",",2,2)==NetParams.ap ) {
+ QString newNps = NetParams.netParamsString();
+ if ( newNps!=(*nps) ) {
+ (*nps) = newNps;
+ WAConfig::self()->writeConfig();
+ std::cout << "Network settings updated." << std::endl;
+ statusLabel->setText( i18n("Network settings updated.") );
+ break;
+ }
+ }
+ }
+}
+
+QString WirelessAssistant::matchEssidForAp( const QString & ap )
+{
+ for (QStringList::Iterator nps = NetParamsList.begin(); nps != NetParamsList.end(); nps++) {
+ if ( (*nps).section(",",2,2)==ap ) {
+ return (*nps).section(",",1,1); //essid
+ }
+ }
+ return "<hidden>";
+}
+
+void WirelessAssistant::netConnect( const WANetParams & np )
+{
+ setUi(0);
+
+ if (connectedItem)
+ netDisconnect( true );
+ else if ( dhcpClientRunning() )
+ runCommand( Commands.cmd("kill_dhcp", np) ); //kill any stale DHCP client running
+
+ if ( !np.preConnectionCommand.isEmpty() ) {
+ std::cout << "Running pre-connection command: " << np.preConnectionCommand << std::endl;
+ statusLabel->setText( i18n("Running pre-connection command...") );
+ runCommand( QStringList::split( " ", np.preConnectionCommand ), np.preConnectionTimeout, np.preConnectionDetached );
+ } else
+ std::cout << "No pre-connection command specified." << std::endl;
+
+
+ statusLabel->setText( i18n("Connecting to '%1'...").arg(np.essid) );
+ statusLabel->repaint();
+ if (!WATools::isUp(np.iface) ) WATools::setUp( true, np.iface );
+ //runCommand( Commands.cmd("ifup", np) );
+ if ( runCommand( Commands.cmd("iwconfig_set", np) ).find("8B04") > -1 ) { // error 8B04 - Request 'Set Frequency' not supported.
+ WANetParams np2 = np;
+ np2.channel = "0";
+ runCommand( Commands.cmd("iwconfig_set", np2) );
+ }
+
+ runCommand( Commands.cmd("iwconfig_ap", np) );
+
+ ///////////////////////
+ ///// RUN WPA CLIENT IF NEEDED
+ if (np.wpa) {
+ if ( generateWpaConfigFile( np.essid, np.wpaSettings, np.wpaKey ) ) {
+ if ( !setWpaClientEnabled( true, np.iface ) ) {
+ setUi(1);
+ std::cout << "CONNECTION FAILED." << std::endl;
+ statusLabel->setText( i18n("Connection failed.") );
+ runCommand( Commands.cmd("disconnect", np ) );
+ return;
+ }
+ }
+ }
+
+ ////////////////////////
+ ///// CONFIGURE IP ADDRESS etc.
+ if (np.dhcp) { //DHCP config
+ QString dhcp_out = runCommand( Commands.cmd("ifconfig_dhcp", np), DhcpTimeout );
+ if ( dhcp_out.contains("::ERR::") && !dhcp_out.contains("bound to ") ) { // 'bound to' is a check for dhclient, which gives some output to stderr even when succeeded
+ if ( dhcpClientRunning() )
+ runCommand( Commands.cmd("kill_dhcp", np) ); //kill any stale DHCP client running (seems it's dhclient only)
+ setUi(1);
+ std::cout << "CONNECTION FAILED." << std::endl;
+ statusLabel->setText( i18n("Connection failed.") );
+ runCommand( Commands.cmd("disconnect", np ) );
+ return;
+ }
+ } else { //manual config
+ runCommand( Commands.cmd("ifconfig_manual", np) );
+ setDNS( np );
+ runCommand( Commands.cmd("route_add", np) );
+ }
+
+ if ( !np.postConnectionCommand.isEmpty() ) {
+ std::cout << "Running post-connection command: " << np.postConnectionCommand << std::endl;
+ statusLabel->setText( i18n("Running post-connection command...") );
+ runCommand( QStringList::split( " ", np.postConnectionCommand ), np.postConnectionTimeout, np.postConnectionDetached );
+ } else
+ std::cout << "No post-connection command specified." << std::endl;
+
+ //////////////////////
+ ///// CHECK CONNECTION
+ statusLabel->setText(i18n("Testing connection..."));
+ usleep(200*1000); //sleep 200ms to make sure all parameters are set.
+ if ( WATools::isConnected(np.iface)) {
+ if (autoQuit)
+ this->close();
+ groupAPs ? setConnectedItem( np.essid ) : setConnectedItem( np.ap );
+ statusLabel->setText( i18n("Successfully connected to '%1'.").arg(np.essid) );
+ setUi(1);
+ } else {
+ std::cout << "CONNECTION FAILED." << std::endl;
+ statusLabel->setText(i18n("Connection failed."));
+ runCommand( Commands.cmd("disconnect", np ) );
+ setConnectedItem( 0 );
+ setUi(1);
+ if (KMessageBox::questionYesNo(0, i18n("Connection failed.\nWould you like to review settings for this network?"), i18n("Review Settings?") , KStdGuiItem::yes(), KStdGuiItem::no(), "ReviewSettings" ) == KMessageBox::Yes)
+ editNetParams();
+ }
+}
+
+void WirelessAssistant::updateConnectedItem()
+{
+ connectedItem->setQuality( WATools::quality() );
+}
+
+void WirelessAssistant::setConnectedItem( const QString & netid )
+{
+ timerConnectionCheck->stop(); //stop timer while changing currentItem
+ if (connectedItem) {
+ timerGui->stop();
+ connectedItem->setConnected( false );
+ connectedItem = 0;
+ }
+ if (!netid.isEmpty()) {
+ QListViewItem* lvi;
+ if (netid.contains(":")) lvi = getItemByAp( netid ); //netid is an AP address
+ else lvi = getItemByEssid( netid );
+ if (lvi) {
+ NetListViewItem* nvi = static_cast<NetListViewItem*>(lvi);
+ nvi->setConnected( true );
+ connectedItem = nvi;
+ netList->sort(); // sort to make sure new connectedItem is 1st.
+ }
+ }
+
+ if (connectedItem) {
+ timerGui->start(2500); //update quality indicator every 2.5seconds
+ }
+ updateConnectButton( netList->selectedItem() );
+ timerConnectionCheck->start(WA_CONNECTION_CHECK_INTERVAL);
+}
+
+void WirelessAssistant::netDisconnect( const bool & quiet )
+{
+ if ( (quiet) || (KMessageBox::warningContinueCancel(0, i18n("<qt><p>You are about to disconnect from '<b>%1</b>'.</p><p>Would you like to continue?<p></qt>").arg(connectedItem->essid()) )== KMessageBox::Continue ) ) {
+ timerConnectionCheck->stop(); //stop while disconnecting.
+
+ if ( !NetParams.preDisconnectionCommand.isEmpty() ) {
+ std::cout << "Running pre-disconnection command: " << NetParams.preDisconnectionCommand << std::endl;
+ statusLabel->setText( i18n("Running pre-disconnection command...") );
+ runCommand( QStringList::split( " ", NetParams.preDisconnectionCommand ), NetParams.preDisconnectionTimeout, NetParams.preDisconnectionDetached );
+ } else
+ std::cout << "No pre-disconnection command specified." << std::endl;
+
+
+ statusLabel->setText( i18n("Disconnecting...") );
+ statusLabel->repaint();
+ setConnectedItem( 0 );
+ if ( NetParams.dhcp ) {
+ if ( dhcpClientRunning() ) {
+ runCommand( Commands.cmd( "kill_dhcp", NetParams ) );
+ statusLabel->setText( i18n("Waiting for DHCP client to shut down...") );
+ statusLabel->repaint();
+ QTimer* tmr = new QTimer();
+ tmr->start(1500, true); //wait 1.5sec for dhcp client to really shutdown, single shot.
+ while ( tmr->isActive() ) {
+ KApplication::eventLoop()->processEvents( QEventLoop::AllEvents );
+ usleep(75*1000); //75msec on Linux
+ }
+ delete tmr;
+ }
+ } else {
+ runCommand( Commands.cmd( "route_del", NetParams ) );
+ }
+ runCommand( Commands.cmd( "disconnect", NetParams ) );
+ WATools::setUp( false, NetParams.iface );
+
+ if ( NetParams.wpa )
+ setWpaClientEnabled( false );
+
+ std::cout << "DISCONNECTED." << std::endl;
+
+ if ( !NetParams.postDisconnectionCommand.isEmpty() ) {
+ std::cout << "Running post-disconnection command: " << NetParams.postDisconnectionCommand << std::endl;
+ statusLabel->setText( i18n("Running post-disconnection command...") );
+ runCommand( QStringList::split( " ", NetParams.postDisconnectionCommand ), NetParams.postDisconnectionTimeout, NetParams.postDisconnectionDetached );
+ } else
+ std::cout << "No post-disconnection command specified." << std::endl;
+
+
+ statusLabel->setText( i18n("Done.") );
+ timerConnectionCheck->start(WA_CONNECTION_CHECK_INTERVAL);
+ } else {
+ statusLabel->setText( i18n("Cancelled.") );
+ }
+}
+
+QListViewItem* WirelessAssistant::getItemByAp( const QString & ap )
+{
+ QListViewItem* lvi = netList->firstChild();
+ while (lvi) {
+ if ( static_cast<NetListViewItem*>(lvi)->
+ ap() == ap ) {
+ break;
+ }
+ lvi = lvi->nextSibling();
+ }
+ return lvi;
+}
+
+QListViewItem* WirelessAssistant::getItemByEssid( const QString & essid )
+{
+ QListViewItem* lvi = netList->firstChild();
+ while (lvi) {
+ if ( static_cast<NetListViewItem*>(lvi)->
+ essid() == essid ) {
+ break;
+ }
+ lvi = lvi->nextSibling();
+ }
+ return lvi;
+}
+
+
+void WirelessAssistant::updateConfiguration(int category)
+{
+ if (category == KApplication::SETTINGS_MOUSE) {
+ setMouseBehaviour();
+ return;
+ }
+ if (category == -1) {
+ autoQuit = checkAutoQuit->isChecked();
+ autoReconnect = checkAutoReconnect->isChecked();
+ autoConnect = checkAutoConnect->isChecked();
+ groupAPs = checkGroupAPs->isChecked();
+ DelayBeforeScanning = spinDelayBeforeScanning->value();
+ DhcpTimeout = spinDhcpTimeout->value();
+ }
+}
+
+void WirelessAssistant::togglePage(bool options)
+{
+ buttonScan->setDisabled(options);
+ buttonConnect->setDisabled(options);
+ if (options) {
+ if (WAConfig::self()->config()->groupList().contains("Notification Messages")>0)
+ buttonEnableAllMessages->setEnabled(true);
+ else
+ buttonEnableAllMessages->setEnabled(false);
+ widgetStack->raiseWidget(optionsPage);
+ } else {
+ widgetStack->raiseWidget(netPage);
+ updateConfiguration(-1);
+ }
+}
+
+void WirelessAssistant::enableAllMessages()
+{
+ KMessageBox::enableAllMessages();
+ buttonEnableAllMessages->setEnabled( false );
+}
+
+void WirelessAssistant::setMouseBehaviour()
+{
+ if ( KGlobalSettings::singleClick() ) {
+ disconnect( netList, SIGNAL(selectionChanged(QListViewItem*)),
+ this, SLOT(updateConnectButton(QListViewItem*)) );
+ disconnect( netList, SIGNAL(doubleClicked(QListViewItem*, const QPoint &, int)),
+ this, SLOT(itemAction()) );
+ connect( netList, SIGNAL(clicked(QListViewItem*, const QPoint &, int)),
+ this, SLOT(itemAction()) );
+ buttonConnect->hide();
+ } else {
+ disconnect( netList, SIGNAL(clicked(QListViewItem*, const QPoint &, int)),
+ this, SLOT(itemAction()) );
+
+ connect( netList, SIGNAL(selectionChanged(QListViewItem*)),
+ this, SLOT(updateConnectButton(QListViewItem*)) );
+ connect( netList, SIGNAL(doubleClicked(QListViewItem*, const QPoint &, int)),
+ this, SLOT(itemAction()) );
+ buttonConnect->show();
+ }
+}
+
+void WirelessAssistant::updateConnectButton(QListViewItem* lvi)
+{
+ QToolTip::remove
+ (buttonConnect);
+ if ( lvi == connectedItem ) {
+ buttonConnect->setText( i18n("&Disconnect") );
+ QToolTip::add
+ ( buttonConnect, i18n("Disconnect from the selected network") );
+
+ } else {
+ buttonConnect->setText( i18n("&Connect") );
+ QToolTip::add
+ ( buttonConnect, i18n("Connect to the selected network") );
+
+ }
+}
+
+void WirelessAssistant::setDev( const QString & ifname)
+{
+ NetParams.iface = ifname;
+ WATools::setInterface( ifname );
+ std::cout << "Selected interface: " << ifname << std::endl;
+ netScan();
+}
+
+QString WirelessAssistant::runCommand( const QStringList & cmd, int timeout, bool detached )
+{
+ if (cmd.isEmpty())
+ return QString::null;
+
+ // a very basic and easy-to-workaround attepmt to restrict using dangerous commands via custom commands setting. This *REALLY* needs a working solution.
+ if ( cmd[0] == "rm" || cmd[0] == "mv" || cmd[0] == "cp" || cmd[0] == "ln" ) return QString::null;
+
+ QProcess* p = new QProcess( this );
+ p->setArguments( cmd );
+
+ p->start();
+ if (detached) {
+ p = 0;
+ return QString::null;
+ }
+
+ QTimer* timerProc = new QTimer(); //timeout timer
+ if ( timeout>0 && !detached ) {
+ connect( timerProc, SIGNAL(timeout()), p, SLOT(kill()) );
+ timerProc->start(timeout*1000); //convert sec to msec
+ }
+
+ connect(buttonClose, SIGNAL(clicked()),
+ p, SLOT(kill()) );
+ int i = 0;
+
+ while ( p->isRunning() ) { // PROCESS USER EVENTS
+ KApplication::eventLoop()->processEvents( QEventLoop::AllEvents );
+ usleep(75*1000); //75msec on Linux (75000msec on Windows...)
+ if (i==27) { // ca 2sec have passed and the process is still running. Replace the 'Close' button with 'Stop'.
+ disconnect(buttonClose, SIGNAL(clicked()),
+ this, SLOT(close()) );
+ buttonClose->setIconSet( SmallIconSet("stop") );
+ buttonClose->setText( i18n("&Stop") );
+ QToolTip::remove
+ (buttonClose);
+ QToolTip::add
+ ( buttonClose, i18n("Terminate current process\n(%1)").arg( p->arguments().join(" ") ) );
+ }
+ i++;
+ }
+
+ disconnect(buttonClose, SIGNAL(clicked()),
+ p, SLOT(kill()) );
+ if (i>27) {//set 'stop' back to 'close' if needed
+ connect(buttonClose, SIGNAL(clicked()),
+ this, SLOT(close()) );
+ buttonClose->setIconSet( SmallIconSet("fileclose") );
+ buttonClose->setText( i18n("&Quit") );
+ QToolTip::remove
+ (buttonClose);
+ QToolTip::add
+ ( buttonClose, i18n("Quit the application") );
+ }
+
+ if (timerProc->isActive())
+ timerProc->stop();
+ delete timerProc;
+ QString e = QString( p->readStderr() );
+ QString o = QString( p->readStdout() );
+ if (!p->normalExit()) {
+ o.append("::ERR::killed");
+ //std::cout << "Process terminated (timed out)." << std::endl; //too much output when checking for internet when it's not available.
+ }
+ delete p;
+
+ if (!e.isEmpty()) {
+ std::cout << "==>stderr: " << e;// << std::endl;
+ o.append("::ERR::");
+ o.append(e);
+ }
+
+ return o;
+}
+
+void WirelessAssistant::setUi(int uiState)
+{
+
+ if (uiState==0) {
+ devCombo->setEnabled( false );
+ buttonScan->setEnabled( false );
+ buttonConnect->setEnabled( false );
+ buttonOptions->setEnabled( false );
+ KApplication::setOverrideCursor( QCursor(Qt::BusyCursor) );
+ } else {
+ if (devCombo->count() > 0) {
+ devCombo->setEnabled( true );
+ buttonScan->setEnabled( true );
+ }
+ if (netList->childCount() > 0)
+ buttonConnect->setEnabled( true );
+ buttonOptions->setEnabled( true );
+ KApplication::restoreOverrideCursor();
+ }
+}
+
+void WirelessAssistant::showItemContextMenu( QListViewItem* i, const QPoint& p, int c )
+{
+ if (!i)
+ return;
+
+ NetListViewItem *nvi = static_cast<NetListViewItem*>(i);
+
+ QString search = nvi->ap();
+ if (search == "any") search = nvi->essid();
+ bool isConfigured = setNetParamsFromConfig(search);
+
+ KPopupMenu *icm = new KPopupMenu();
+ icm->insertTitle(nvi->essid());
+ if (isConfigured) {
+ if (nvi->isConnected()) {
+ icm->insertItem( SmallIcon("connect_no"), i18n("Disconnect..."), this, SLOT(netDisconnect()) );
+ //icm->insertItem( SmallIcon("reload"), i18n("Reconnect"), this, SLOT(netConnect()) );
+ } else
+ icm->insertItem( SmallIcon("connect_creating"), i18n("Connect"), this, SLOT(netConnect()) );
+ icm->insertSeparator();
+ icm->insertItem(i18n("Forget Settings..."), this, SLOT(removeNetParams()) );
+ icm->insertItem(i18n("Edit Settings..."), this, SLOT(editNetParams()) );
+ } else {
+ if (nvi->isConnected()) {
+ icm->insertItem( SmallIcon("connect_no"), i18n("Disconnect..."), this, SLOT(netDisconnect()) );
+ //icm->insertItem( SmallIcon("reload"), i18n("Configure and Reconnect..."), this, SLOT(netConnect()) );
+ } else
+ icm->insertItem( SmallIcon("connect_creating"), i18n("Configure and Connect..."), this, SLOT(netConnect()) );
+ }
+ icm->exec( QCursor::pos() );
+}
+
+void WirelessAssistant::editNetParams()
+{
+ setNetParamsFromList( netList->selectedItem() ); //prepare NetParams
+ if (NetParams.ap!="any") setNetParamsFromConfig( NetParams.ap ); //prepare NetParams
+ else setNetParamsFromConfig( NetParams.essid );
+
+ ui_NetParamsEdit *netedit = new ui_NetParamsEdit();
+ netedit->setValues( NetParams );
+ netedit->setCaption( i18n("%1 Settings").arg(NetParams.essid) );
+ netedit->exec();
+ if (netedit->result() == QDialog::Rejected) {
+ delete netedit;
+ return;
+ } else { //accepted
+ NetParams = netedit->readNetParams( NetParams );
+ updateNetParams();
+ }
+}
+
+void WirelessAssistant::setNetListColumns()
+{
+ int realWidth = netList->viewportSize( netList->contentsWidth(), netList->contentsHeight() ).width(); //calculate actual width taking scrollbars into account
+ int essidWidth = realWidth - netList->columnWidth(1) - netList->columnWidth(2) - netList->columnWidth(3);
+
+ netList->setColumnWidth(0, essidWidth);
+ netList->triggerUpdate();
+}
+
+bool WirelessAssistant::dhcpClientRunning()
+{
+ QStringList pidPaths;
+ QString pidFile;
+ pidPaths << "/etc/" << "/etc/dhcpc/" << "/var/run/";
+ if ( Commands.dhcpClient=="dhcpcd" )
+ pidFile = QString("dhcpcd-%1.pid").arg(NetParams.iface);
+ else
+ pidFile = QString("dhclient.pid");
+
+ for ( QStringList::Iterator it = pidPaths.begin(); it != pidPaths.end(); ++it ) {
+ if ( QFile( QString(*it).append(pidFile) ).exists() ) {
+ std::cout << "Running DHCP client found." << std::endl;
+ return true;
+ }
+ }
+ std::cout << "No DHCP client running." << std::endl;
+ return false;
+}
+
+QStringList WirelessAssistant::interfaceList()
+{
+ QDir d("/sys/class/net");
+ QStringList ifList = d.entryList( QDir::Dirs );
+ ifList.remove("."); ifList.remove(".."); ifList.remove("lo");
+ std::cout << "All interfaces: " << ifList.join(", ") << std::endl;
+ for (QStringList::Iterator nps = ifList.begin(); nps != ifList.end(); nps++) {
+ const char* i = *nps;
+ bool w = WATools::isWireless( i );
+ if ( !WATools::isWireless( (const char*)*nps ) ) {
+ nps = ifList.remove( nps ); nps--;
+ }
+ }
+ return ifList;
+}
+
+QString WirelessAssistant::getVal(const QString & str, const QString & rxs)
+{
+ QRegExp rx(rxs);
+ rx.search(str);
+ return rx.cap(1).stripWhiteSpace();
+}
+
+bool WirelessAssistant::generateWpaConfigFile( const QString& essid, const QStringList& wpaSettings, const QString& wpaKey )
+{
+ // 0 WPA version (1 or 2), 1 group, 2 pairwise, 3 suite
+ if ( wpaSettings.isEmpty() ) return QString();
+ QString c = "ctrl_interface=/var/run/wpa_supplicant\nnetwork={\nscan_ssid=0\nssid=\""; //fast_reauth=1\n
+ c.append(essid).append("\"\n");
+
+ // WPA version
+ c.append("proto=").append(wpaSettings[0]).append("\n");
+
+ //WPA authentication suite
+ c.append("key_mgmt=");
+ if ( wpaSettings[3].contains("PSK") ) c.append("WPA-PSK\n");
+ else return QString(); // not supported
+
+ //WPA pairwise cipher
+ c.append("pairwise=");
+ c.append( wpaSettings[2] ).append("\n");
+
+ //WPA group cipher
+ c.append("group=");
+ c.append( wpaSettings[1] ).append("\n");
+
+ //WPA key
+ QString k = QString();
+ if (wpaKey.left(2)=="s:") { // PASSPHRASE
+ k.append("\"");
+ k.append( wpaKey.right( wpaKey.length() - 2 ) );
+ k.append("\"\n");
+ } else
+ k.append( wpaKey ).append("\n"); // HEX KEY
+
+ c.append("psk=").append(k);
+
+ c.append("}\n");
+ //std::cout << "WPA Config:\n" << c << std::endl;
+
+// # WPA protected network, supply your own ESSID and WPAPSK here:
+// network={
+// scan_ssid=0
+// ssid="your_essid_here"
+// proto=WPA
+// key_mgmt=WPA-PSK
+// pairwise=CCMP TKIP
+// group=CCMP TKIP WEP104 WEP40
+// psk=your_psk_here
+// }
+
+ QFile file( wpaConfigFile );
+ if (file.exists()) file.remove();
+ if ( file.open( IO_WriteOnly ) ) {
+ QTextStream stream( &file );
+ stream << c;
+ file.close();
+ //std::cout << "Wrote WPA config: " << wpaConfigFile << std::endl;
+ return 1;
+ } else
+ return 0;
+}
+
+bool WirelessAssistant::setWpaClientEnabled( bool e, const QString& iface, QString driver )
+{
+ if (!e) {
+ if ( runCommand( QStringList(Commands.wpa_cli) << QString("-i%1").arg(NetParams.iface) << "terminate" ).contains("OK") ) {
+ QFile( wpaConfigFile ).remove();
+ return 1;
+ } else
+ return 0; // wpa client was not running.
+ }
+
+ if ( !runCommand( QStringList(Commands.wpa_cli) << QString("-i%1").arg(NetParams.iface) << "status" ).contains("Failed to connect") ) {
+ std::cout << "WPA client already running. Reconfiguring..." << std::endl;
+ runCommand( QStringList(Commands.wpa_cli) << "reconfigure" );
+ } else {
+ if ( driver.isEmpty() ) { //detect needed driver
+ QString k = WATools::kernelModule( iface );
+ if ( k.contains("hermes") ) driver = "hermes";
+ else if ( k.contains("atmel") ) driver = "atmel";
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 13)
+ else if ( k.contains("ipw") ) driver = "ipw"; //wext should be used for kernels newer than 2.6.12
+#endif
+ //Commented out, because ndiswrapper newer than 1.13 works with wext driver.
+ //else if ( k.contains("ndiswrapper") ) driver = "ndiswrapper";
+ //Commented out, because madwifi-ng works with wext driver.
+ //else if ( k.contains("ath") ) driver = "madwifi";
+ else driver = "wext";
+ std::cout << "Using wpa_supplicant driver: " << driver << std::endl;
+ }
+
+ QProcess* wp = new QProcess( this );
+ wp->clearArguments();
+ wp->addArgument( Commands.wpa_supplicant );
+ wp->addArgument( "-W" ); //wait for control interface
+ wp->addArgument( QString("-D%1").arg(driver) );
+ wp->addArgument( QString("-i%1").arg(iface) );
+ wp->addArgument( QString("-c%1").arg(wpaConfigFile) );
+ //std::cout << "Starting WPA client: " << wp->arguments().join(" ") << std::endl;
+ if ( !wp->start() ) {
+ std::cout << "Failed to start WPA client." << std::endl;
+ return 0;
+ }
+ wp = 0;
+ std::cout << "WPA client started. Waiting for status..." << std::endl;
+ }
+
+ usleep(200*1000); //200msec for wpa_supplicant to initiate
+
+ QString o;
+ int i = 0;
+ while ( !(o =runCommand( QStringList(Commands.wpa_cli) << QString("-i%1").arg(NetParams.iface) << "status" )).contains("Failed to connect") ) {
+ for (int c = 0; c < 15; c++) {
+ usleep(75*1000); //75msec
+ KApplication::eventLoop()->processEvents( QEventLoop::AllEvents );
+ i++;
+ }
+ if (i>400) { //more than 30sec have passed
+ runCommand( QStringList(Commands.wpa_cli) << QString("-i%1").arg(NetParams.iface) << "terminate" );
+ return 0;
+ }
+ if ( o.contains("wpa_state=COMPLETED") ) {
+ std::cout << "WPA Authorisation successful." << std::endl;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
+bool WirelessAssistant::close()
+{
+ updateConfiguration(-1); //read values from setingsPage;
+ WAConfig::self()->writeConfig();
+ std::cout << "Application options saved." << std::endl;
+ WATools::cleanup();
+ std::cout << "Kernel socket closed." << std::endl;
+ return QWidget::close();
+}
+
+
+#include "wlassistant.moc"
diff --git a/src/wlassistant.desktop b/src/wlassistant.desktop
new file mode 100644
index 0000000..b119871
--- /dev/null
+++ b/src/wlassistant.desktop
@@ -0,0 +1,55 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Wireless Assistant
+Comment[pl]=Program do obsługi sieci bezprzewodowych
+Comment[es]=Aplicación para buscar redes inalámbricas
+Exec=ksystraycmd kdesu wlassistant
+Icon=wlassistant
+Type=Application
+Categories=Qt;KDE;Network;
+
+Name[de]=Funknetzassistent
+GenericName=Wireless LAN Manager
+GenericName[ar]=إدارة الشبكة المحلية اللاسلكية
+GenericName[bg]=Безжична мрежа
+GenericName[br]=Merour ar rouedad hep neud
+GenericName[bs]=Upravitelj bežčnim LANom
+GenericName[ca]=Gestor LAN sense fils
+GenericName[cs]=Správce bezdrátové LAN
+GenericName[cy]=Rheolydd LAN Di-Wifr
+GenericName[da]=Håndtering af trådløst netværk
+GenericName[de]=Verwaltung für drahtlose LAN-Verbindungen
+GenericName[el]=Διαχειριστής ασύρματου LAN
+GenericName[es]=Gestor de red inalámbrica
+GenericName[et]=Traadita võrgu haldur
+GenericName[eu]=Kablerik gabeko LAN kudeatzailea
+GenericName[fi]=Langattoman lähiverkon hallinta
+GenericName[fr]=Gestionnaire de réseau sans fil
+GenericName[ga]=Bainisteoir Ghréasáin gan sreang
+GenericName[hi]= बतार लन मनजर
+GenericName[hr]=Upravitelj bežičnog LAN-a
+GenericName[hu]=WiFi-kezelő
+GenericName[is]=Fylgist með staðarneti
+GenericName[it]=Gestione LAN senza fili
+GenericName[ja]=ワイヤレスLANマネージャ
+GenericName[lt]=Bevielio ryšio kontrolės centras
+GenericName[mk]=Менаџер на безжичната локална мрежа
+GenericName[nb]=Trådløst nettverksbehandler
+GenericName[nl]=Draadloos netwerkbeheer
+GenericName[nn]=Handsamar for trådlaust nettverk
+GenericName[pl]=Nadzorca sieci bezprzewodowej
+GenericName[pt]=Gestor de Rede Sem Fios
+GenericName[pt_BR]=Gerenciador de Wireless na LAN
+GenericName[ru]=Менеджер локальной радиосети
+GenericName[sk]=Správca bezdrôtovej siete LAN
+GenericName[sl]=Upravljalec brezžičnega LAN-a
+GenericName[sr]=Управник бежичног LAN-а
+GenericName[sr@Latn]=Upravnik bežičnog LAN-a
+GenericName[sv]=Trådlöst nätverkshantering
+GenericName[ta]=கமபியிலலா LAN மேளாளர
+GenericName[tg]=Мудири Беноқили Шабакаи Маҳаллӣ
+GenericName[tr]=Kablosuz Yerel Ağ Yöneticisi
+GenericName[uk]=Менеджер локальної радіомережі
+GenericName[uz]=Симсиз тармоқ бошқарувчиси
+GenericName[xx]=xxWireless LAN Managerxx
+GenericName[zh_CN]=无线局域网管理器
diff --git a/src/wlassistant.h b/src/wlassistant.h
new file mode 100644
index 0000000..64cd048
--- /dev/null
+++ b/src/wlassistant.h
@@ -0,0 +1,120 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Pawel Nawrocki *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef WLASSISTANT_H
+#define WLASSISTANT_H
+
+//connection check interval in msec
+#define WA_CONNECTION_CHECK_INTERVAL 5000
+
+#include "ui_main.h"
+#include "waconfig.h"
+
+#include "netparams.h"
+
+class QTimer;
+class QProcess;
+class NetListViewItem;
+
+class WirelessAssistant : public mainWindow
+{
+ Q_OBJECT
+
+public:
+ /*$PUBLIC_FUNCTIONS$*/
+ WirelessAssistant(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~WirelessAssistant();
+
+ static QString getVal(const QString & str, const QString & rxs);
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+ virtual void netConnect();
+ virtual void netScan();
+ virtual void netDisconnect( const bool & quiet = false);
+
+private:
+ void netScan( const WANetParams & np );
+ void netConnect( const WANetParams & np );
+ void setDNS( const WANetParams & np );
+ void readConfig();
+ void saveSettings();
+ void setUi(int uiState);
+ void setSingleClick(bool i);
+ QString runCommand( const QStringList & cmd, int timeout = 0, bool detached = 0 );
+ void setNetParamsFromList( QListViewItem* lvi );
+ bool setNetParamsFromConfig( const QString & s );
+ QString matchEssidForAp( const QString & ap );
+ bool radioEnabled();
+ QListViewItem* getItemByAp( const QString & ap );
+ QListViewItem* getItemByEssid( const QString & essid );
+ void setConnectedItem( const QString & netid );
+ QString getGateway();
+ bool dhcpClientRunning();
+ QStringList interfaceList();
+ bool generateWpaConfigFile( const QString& essid, const QStringList& wpaSettings, const QString& wpaKey );
+ bool setWpaClientEnabled( bool e, const QString& iface = 0, QString driver = 0 );
+
+ QStringList NetParamsList;
+ QStringList execsNotFound;
+ NetListViewItem* connectedItem;
+ QString wpaConfigFile;
+ /// settings saved in wlassistantrc
+ bool autoQuit;
+ bool autoReconnect;
+ bool autoConnect;
+ bool groupAPs;
+ bool wpaAvailable;
+ int DelayBeforeScanning;
+ int DhcpTimeout;
+ /*QString dhcpcdInfoPath;
+ QString dhclientInfoPath;
+ QString dhcpcdPidPath;
+ QString dhclientPidPath;*/
+ /// end settings.
+
+ WACommands Commands;
+ WANetParams NetParams;
+ QTimer* timerGui;
+ QTimer* timerConnectionCheck;
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ virtual void init();
+ virtual void netAutoConnect();
+ virtual void parseScan( const QString & output );
+ virtual void setDev( const QString & ifname);
+ virtual void setNetListColumns();
+ virtual void updateConfiguration(int category = -1);
+ virtual void updateConnectedItem();
+ virtual void showItemContextMenu( QListViewItem* i, const QPoint& p, int c);
+ virtual void editNetParams();
+ virtual void removeNetParams();
+ virtual void updateNetParams();
+ virtual void itemAction();
+ virtual void checkConnectionStatus();
+ virtual void updateConnectButton(QListViewItem* lvi);
+ virtual void setMouseBehaviour();
+ virtual void togglePage(bool options );
+ virtual void enableAllMessages();
+ virtual bool close();
+};
+
+#endif