You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdenetwork/wifi/networkscanning.cpp

156 lines
5.6 KiB

/***************************************************************************
networkscanning.cpp - description
-------------------
begin : Sam Apr 24 11:44:20 CEST 2005
copyright : (C) 2005 by Stefan Winter
email : swinter@kde.org
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include <stdio.h>
#include <tqstring.h>
#include <tqwidget.h>
#include <tqlayout.h>
#include <tqpushbutton.h>
#include <tqtable.h>
#include <kdebug.h>
#include <klocale.h>
#include <kprocess.h>
#include <kmessagebox.h>
#include <ktempfile.h>
#include "networkscanning.h"
#include "interface_wireless.h"
NetworkScanning::NetworkScanning (Interface_wireless * dev, TQWidget * parent, const char * name ) : TQWidget ( parent, name ) {
device = dev;
networkScan();
}
void
NetworkScanning::networkScan ()
{
networks = device->get_available_networks ();
if ( networks->numRows() > 0 ) {
networks->setColumnReadOnly( 0, true);
networks->setColumnReadOnly( 1, true);
networks->setColumnReadOnly( 2, true);
networks->setColumnReadOnly( 3, false);
for ( int i = 0; i < networks->numRows(); i++) {
if ( networks->text( i, 3 ) == i18n( "off" )) networks->setRowReadOnly( i, true );
}
networks->setSelectionMode(TQTable::SingleRow);
connect(networks,TQT_SIGNAL(selectionChanged()),this,TQT_SLOT(checkWEP()));
this->setCaption( i18n( "Scan Results" ) );
TQGridLayout* networkSelectionLayout = new TQGridLayout ( this, 2, 3, 0, 5);
switchNet = new TQPushButton( i18n( "Switch to Network..." ), this );
switchNet->setEnabled(false);
TQPushButton* close = new TQPushButton( i18n( "Close" ), this );
networks->reparent( this, TQPoint( 0, 0 ) );
networks->setLeftMargin( 0 );
networks->verticalHeader()->hide();
connect ( close, TQT_SIGNAL( clicked() ), this, TQT_SLOT( hide() ) );
connect ( switchNet, TQT_SIGNAL( clicked() ), this, TQT_SLOT( switchToNetwork() ) );
connect ( networks, TQT_SIGNAL( currentChanged(int,int)), this, TQT_SLOT( checkSettings(int,int)));
connect ( networks, TQT_SIGNAL( valueChanged(int,int)), this, TQT_SLOT( checkSettings(int,int)));
networkSelectionLayout->addMultiCellWidget( networks, 0, 0, 0, 2 );
networkSelectionLayout->addWidget( switchNet, 1, 0 );
networkSelectionLayout->addWidget( close, 1, 2 );
this->show();
} else
{
KMessageBox::sorry(0,i18n("The scan is complete, but no networks have been found."),i18n("No Network Available"));
}
}
void NetworkScanning::checkSettings(int row, int)
{
if ((networks->text(row,0)!=i18n("(hidden cell)")) && (checkWEP()!=INVALID)) switchNet->setEnabled(true);
else switchNet->setEnabled(false);
}
WEP_KEY
NetworkScanning::checkWEP()
{
kdDebug() << "In checkWEP()\n";
if ( (networks->text( networks->currentRow() , 3 ) == i18n( "off" )) ||
(networks->text( networks->currentRow() , 3 ) == "" ) ) return NONE;
if ( (networks->text( networks->currentRow() , 3 ).length()== 5 ) ||
(networks->text( networks->currentRow() , 3 ).length()== 13 ) ) return VALID_STRING;
if ( (networks->text( networks->currentRow() , 3 ).length()== 10 ) ||
(networks->text( networks->currentRow() , 3 ).length()== 26 ) ) return VALID_HEX;
return INVALID;
}
void
NetworkScanning::switchToNetwork()
{
WEP_KEY encryption = checkWEP();
if (encryption == INVALID) {
KMessageBox::sorry(0,i18n( "Aborting network switching due to invalid WEP key specification." ), i18n( "Invalid WEP Key" ));
return;
}
TQString cmdline;
KTempFile* tempfile = new KTempFile( TQString(), TQString(), 0700 );
TQString tempfilename = tempfile->name();
cmdline = (TQString)"ifconfig %1 down\n";
cmdline = cmdline.tqarg( device->get_interface_name() );
write( tempfile->handle(), cmdline.ascii(), strlen( cmdline.ascii() ) );
cmdline = (TQString)"iwconfig %1 essid %2 mode %3 enc %4\n";
cmdline = cmdline.tqarg( device->get_interface_name() );
cmdline = cmdline.tqarg( KProcess::quote( networks->text( networks->currentRow(), 0 ) ) );
TQString modetemp;
if (networks->text( networks->currentRow(), 1 ) == i18n("Managed") ) modetemp = "Managed"; else modetemp = "Ad-Hoc";
cmdline = cmdline.tqarg( modetemp );
if ( encryption != NONE ) {
cmdline = cmdline.tqarg( (encryption == VALID_STRING ? "s:" : "" ) + KProcess::quote( networks->text( networks->currentRow(), 3 ) ) );
} else {
cmdline = cmdline.tqarg("off");
}
write( tempfile->handle(), cmdline.ascii(), strlen( cmdline.ascii() ) );
cmdline = (TQString)"ifconfig %1 up\n";
cmdline = cmdline.tqarg( device->get_interface_name() );
write( tempfile->handle(), cmdline.ascii(), strlen( cmdline.ascii() ) );
delete tempfile; // autoDeletion off, so the file remains on disk
KProcess switchProc;
switchProc << "kdesu" << tempfilename;
switchProc.start( KProcess::Block );
remove(tempfilename.ascii());
}
#include "networkscanning.moc"