does not need DQT3_SUPPORT
[kdenetwork.git] / wifi / interface_wireless.cpp
blob28a77c7873501664731b9be9102f916f9b5e5458
1 /***************************************************************************
2 stuff.cpp - description
3 -------------------
4 begin : Sun May 6 2001
5 copyright : (C) 2001 by Stefan Winter
6 email : mail@stefan-winter.de
7 ***************************************************************************/
9 /***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
18 #include "interface_wireless.h"
19 #include <QDir>
20 #include <QFile>
21 #include <QString>
22 #include <QStringList>
23 #include <QColor>
24 #include <QRegExp>
26 #ifndef WITHOUT_ARTS
27 #include <arts/artsflow.h>
28 #include <arts/connect.h>
29 #include <arts/iomanager.h>
30 #include <arts/referenceclean.h>
31 #endif // WITHOUT_ARTS
33 #include <iostream>
34 #include <string>
35 #include <klocale.h>
36 #include <k3procio.h>
37 #include <kdebug.h>
38 #include <arpa/inet.h>
40 QStringList Interface_wireless::ignoreInterfaces;
42 Interface_wireless::Interface_wireless ( )
44 has_frequency = false;
45 frequency = 0;
46 has_mode = false;
47 mode = 0;
48 has_key = 0;
49 key = "";
50 key_size = 0;
51 key_flags = 0;
52 essid = "";
53 access_point_address = "";
54 ip_addresses.clear ( );
55 bitrate = 0;
56 socket = -1;
57 has_range = false;
58 for ( int i = 0; i < MAX_HISTORY; i++ )
60 sigLevel[i] = -255;
61 noiseLevel[i] = -255;
62 qual[i] = -255;
63 valid[i] = false;
65 current = 0;
66 sigLevelMin = 32000;
67 noiseLevelMin = 32000;
68 sigLevelMax = -32000;
69 noiseLevelMax = -32000;
71 already_warned = false;
74 bool
75 Interface_wireless::get_device_freq ( long &freq )
77 if ( has_frequency )
79 freq = frequency;
80 return true;
82 else
84 return false;
88 bool
89 Interface_wireless::get_mode ( int &ext_mode )
91 if ( has_mode )
93 ext_mode = mode;
94 return true;
96 else
98 return false;
102 bool
103 Interface_wireless::get_key ( QString & ext_key, int &ext_size, int &ext_flags )
105 if ( has_key )
107 ext_key = key;
108 ext_size = key_size;
109 ext_flags = key_flags;
110 return true;
112 else
114 return false;
118 QString
119 Interface_wireless::get_essid ( )
121 return essid;
124 bool
125 Interface_wireless::get_has_txpower ( )
127 return has_txpower;
131 Interface_wireless::get_txpower_disabled ( )
133 return txpower_disabled;
136 bool
137 Interface_wireless::get_AP_info ( QString & mac, QString & /*ip */ )
139 mac = access_point_address;
140 return false;
143 QStringList
144 Interface_wireless::get_IP_info ( )
146 return ip_addresses;
149 signed long
150 Interface_wireless::get_bitrate ( )
152 return bitrate;
155 signed long
156 Interface_wireless::getMaxBitrate ( )
158 return maxBitrate;
161 QString
162 Interface_wireless::get_interface_name ( )
164 return interface_name;
167 bool
168 Interface_wireless::get_current_quality ( int &sig, int &noi, int &qua )
170 if ( valid[current] )
172 sig = sigLevel[current];
173 noi = noiseLevel[current];
174 qua = qual[current];
175 return true;
177 else
178 return false;
181 CARDSTATES
182 Interface_wireless::getDeviceState ( )
184 if ( !has_frequency || txpower_disabled )
186 return NO_CARD;
188 else if ( mode == 1 )
190 return AD_HOC;
192 else if ( qual[current] == 0 )
194 return NO_CONNECTION;
196 else if ( qual[current] > 0 )
198 return AP_CONNECT;
200 else
201 return NO_CARD;
204 #ifndef WITHOUT_ARTS
206 void
207 sine_wave ( double frequency )
209 using namespace Arts;
210 StdIOManager *limiter = new StdIOManager;
211 Dispatcher dispatcher ( limiter );
212 MyTimeNotify *zeit = new MyTimeNotify ( &dispatcher );
213 Synth_FREQUENCY freq;
214 Synth_WAVE_SIN sin;
215 Synth_PLAY play;
216 setValue ( freq, frequency );
217 connect ( freq, sin );
218 connect ( sin, play, "invalue_left" );
219 freq.start ( );
220 sin.start ( );
221 play.start ( );
222 limiter->addTimer ( 240, zeit );
223 dispatcher.run ( );
224 play.stop ( );
225 sin.stop ( );
226 freq.stop ( );
229 void
230 MyTimeNotify::notifyTime ( )
232 test->terminate ( );
235 #endif
237 QString
238 whois ( const char *MAC_ADR, QStringList APList )
240 for ( QStringList::Iterator it = APList.begin ( ); it != APList.end ( ); ( it++ )++ )
242 if ( ( *it ) == ( QString ) MAC_ADR )
243 return *( ++it );
245 return i18n ( "UNKNOWN" );
249 NetworkParameterDataModel::rowCount ( const QModelIndex & parent ) const
251 return dataContainer.size ( );
255 NetworkParameterDataModel::columnCount ( const QModelIndex & parent ) const
257 return 4;
260 QVariant
261 NetworkParameterDataModel::data ( const QModelIndex & index, int role ) const
263 if ( index.row ( ) >= dataContainer.size ( ) )
264 return QVariant ( );
266 if ( role != Qt::DisplayRole && role != Qt::BackgroundColorRole )
267 return QVariant ( );
269 if ( role == Qt::DisplayRole )
270 switch ( index.column ( ) )
272 case 0:
273 return dataContainer[index.row ( )].ssid;
274 case 1:
275 return dataContainer[index.row ( )].mode;
276 case 2:
277 return ( QString ( "%1" ) ).arg ( dataContainer[index.row ( )].quality );
278 case 3:
279 if ( dataContainer[index.row ( )].encryption == "off" )
280 return QString ( i18n ( "off" ) );
281 if ( dataContainer[index.row ( )].encryption == "on" )
282 return QString ( i18n ( "on" ) );
283 return dataContainer[index.row ( )].encryption;
284 default:
285 return QVariant ( );
288 if ( role == Qt::BackgroundColorRole )
289 switch ( index.column ( ) )
291 case 0:
292 return ( dataContainer[index.row ( )].ssid == "" ? QColor ( 255, 255, 0 ) : QColor ( 0, 128, 0 ) );
293 case 1:
294 return QColor ( 0, 128, 0 );
295 case 2:
296 return QColor ( 0, 128, 0 );
297 case 3:
298 if ( dataContainer[index.row ( )].encryption == "on" )
299 return QColor ( 255, 255, 0 );
300 if ( checkWEP ( dataContainer[index.row ( )].encryption ) == NONE )
301 return QColor ( 0, 128, 0 );
302 if ( checkWEP ( dataContainer[index.row ( )].encryption ) == VALID_HEX ||
303 checkWEP ( dataContainer[index.row ( )].encryption ) == VALID_STRING )
304 return QColor ( 0, 128, 0 );
305 if ( checkWEP ( dataContainer[index.row ( )].encryption ) == INVALID )
306 return QColor ( 255, 0, 0 );
307 return QVariant ( );
308 default:
309 return QVariant ( );
312 // we will never get here, but let's make the compiler happy
313 return QVariant ();
316 WEP_KEY
317 NetworkParameterDataModel::checkWEP ( const QString & key ) const
320 kDebug ( ) << "In checkWEP()\n";
321 if ( key == "off" )
322 return NONE;
324 if ( key.length ( ) == 5 )
325 return VALID_STRING;
326 if ( key.length ( ) == 13 )
327 return VALID_STRING;
328 if ( key.length ( ) == 32 )
329 return VALID_STRING;
331 // a more restrictive check: is it really a hex number?
333 QRegExp hexNumber ( "[A-F,a-f,0-9]*" );
335 if ( key.length ( ) == 10 && hexNumber.exactMatch ( key ) )
336 return VALID_HEX;
337 if ( key.length ( ) == 26 && hexNumber.exactMatch ( key ) )
338 return VALID_HEX;
339 if ( key.length ( ) == 64 && hexNumber.exactMatch ( key ) )
340 return VALID_HEX;
342 return INVALID;
346 QVariant
347 NetworkParameterDataModel::data ( int row, int col )
349 return data ( createIndex ( row, col, 0 ), Qt::DisplayRole );
352 QVariant
353 NetworkParameterDataModel::headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const
355 if ( orientation == Qt::Vertical )
356 return QVariant ( );
357 switch ( section )
359 case 0:
360 return i18n ( "SSID" );
361 break;
362 case 1:
363 return i18n ( "Mode" );
364 break;
365 case 2:
366 return i18n ( "Quality" );
367 break;
368 case 3:
369 return i18n ( "Encryption" );
370 break;
371 case 4:
372 return "reserved";
373 break;
374 default:
375 return "???";
376 break;
380 QVariant
381 NetworkParameterDataModel::headerData ( int col )
383 return headerData ( col, Qt::Horizontal );
386 bool
387 NetworkParameterDataModel::setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole )
389 if ( role != Qt::EditRole )
390 return false;
391 if ( dataContainer.size ( ) == 0 )
392 insertColumns ( 0, 4 );
393 for ( int i = dataContainer.size ( ); i <= index.row ( ); i++ )
395 kDebug ( ) << "intialising intermediate row " << i << ".\n";
396 struct NetworkParameterData *newRow = new NetworkParameterData;
397 newRow->ssid = "";
398 newRow->mode = "";
399 newRow->quality = 0;
400 newRow->encryption = "off";
401 dataContainer.append ( *newRow );
402 insertRow ( i );
404 kDebug ( ) << "Setting value at row " << index.row ( ) << ", col " << index.column ( ) << " to " << value.
405 toString ( ) << ".\n";
407 switch ( index.column ( ) )
409 case 0:
410 dataContainer[index.row ( )].ssid = value.toString ( );
411 break;
412 case 1:
413 dataContainer[index.row ( )].mode = value.toString ( );
414 break;
415 case 2:
416 dataContainer[index.row ( )].quality = value.toString ( ).toInt ( );
417 break;
418 case 3:
419 dataContainer[index.row ( )].encryption = value.toString ( );
420 break;
421 default:
422 return false;
424 // emit dataChanged(index,index);
425 return true;
428 void
429 NetworkParameterDataModel::gotFinishedIndicator ( )
431 emit finishedScanning ( );
434 bool
435 NetworkParameterDataModel::setData ( int row, int col, const QVariant & value )
437 return setData ( createIndex ( row, col ), value );
440 Qt::ItemFlags NetworkParameterDataModel::flags ( const QModelIndex & index ) const
442 if ( index.row ( ) >= dataContainer.size ( ) )
443 return 0;
444 if ( index.column ( ) > 3 )
445 return 0;
446 if ( index.column ( ) != 0 && index.column ( ) != 3 )
447 return Qt::ItemIsSelectable;
448 if ( index.column ( ) == 0 && !dataContainer[index.row ( )].ssid.isEmpty() )
449 return Qt::ItemIsSelectable;
450 if ( index.column ( ) == 3 && dataContainer[index.row ( )].encryption == "off" )
451 return Qt::ItemIsSelectable;
452 return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable;
455 #include "interface_wireless.moc"