summaryrefslogtreecommitdiff
authorwimpie <wimpie>2004-08-09 02:31:25 (UTC)
committer wimpie <wimpie>2004-08-09 02:31:25 (UTC)
commit0784cfdbd261c43856b45be6ab7439841e69b858 (patch) (unidiff)
treef6a27d6b2e1e6d8dcc908b2ef5836cd320ddfab1
parent5e10278e748608766245ff9f59a54d1ae8ff6f7e (diff)
downloadopie-0784cfdbd261c43856b45be6ab7439841e69b858.zip
opie-0784cfdbd261c43856b45be6ab7439841e69b858.tar.gz
opie-0784cfdbd261c43856b45be6ab7439841e69b858.tar.bz2
Many changes :
bluetooth and usb seems to work added preliminary support for VPN on top of any network This version is still very much crippled yet is does DO some things
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/networksettings2/bluetooth/bluetooth.pro1
-rw-r--r--noncore/settings/networksettings2/bluetooth/bluetoothBNEP_NNI.cpp25
-rw-r--r--noncore/settings/networksettings2/bluetooth/bluetoothBNEPdata.h5
-rw-r--r--noncore/settings/networksettings2/bluetooth/bluetoothBNEPedit.cpp28
-rw-r--r--noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.cpp249
-rw-r--r--noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.h23
-rw-r--r--noncore/settings/networksettings2/lancard/lancardedit.cpp4
-rw-r--r--noncore/settings/networksettings2/main.cpp7
-rw-r--r--noncore/settings/networksettings2/network/networkrun.cpp26
-rw-r--r--noncore/settings/networksettings2/networksettings.cpp34
-rw-r--r--noncore/settings/networksettings2/networksettings.h2
-rw-r--r--noncore/settings/networksettings2/networksettings2/Utils.h8
-rw-r--r--noncore/settings/networksettings2/networksettings2/asfullsetup.h2
-rw-r--r--noncore/settings/networksettings2/networksettings2/netnode.cpp6
-rw-r--r--noncore/settings/networksettings2/networksettings2/netnode.h20
-rw-r--r--noncore/settings/networksettings2/networksettings2/networksettings2.pro2
-rw-r--r--noncore/settings/networksettings2/networksettings2/resources.cpp256
-rw-r--r--noncore/settings/networksettings2/networksettings2/resources.h7
-rw-r--r--noncore/settings/networksettings2/networksettings2/system.cpp108
-rw-r--r--noncore/settings/networksettings2/networksettings2/system.h11
-rw-r--r--noncore/settings/networksettings2/networksettingsGUI.ui76
-rw-r--r--noncore/settings/networksettings2/nsdata.cpp25
-rw-r--r--noncore/settings/networksettings2/profile/profileGUI.ui162
-rw-r--r--noncore/settings/networksettings2/profile/profile_NNI.cpp4
-rw-r--r--noncore/settings/networksettings2/profile/profiledata.h1
-rw-r--r--noncore/settings/networksettings2/profile/profileedit.cpp2
-rw-r--r--noncore/settings/networksettings2/profile/profilerun.cpp6
-rw-r--r--noncore/settings/networksettings2/profile/profilerun.h4
-rw-r--r--noncore/settings/networksettings2/usb/usbrun.cpp14
29 files changed, 818 insertions, 300 deletions
diff --git a/noncore/settings/networksettings2/bluetooth/bluetooth.pro b/noncore/settings/networksettings2/bluetooth/bluetooth.pro
index 180bda9..2e1e138 100644
--- a/noncore/settings/networksettings2/bluetooth/bluetooth.pro
+++ b/noncore/settings/networksettings2/bluetooth/bluetooth.pro
@@ -1,21 +1,22 @@
1TEMPLATE = lib 1TEMPLATE = lib
2CONFIG += qt warn_on release 2CONFIG += qt warn_on release
3DESTDIR = $(OPIEDIR)/plugins/networksettings2 3DESTDIR = $(OPIEDIR)/plugins/networksettings2
4 HEADERS = bluetooth_NN.h \ 4 HEADERS = bluetooth_NN.h \
5 bluetoothBNEP_NNI.h \ 5 bluetoothBNEP_NNI.h \
6 bluetoothRFCOMM_NNI.h \ 6 bluetoothRFCOMM_NNI.h \
7 bluetoothBNEPedit.h \ 7 bluetoothBNEPedit.h \
8 bluetoothRFCOMMedit.h 8 bluetoothRFCOMMedit.h
9 SOURCES = bluetooth_NN.cpp \ 9 SOURCES = bluetooth_NN.cpp \
10 bluetoothBNEP_NNI.cpp \ 10 bluetoothBNEP_NNI.cpp \
11 bluetoothRFCOMM_NNI.cpp \ 11 bluetoothRFCOMM_NNI.cpp \
12 bluetoothBNEPedit.cpp \ 12 bluetoothBNEPedit.cpp \
13 bluetoothBNEPrun.cpp \
13 bluetoothRFCOMMedit.cpp 14 bluetoothRFCOMMedit.cpp
14 INCLUDEPATH+= $(OPIEDIR)/include ../ ../networksettings2 15 INCLUDEPATH+= $(OPIEDIR)/include ../ ../networksettings2
15 DEPENDPATH+= $(OPIEDIR)/include ../ ../networksettings2 16 DEPENDPATH+= $(OPIEDIR)/include ../ ../networksettings2
16LIBS += -lqpe 17LIBS += -lqpe
17 INTERFACES= bluetoothBNEPGUI.ui bluetoothRFCOMMGUI.ui 18 INTERFACES= bluetoothBNEPGUI.ui bluetoothRFCOMMGUI.ui
18 TARGET = bluetooth 19 TARGET = bluetooth
19 VERSION = 1.0.0 20 VERSION = 1.0.0
20 21
21include ( $(OPIEDIR)/include.pro ) 22include ( $(OPIEDIR)/include.pro )
diff --git a/noncore/settings/networksettings2/bluetooth/bluetoothBNEP_NNI.cpp b/noncore/settings/networksettings2/bluetooth/bluetoothBNEP_NNI.cpp
index 73312c6..d8420b9 100644
--- a/noncore/settings/networksettings2/bluetooth/bluetoothBNEP_NNI.cpp
+++ b/noncore/settings/networksettings2/bluetooth/bluetoothBNEP_NNI.cpp
@@ -1,37 +1,50 @@
1#include "bluetoothBNEPedit.h" 1#include "bluetoothBNEPedit.h"
2#include "bluetoothBNEP_NNI.h" 2#include "bluetoothBNEP_NNI.h"
3#include "bluetooth_NN.h" 3#include "bluetooth_NN.h"
4 4
5ABluetoothBNEP::ABluetoothBNEP( BluetoothBNEPNetNode * PNN ) : ANetNodeInstance( PNN ) { 5ABluetoothBNEP::ABluetoothBNEP( BluetoothBNEPNetNode * PNN ) :
6 ANetNodeInstance( PNN ), Data() {
6 GUI = 0; 7 GUI = 0;
7 RT = 0; 8 RT = 0;
9 Data.AllowAll = 1;
8} 10}
9 11
10void ABluetoothBNEP::setSpecificAttribute( QString & , QString & ) { 12void ABluetoothBNEP::setSpecificAttribute( QString & S, QString & A ) {
13 if( S == "bdaddress" ) {
14 Data.BDAddress << A;
15 } else if ( S == "allowall" ) {
16 Data.AllowAll = 1;
17 }
11} 18}
12 19
13void ABluetoothBNEP::saveSpecificAttribute( QTextStream & ) { 20void ABluetoothBNEP::saveSpecificAttribute( QTextStream & TS ) {
21 TS << "allowall=" << Data.AllowAll << endl;
22 for ( QStringList::Iterator it = Data.BDAddress.begin();
23 it != Data.BDAddress.end();
24 ++it ) {
25 TS << "bdaddress=" << (*it) << endl;
26 }
14} 27}
15 28
16QWidget * ABluetoothBNEP::edit( QWidget * parent ) { 29QWidget * ABluetoothBNEP::edit( QWidget * parent ) {
17 GUI = new BluetoothBNEPEdit( parent ); 30 GUI = new BluetoothBNEPEdit( parent );
18 GUI->showData( Data ); 31 GUI->showData( Data );
19 return GUI; 32 return GUI;
20} 33}
21 34
22QString ABluetoothBNEP::acceptable( void ) { 35QString ABluetoothBNEP::acceptable( void ) {
23 return ( GUI ) ? GUI->acceptable( ) : QString(); 36 return ( GUI ) ? GUI->acceptable( ) : QString();
24} 37}
25 38
26void ABluetoothBNEP::commit( void ) { 39void ABluetoothBNEP::commit( void ) {
27 if( GUI && GUI->commit( Data ) ) 40 if( GUI && GUI->commit( Data ) )
28 setModified( 1 ); 41 setModified( 1 );
29} 42}
30 43
31bool ABluetoothBNEP::hasDataFor( const QString & ) { 44bool ABluetoothBNEP::hasDataFor( const QString & ) {
32 return 0; 45 return 0;
33} 46}
34 47
35bool ABluetoothBNEP::generateDataForCommonFile( SystemFile & , long ){ 48bool ABluetoothBNEP::generateDataForCommonFile( SystemFile & , long ){
36 return 0; 49 return 0;
37} 50}
diff --git a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPdata.h b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPdata.h
index 037b7b1..03c6903 100644
--- a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPdata.h
+++ b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPdata.h
@@ -1,8 +1,11 @@
1#ifndef BLUETOOTHBNEP_DATA_H 1#ifndef BLUETOOTHBNEP_DATA_H
2#define BLUETOOTHBNEP_DATA_H 2#define BLUETOOTHBNEP_DATA_H
3 3
4#include <qstringlist.h>
5
4typedef struct BluetoothBNEPData { 6typedef struct BluetoothBNEPData {
5 long x; 7 bool AllowAll;
8 QStringList BDAddress;
6} BluetoothBNEPData_t; 9} BluetoothBNEPData_t;
7 10
8#endif 11#endif
diff --git a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPedit.cpp b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPedit.cpp
index 9a3156b..195dbae 100644
--- a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPedit.cpp
+++ b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPedit.cpp
@@ -1,26 +1,48 @@
1#include <qtopia/qcopenvelope_qws.h> 1#include <qtopia/qcopenvelope_qws.h>
2#include <qlistview.h>
3#include <qcheckbox.h>
2 4
3#include <GUIUtils.h> 5#include <GUIUtils.h>
4#include "bluetoothBNEPedit.h" 6#include "bluetoothBNEPedit.h"
5 7
6 8
7BluetoothBNEPEdit::BluetoothBNEPEdit( QWidget * Parent ) : BluetoothBNEPGUI( Parent ){ 9BluetoothBNEPEdit::BluetoothBNEPEdit( QWidget * Parent ) : BluetoothBNEPGUI( Parent ){
8 10
9} 11}
10 12
11QString BluetoothBNEPEdit::acceptable( void ) { 13QString BluetoothBNEPEdit::acceptable( void ) {
14 if( ( ! AnyPAN_CB->isChecked() ) &&
15 BTPANServers_LV->firstChild() == 0 ) {
16 return tr("<p>No bluetooth device addresses specified</p>");
17 }
18
12 return QString(); 19 return QString();
13} 20}
14 21
15bool BluetoothBNEPEdit::commit( BluetoothBNEPData & ) { 22bool BluetoothBNEPEdit::commit( BluetoothBNEPData & Data ) {
16 return 0; 23 QListViewItem * it = BTPANServers_LV->firstChild();
24 Data.BDAddress.clear();
25 while( it ) {
26 Data.BDAddress << it->text(0);
27 it = it->nextSibling();
28 }
29 return 0;
17} 30}
18 31
19void BluetoothBNEPEdit::showData( BluetoothBNEPData & ) { 32void BluetoothBNEPEdit::showData( BluetoothBNEPData & Data ) {
33 QListViewItem * lvit;
34 BTPANServers_LV->clear();
35
36 for ( QStringList::Iterator it = Data.BDAddress.begin();
37 it != Data.BDAddress.end();
38 ++it ) {
39 lvit = new QListViewItem(BTPANServers_LV);
40 lvit->setText( 0, (*it) );
41 }
20} 42}
21 43
22void BluetoothBNEPEdit::SLOT_StartBTMgr( void ) { 44void BluetoothBNEPEdit::SLOT_StartBTMgr( void ) {
23 QCopEnvelope e( "QPE/System", "execute(QString)" ); 45 QCopEnvelope e( "QPE/System", "execute(QString)" );
24 e << QString( "bluetooth-manager" ); 46 e << QString( "bluetooth-manager" );
25 47
26} 48}
diff --git a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.cpp b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.cpp
new file mode 100644
index 0000000..24e4b7b
--- a/dev/null
+++ b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.cpp
@@ -0,0 +1,249 @@
1#include <qfile.h>
2#include <qfileinfo.h>
3#include <qtextstream.h>
4#include <resources.h>
5#include "bluetoothBNEPrun.h"
6
7QDict<QString> * BluetoothBNEPRun::PANConnections = 0;
8
9void BluetoothBNEPRun::detectState( NodeCollection * NC ) {
10 // unavailable : no card found
11 // available : card found and assigned to us or free
12 // up : card found and assigned to us and up
13 QString S = QString( "/tmp/profile-%1.up" ).arg(NC->number());
14 System & Sys = NSResources->system();
15 InterfaceInfo * Run;
16 QFile F( S );
17
18 Log(("Detecting for %s\n", NC->name().latin1() ));
19
20 if( F.open( IO_ReadOnly ) ) {
21 // could open file -> read interface and assign
22 QString X;
23 bool accepted = 0;
24 QTextStream TS(&F);
25 X = TS.readLine();
26 Log(("%s exists : %s\n", S.latin1(), X.latin1() ));
27 // find interface
28 if( handlesInterface( X ) ) {
29
30 Log(("Handles interface %s, PANC %p\n", X.latin1(), PANConnections ));
31 if( PANConnections == 0 ) {
32 // load connections that are active
33 // format : bnep0 00:60:57:02:71:A2 PANU
34 FILE * OutputOfCmd = popen( "pand --show", "r" ) ;
35
36 PANConnections = new QDict<QString>;
37
38 if( OutputOfCmd ) {
39 char ch;
40 // could fork
41 // read all data
42 QString Line = "";
43 while( 1 ) {
44 if( fread( &ch, 1, 1, OutputOfCmd ) < 1 ) {
45 // eof
46 break;
47 }
48 if( ch == '\n' || ch == '\r' ) {
49 if( ! Line.isEmpty() ) {
50 if( Line.startsWith( "bnep" ) ) {
51 QStringList SL = QStringList::split( " ", Line );
52 Log(("Detected PAN %s %s\n",
53 SL[0].latin1(), SL[1].latin1() ));
54 PANConnections->insert( SL[0], new QString(SL[1]));
55 }
56 Line="";
57 }
58 } else {
59 Line += ch;
60 }
61 }
62 }
63
64 pclose( OutputOfCmd );
65 }
66
67 // check if this runtime allows connection to node
68 if( ! Data.AllowAll ) {
69 // has addresses
70 for ( QStringList::Iterator it = Data.BDAddress.begin();
71 ! accepted && it != Data.BDAddress.end();
72 ++ it ) {
73 for( QDictIterator<QString> it2( *(PANConnections) );
74 it2.current();
75 ++ it2 ) {
76 if( X == it2.currentKey() &&
77 (*it) == *(it2.current())
78 ) {
79 // found
80 Log(("%s accepts connections to %s\n",
81 NC->name().latin1(),
82 it2.current()->latin1() ));
83 accepted = 1;
84 break;
85 }
86 }
87 }
88 } else {
89 Log(("%s accepts any connection\n", NC->name().latin1() ));
90 // accept any
91 accepted = 1;
92 }
93
94 if( accepted ) {
95 // matches and is allowed for this node
96 for( QDictIterator<InterfaceInfo> It(Sys.interfaces());
97 It.current();
98 ++It ) {
99 Run = It.current();
100 if( X == Run->Name ) {
101 Log(("%s Assigned %p\n", NC->name().latin1(), Run ));
102 Run->assignNode( netNode() );
103 assignInterface( Run );
104 NC->setCurrentState( IsUp );
105 return;
106 }
107 }
108 }
109 }
110 }
111
112 Log(("Assigned %p\n", assignedInterface() ));
113 if( ( Run = assignedInterface() ) ) {
114 // we already have an interface assigned -> still present ?
115 if( ! Run->IsUp ) {
116 // usb is still free -> keep assignment
117 NC->setCurrentState( Available );
118 return;
119 } // else interface is up but NOT us -> some other profile
120 }
121
122 // nothing (valid) assigned to us
123 assignInterface( 0 );
124
125 // find possible interface
126 for( QDictIterator<InterfaceInfo> It(Sys.interfaces());
127 It.current();
128 ++It ) {
129 Run = It.current();
130
131 Log(("%s %d %d=%d %d\n",
132 Run->Name.latin1(),
133 handlesInterface( Run->Name ),
134 Run->CardType, ARPHRD_ETHER,
135 ! Run->IsUp ));
136
137 if( handlesInterface( Run->Name ) &&
138 Run->CardType == ARPHRD_ETHER &&
139 ! Run->IsUp
140 ) {
141 Log(("Released(OFF)\n" ));
142 // proper type, and Not UP -> free
143 NC->setCurrentState( Off );
144 return;
145 }
146 }
147 // no free found
148 Log(("None available\n" ));
149
150 NC->setCurrentState( Unavailable );
151}
152
153bool BluetoothBNEPRun::setState( NodeCollection * NC, Action_t A, bool ) {
154
155 // we only handle activate and deactivate
156 switch( A ) {
157 case Activate :
158 {
159 if( NC->currentState() != Off ) {
160 return 0;
161 }
162 InterfaceInfo * N = getInterface();
163 if( ! N ) {
164 // no interface available
165 NC->setCurrentState( Unavailable );
166 return 0;
167 }
168 // because we were OFF the interface
169 // we get back is NOT assigned
170 N->assignNode( netNode() );
171 assignInterface( N );
172 Log(("Assing %p\n", N ));
173 NC->setCurrentState( Available );
174 return 1;
175 }
176 case Deactivate :
177 if( NC->currentState() == IsUp ) {
178 // bring down first
179 if( ! connection()->setState( Down ) )
180 // could not ...
181 return 0;
182 } else if( NC->currentState() != Available ) {
183 return 1;
184 }
185 assignedInterface()->assignNode( 0 ); // release
186 assignInterface( 0 );
187 NC->setCurrentState( Off );
188 return 1;
189 default :
190 // FT
191 break;
192 }
193 return 0;
194}
195
196bool BluetoothBNEPRun::canSetState( State_t Curr , Action_t A ) {
197 // we only handle up down activate and deactivate
198 switch( A ) {
199 case Activate :
200 { // at least available
201 if( Curr == Available ) {
202 return 1;
203 }
204 // or we can make one available
205 InterfaceInfo * N = getInterface();
206 if( ! N || N->assignedNode() != 0 ) {
207 // non available or assigned
208 return 0;
209 }
210 return 1;
211 }
212 case Deactivate :
213 return ( Curr >= Available );
214 default :
215 // FT
216 break;
217 }
218 return 0;
219}
220
221// get interface that is free or assigned to us
222InterfaceInfo * BluetoothBNEPRun::getInterface( void ) {
223
224 System & S = NSResources->system();
225 InterfaceInfo * best = 0, * Run;
226
227 for( QDictIterator<InterfaceInfo> It(S.interfaces());
228 It.current();
229 ++It ) {
230 Run = It.current();
231 if( handlesInterface( Run->Name ) &&
232 Run->CardType == ARPHRD_ETHER
233 ) {
234 // this is a bluetooth card
235 if( Run->assignedNode() == netNode() ) {
236 // assigned to us
237 return Run;
238 } else if( Run->assignedNode() == 0 ) {
239 // free
240 best = Run;
241 }
242 }
243 }
244 return best; // can be 0
245}
246
247bool BluetoothBNEPRun::handlesInterface( const QString & S ) {
248 return Pat.match( S ) >= 0;
249}
diff --git a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.h b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.h
index c168429..ce03cbb 100644
--- a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.h
+++ b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.h
@@ -1,31 +1,34 @@
1#include <asdevice.h> 1#include <asdevice.h>
2#include "bluetoothBNEPdata.h" 2#include "bluetoothBNEPdata.h"
3 3
4class BluetoothBNEPRun : public AsDevice { 4class BluetoothBNEPRun : public AsDevice {
5 5
6public : 6public :
7 7
8 BluetoothBNEPRun( ANetNodeInstance * NNI, 8 BluetoothBNEPRun( ANetNodeInstance * NNI,
9 BluetoothBNEPData & Data ) : AsDevice( NNI ) 9 BluetoothBNEPData & D ) :
10 AsDevice( NNI ),
11 Data( D),
12 Pat( "bnep[0-6]" )
10 { } 13 { }
11 14
12 virtual AsDevice * asDevice( void ) 15 virtual AsDevice * asDevice( void )
13 { return (AsDevice *)this; } 16 { return (AsDevice *)this; }
14 17
15 virtual AsDevice * device( void ) 18 virtual AsDevice * device( void )
16 { return asDevice(); } 19 { return asDevice(); }
17 20
18protected : 21protected :
19 22
20 void detectState( NodeCollection * ) 23 void detectState( NodeCollection * );
21 { } 24 bool setState( NodeCollection * , Action_t, bool );
22 25 bool canSetState( State_t , Action_t );
23 bool setState( NodeCollection * , Action_t, bool ) 26 bool handlesInterface( const QString & );
24 { return 0; }
25 27
26 bool canSetState( State_t , Action_t ) 28private :
27 { return 0; }
28 29
29 bool handlesInterface( const QString & ) 30 InterfaceInfo * getInterface( void );
30 { return 0; } 31 BluetoothBNEPData & Data;
32 static QDict<QString> * PANConnections;
33 QRegExp Pat;
31}; 34};
diff --git a/noncore/settings/networksettings2/lancard/lancardedit.cpp b/noncore/settings/networksettings2/lancard/lancardedit.cpp
index ffe9bf6..c00d7aa 100644
--- a/noncore/settings/networksettings2/lancard/lancardedit.cpp
+++ b/noncore/settings/networksettings2/lancard/lancardedit.cpp
@@ -1,208 +1,208 @@
1#include <GUIUtils.h> 1#include <GUIUtils.h>
2#include <resources.h> 2#include <resources.h>
3#include <qarray.h> 3#include <qarray.h>
4#include <qlistview.h> 4#include <qlistview.h>
5#include <qcheckbox.h> 5#include <qcheckbox.h>
6#include <qheader.h> 6#include <qheader.h>
7#include <qregexp.h> 7#include <qregexp.h>
8 8
9#include "lancardedit.h" 9#include "lancardedit.h"
10#include "lancard_NN.h" 10#include "lancard_NN.h"
11#include "lancard_NNI.h" 11#include "lancard_NNI.h"
12 12
13LanCardEdit::LanCardEdit( QWidget * Parent ) : LanCardGUI( Parent ){ 13LanCardEdit::LanCardEdit( QWidget * Parent ) : LanCardGUI( Parent ){
14 LanCards_LV->header()->hide(); 14 LanCards_LV->header()->hide();
15 15
16} 16}
17 17
18QString LanCardEdit::acceptable( void ) { 18QString LanCardEdit::acceptable( void ) {
19 return QString(); 19 return QString();
20} 20}
21 21
22bool LanCardEdit::commit( LanCardData & Data ) { 22bool LanCardEdit::commit( LanCardData & Data ) {
23 bool SM = 0; 23 bool SM = 0;
24 CBM( Data.AnyLanCard, AnyCard_CB, SM ); 24 CBM( Data.AnyLanCard, AnyCard_CB, SM );
25 25
26 if( ! Data.AnyLanCard ) { 26 if( ! Data.AnyLanCard ) {
27 // take copy for orig list 27 // take copy for orig list
28 QStringList NewList( Data.HWAddresses ); 28 QStringList NewList( Data.HWAddresses );
29 29
30 // update HWAddresses to new state 30 // update HWAddresses to new state
31 // remove item also from NewList 31 // remove item also from NewList
32 int idx; 32 int idx;
33 QCheckListItem * CLI = (QCheckListItem *)LanCards_LV->firstChild(); 33 QCheckListItem * CLI = (QCheckListItem *)LanCards_LV->firstChild();
34 while( CLI ) { 34 while( CLI ) {
35 idx = Data.HWAddresses.findIndex(CLI->text(0)); 35 idx = Data.HWAddresses.findIndex(CLI->text(0));
36 if( CLI->isOn() ) { 36 if( CLI->isOn() ) {
37 if( idx < 0 ) { 37 if( idx < 0 ) {
38 // should be in list 38 // should be in list
39 Data.HWAddresses.append( CLI->text(0) ); 39 Data.HWAddresses.append( CLI->text(0) );
40 SM = 1; 40 SM = 1;
41 } 41 }
42 } else { 42 } else {
43 // should not be in list 43 // should not be in list
44 if( idx >= 0 ) { 44 if( idx >= 0 ) {
45 NewList.remove( CLI->text(0) ); 45 NewList.remove( CLI->text(0) );
46 Data.HWAddresses.remove( CLI->text(0) ); 46 Data.HWAddresses.remove( CLI->text(0) );
47 SM = 1; 47 SM = 1;
48 } 48 }
49 } 49 }
50 CLI = (QCheckListItem *)CLI->nextSibling(); 50 CLI = (QCheckListItem *)CLI->nextSibling();
51 } 51 }
52 52
53 // if newlist still contains items. it were items 53 // if newlist still contains items. it were items
54 // that were checked but no longer are present in the system 54 // that were checked but no longer are present in the system
55 SM |= ( NewList.count() > 0 ) ; 55 SM |= ( NewList.count() > 0 ) ;
56 } 56 }
57 return SM; 57 return SM;
58} 58}
59 59
60void LanCardEdit::showData( ALanCard * LC ) { 60void LanCardEdit::showData( ALanCard * LC ) {
61 NNI = LC; 61 NNI = LC;
62 LanCardData & Data = *((LanCardData *)LC->data()); 62 LanCardData & Data = *((LanCardData *)LC->data());
63 63
64 AnyCard_CB->setChecked( Data.AnyLanCard ); 64 AnyCard_CB->setChecked( Data.AnyLanCard );
65 65
66 // load all cards 66 // load all cards
67 populateList(); 67 populateList();
68 68
69 // set checks 69 // set checks
70 QCheckListItem * CLI = (QCheckListItem *)LanCards_LV->firstChild(); 70 QCheckListItem * CLI = (QCheckListItem *)LanCards_LV->firstChild();
71 while( CLI ) { 71 while( CLI ) {
72 CLI->setOn( Data.HWAddresses.findIndex(CLI->text(0)) >= 0 ); 72 CLI->setOn( Data.HWAddresses.findIndex(CLI->text(0)) >= 0 );
73 CLI = (QCheckListItem *)CLI->nextSibling(); 73 CLI = (QCheckListItem *)CLI->nextSibling();
74 } 74 }
75} 75}
76 76
77// load all known cards in list 77// load all known cards in list
78void LanCardEdit::populateList( void ) { 78void LanCardEdit::populateList( void ) {
79 LanCardNetNode *NN = (LanCardNetNode *)NNI->nodeClass(); 79 LanCardNetNode *NN = (LanCardNetNode *)NNI->nodeClass();
80 QCheckListItem * CLI; 80 QCheckListItem * CLI;
81 bool Found; 81 bool Found;
82 82
83 LanCards_LV->clear(); 83 LanCards_LV->clear();
84 84
85 for( QStringList::Iterator it = NN->addressesOfNIC().begin(); 85 for( QStringList::Iterator it = NN->addressesOfNIC().begin();
86 it != NN->addressesOfNIC().end(); 86 it != NN->addressesOfNIC().end();
87 ++it ) { 87 ++it ) {
88 CLI = new QCheckListItem( LanCards_LV, (*it), QCheckListItem::CheckBox ); 88 CLI = new QCheckListItem( LanCards_LV, (*it), QCheckListItem::CheckBox );
89 89
90 // check interfaces and see if this card is present 90 // check interfaces and see if this card is present
91 Found = 0; 91 Found = 0;
92 for( QDictIterator<InterfaceInfo> NIt(NSResources->system().interfaces()); 92 for( QDictIterator<InterfaceInfo> NIt(NSResources->system().interfaces());
93 NIt.current(); 93 NIt.current();
94 ++NIt ) { 94 ++NIt ) {
95 if( NIt.current()->MACAddress == (*it) ) { 95 if( NIt.current()->MACAddress == (*it) ) {
96 Found = 1; 96 Found = 1;
97 break; 97 break;
98 } 98 }
99 } 99 }
100 100
101 CLI->setPixmap( 0, NSResources->getPixmap( 101 CLI->setPixmap( 0, NSResources->getPixmap(
102 (Found) ? "add" : "remove" ) ); 102 (Found) ? "add" : "remove" ) );
103 } 103 }
104} 104}
105 105
106// rescan system for new cards 106// rescan system for new cards
107void LanCardEdit::SLOT_ScanCards( void ) { 107void LanCardEdit::SLOT_ScanCards( void ) {
108 LanCardNetNode *NN = (LanCardNetNode *)NNI->nodeClass(); 108 LanCardNetNode *NN = (LanCardNetNode *)NNI->nodeClass();
109 109
110 // add any NIC that is new and matches our interfacename 110 // add any NIC that is new and matches our interfacename
111 System & S = NSResources->system(); 111 System & S = NSResources->system();
112 QRegExp R( "eth[0-9]" ); 112 QRegExp R( "eth[0-9]" );
113 // populate with all lancards in system 113 // populate with all lancards in system
114 for( QDictIterator<InterfaceInfo> It(S.interfaces()); 114 for( QDictIterator<InterfaceInfo> It(S.interfaces());
115 It.current(); 115 It.current();
116 ++It ) { 116 ++It ) {
117 fprintf( stderr, "TEST %s %s\n", 117 Log(( "TEST %s %s\n",
118 It.current()->Name.latin1(), 118 It.current()->Name.latin1(),
119 It.current()->MACAddress.latin1() ); 119 It.current()->MACAddress.latin1() ));
120 if( R.match( It.current()->Name ) >= 0 && 120 if( R.match( It.current()->Name ) >= 0 &&
121 ( It.current()->CardType == ARPHRD_ETHER 121 ( It.current()->CardType == ARPHRD_ETHER
122#ifdef ARPHRD_IEEE1394 122#ifdef ARPHRD_IEEE1394
123 || It.current()->CardType == ARPHRD_IEEE1394 123 || It.current()->CardType == ARPHRD_IEEE1394
124#endif 124#endif
125 ) 125 )
126 ) { 126 ) {
127 // old item ? 127 // old item ?
128 QCheckListItem * CLI = 128 QCheckListItem * CLI =
129 (QCheckListItem *)LanCards_LV->firstChild(); 129 (QCheckListItem *)LanCards_LV->firstChild();
130 while( CLI ) { 130 while( CLI ) {
131 if( CLI->text(0) == It.current()->MACAddress ) { 131 if( CLI->text(0) == It.current()->MACAddress ) {
132 break; 132 break;
133 } 133 }
134 CLI = (QCheckListItem *)CLI->nextSibling(); 134 CLI = (QCheckListItem *)CLI->nextSibling();
135 } 135 }
136 136
137 if( ! CLI ) { 137 if( ! CLI ) {
138 // new item 138 // new item
139 CLI = new QCheckListItem( LanCards_LV, 139 CLI = new QCheckListItem( LanCards_LV,
140 It.current()->MACAddress, 140 It.current()->MACAddress,
141 QCheckListItem::CheckBox ); 141 QCheckListItem::CheckBox );
142 } 142 }
143 143
144 // mark present 144 // mark present
145 CLI->setPixmap( 0, NSResources->getPixmap( 145 CLI->setPixmap( 0, NSResources->getPixmap(
146 "add" ) ); 146 "add" ) );
147 147
148 if( NN->addressesOfNIC().findIndex( It.current()->MACAddress) < 0 ) { 148 if( NN->addressesOfNIC().findIndex( It.current()->MACAddress) < 0 ) {
149 // new 149 // new
150 NN->addressesOfNIC().append( It.current()->MACAddress ); 150 NN->addressesOfNIC().append( It.current()->MACAddress );
151 } 151 }
152 } 152 }
153 } 153 }
154 154
155} 155}
156 156
157// remove all cards that are not present -> flagged with 'remove' 157// remove all cards that are not present -> flagged with 'remove'
158// and unchecked 158// and unchecked
159void LanCardEdit::SLOT_RemoveUnknown( void ) { 159void LanCardEdit::SLOT_RemoveUnknown( void ) {
160 QArray<QCheckListItem *> AllItems; 160 QArray<QCheckListItem *> AllItems;
161 161
162 LanCardNetNode *NN = (LanCardNetNode *)NNI->nodeClass(); 162 LanCardNetNode *NN = (LanCardNetNode *)NNI->nodeClass();
163 163
164 QCheckListItem * CLI = (QCheckListItem *)LanCards_LV->firstChild(); 164 QCheckListItem * CLI = (QCheckListItem *)LanCards_LV->firstChild();
165 while( CLI ) { 165 while( CLI ) {
166 AllItems.resize( AllItems.size()+1 ); 166 AllItems.resize( AllItems.size()+1 );
167 AllItems[ AllItems.size()-1 ] = CLI; 167 AllItems[ AllItems.size()-1 ] = CLI;
168 CLI = (QCheckListItem *)CLI->nextSibling(); 168 CLI = (QCheckListItem *)CLI->nextSibling();
169 } 169 }
170 170
171 // force update of system 171 // force update of system
172 System & S = NSResources->system(); 172 System & S = NSResources->system();
173 S.probeInterfaces(); 173 S.probeInterfaces();
174 174
175 // add any NIC that is new and matches our interfacename 175 // add any NIC that is new and matches our interfacename
176 QRegExp R( "eth[0-9]" ); 176 QRegExp R( "eth[0-9]" );
177 177
178 178
179 for( QDictIterator<InterfaceInfo> It(S.interfaces()); 179 for( QDictIterator<InterfaceInfo> It(S.interfaces());
180 It.current(); 180 It.current();
181 ++It ) { 181 ++It ) {
182 if( R.match( It.current()->Name ) >= 0 && 182 if( R.match( It.current()->Name ) >= 0 &&
183 ( It.current()->CardType == ARPHRD_ETHER 183 ( It.current()->CardType == ARPHRD_ETHER
184#ifdef ARPHRD_IEEE1394 184#ifdef ARPHRD_IEEE1394
185 || It.current()->CardType == ARPHRD_IEEE1394 185 || It.current()->CardType == ARPHRD_IEEE1394
186#endif 186#endif
187 ) 187 )
188 ) { 188 ) {
189 189
190 for ( unsigned i = 0; i< AllItems.size(); i++ ) { 190 for ( unsigned i = 0; i< AllItems.size(); i++ ) {
191 if( AllItems[i] && 191 if( AllItems[i] &&
192 AllItems[i]->text(0) == It.current()->MACAddress ) { 192 AllItems[i]->text(0) == It.current()->MACAddress ) {
193 AllItems[i] = 0; 193 AllItems[i] = 0;
194 break; 194 break;
195 } 195 }
196 } 196 }
197 } 197 }
198 } 198 }
199 199
200 // AllItems now contains all cards NOT present 200 // AllItems now contains all cards NOT present
201 // remove all items non null and not ON 201 // remove all items non null and not ON
202 for ( unsigned i = 0; i< AllItems.size(); i++ ) { 202 for ( unsigned i = 0; i< AllItems.size(); i++ ) {
203 if( AllItems[i] && ! AllItems[i]->isOn() ) { 203 if( AllItems[i] && ! AllItems[i]->isOn() ) {
204 NN->addressesOfNIC().remove( AllItems[i]->text(0) ); 204 NN->addressesOfNIC().remove( AllItems[i]->text(0) );
205 delete AllItems[i]; 205 delete AllItems[i];
206 } 206 }
207 } 207 }
208} 208}
diff --git a/noncore/settings/networksettings2/main.cpp b/noncore/settings/networksettings2/main.cpp
index 30d1270..6c969fc 100644
--- a/noncore/settings/networksettings2/main.cpp
+++ b/noncore/settings/networksettings2/main.cpp
@@ -1,133 +1,140 @@
1#include "nsdata.h" 1#include "nsdata.h"
2#include "activateprofile.h" 2#include "activateprofile.h"
3#include "networksettings.h" 3#include "networksettings.h"
4 4
5#include <qpe/qpeapplication.h> 5#include <qpe/qpeapplication.h>
6 6
7#include <opie2/oapplicationfactory.h> 7#include <opie2/oapplicationfactory.h>
8using namespace Opie::Core; 8using namespace Opie::Core;
9 9
10#ifdef GONE 10#ifdef GONE
11 11
12OPIE_EXPORT_APP( OApplicationFactory<NetworkSettings> ) 12OPIE_EXPORT_APP( OApplicationFactory<NetworkSettings> )
13 13
14#else 14#else
15 15
16// just standard GUI 16// just standard GUI
17#define ACT_GUI 0 17#define ACT_GUI 0
18// used by interfaces to request for allow of up/down 18// used by interfaces to request for allow of up/down
19#define ACT_REQUEST 1 19#define ACT_REQUEST 1
20// regenerate config files 20// regenerate config files
21#define ACT_REGEN 2 21#define ACT_REGEN 2
22// used by interfaces to request user prompt 22// used by interfaces to request user prompt
23#define ACT_PROMPT 3 23#define ACT_PROMPT 3
24 24
25int main( int argc, char * argv[] ) { 25int main( int argc, char * argv[] ) {
26 int rv = 0; 26 int rv = 0;
27 int Action = ACT_GUI; 27 int Action = ACT_GUI;
28 // could be overruled by -qws 28 // could be overruled by -qws
29 QApplication::Type GuiType = QApplication::GuiClient; 29 QApplication::Type GuiType = QApplication::GuiClient;
30 30
31#ifdef _WS_QWS_ 31#ifdef _WS_QWS_
32 QPEApplication * TheApp; 32 QPEApplication * TheApp;
33#else 33#else
34 QApplication * TheApp; 34 QApplication * TheApp;
35#endif 35#endif
36 36
37 for ( int i = 1; i < argc; i ++ ) { 37 for ( int i = 1; i < argc; i ++ ) {
38 int rmv; 38 int rmv;
39 rmv = 0; 39 rmv = 0;
40 if( strcmp( argv[i], "--regen" ) == 0 ) { 40 if( strcmp( argv[i], "--regen" ) == 0 ) {
41 Action = ACT_REGEN; 41 Action = ACT_REGEN;
42 GuiType = QApplication::Tty; 42 GuiType = QApplication::Tty;
43 rmv = 1; 43 rmv = 1;
44 } else if( strcmp( argv[i], "--prompt" ) == 0 ) { 44 } else if( strcmp( argv[i], "--prompt" ) == 0 ) {
45 Action = ACT_PROMPT; 45 Action = ACT_PROMPT;
46 rmv = 1; 46 rmv = 1;
47 } 47 }
48 if( rmv ) { 48 if( rmv ) {
49 memmove( argv+i, argv+i+rmv, 49 memmove( argv+i, argv+i+rmv,
50 sizeof( char * ) * (argc-i-rmv) ); 50 sizeof( char * ) * (argc-i-rmv) );
51 i --; 51 i --;
52 argc -= rmv; 52 argc -= rmv;
53 } 53 }
54 } 54 }
55 55
56 if( strstr( argv[0], "-request" ) ) { 56 if( strstr( argv[0], "-request" ) ) {
57 // called from system to request something 57 // called from system to request something
58 GuiType = QApplication::Tty; 58 GuiType = QApplication::Tty;
59 Action = ACT_REQUEST; 59 Action = ACT_REQUEST;
60 } 60 }
61 61
62 // Start Qt 62 // Start Qt
63#ifdef _WS_QWS_ 63#ifdef _WS_QWS_
64 // because QPEApplication does not handle GuiType well 64 // because QPEApplication does not handle GuiType well
65 if( GuiType == QApplication::Tty ) { 65 if( GuiType == QApplication::Tty ) {
66 // this cast is NOT correct but we do not use 66 // this cast is NOT correct but we do not use
67 // TheApp anymore ... 67 // TheApp anymore ...
68 TheApp = (QPEApplication *)new QApplication( argc, argv, GuiType ); 68 TheApp = (QPEApplication *)new QApplication( argc, argv, GuiType );
69 } else { 69 } else {
70 TheApp = new QPEApplication( argc, argv, GuiType ); 70 TheApp = new QPEApplication( argc, argv, GuiType );
71 } 71 }
72#else 72#else
73 TheApp = new QApplication( argc, argv, GuiType ); 73 TheApp = new QApplication( argc, argv, GuiType );
74#endif 74#endif
75 75
76 // init qt with app widget 76 // init qt with app widget
77 77
78 switch( Action ) { 78 switch( Action ) {
79 case ACT_REQUEST : 79 case ACT_REQUEST :
80 { NetworkSettingsData NS; 80 { NetworkSettingsData NS;
81 Log(("ACT_REQUEST\n"));
81 if( NS.canStart( argv[1] ) ) { 82 if( NS.canStart( argv[1] ) ) {
82 QString S; 83 QString S;
84 Log(("NEED FOR PROMPT\n" ));
83 S.sprintf( QPEApplication::qpeDir()+ 85 S.sprintf( QPEApplication::qpeDir()+
84 "/bin/networksettings2" ); 86 "/bin/networksettings2" );
85 char * MyArgv[4]; 87 char * MyArgv[4];
86 MyArgv[0] = "networksettings2"; 88 MyArgv[0] = "networksettings2";
87 MyArgv[1] = "--prompt"; 89 MyArgv[1] = "--prompt";
88 MyArgv[2] = argv[1]; 90 MyArgv[2] = argv[1];
89 MyArgv[3] = NULL; 91 MyArgv[3] = NULL;
90 NSResources->system().execAsUser( S, MyArgv ); 92 NSResources->system().execAsUser( S, MyArgv );
91 // if we come here , failed 93 // if we come here , failed
92 printf( "%s-cNN-disallowed", argv[1] ); 94 printf( "%s-cNN-disallowed", argv[1] );
93 } 95 }
94 } 96 }
95 break; 97 break;
96 case ACT_REGEN : 98 case ACT_REGEN :
97 { NetworkSettingsData NS; 99 { NetworkSettingsData NS;
100 Log(("REGEN\n" ));
98 // regen returns 0 if OK 101 // regen returns 0 if OK
99 rv = (NS.regenerate()) ? 1 : 0; 102 rv = (NS.regenerate()) ? 1 : 0;
100 } 103 }
101 break; 104 break;
102 case ACT_PROMPT : 105 case ACT_PROMPT :
103 { ActivateProfile AP(argv[1]); 106 { ActivateProfile AP(argv[1]);
107 Log(("PROMPT\n" ));
104 if( AP.exec() == QDialog::Accepted ) { 108 if( AP.exec() == QDialog::Accepted ) {
105 printf( "%s-c%ld-allowed", argv[1], AP.selectedProfile() ); 109 printf( "%s-c%ld-allowed", argv[1], AP.selectedProfile() );
106 } else { 110 } else {
107 printf( "%s-cNN-disallowed", argv[1] ); 111 printf( "%s-cNN-disallowed", argv[1] );
108 } 112 }
109 } 113 }
110 break; 114 break;
111 case ACT_GUI : 115 case ACT_GUI :
112 { QWidget * W = new NetworkSettings(0); 116 { QWidget * W = new NetworkSettings(0);
117 Log(("GUI\n" ));
113 TheApp->setMainWidget( W ); 118 TheApp->setMainWidget( W );
114 W->show(); 119 W->show();
115#ifdef _WS_QWS_ 120#ifdef _WS_QWS_
116 W->showMaximized(); 121 W->showMaximized();
117#else 122#else
118 W->resize( W->sizeHint() ); 123 W->resize( W->sizeHint() );
119#endif 124#endif
120 rv = TheApp->exec(); 125 rv = TheApp->exec();
121 delete W; 126 delete W;
122 } 127 }
123 break; 128 break;
124 } 129 }
125 130
131 LogClose();
132
126 return rv; 133 return rv;
127} 134}
128 135
129#endif 136#endif
130 137
131 138
132// main.cpp 139// main.cpp
133 140
diff --git a/noncore/settings/networksettings2/network/networkrun.cpp b/noncore/settings/networksettings2/network/networkrun.cpp
index 41e1c53..3e24c5f 100644
--- a/noncore/settings/networksettings2/network/networkrun.cpp
+++ b/noncore/settings/networksettings2/network/networkrun.cpp
@@ -1,66 +1,78 @@
1#include <system.h> 1#include <system.h>
2#include <asdevice.h> 2#include <asdevice.h>
3#include "networkrun.h" 3#include "networkrun.h"
4 4
5void NetworkRun::detectState( NodeCollection * NC ) { 5void NetworkRun::detectState( NodeCollection * NC ) {
6 RuntimeInfo * RI = netNode()->nextNode()->runtime(); 6 RuntimeInfo * RI = netNode()->nextNode()->runtime();
7 AsDevice * Next = RI->asDevice(); 7 AsDevice * Next = RI->asDevice();
8 InterfaceInfo * II = Next->assignedInterface(); 8 InterfaceInfo * II = Next->assignedInterface();
9 9
10 if( II ) { 10 if( II ) {
11 // device has assigned interface 11 // device has assigned interface
12 NC->setCurrentState( (( II->IsUp ) ? IsUp : Available) ); 12 NC->setCurrentState( (( II->IsUp ) ? IsUp : Available) );
13 return; 13 return;
14 } 14 }
15 15
16 Log(( "%s not ! UP or ava\n", NC->name().latin1() ));
16 // has no interface -> delegate 17 // has no interface -> delegate
17 RI->detectState( NC ); 18 RI->detectState( NC );
18} 19}
19 20
20bool NetworkRun::setState( NodeCollection * NC, Action_t A, bool Force ) { 21bool NetworkRun::setState( NodeCollection * NC, Action_t A, bool Force ) {
21 // we handle UP and DOWN 22 // we handle UP and DOWN
22 RuntimeInfo * RI = netNode()->nextNode()->runtime(); 23 RuntimeInfo * RI = netNode()->nextNode()->runtime();
23 AsDevice * Next = RI->asDevice(); 24 AsDevice * Next = RI->asDevice();
24 InterfaceInfo * II = Next->assignedInterface(); 25 InterfaceInfo * II = Next->assignedInterface();
25 26
26 if( A == Up ) { 27 if( A == Up ) {
27 // we can bring UP if lower level is available 28 // we can bring UP if lower level is available
28 if( NC->currentState() == Available || Force ) { 29 if( NC->currentState() == Available || Force ) {
29 QString S; 30 QString S;
30 S.sprintf( "ifup %s=%s-c%d-allowed", 31 S.sprintf( "ifup %s=%s-c%d-allowed",
31 II->Name.latin1(), II->Name.latin1(), 32 II->Name.latin1(), II->Name.latin1(),
32 connection()->number() ); 33 connection()->number() );
33 NSResources->system().runAsRoot( S ); 34 NSResources->system().runAsRoot( S );
34 } 35 }
35 return 1; 36 return 1;
36 } else if( A == Down ) { 37 } else if( A == Down ) {
37 if( NC->currentState() == IsUp || Force ) { 38 QString S;
38 QString S; 39 if( Force ) {
39 S.sprintf( "ifdown %s=%s-c%d-allowed", 40 Log(("Force mode %d\n", Force ));
40 II->Name.latin1(), II->Name.latin1(), 41 for( int i = 0;
41 connection()->number() ); 42 i < RI->netNode()->nodeClass()->instanceCount();
42 NSResources->system().runAsRoot( S ); 43 i ++ ) {
44 S.sprintf( "ifdown %s",
45 RI->netNode()->nodeClass()->genNic( i ).latin1() );
46 NSResources->system().runAsRoot( S );
47 }
48 } else {
49 if( NC->currentState() == IsUp ) {
50 S.sprintf( "ifdown %s=%s-c%d-allowed",
51 II->Name.latin1(), II->Name.latin1(),
52 connection()->number() );
53 NSResources->system().runAsRoot( S );
54 }
43 } 55 }
44 return 1; 56 return 1;
45 } 57 }
46 // delegate 58 // delegate
47 return RI->setState( NC, A ); 59 return RI->setState( NC, A, Force );
48} 60}
49 61
50bool NetworkRun::canSetState( State_t Curr, Action_t A ) { 62bool NetworkRun::canSetState( State_t Curr, Action_t A ) {
51 // we handle UP and DOWN 63 // we handle UP and DOWN
52 RuntimeInfo * RI = netNode()->nextNode()->runtime(); 64 RuntimeInfo * RI = netNode()->nextNode()->runtime();
53 65
54 if( A == Up ) { 66 if( A == Up ) {
55 return ( Curr == Available ); 67 return ( Curr == Available );
56 } else if( A == Down ) { 68 } else if( A == Down ) {
57 return ( Curr == IsUp ); 69 return ( Curr == IsUp );
58 } 70 }
59 // delegate 71 // delegate
60 return RI->canSetState( Curr, A ); 72 return RI->canSetState( Curr, A );
61} 73}
62 74
63bool NetworkRun::handlesInterface( const QString & S ) { 75bool NetworkRun::handlesInterface( const QString & S ) {
64 // donno -> pass deeper 76 // donno -> pass deeper
65 return netNode()->nextNode()->runtime()->handlesInterface(S); 77 return netNode()->nextNode()->runtime()->handlesInterface(S);
66} 78}
diff --git a/noncore/settings/networksettings2/networksettings.cpp b/noncore/settings/networksettings2/networksettings.cpp
index b36c7a0..6ee4106 100644
--- a/noncore/settings/networksettings2/networksettings.cpp
+++ b/noncore/settings/networksettings2/networksettings.cpp
@@ -1,449 +1,475 @@
1#include <stdio.h> 1#include <stdio.h>
2#include <unistd.h>
2 3
3#include <qpe/qpeapplication.h> 4#include <qpe/qpeapplication.h>
4#include <qlistbox.h> 5#include <qlistbox.h>
5#include <qgroupbox.h> 6#include <qgroupbox.h>
6#include <qtimer.h> 7#include <qtimer.h>
7#include <qlistbox.h> 8#include <qlistbox.h>
8#include <qmessagebox.h> 9#include <qmessagebox.h>
9#include <qlabel.h> 10#include <qlabel.h>
10#include <qiconview.h> 11#include <qiconview.h>
11#include <qtimer.h> 12#include <qtimer.h>
12#include <qpe/qpeapplication.h> 13#include <qpe/qpeapplication.h>
13#include <qtoolbutton.h> 14#include <qtoolbutton.h>
14 15
15#include <asdevice.h> 16#include <asdevice.h>
16#include "networksettings.h" 17#include "networksettings.h"
17#include "netnode.h" 18#include "netnode.h"
18#include "editconnection.h" 19#include "editconnection.h"
19 20
20NetworkSettings::NetworkSettings( QWidget *parent, 21NetworkSettings::NetworkSettings( QWidget *parent,
21 const char *name, 22 const char *name,
22 WFlags fl ) : NetworkSettingsGUI(parent,name,fl), 23 WFlags fl ) : NetworkSettingsGUI(parent,name,fl),
23 NSD() { 24 NSD() {
24 25
25 UpdateTimer = new QTimer( this ); 26 UpdateTimer = new QTimer( this );
26 27
27 // set pixmaps 28 // set pixmaps
28 Add_TB->setPixmap( NSResources->getPixmap( "add" ) ); 29 Add_TB->setPixmap( NSResources->getPixmap( "add" ) );
29 Delete_TB->setPixmap( NSResources->getPixmap( "remove" ) ); 30 Delete_TB->setPixmap( NSResources->getPixmap( "remove" ) );
30 CheckState_TB->setPixmap( NSResources->getPixmap( "check" ) ); 31 CheckState_TB->setPixmap( NSResources->getPixmap( "check" ) );
31 Enable_TB->setPixmap( NSResources->getPixmap( "disabled" ) ); 32 Enable_TB->setPixmap( NSResources->getPixmap( "disabled" ) );
32 GenConfig_TB->setPixmap( NSResources->getPixmap( "configure" ) ); 33 GenConfig_TB->setPixmap( NSResources->getPixmap( "configure" ) );
33 34
34 Connect_TB->setPixmap( NSResources->getPixmap( "connected" ) ); 35 Connect_TB->setPixmap( NSResources->getPixmap( "connected" ) );
35 Disconnect_TB->setPixmap( NSResources->getPixmap( "disconnected" ) ); 36 Disconnect_TB->setPixmap( NSResources->getPixmap( "disconnected" ) );
36 37
37 On_TB->setPixmap( NSResources->getPixmap( "off" ) ); 38 On_TB->setPixmap( NSResources->getPixmap( "off" ) );
38 39
39 SLOT_ToProfile(); 40 SLOT_ToProfile();
40 41
41 // populate main Listbox 42 // populate main Listbox
42 Profiles_LB->clear(); 43 Profiles_LB->clear();
43 { Name2Connection_t & M = NSResources->connections(); 44 { Name2Connection_t & M = NSResources->connections();
44 NodeCollection * NC; 45 NodeCollection * NC;
45 // for all connections 46 // for all connections
46 for( QDictIterator<NodeCollection> it(M); 47 for( QDictIterator<NodeCollection> it(M);
47 it.current(); 48 it.current();
48 ++it ) { 49 ++it ) {
49 NC = it.current(); 50 NC = it.current();
50 Profiles_LB->insertItem( NC->devicePixmap(), 51 Profiles_LB->insertItem( NC->devicePixmap(),
51 NC->name() ); 52 NC->name() );
52 } 53 }
53 } 54 }
54 55
55 if( Profiles_LB->count() ) { 56 if( Profiles_LB->count() ) {
56 Profiles_LB->setSelected( 0, TRUE ); 57 Profiles_LB->setSelected( 0, TRUE );
57 } 58 }
58 59
59 // if no profiles -> auto popup editing 60 // if no profiles -> auto popup editing
60 if( NSResources->connections().count() == 0 ) { 61 if( NSResources->connections().count() == 0 ) {
61 QTimer::singleShot( 100, this, SLOT(SLOT_AddNode() ) ); 62 QTimer::singleShot( 100, this, SLOT(SLOT_AddNode() ) );
62 } 63 }
63 64
65 connect( &(NSResources->system()),
66 SIGNAL( lineFromCommand(const QString &) ),
67 this, SLOT( SLOT_CmdMessage(const QString &) ) );
68
64 UpdateTimer->start( 5000 ); 69 UpdateTimer->start( 5000 );
65 connect( UpdateTimer, SIGNAL( timeout() ), 70 connect( UpdateTimer, SIGNAL( timeout() ),
66 this, SLOT( SLOT_RefreshStates() ) ); 71 this, SLOT( SLOT_RefreshStates() ) );
67 72
68 /* Add QCopChannel */ 73 /* Add QCopChannel */
69 connect( qApp, SIGNAL(appMessage(const QCString&,const QByteArray&)), 74 connect( qApp, SIGNAL(appMessage(const QCString&,const QByteArray&)),
70 this, SLOT(SLOT_QCopMessage(const QCString&,const QByteArray&)) ); 75 this, SLOT(SLOT_QCopMessage(const QCString&,const QByteArray&)) );
71} 76}
72 77
73NetworkSettings::~NetworkSettings() { 78NetworkSettings::~NetworkSettings() {
74 QString S; 79 QString S;
75 80
76 S = NSD.generateSettings(); 81 S = NSD.generateSettings();
77 if( ! S.isEmpty() ) { 82 if( ! S.isEmpty() ) {
78 QMessageBox::warning( 83 QMessageBox::warning(
79 0, 84 0,
80 tr( "In System Config" ), 85 tr( "In System Config" ),
81 S 86 S
82 ); 87 );
83 } 88 }
84 89
85 S = NSD.saveSettings(); 90 S = NSD.saveSettings();
86 if( ! S.isEmpty() ) { 91 if( ! S.isEmpty() ) {
87 // problem saving 92 // problem saving
88 QMessageBox::warning( 93 QMessageBox::warning(
89 0, 94 0,
90 tr( "Saving setup" ), S ); 95 tr( "Saving setup" ), S );
91 } 96 }
92} 97}
93 98
99void NetworkSettings::SLOT_CmdMessage( const QString & S ) {
100 Messages_LB->insertItem( S );
101 Messages_LB->setCurrentItem( Messages_LB->count()-1 );
102 Messages_LB->ensureCurrentVisible();
103}
104
94void NetworkSettings::SLOT_RefreshStates( void ) { 105void NetworkSettings::SLOT_RefreshStates( void ) {
95 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); // remember 106 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); // remember
96 107
97 if( LBI ) { 108 if( LBI ) {
98 NodeCollection * NC; 109 NodeCollection * NC;
99 NSResources->system().probeInterfaces(); 110 NSResources->system().probeInterfaces();
100 // update current selection only 111 // update current selection only
101 NC = NSResources->findConnection( LBI->text() ); 112 NC = NSResources->findConnection( LBI->text() );
102 if( NC ) { 113 if( NC ) {
103 State_t OldS = NC->state(); 114 State_t OldS = NC->state();
104 State_t NewS = NC->state(1); 115 State_t NewS = NC->state(1);
105 if( OldS != NewS ) { 116 if( OldS != NewS ) {
106 updateProfileState( LBI ); 117 updateProfileState( LBI );
107 } 118 }
108 } 119 }
109 } 120 }
110 121
111 122
112 /* -> LATER !! 123 /* -> LATER !!
113 bool is; 124 bool is;
114 NodeCollection * NC; 125 NodeCollection * NC;
115 126
116 for( unsigned int i = 0; i < Profiles_LB->count() ; i ++ ) { 127 for( unsigned int i = 0; i < Profiles_LB->count() ; i ++ ) {
117 NC = NSResources->findConnection( Profiles_LB->text(i) ); 128 NC = NSResources->findConnection( Profiles_LB->text(i) );
118 if( NC ) { 129 if( NC ) {
119 State_t OldS = NC->state(); 130 State_t OldS = NC->state();
120 State_t NewS = NC->state(1); 131 State_t NewS = NC->state(1);
121 if( OldS != NewS ) { 132 if( OldS != NewS ) {
122 is = Profiles_LB->isSelected(i); 133 is = Profiles_LB->isSelected(i);
123 Profiles_LB->changeItem( NC->statePixmap(NewS), 134 Profiles_LB->changeItem( NC->statePixmap(NewS),
124 NC->name(), 135 NC->name(),
125 i ); 136 i );
126 if( is ) { 137 if( is ) {
127 Profiles_LB->setSelected( i, TRUE ); 138 Profiles_LB->setSelected( i, TRUE );
128 } 139 }
129 } 140 }
130 } 141 }
131 } 142 }
132 if( ci >= 0 ) 143 if( ci >= 0 )
133 Profiles_LB->setCurrentItem( ci ); 144 Profiles_LB->setCurrentItem( ci );
134 */ 145 */
135} 146}
136 147
148void NetworkSettings::SLOT_NoLongerBusy( void ) {
149 NSResources->busy( FALSE );
150}
137void NetworkSettings::SLOT_AddNode( void ) { 151void NetworkSettings::SLOT_AddNode( void ) {
138 SLOT_EditNode( 0 ); 152 SLOT_EditNode( 0 );
139} 153}
140 154
141void NetworkSettings::SLOT_DeleteNode( void ) { 155void NetworkSettings::SLOT_DeleteNode( void ) {
142 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); 156 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() );
143 157
144 if ( ! LBI ) 158 if ( ! LBI )
145 return; 159 return;
146 160
147 if( QMessageBox::warning( 161 if( QMessageBox::warning(
148 0, 162 0,
149 tr( "Removing profile" ), 163 tr( "Removing profile" ),
150 tr( "Remove selected profile ?" ), 164 tr( "Remove selected profile ?" ),
151 1, 0 ) == 1 ) { 165 1, 0 ) == 1 ) {
152 NSResources->removeConnection( LBI->text() ); 166 NSResources->removeConnection( LBI->text() );
153 delete LBI; 167 delete LBI;
154 setModified( 1 ); 168 setModified( 1 );
155 NSD.forceGeneration(1); 169 NSD.forceGeneration(1);
156 } 170 }
157} 171}
158 172
159void NetworkSettings::SLOT_EditNode( QListBoxItem * LBI ) { 173void NetworkSettings::SLOT_EditNode( QListBoxItem * LBI ) {
160 QString OldName = ""; 174 QString OldName = "";
161 EditConnection EC( this ); 175 EditConnection EC( this );
162 176
163 if( LBI ) { 177 if( LBI ) {
164 NodeCollection * NC = NSResources->findConnection( LBI->text() ); 178 NodeCollection * NC = NSResources->findConnection( LBI->text() );
165 if( ! NC ) { 179 if( ! NC ) {
166 return; 180 return;
167 } 181 }
168 OldName = NC->name(); 182 OldName = NC->name();
169 EC.setConnection( NC ); 183 EC.setConnection( NC );
170 } 184 }
171 185
172 EC.showMaximized(); 186 EC.showMaximized();
173 // disable refresh timer 187 // disable refresh timer
174 UpdateTimer->stop(); 188 UpdateTimer->stop();
189 NSResources->busy( TRUE );
190 QTimer::singleShot( 1000, this, SLOT( SLOT_NoLongerBusy() ));
175 // we need to retry 191 // we need to retry
176 while( 1 ) { 192 while( 1 ) {
177 if( EC.exec() == QDialog::Accepted ) { 193 if( EC.exec() == QDialog::Accepted ) {
178 // toplevel item -> store 194 // toplevel item -> store
179 NodeCollection * NC = EC.connection(); 195 NodeCollection * NC = EC.connection();
180 if( NC->isModified() ) { 196 if( NC->isModified() ) {
181 setModified( 1 ); 197 setModified( 1 );
182 if( LBI ) { 198 if( LBI ) {
183 if( NC->name() != OldName ) { 199 if( NC->name() != OldName ) {
184 // find if new name is free 200 // find if new name is free
185 NodeCollection * LCN = NSResources->findConnection( 201 NodeCollection * LCN = NSResources->findConnection(
186 NC->name() ); 202 NC->name() );
187 if( LCN ) { 203 if( LCN ) {
188 QMessageBox::warning( 204 QMessageBox::warning(
189 0, 205 0,
190 tr( "In System Config" ), 206 tr( "In System Config" ),
191 tr( "Name %1 already exists" ).arg(NC->name()) 207 tr( "Name %1 already exists" ).arg(NC->name())
192 ); 208 );
193 continue; // restart exec 209 continue; // restart exec
194 } // else new name 210 } // else new name
195 // new name -> remove item 211 // new name -> remove item
196 NSResources->removeConnection( OldName ); 212 NSResources->removeConnection( OldName );
197 NSResources->addConnection( NC ); 213 NSResources->addConnection( NC );
198 } // else not changed 214 } // else not changed
199 215
200 // must add it here since change will trigger event 216 // must add it here since change will trigger event
201 Profiles_LB->changeItem( NC->devicePixmap(), 217 Profiles_LB->changeItem( NC->devicePixmap(),
202 NC->name(), 218 NC->name(),
203 Profiles_LB->index( LBI ) 219 Profiles_LB->index( LBI )
204 ); 220 );
205 } else { 221 } else {
206 // new item 222 // new item
207 int ci = Profiles_LB->count(); 223 int ci = Profiles_LB->count();
208 NSResources->addConnection( NC ); 224 NSResources->addConnection( NC );
209 NC->setNumber( NC->maxConnectionNumber()+1 ); 225 NC->setNumber( NSResources->assignConnectionNumber() );
210 Profiles_LB->insertItem( NC->devicePixmap(), NC->name() ); 226 Profiles_LB->insertItem( NC->devicePixmap(), NC->name() );
211 Profiles_LB->setSelected( ci, TRUE ); 227 Profiles_LB->setSelected( ci, TRUE );
212 } 228 }
213 updateProfileState( LBI ); 229 updateProfileState( LBI );
214 } 230 }
215 } else { 231 } else {
216 // cancelled : reset connection 232 // cancelled : reset connection
217 if( LBI ) { 233 if( LBI ) {
218 NodeCollection * NC = NSResources->findConnection( LBI->text() ); 234 NodeCollection * NC = NSResources->findConnection( LBI->text() );
219 NC->reassign(); 235 NC->reassign();
220 } 236 }
221 } 237 }
222 break; 238 break;
223 } 239 }
224 // reenable 240 // reenable
225 UpdateTimer->start( 5000 ); 241 UpdateTimer->start( 5000 );
226} 242}
227 243
228void NetworkSettings::SLOT_ShowNode( QListBoxItem * LBI ) { 244void NetworkSettings::SLOT_ShowNode( QListBoxItem * LBI ) {
229 if( LBI == 0 ) 245 if( LBI == 0 )
230 return; 246 return;
231 247
232 NodeCollection * NC = NSResources->findConnection( LBI->text() ); 248 NodeCollection * NC = NSResources->findConnection( LBI->text() );
233 249
234 // is button possible 250 // is button possible
235 bool EnabledPossible, OnPossible, ConnectPossible; 251 bool EnabledPossible, OnPossible, ConnectPossible;
236 // is button On or Off 252 // is button On or Off
237 bool DisabledOn, OnOn, ConnectOn; 253 bool DisabledOn, OnOn, ConnectOn;
238 254
239 EnabledPossible = OnPossible = ConnectPossible = 1; 255 EnabledPossible = OnPossible = ConnectPossible = 1;
240 DisabledOn = 1; 256 DisabledOn = 1;
241 OnOn = ConnectOn = 0; 257 OnOn = ConnectOn = 0;
242 258
243 switch( NC->state() ) { 259 switch( NC->state() ) {
244 case Unknown : 260 case Unknown :
245 // cannot occur here 261 // cannot occur here
246 break; 262 break;
247 case Unchecked : 263 case Unchecked :
248 case Unavailable : 264 case Unavailable :
249 // cannot do anything but recheck 265 // cannot do anything but recheck
250 EnabledPossible = OnPossible = ConnectPossible = 0; 266 EnabledPossible = OnPossible = ConnectPossible = 0;
251 break; 267 break;
252 case Disabled : 268 case Disabled :
253 OnPossible = ConnectPossible = 0; 269 OnPossible = ConnectPossible = 0;
254 break; 270 break;
255 case Off : 271 case Off :
256 DisabledOn = 0; 272 DisabledOn = 0;
257 break; 273 break;
258 case Available : 274 case Available :
259 OnOn = 1; 275 OnOn = 1;
276 Connect_TB->setPixmap( NSResources->getPixmap( "disconnected" ) );
260 DisabledOn = 0; 277 DisabledOn = 0;
261 break; 278 break;
262 case IsUp : 279 case IsUp :
263 OnOn = ConnectOn = 1; 280 OnOn = ConnectOn = 1;
281 Connect_TB->setPixmap( NSResources->getPixmap( "connected" ) );
264 DisabledOn = 0; 282 DisabledOn = 0;
265 break; 283 break;
266 } 284 }
267 285
286 if( ! OnOn ) {
287 Connect_TB->setPixmap( NSResources->getPixmap( "disconnected" ) );
288 }
289
268 // set button state 290 // set button state
269 Enable_TB->setEnabled( EnabledPossible ); 291 Enable_TB->setEnabled( EnabledPossible );
270 On_TB->setEnabled( OnPossible ); 292 On_TB->setEnabled( OnPossible );
271 Connect_TB->setEnabled( ConnectPossible ); 293 Connect_TB->setEnabled( ConnectPossible );
272 294
273 Enable_TB->setOn( DisabledOn ); 295 Enable_TB->setOn( DisabledOn );
274 On_TB->setOn( OnOn ); 296 On_TB->setOn( OnOn );
275 Connect_TB->setOn( ConnectOn ); 297 Connect_TB->setOn( ConnectOn );
276 298
277 if( NC->description().isEmpty() ) { 299 if( NC->description().isEmpty() ) {
278 Description_LBL->setText( tr( "No description" ) ); 300 Description_LBL->setText( tr( "<<No description>>" ) );
279 } else { 301 } else {
280 Description_LBL->setText( NC->description() ); 302 Description_LBL->setText( NC->description() );
281 } 303 }
282 304
283 Profile_GB->setTitle( LBI->text() ); 305 Profile_GB->setTitle( LBI->text() + " : " + NC->stateName() );
284 State_LBL->setText( NC->stateName() );
285} 306}
286 307
287void NetworkSettings::SLOT_CheckState( void ) { 308void NetworkSettings::SLOT_CheckState( void ) {
288 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); 309 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() );
289 if ( ! LBI ) 310 if ( ! LBI )
290 return; 311 return;
291 updateProfileState( LBI ); 312 updateProfileState( LBI );
292} 313}
293 314
294void NetworkSettings::updateProfileState( QListBoxItem * LBI ) { 315void NetworkSettings::updateProfileState( QListBoxItem * LBI ) {
295 if( LBI == Profiles_LB->item( Profiles_LB->currentItem() ) ) { 316 if( LBI == Profiles_LB->item( Profiles_LB->currentItem() ) ) {
296 SLOT_ShowNode( LBI ); 317 SLOT_ShowNode( LBI );
297 } 318 }
298} 319}
299 320
300void NetworkSettings::SLOT_GenerateConfig( void ) { 321void NetworkSettings::SLOT_GenerateConfig( void ) {
301 QString S = NSD.generateSettings( TRUE ); 322 QString S = NSD.generateSettings( TRUE );
302 323
303 if( ! S.isEmpty() ) { 324 if( ! S.isEmpty() ) {
304 QMessageBox::warning( 325 QMessageBox::warning(
305 0, 326 0,
306 tr( "Generating system configuration" ), 327 tr( "Generating system configuration" ),
307 S 328 S
308 ); 329 );
309 } 330 }
310} 331}
311 332
312void NetworkSettings::SLOT_Enable( void ) { 333void NetworkSettings::SLOT_Enable( void ) {
313 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); 334 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() );
314 QString Msg; 335 QString Msg;
315 if ( ! LBI ) 336 if ( ! LBI )
316 return; 337 return;
317 338
318 NodeCollection * NC = 339 NodeCollection * NC =
319 NSResources->findConnection( LBI->text() ); 340 NSResources->findConnection( LBI->text() );
320 341
321 bool rv; 342 bool rv;
322 switch( NC->state() ) { 343 switch( NC->state() ) {
323 case Disabled : 344 case Disabled :
324 Msg = tr( "Cannot enable profile" ); 345 Msg = tr( "Cannot enable profile" );
325 rv = NC->setState( Enable ); 346 rv = NC->setState( Enable );
326 break; 347 break;
327 default : 348 default :
328 Msg = tr( "Cannot disable profile" ); 349 Msg = tr( "Cannot disable profile" );
329 rv = NC->setState( Disable ); 350 rv = NC->setState( Disable );
330 break; 351 break;
331 } 352 }
332 353
333 if( ! rv ) { 354 if( ! rv ) {
334 QMessageBox::warning( 355 QMessageBox::warning(
335 0, 356 0,
336 tr( "Activating profile" ), 357 tr( "Activating profile" ),
337 Msg ); 358 Msg );
338 return; 359 return;
339 } 360 }
340 updateProfileState( LBI ); 361 updateProfileState( LBI );
341} 362}
342 363
343void NetworkSettings::SLOT_On( void ) { 364void NetworkSettings::SLOT_On( void ) {
344 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); 365 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() );
345 366
346 if ( ! LBI ) 367 if ( ! LBI )
347 return; 368 return;
348 369
349 NodeCollection * NC = 370 NodeCollection * NC =
350 NSResources->findConnection( LBI->text() ); 371 NSResources->findConnection( LBI->text() );
351 372
352 bool rv; 373 bool rv;
353 switch( NC->state() ) { 374 switch( NC->state() ) {
354 case Off : 375 case Off :
355 // activate interface 376 // activate interface
356 rv = NC->setState( Activate ); 377 rv = NC->setState( Activate );
357 break; 378 break;
358 case Available : // deactivate 379 case Available : // deactivate
359 case IsUp : // deactivate (will also bring down if needed) 380 case IsUp : // deactivate (will also bring down if needed)
360 rv = NC->setState( Deactivate ); 381 rv = NC->setState( Deactivate );
361 break; 382 break;
362 default : 383 default :
363 // others no change 384 // others no change
364 return; 385 return;
365 } 386 }
366 387
367 if( ! rv ) { 388 if( ! rv ) {
368 QMessageBox::warning( 389 QMessageBox::warning(
369 0, 390 0,
370 tr( "Activating profile" ), 391 tr( "Activating profile" ),
371 tr( "Cannot enable profile" ) ); 392 tr( "Cannot enable profile" ) );
372 return; 393 return;
373 } 394 }
374 updateProfileState( LBI ); 395 updateProfileState( LBI );
375} 396}
376 397
377void NetworkSettings::SLOT_Connect( void ) { 398void NetworkSettings::SLOT_Connect( void ) {
378 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); 399 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() );
379 400
380 if ( ! LBI ) 401 if ( ! LBI )
381 return; 402 return;
382 403
383 NodeCollection * NC = 404 NodeCollection * NC =
384 NSResources->findConnection( LBI->text() ); 405 NSResources->findConnection( LBI->text() );
385 406
386 bool rv = 1 ; 407 bool rv = 1 ;
387 switch( NC->state() ) { 408 switch( NC->state() ) {
388 case IsUp : 409 case IsUp :
389 // down interface 410 // down interface
390 rv = NC->setState( Down ); 411 rv = NC->setState( Down );
391 break; 412 break;
392 case Available : 413 case Available :
393 // up interface 414 // up interface
394 rv = NC->setState( Up ); 415 rv = NC->setState( Up );
395 break; 416 break;
396 case Off : 417 case Off :
397 // activate and bring up 418 // activate and bring up
398 rv = ( NC->setState( Activate ) && 419 rv = ( NC->setState( Activate ) &&
399 NC->setState( Up ) ); 420 NC->setState( Up ) );
400 break; 421 break;
401 default : 422 default :
402 // others no change 423 // others no change
403 break; 424 break;
404 } 425 }
405 426
406 if( ! rv ) { 427 if( ! rv ) {
407 QMessageBox::warning( 428 QMessageBox::warning(
408 0, 429 0,
409 tr( "Activating profile" ), 430 tr( "Activating profile" ),
410 tr( "Cannot enable profile" ) ); 431 tr( "Cannot enable profile" ) );
411 } 432 }
412 433
413 // we do not update the GUI but wait for the REAL upping of the device 434 // we do not update the GUI but wait for the REAL upping of the device
414} 435}
415 436
416void NetworkSettings::SLOT_Disconnect( void ) { 437void NetworkSettings::SLOT_Disconnect( void ) {
438 QString S;
417 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); 439 QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() );
418 440
419 if ( ! LBI ) 441 if ( ! LBI )
420 return; 442 return;
421 443
422 NodeCollection * NC = 444 NodeCollection * NC =
423 NSResources->findConnection( LBI->text() ); 445 NSResources->findConnection( LBI->text() );
424 446
447 Log(( "Force interface %s down\n", NC->name().latin1() ));
425 NC->setState( Down, 1 ); 448 NC->setState( Down, 1 );
449 // remove 'up' file to make sure
450 S.sprintf( "/tmp/Profile-%d.up", NC->number() );
451 unlink( S.latin1() );
426} 452}
427 453
428void NetworkSettings::SLOT_ToMessages( void ) { 454void NetworkSettings::SLOT_ToMessages( void ) {
429 Profile_GB->hide(); 455 Profile_GB->hide();
430 Messages_GB->show(); 456 Messages_GB->show();
431} 457}
432 458
433void NetworkSettings::SLOT_ToProfile( void ) { 459void NetworkSettings::SLOT_ToProfile( void ) {
434 Profile_GB->show(); 460 Profile_GB->show();
435 Messages_GB->hide(); 461 Messages_GB->hide();
436} 462}
437 463
438void NetworkSettings::SLOT_QCopMessage(const QCString &msg, const QByteArray &data) { 464void NetworkSettings::SLOT_QCopMessage(const QCString &msg, const QByteArray &data) {
439 QDataStream stream( data, IO_ReadOnly ); 465 QDataStream stream( data, IO_ReadOnly );
440 466
441 if( msg == "raise" ) { 467 if( msg == "raise" ) {
442 raise(); 468 raise();
443 return; 469 return;
444 } /* if ( msg == "someMessage(int,int,int)" ) { 470 } /* if ( msg == "someMessage(int,int,int)" ) {
445 int a,b,c; 471 int a,b,c;
446 stream >> a >> b >> c; 472 stream >> a >> b >> c;
447 ... 473 ...
448 } */ 474 } */
449} 475}
diff --git a/noncore/settings/networksettings2/networksettings.h b/noncore/settings/networksettings2/networksettings.h
index 97852af..8ffde06 100644
--- a/noncore/settings/networksettings2/networksettings.h
+++ b/noncore/settings/networksettings2/networksettings.h
@@ -1,52 +1,54 @@
1#include "nsdata.h" 1#include "nsdata.h"
2#include "networksettingsGUI.h" 2#include "networksettingsGUI.h"
3#include "resources.h" 3#include "resources.h"
4 4
5class ANetNode; 5class ANetNode;
6class ANetNodeInstance; 6class ANetNodeInstance;
7class QTimer; 7class QTimer;
8class QListBoxItem; 8class QListBoxItem;
9 9
10class NetworkSettings : public NetworkSettingsGUI { 10class NetworkSettings : public NetworkSettingsGUI {
11 11
12 Q_OBJECT 12 Q_OBJECT
13 13
14public : 14public :
15 15
16 NetworkSettings( QWidget *parent=0, 16 NetworkSettings( QWidget *parent=0,
17 const char *name=0, 17 const char *name=0,
18 WFlags fl = 0 ); 18 WFlags fl = 0 );
19 ~NetworkSettings( void ); 19 ~NetworkSettings( void );
20 20
21 static QString appName( void ) 21 static QString appName( void )
22 { return QString::fromLatin1("networksettings"); } 22 { return QString::fromLatin1("networksettings"); }
23 23
24 bool isModified( void ) 24 bool isModified( void )
25 { return NSD.isModified(); } 25 { return NSD.isModified(); }
26 void setModified( bool m ) 26 void setModified( bool m )
27 { NSD.setModified( m ); } 27 { NSD.setModified( m ); }
28 28
29public slots : 29public slots :
30 30
31 void SLOT_NoLongerBusy( void );
31 void SLOT_AddNode( void ); 32 void SLOT_AddNode( void );
32 void SLOT_DeleteNode( void ); 33 void SLOT_DeleteNode( void );
33 void SLOT_ShowNode( QListBoxItem * ); 34 void SLOT_ShowNode( QListBoxItem * );
34 void SLOT_EditNode( QListBoxItem * ); 35 void SLOT_EditNode( QListBoxItem * );
35 void SLOT_CheckState( void ); 36 void SLOT_CheckState( void );
36 void SLOT_Enable( void ); 37 void SLOT_Enable( void );
37 void SLOT_On( void ); 38 void SLOT_On( void );
38 void SLOT_Connect( void ); 39 void SLOT_Connect( void );
39 void SLOT_Disconnect( void ); 40 void SLOT_Disconnect( void );
40 void SLOT_GenerateConfig( void ); 41 void SLOT_GenerateConfig( void );
41 void SLOT_RefreshStates( void ); 42 void SLOT_RefreshStates( void );
42 void SLOT_QCopMessage( const QCString&,const QByteArray& ); 43 void SLOT_QCopMessage( const QCString&,const QByteArray& );
43 void SLOT_ToProfile( void ); 44 void SLOT_ToProfile( void );
44 void SLOT_ToMessages( void ); 45 void SLOT_ToMessages( void );
46 void SLOT_CmdMessage( const QString & S );
45 47
46private : 48private :
47 49
48 void updateProfileState( QListBoxItem * it ); 50 void updateProfileState( QListBoxItem * it );
49 QTimer * UpdateTimer; 51 QTimer * UpdateTimer;
50 NetworkSettingsData NSD; 52 NetworkSettingsData NSD;
51 53
52}; 54};
diff --git a/noncore/settings/networksettings2/networksettings2/Utils.h b/noncore/settings/networksettings2/networksettings2/Utils.h
new file mode 100644
index 0000000..63ef51c
--- a/dev/null
+++ b/noncore/settings/networksettings2/networksettings2/Utils.h
@@ -0,0 +1,8 @@
1#ifndef __UTILS_H
2#define __UTILS_H
3
4#define Log(x) VLog x
5extern void VLog( char * Format, ... );
6extern void LogClose( void );
7
8#endif
diff --git a/noncore/settings/networksettings2/networksettings2/asfullsetup.h b/noncore/settings/networksettings2/networksettings2/asfullsetup.h
index e358a83..072de9a 100644
--- a/noncore/settings/networksettings2/networksettings2/asfullsetup.h
+++ b/noncore/settings/networksettings2/networksettings2/asfullsetup.h
@@ -1,20 +1,22 @@
1#ifndef ASFULLSETUP_H 1#ifndef ASFULLSETUP_H
2#define ASFULLSETUP_H 2#define ASFULLSETUP_H
3 3
4#include <netnode.h> 4#include <netnode.h>
5 5
6// pure virtual (component oriented) interface of any 6// pure virtual (component oriented) interface of any
7// plugin that offers a full setup 7// plugin that offers a full setup
8class AsFullSetup : public RuntimeInfo { 8class AsFullSetup : public RuntimeInfo {
9 9
10public : 10public :
11 11
12 AsFullSetup( ANetNodeInstance * NNI ) : 12 AsFullSetup( ANetNodeInstance * NNI ) :
13 RuntimeInfo( NNI ) { 13 RuntimeInfo( NNI ) {
14 } 14 }
15 15
16 virtual const QString & description( void ) = 0; 16 virtual const QString & description( void ) = 0;
17 virtual bool triggersVPN( void )
18 { return 0; }
17 19
18}; 20};
19 21
20#endif 22#endif
diff --git a/noncore/settings/networksettings2/networksettings2/netnode.cpp b/noncore/settings/networksettings2/networksettings2/netnode.cpp
index 1182543..8c80e0b 100644
--- a/noncore/settings/networksettings2/networksettings2/netnode.cpp
+++ b/noncore/settings/networksettings2/networksettings2/netnode.cpp
@@ -1,310 +1,312 @@
1#include <time.h> 1#include <time.h>
2#include <qpe/qpeapplication.h> 2#include <qpe/qpeapplication.h>
3#include <qpainter.h> 3#include <qpainter.h>
4#include <qbitmap.h> 4#include <qbitmap.h>
5#include <qtextstream.h> 5#include <qtextstream.h>
6#include <qpixmap.h> 6#include <qpixmap.h>
7 7
8#include "resources.h" 8#include "resources.h"
9#include "netnode.h" 9#include "netnode.h"
10 10
11#include "asdevice.h" 11#include "asdevice.h"
12#include "asline.h" 12#include "asline.h"
13#include "asconnection.h" 13#include "asconnection.h"
14#include "asfullsetup.h" 14#include "asfullsetup.h"
15 15
16QString & deQuote( QString & X ) { 16QString & deQuote( QString & X ) {
17 if( X[0] == '"' ) { 17 if( X[0] == '"' ) {
18 // remove end and trailing "" and \x -> x 18 // remove end and trailing "" and \x -> x
19 QChar R; 19 QChar R;
20 long idx; 20 long idx;
21 idx = X.length()-1; 21 idx = X.length()-1;
22 X = X.mid( 1, idx ); 22 X = X.mid( 1, idx );
23 23
24 idx = 0; 24 idx = 0;
25 while( ( idx = X.find( '\\', idx ) ) >= 0 ) { 25 while( ( idx = X.find( '\\', idx ) ) >= 0 ) {
26 R = X.at( idx + 1 ); 26 R = X.at( idx + 1 );
27 X.replace( idx, 2, &R, 1 ); 27 X.replace( idx, 2, &R, 1 );
28 } 28 }
29 X = X.left( X.length()-1 ); 29 X = X.left( X.length()-1 );
30 } 30 }
31 return X; 31 return X;
32} 32}
33 33
34QString quote( QString X ) { 34QString quote( QString X ) {
35 if( X.find( QRegExp( "[ \n\"\\\t]" ) ) >= 0 ) { 35 if( X.find( QRegExp( "[ \n\"\\\t]" ) ) >= 0 ) {
36 // need to quote this 36 // need to quote this
37 QString OutString = "\""; 37 QString OutString = "\"";
38 38
39 X.replace( QRegExp("\""), "\\\"" ); 39 X.replace( QRegExp("\""), "\\\"" );
40 X.replace( QRegExp("\\"), "\\\\" ); 40 X.replace( QRegExp("\\"), "\\\\" );
41 X.replace( QRegExp(" "), "\\ " ); 41 X.replace( QRegExp(" "), "\\ " );
42 42
43 OutString += X; 43 OutString += X;
44 OutString += "\""; 44 OutString += "\"";
45 X = OutString; 45 X = OutString;
46 } 46 }
47 return X; 47 return X;
48} 48}
49 49
50 50
51// 51//
52// 52//
53// ANETNODE 53// ANETNODE
54// 54//
55// 55//
56 56
57void ANetNode::saveAttributes( QTextStream & TS ) { 57void ANetNode::saveAttributes( QTextStream & TS ) {
58 saveSpecificAttribute( TS ); 58 saveSpecificAttribute( TS );
59} 59}
60 60
61void ANetNode::setAttribute( QString & Attr, QString & Value ){ 61void ANetNode::setAttribute( QString & Attr, QString & Value ){
62 setSpecificAttribute( Attr, Value ); 62 setSpecificAttribute( Attr, Value );
63} 63}
64 64
65// 65//
66// 66//
67// ANETNODEINSTANCE 67// ANETNODEINSTANCE
68// 68//
69// 69//
70 70
71long ANetNodeInstance::InstanceCounter = -1; 71long ANetNodeInstance::InstanceCounter = -1;
72 72
73void ANetNodeInstance::initialize( void ) { 73void ANetNodeInstance::initialize( void ) {
74 if( InstanceCounter == -1 ) 74 if( InstanceCounter == -1 )
75 InstanceCounter = time(0); 75 InstanceCounter = time(0);
76 // set name 76 // set name
77 QString N; 77 QString N;
78 N.sprintf( "-%ld", InstanceCounter++ ); 78 N.sprintf( "-%ld", InstanceCounter++ );
79 N.prepend( NodeType->name() ); 79 N.prepend( NodeType->name() );
80 setName( N.latin1() ); 80 setName( N.latin1() );
81} 81}
82 82
83void ANetNodeInstance::setAttribute( QString & Attr, QString & Value ){ 83void ANetNodeInstance::setAttribute( QString & Attr, QString & Value ){
84 if( Attr == "name" ) { 84 if( Attr == "name" ) {
85 setName( Value.latin1() ); 85 setName( Value.latin1() );
86 } else { 86 } else {
87 setSpecificAttribute( Attr, Value ); 87 setSpecificAttribute( Attr, Value );
88 } 88 }
89} 89}
90 90
91void ANetNodeInstance::saveAttributes( QTextStream & TS ) { 91void ANetNodeInstance::saveAttributes( QTextStream & TS ) {
92 TS << "name=" << name() << endl; 92 TS << "name=" << name() << endl;
93 saveSpecificAttribute( TS ); 93 saveSpecificAttribute( TS );
94} 94}
95 95
96ANetNodeInstance * ANetNodeInstance::nextNode( void ) { 96ANetNodeInstance * ANetNodeInstance::nextNode( void ) {
97 return connection()->findNext( this ); 97 return connection()->findNext( this );
98} 98}
99 99
100// 100//
101// 101//
102// NODECOLLECTION 102// NODECOLLECTION
103// 103//
104// 104//
105 105
106long NodeCollection::MaxNr = -1;
107
108NodeCollection::NodeCollection( void ) : QList<ANetNodeInstance>() { 106NodeCollection::NodeCollection( void ) : QList<ANetNodeInstance>() {
109 IsModified = 0; 107 IsModified = 0;
110 Index = -1; 108 Index = -1;
111 Name=""; 109 Name="";
112 IsNew = 1; 110 IsNew = 1;
113 CurrentState = Unchecked; 111 CurrentState = Unchecked;
114} 112}
115 113
116NodeCollection::NodeCollection( QTextStream & TS ) : 114NodeCollection::NodeCollection( QTextStream & TS ) :
117 QList<ANetNodeInstance>() { 115 QList<ANetNodeInstance>() {
118 long idx; 116 long idx;
119 bool InError = 0; 117 bool InError = 0;
120 QString S, A, N; 118 QString S, A, N;
121 IsModified = 0; 119 IsModified = 0;
122 Index = -1; 120 Index = -1;
123 Name=""; 121 Name="";
124 IsNew = 0; 122 IsNew = 0;
125 CurrentState = Unchecked; 123 CurrentState = Unchecked;
126 124
127 do { 125 do {
128 S = TS.readLine(); 126 S = TS.readLine();
129 if( S.isEmpty() ) { 127 if( S.isEmpty() ) {
130 if( InError ) { 128 if( InError ) {
131 // remove all nodes 129 // remove all nodes
132 clear(); 130 clear();
133 } 131 }
134 // empty line 132 // empty line
135 break; 133 break;
136 } 134 }
137 135
138 idx = S.find('='); 136 idx = S.find('=');
139 S.stripWhiteSpace(); 137 S.stripWhiteSpace();
140 A = S.left( idx ); 138 A = S.left( idx );
141 A.lower(); 139 A.lower();
142 N = S.mid( idx+1, S.length() ); 140 N = S.mid( idx+1, S.length() );
143 N.stripWhiteSpace(); 141 N.stripWhiteSpace();
144 N = deQuote( N ); 142 N = deQuote( N );
145 143
146 if( A == "name" ) { 144 if( A == "name" ) {
147 Name = N; 145 Name = N;
148 } else if( A == "number" ) { 146 } else if( A == "number" ) {
147 Log(( "read number %s\n", N.latin1() ));
149 setNumber( N.toLong() ); 148 setNumber( N.toLong() );
150 } else if( A == "node" ) { 149 } else if( A == "node" ) {
151 ANetNodeInstance * NNI = NSResources->findNodeInstance( N ); 150 ANetNodeInstance * NNI = NSResources->findNodeInstance( N );
152 if( NNI && ! InError ) { 151 if( NNI && ! InError ) {
153 append( NSResources->findNodeInstance( N ) ); 152 append( NSResources->findNodeInstance( N ) );
154 } else { 153 } else {
155 // could not find a node type -> collection invalid 154 // could not find a node type -> collection invalid
156 InError = 1; 155 InError = 1;
157 } 156 }
158 } 157 }
159 } while( 1 ); 158 } while( 1 );
160} 159}
161 160
162 161
163NodeCollection::~NodeCollection( void ) { 162NodeCollection::~NodeCollection( void ) {
164} 163}
165 164
166const QString & NodeCollection::description( void ) { 165const QString & NodeCollection::description( void ) {
167 ANetNodeInstance * NNI = getToplevel(); 166 ANetNodeInstance * NNI = getToplevel();
168 return (NNI) ? NNI->runtime()->asFullSetup()->description() : Name; 167 return (NNI) ? NNI->runtime()->asFullSetup()->description() : Name;
169} 168}
170 169
171void NodeCollection::append( ANetNodeInstance * NNI ) { 170void NodeCollection::append( ANetNodeInstance * NNI ) {
172 NNI->setConnection( this ); 171 NNI->setConnection( this );
173 QList<ANetNodeInstance>::append( NNI ); 172 QList<ANetNodeInstance>::append( NNI );
174} 173}
175 174
176void NodeCollection::save( QTextStream & TS ) { 175void NodeCollection::save( QTextStream & TS ) {
177 176
178 TS << "name=" << quote( Name ) << endl; 177 TS << "name=" << quote( Name ) << endl;
179 TS << "number=" << number() << endl; 178 TS << "number=" << number() << endl;
180 ANetNodeInstance * NNI; 179 ANetNodeInstance * NNI;
181 for( QListIterator<ANetNodeInstance> it(*this); 180 for( QListIterator<ANetNodeInstance> it(*this);
182 it.current(); 181 it.current();
183 ++it ) { 182 ++it ) {
184 NNI = it.current(); 183 NNI = it.current();
185 TS << "node=" << NNI->name() << endl; 184 TS << "node=" << NNI->name() << endl;
186 } 185 }
187 TS << endl; 186 TS << endl;
188 IsNew = 0; 187 IsNew = 0;
189} 188}
190 189
191ANetNodeInstance * NodeCollection::getToplevel( void ) { 190ANetNodeInstance * NodeCollection::getToplevel( void ) {
192 ANetNodeInstance * NNI = 0; 191 ANetNodeInstance * NNI = 0;
193 for( QListIterator<ANetNodeInstance> it(*this); 192 for( QListIterator<ANetNodeInstance> it(*this);
194 it.current(); 193 it.current();
195 ++it ) { 194 ++it ) {
196 NNI = it.current(); 195 NNI = it.current();
197 if( NNI->nodeClass()->isToplevel() ) 196 if( NNI->nodeClass()->isToplevel() )
198 break; 197 break;
199 } 198 }
200 return NNI; 199 return NNI;
201} 200}
202 201
203ANetNodeInstance * NodeCollection::findByName( const QString & S ) { 202ANetNodeInstance * NodeCollection::findByName( const QString & S ) {
204 ANetNodeInstance * NNI = 0; 203 ANetNodeInstance * NNI = 0;
205 for( QListIterator<ANetNodeInstance> it(*this); 204 for( QListIterator<ANetNodeInstance> it(*this);
206 it.current(); 205 it.current();
207 ++it ) { 206 ++it ) {
208 NNI = it.current(); 207 NNI = it.current();
209 if( NNI->name() == S ) 208 if( NNI->name() == S )
210 break; 209 break;
211 } 210 }
212 return NNI; 211 return NNI;
213} 212}
214 213
215ANetNodeInstance * NodeCollection::findNext( ANetNodeInstance * NNI ) { 214ANetNodeInstance * NodeCollection::findNext( ANetNodeInstance * NNI ) {
216 ANetNodeInstance * NNNI; 215 ANetNodeInstance * NNNI;
217 216
218 if( ! NNI ) 217 if( ! NNI )
219 getToplevel(); 218 getToplevel();
220 219
221 for( QListIterator<ANetNodeInstance> it(*this); 220 for( QListIterator<ANetNodeInstance> it(*this);
222 it.current(); 221 it.current();
223 ++it ) { 222 ++it ) {
224 NNNI = it.current(); 223 NNNI = it.current();
225 if( NNNI == NNI ) { 224 if( NNNI == NNI ) {
226 ++it; 225 ++it;
227 return it.current(); 226 return it.current();
228 } 227 }
229 } 228 }
230 return 0; // no more next 229 return 0; // no more next
231} 230}
232 231
233int NodeCollection::compareItems( QCollection::Item I1, 232int NodeCollection::compareItems( QCollection::Item I1,
234 QCollection::Item I2 ) { 233 QCollection::Item I2 ) {
235 ANetNodeInstance * NNI1, * NNI2; 234 ANetNodeInstance * NNI1, * NNI2;
236 NNI1 = (ANetNodeInstance *)I1; 235 NNI1 = (ANetNodeInstance *)I1;
237 NNI2 = (ANetNodeInstance *)I2; 236 NNI2 = (ANetNodeInstance *)I2;
238 return strcmp( NNI1->name(), NNI2->name() ); 237 return strcmp( NNI1->name(), NNI2->name() );
239} 238}
240 239
241static char * State2PixmapTbl[] = { 240static char * State2PixmapTbl[] = {
242 "NULL", // Unchecked : no pixmap 241 "NULL", // Unchecked : no pixmap
243 "check", // Unknown 242 "check", // Unknown
244 "delete", // unavailable 243 "delete", // unavailable
245 "disabled", // disabled 244 "disabled", // disabled
246 "off", // off 245 "off", // off
247 "disconnected", // available 246 "disconnected", // available
248 "connected" // up 247 "connected" // up
249}; 248};
250 249
251QPixmap NodeCollection::devicePixmap( void ) { 250QPixmap NodeCollection::devicePixmap( void ) {
252 QPixmap pm = NSResources->getPixmap( 251 QPixmap pm = NSResources->getPixmap(
253 getToplevel()->nextNode()->pixmapName()+"-large"); 252 getToplevel()->nextNode()->pixmapName()+"-large");
254 253
255 QPixmap Mini = NSResources->getPixmap( device()->netNode()->pixmapName() ); 254 QPixmap Mini = NSResources->getPixmap( device()->netNode()->pixmapName() );
256 255
257 QPainter painter( &pm ); 256 QPainter painter( &pm );
258 painter.drawPixmap( pm.width()-Mini.width(), 257 painter.drawPixmap( pm.width()-Mini.width(),
259 pm.height()-Mini.height(), 258 pm.height()-Mini.height(),
260 Mini ); 259 Mini );
261 pm.setMask( pm.createHeuristicMask( TRUE ) ); 260 pm.setMask( pm.createHeuristicMask( TRUE ) );
262 return pm; 261 return pm;
263} 262}
264 263
265QPixmap NodeCollection::statePixmap( State_t S) { 264QPixmap NodeCollection::statePixmap( State_t S) {
266 return NSResources->getPixmap( State2PixmapTbl[S] ); 265 return NSResources->getPixmap( State2PixmapTbl[S] );
267} 266}
268 267
269QString NodeCollection::stateName( State_t S) { 268QString NodeCollection::stateName( State_t S) {
270 switch( S ) { 269 switch( S ) {
271 case Unknown : 270 case Unknown :
272 return qApp->translate( "networksettings2", "Unknown"); 271 return qApp->translate( "networksettings2", "Unknown");
273 case Unavailable : 272 case Unavailable :
274 return qApp->translate( "networksettings2", "Unavailable"); 273 return qApp->translate( "networksettings2", "Unavailable");
275 case Disabled : 274 case Disabled :
276 return qApp->translate( "networksettings2", "Disabled"); 275 return qApp->translate( "networksettings2", "Disabled");
277 case Off : 276 case Off :
278 return qApp->translate( "networksettings2", "Off"); 277 return qApp->translate( "networksettings2", "Off");
279 case Available : 278 case Available :
280 return qApp->translate( "networksettings2", "Available"); 279 return qApp->translate( "networksettings2", "Available");
281 case IsUp : 280 case IsUp :
282 return qApp->translate( "networksettings2", "IsUp"); 281 return qApp->translate( "networksettings2", "IsUp");
283 case Unchecked : /* FT */ 282 case Unchecked : /* FT */
284 default : 283 default :
285 break; 284 break;
286 } 285 }
287 return QString(""); 286 return QString("");
288} 287}
289 288
290void NodeCollection::reassign( void ) { 289void NodeCollection::reassign( void ) {
291 for( QListIterator<ANetNodeInstance> it(*this); 290 for( QListIterator<ANetNodeInstance> it(*this);
292 it.current(); 291 it.current();
293 ++it ) { 292 ++it ) {
294 it.current()->setConnection( this ); 293 it.current()->setConnection( this );
295 } 294 }
296} 295}
297 296
297bool NodeCollection::triggersVPN() {
298 return getToplevel()->runtime()->asFullSetup()->triggersVPN();
299}
298// 300//
299// 301//
300// RUNTIMEINFO 302// RUNTIMEINFO
301// 303//
302// 304//
303 305
304InterfaceInfo * RuntimeInfo::assignedInterface( void ) { 306InterfaceInfo * RuntimeInfo::assignedInterface( void ) {
305 return netNode()->nextNode()->runtime()->assignedInterface(); 307 return netNode()->nextNode()->runtime()->assignedInterface();
306} 308}
307 309
308AsDevice * RuntimeInfo::device( void ) { 310AsDevice * RuntimeInfo::device( void ) {
309 return netNode()->nextNode()->runtime()->device(); 311 return netNode()->nextNode()->runtime()->device();
310} 312}
diff --git a/noncore/settings/networksettings2/networksettings2/netnode.h b/noncore/settings/networksettings2/networksettings2/netnode.h
index 5e36062..ca35c27 100644
--- a/noncore/settings/networksettings2/networksettings2/netnode.h
+++ b/noncore/settings/networksettings2/networksettings2/netnode.h
@@ -1,382 +1,384 @@
1#ifndef NETNODE_H 1#ifndef NETNODE_H
2#define NETNODE_H 2#define NETNODE_H
3 3
4#include <qtextstream.h> 4#include <qtextstream.h>
5#include <qlist.h> 5#include <qlist.h>
6#include <qdict.h> 6#include <qdict.h>
7#include <qpixmap.h> 7#include <qpixmap.h>
8#include <qobject.h> 8#include <qobject.h>
9#include <time.h> 9#include <time.h>
10 10
11#include <Utils.h>
12
11// difference feature interfaces 13// difference feature interfaces
12class AsDevice; 14class AsDevice;
13class AsLine; 15class AsLine;
14class AsConnection; 16class AsConnection;
15class AsFullSetup; 17class AsFullSetup;
16 18
17// needed for plugin creation function 19// needed for plugin creation function
18#include <qlist.h> 20#include <qlist.h>
19 21
20class ANetNode; 22class ANetNode;
21class ANetNodeInstance; 23class ANetNodeInstance;
22class NodeCollection; 24class NodeCollection;
23class QTextStream; 25class QTextStream;
24class RuntimeInfo; 26class RuntimeInfo;
25class InterfaceInfo; 27class InterfaceInfo;
26 28
27extern QString & deQuote( QString & X ); 29extern QString & deQuote( QString & X );
28extern QString quote( QString X ); 30extern QString quote( QString X );
29 31
30#include "systemfile.h" 32#include "systemfile.h"
31 33
32typedef enum State { 34typedef enum State {
33 // if we have not yet detected the state of the device 35 // if we have not yet detected the state of the device
34 Unchecked = 0, 36 Unchecked = 0,
35 // if we cannot determine the state 37 // if we cannot determine the state
36 Unknown = 1, 38 Unknown = 1,
37 // if connection cannot be established e.g. because 39 // if connection cannot be established e.g. because
38 // the hardware is not available 40 // the hardware is not available
39 Unavailable = 2, 41 Unavailable = 2,
40 // if the connection cannot be establishec but NOT 42 // if the connection cannot be establishec but NOT
41 // because it is physically impossible but because 43 // because it is physically impossible but because
42 // it has been disabled for FUNCTIONAL reasons 44 // it has been disabled for FUNCTIONAL reasons
43 Disabled = 3, 45 Disabled = 3,
44 // if connection is available to is currently down 46 // if connection is available to is currently down
45 // i.e. the corresponding hardware is not activated 47 // i.e. the corresponding hardware is not activated
46 Off = 4, 48 Off = 4,
47 // if connection is available to be used (i.e. the 49 // if connection is available to be used (i.e. the
48 // devices if fully ready to be used 50 // devices if fully ready to be used
49 Available = 5, 51 Available = 5,
50 // if connection is being used 52 // if connection is being used
51 IsUp = 6 53 IsUp = 6
52} State_t; 54} State_t;
53 55
54typedef enum Action { 56typedef enum Action {
55 // to make the device unavailable functionally 57 // to make the device unavailable functionally
56 Disable = 0, 58 Disable = 0,
57 // to make the device available functionally 59 // to make the device available functionally
58 Enable = 1, 60 Enable = 1,
59 // bring the hardware up 61 // bring the hardware up
60 Activate = 2, 62 Activate = 2,
61 // bring the hardware down 63 // bring the hardware down
62 Deactivate = 3, 64 Deactivate = 3,
63 // bring the connection up 65 // bring the connection up
64 Up = 4, 66 Up = 4,
65 // bring the connection down 67 // bring the connection down
66 Down = 5 68 Down = 5
67} Action_t; 69} Action_t;
68 70
69class ANetNode : public QObject{ 71class ANetNode : public QObject{
70 72
71public: 73public:
72 74
73 typedef QArray<ANetNode *> NetNodeList; 75 typedef QArray<ANetNode *> NetNodeList;
74 76
75 ANetNode( const char * Name ) : QObject( 0, Name ) {} 77 ANetNode( const char * Name ) : QObject( 0, Name ) {}
76 virtual ~ANetNode(){}; 78 virtual ~ANetNode(){};
77 79
78 // pixmap needed for this NetNode 80 // pixmap needed for this NetNode
79 virtual const QString pixmapName() = 0; 81 virtual const QString pixmapName() = 0;
80 82
81 // description for this NetNode 83 // description for this NetNode
82 virtual const QString nodeDescription() = 0; 84 virtual const QString nodeDescription() = 0;
83 85
84 // create a blank instance of a net node 86 // create a blank instance of a net node
85 virtual ANetNodeInstance * createInstance( void ) = 0; 87 virtual ANetNodeInstance * createInstance( void ) = 0;
86 88
87 // return feature this NetNode provides 89 // return feature this NetNode provides
88 virtual const char * provides( void ) = 0; 90 virtual const char * provides( void ) = 0;
89 virtual const char ** needs( void ) = 0; 91 virtual const char ** needs( void ) = 0;
90 92
91 // generate files specific for this node (if any) 93 // generate files specific for this node (if any)
92 virtual bool generateProperFilesFor( ANetNodeInstance * NNI ) = 0; 94 virtual bool generateProperFilesFor( ANetNodeInstance * NNI ) = 0;
93 // return TRUE if this node has data to be inserted in systemfile 95 // return TRUE if this node has data to be inserted in systemfile
94 // with name S 96 // with name S
95 virtual bool hasDataFor( const QString & S ) = 0; 97 virtual bool hasDataFor( const QString & S ) = 0;
96 // generate data specific for the device for the system file S 98 // generate data specific for the device for the system file S
97 // called only IF data was needed 99 // called only IF data was needed
98 virtual bool generateDeviceDataForCommonFile( 100 virtual bool generateDeviceDataForCommonFile(
99 SystemFile & SF, long DevNr ) = 0; 101 SystemFile & SF, long DevNr ) = 0;
100 102
101 // does this Node provide a Connection 103 // does this Node provide a Connection
102 bool isToplevel( void ) 104 bool isToplevel( void )
103 { return strcmp( provides(), "fullsetup") == 0 ; } 105 { return strcmp( provides(), "fullsetup") == 0 ; }
104 106
105 // generate NIC name based on instance nr 107 // generate NIC name based on instance nr
106 // only relevant if node instances are devices 108 // only relevant if node instances are devices
107 virtual QString genNic( long ) 109 virtual QString genNic( long )
108 { return QString(""); } 110 { return QString(""); }
109 111
110 // max number of instances for this node type 112 // max number of instances for this node type
111 // only relevant if node instances are devices 113 // only relevant if node instances are devices
112 virtual long instanceCount( void ) 114 virtual long instanceCount( void )
113 { return 1; } 115 { return 1; }
114 116
115 // set the value of an attribute 117 // set the value of an attribute
116 void setAttribute( QString & Attr, QString & Value ) ; 118 void setAttribute( QString & Attr, QString & Value ) ;
117 void saveAttributes( QTextStream & TS ) ; 119 void saveAttributes( QTextStream & TS ) ;
118 120
119 // compiled references to 'needed' NetNodes -> needs list 121 // compiled references to 'needed' NetNodes -> needs list
120 void setAlternatives( NetNodeList * Alt ) 122 void setAlternatives( NetNodeList * Alt )
121 { Alternatives = Alt; } 123 { Alternatives = Alt; }
122 NetNodeList & alternatives( void ) 124 NetNodeList & alternatives( void )
123 { return *Alternatives; } 125 { return *Alternatives; }
124 126
125protected : 127protected :
126 128
127 NetNodeList * Alternatives; 129 NetNodeList * Alternatives;
128 130
129private : 131private :
130 132
131 virtual void setSpecificAttribute( QString & , QString & ) = 0; 133 virtual void setSpecificAttribute( QString & , QString & ) = 0;
132 virtual void saveSpecificAttribute( QTextStream & ) = 0; 134 virtual void saveSpecificAttribute( QTextStream & ) = 0;
133 135
134}; 136};
135 137
136class ANetNodeInstance : public QObject { 138class ANetNodeInstance : public QObject {
137 139
138public: 140public:
139 141
140 ANetNodeInstance( ANetNode * NN ) : QObject() 142 ANetNodeInstance( ANetNode * NN ) : QObject()
141 { IsModified=0; NodeType = NN; IsNew = TRUE; } 143 { IsModified=0; NodeType = NN; IsNew = TRUE; }
142 virtual ~ANetNodeInstance( void ) { } 144 virtual ~ANetNodeInstance( void ) { }
143 145
144 virtual RuntimeInfo * runtime( void ) = 0; 146 virtual RuntimeInfo * runtime( void ) = 0;
145 147
146 void setConnection( NodeCollection * NC ) 148 void setConnection( NodeCollection * NC )
147 { Connection = NC; } 149 { Connection = NC; }
148 NodeCollection * connection( void ) 150 NodeCollection * connection( void )
149 { return Connection; } 151 { return Connection; }
150 152
151 // create edit widget under parent 153 // create edit widget under parent
152 virtual QWidget * edit( QWidget * parent ) = 0; 154 virtual QWidget * edit( QWidget * parent ) = 0;
153 // is given data acceptable 155 // is given data acceptable
154 virtual QString acceptable( void ) = 0; 156 virtual QString acceptable( void ) = 0;
155 157
156 // return data was modified 158 // return data was modified
157 void setModified( bool M ) 159 void setModified( bool M )
158 { IsModified = M; } 160 { IsModified = M; }
159 bool isModified( void ) 161 bool isModified( void )
160 { return IsModified; } 162 { return IsModified; }
161 163
162 // get data from GUI and store in node 164 // get data from GUI and store in node
163 virtual void commit( void ) = 0; 165 virtual void commit( void ) = 0;
164 166
165 // get next node 167 // get next node
166 ANetNodeInstance * nextNode(); 168 ANetNodeInstance * nextNode();
167 // return NetNode this is an instance of 169 // return NetNode this is an instance of
168 ANetNode * nodeClass( void ) 170 ANetNode * nodeClass( void )
169 { return NodeType; } 171 { return NodeType; }
170 172
171 // intialize am instance of a net node 173 // intialize am instance of a net node
172 void initialize( void ); 174 void initialize( void );
173 175
174 // set the value of an attribute 176 // set the value of an attribute
175 void setAttribute( QString & Attr, QString & Value ) ; 177 void setAttribute( QString & Attr, QString & Value ) ;
176 void saveAttributes( QTextStream & TS ) ; 178 void saveAttributes( QTextStream & TS ) ;
177 179
178 // return true if node isntance is NEW and not loaded 180 // return true if node isntance is NEW and not loaded
179 void setNew( bool IsN ) 181 void setNew( bool IsN )
180 { IsNew = IsN; } 182 { IsNew = IsN; }
181 bool isNew( void ) 183 bool isNew( void )
182 { return IsNew; } 184 { return IsNew; }
183 185
184 // return description for this instance 186 // return description for this instance
185 QString & description( void ) 187 QString & description( void )
186 { return Description; } 188 { return Description; }
187 void setDescription( const QString & S ) 189 void setDescription( const QString & S )
188 { Description = S; } 190 { Description = S; }
189 191
190 // pixmap for this instance -> from NetNode 192 // pixmap for this instance -> from NetNode
191 const QString pixmapName( void ) 193 const QString pixmapName( void )
192 { return NodeType->pixmapName(); } 194 { return NodeType->pixmapName(); }
193 195
194 const char * provides( void ) 196 const char * provides( void )
195 { return NodeType->provides(); } 197 { return NodeType->provides(); }
196 198
197 const char ** needs( void ) 199 const char ** needs( void )
198 { return NodeType->needs(); } 200 { return NodeType->needs(); }
199 201
200 // returns node specific data -> only useful for 'buddy' 202 // returns node specific data -> only useful for 'buddy'
201 virtual void * data( void ) = 0; 203 virtual void * data( void ) = 0;
202 204
203 // return TRUE if this node has data to be inserted in systemfile 205 // return TRUE if this node has data to be inserted in systemfile
204 // with name S 206 // with name S
205 virtual bool hasDataFor( const QString & S ) = 0; 207 virtual bool hasDataFor( const QString & S ) = 0;
206 208
207 // generate data specific for a profile and for the system file S 209 // generate data specific for a profile and for the system file S
208 // called only IF data was needed 210 // called only IF data was needed
209 virtual bool generateDataForCommonFile( 211 virtual bool generateDataForCommonFile(
210 SystemFile & SF, long DevNr ) = 0; 212 SystemFile & SF, long DevNr ) = 0;
211 213
212protected : 214protected :
213 215
214 virtual void setSpecificAttribute( QString & , QString & ) = 0; 216 virtual void setSpecificAttribute( QString & , QString & ) = 0;
215 virtual void saveSpecificAttribute( QTextStream & ) = 0; 217 virtual void saveSpecificAttribute( QTextStream & ) = 0;
216 218
217 ANetNode * NodeType; 219 ANetNode * NodeType;
218 // connection to which this node belongs to 220 // connection to which this node belongs to
219 NodeCollection * Connection; 221 NodeCollection * Connection;
220 QString Description; 222 QString Description;
221 bool IsModified; 223 bool IsModified;
222 bool IsNew; 224 bool IsNew;
223 225
224 static long InstanceCounter; 226 static long InstanceCounter;
225}; 227};
226 228
227class RuntimeInfo : public QObject { 229class RuntimeInfo : public QObject {
228 230
229 Q_OBJECT 231 Q_OBJECT
230 232
231public : 233public :
232 234
233 RuntimeInfo( ANetNodeInstance * TheNNI ) 235 RuntimeInfo( ANetNodeInstance * TheNNI )
234 { NNI = TheNNI; } 236 { NNI = TheNNI; }
235 237
236 // downcast implemented by specify runtime classes 238 // downcast implemented by specify runtime classes
237 virtual AsDevice * asDevice( void ) 239 virtual AsDevice * asDevice( void )
238 { return 0; } 240 { return 0; }
239 virtual AsConnection * asConnection( void ) 241 virtual AsConnection * asConnection( void )
240 { return 0; } 242 { return 0; }
241 virtual AsLine * asLine( void ) 243 virtual AsLine * asLine( void )
242 { return 0; } 244 { return 0; }
243 virtual AsFullSetup * asFullSetup( void ) 245 virtual AsFullSetup * asFullSetup( void )
244 { return 0; } 246 { return 0; }
245 247
246 // does this node handles this interface e.g.eth0 248 // does this node handles this interface e.g.eth0
247 // recurse deeper if this node cannot answer that question 249 // recurse deeper if this node cannot answer that question
248 virtual bool handlesInterface( const QString & ) 250 virtual bool handlesInterface( const QString & )
249 { return 0; } 251 { return 0; }
250 virtual bool handlesInterface( const InterfaceInfo & ) 252 virtual bool handlesInterface( const InterfaceInfo & )
251 { return 0; } 253 { return 0; }
252 virtual InterfaceInfo * assignedInterface( void ); 254 virtual InterfaceInfo * assignedInterface( void );
253 virtual AsDevice * device( void ); 255 virtual AsDevice * device( void );
254 256
255 ANetNodeInstance * netNode() 257 ANetNodeInstance * netNode()
256 { return NNI; } 258 { return NNI; }
257 NodeCollection * connection() 259 NodeCollection * connection()
258 { return NNI->connection(); } 260 { return NNI->connection(); }
259 261
260 virtual void detectState( NodeCollection * NC ) = 0; 262 virtual void detectState( NodeCollection * NC ) = 0;
261 virtual bool setState( NodeCollection * NC, Action_t A, bool Force = 0 ) = 0; 263 virtual bool setState( NodeCollection * NC, Action_t A, bool Force = 0 ) = 0;
262 virtual bool canSetState( State_t Curr, Action_t A ) = 0; 264 virtual bool canSetState( State_t Curr, Action_t A ) = 0;
263 265
264signals : 266signals :
265 267
266 // sent by device if state changes 268 // sent by device if state changes
267 void stateChanged( State_t S, ANetNodeInstance * NNI ); 269 void stateChanged( State_t S, ANetNodeInstance * NNI );
268 270
269protected : 271protected :
270 272
271 // connection this runtime info belongs to 273 // connection this runtime info belongs to
272 ANetNodeInstance * NNI; 274 ANetNodeInstance * NNI;
273}; 275};
274 276
275class NodeCollection : public QList<ANetNodeInstance> { 277class NodeCollection : public QList<ANetNodeInstance> {
276 278
277public : 279public :
278 280
279 NodeCollection( void ); 281 NodeCollection( void );
280 NodeCollection( QTextStream & TS ); 282 NodeCollection( QTextStream & TS );
281 ~NodeCollection( void ); 283 ~NodeCollection( void );
282 284
283 int number( void ) 285 int number( void )
284 { return Number; } 286 { return Number; }
285 void setNumber( int i ) 287 void setNumber( int i )
286 { Number = i; if( MaxNr < i ) MaxNr = i; } 288 { Number = i; }
287 bool isNew( void ) 289 bool isNew( void )
288 { return IsNew; } 290 { return IsNew; }
289 void setNew( bool N ) 291 void setNew( bool N )
290 { IsNew = N ; } 292 { IsNew = N ; }
291 bool isModified( void ) 293 bool isModified( void )
292 { return IsModified; } 294 { return IsModified; }
293 void setModified( bool N ) 295 void setModified( bool N )
294 { IsModified = N ; } 296 { IsModified = N ; }
295 297
296 bool handlesInterface( const QString & S ) { 298 bool handlesInterface( const QString & S ) {
297 return getToplevel()->runtime()->handlesInterface( S ); 299 return getToplevel()->runtime()->handlesInterface( S );
298 } 300 }
299 301
300 InterfaceInfo * assignedInterface( void ) { 302 InterfaceInfo * assignedInterface( void ) {
301 return getToplevel()->runtime()->assignedInterface(); 303 return getToplevel()->runtime()->assignedInterface();
302 } 304 }
303 305
304 AsDevice * device() { 306 AsDevice * device() {
305 return getToplevel()->runtime()->device(); 307 return getToplevel()->runtime()->device();
306 } 308 }
307 309
310 bool triggersVPN();
311
308 State_t state( bool Update = 0 ) 312 State_t state( bool Update = 0 )
309 { if( CurrentState == Unchecked || Update ) { 313 { Log(( "%s state %d(=%d?)\n", Name.latin1(), CurrentState,
314 Unchecked ));
315 if( CurrentState == Unchecked || Update ) {
316 Log(( "TL %p TLR %p\n",
317 getToplevel(),
318 getToplevel()->runtime() ));
310 // need to get current state 319 // need to get current state
311 getToplevel()->runtime()->detectState( this ); 320 getToplevel()->runtime()->detectState( this );
312 } 321 }
313 return CurrentState; 322 return CurrentState;
314 } 323 }
315 324
316 // get the ixmap for this device 325 // get the ixmap for this device
317 QPixmap devicePixmap( void ); 326 QPixmap devicePixmap( void );
318 QPixmap statePixmap( State_t S ); 327 QPixmap statePixmap( State_t S );
319 QPixmap statePixmap( bool Update = 0 ) 328 QPixmap statePixmap( bool Update = 0 )
320 { return statePixmap( state(Update) ); } 329 { return statePixmap( state(Update) ); }
321 QString stateName( State_t ); 330 QString stateName( State_t );
322 QString stateName( bool Update = 0 ) 331 QString stateName( bool Update = 0 )
323 { return stateName( state(Update) ); } 332 { return stateName( state(Update) ); }
324 333
325 bool setState( Action_t A, bool Force =0 ) 334 bool setState( Action_t A, bool Force =0 )
326 { return getToplevel()->runtime()->setState( this, A, Force ); } 335 { return getToplevel()->runtime()->setState( this, A, Force ); }
327 bool canSetState( Action_t A ) 336 bool canSetState( Action_t A )
328 { return getToplevel()->runtime()->canSetState( CurrentState, A ); } 337 { return getToplevel()->runtime()->canSetState( CurrentState, A ); }
329 338
330 void save( QTextStream & TS ); 339 void save( QTextStream & TS );
331 340
332 void append( ANetNodeInstance * NNI ); 341 void append( ANetNodeInstance * NNI );
333 342
334 // makes sure that all items in the connection point to 343 // makes sure that all items in the connection point to
335 // that connectoin 344 // that connectoin
336 void reassign( void ); 345 void reassign( void );
337 346
338 ANetNodeInstance * getToplevel( void ); 347 ANetNodeInstance * getToplevel( void );
339 ANetNodeInstance * findNext( ANetNodeInstance * NNI ); 348 ANetNodeInstance * findNext( ANetNodeInstance * NNI );
340 ANetNodeInstance * findByName( const QString & S ); 349 ANetNodeInstance * findByName( const QString & S );
341 350
342 const QString & name() 351 const QString & name()
343 { return Name; } 352 { return Name; }
344 353
345 const QString & description( void ); 354 const QString & description( void );
346 355
347 void setName( const QString & N) 356 void setName( const QString & N)
348 { Name = N; } 357 { Name = N; }
349 358
350 State_t currentState( void ) 359 State_t currentState( void )
351 { return CurrentState; } 360 { return CurrentState; }
352 void setCurrentState( State_t S ) 361 void setCurrentState( State_t S )
353 { CurrentState = S; } 362 { CurrentState = S; }
354 363
355 long maxConnectionNumber( void )
356 { return MaxNr; }
357
358 static void resetMaxNr( void )
359 { MaxNr = -1; }
360
361private : 364private :
362 365
363 int compareItems ( QCollection::Item item1, 366 int compareItems ( QCollection::Item item1,
364 QCollection::Item item2 ); 367 QCollection::Item item2 );
365 368
366 static long MaxNr;
367 long Number; 369 long Number;
368 370
369 // state of this connection 371 // state of this connection
370 State_t CurrentState; 372 State_t CurrentState;
371 373
372 QString Name; 374 QString Name;
373 // true if this collection was just created (and not 375 // true if this collection was just created (and not
374 // loaded from file 376 // loaded from file
375 bool IsNew; 377 bool IsNew;
376 // index in listbox 378 // index in listbox
377 int Index; 379 int Index;
378 bool IsModified; 380 bool IsModified;
379 381
380}; 382};
381 383
382#endif 384#endif
diff --git a/noncore/settings/networksettings2/networksettings2/networksettings2.pro b/noncore/settings/networksettings2/networksettings2/networksettings2.pro
index f97c93b..16a946b 100644
--- a/noncore/settings/networksettings2/networksettings2/networksettings2.pro
+++ b/noncore/settings/networksettings2/networksettings2/networksettings2.pro
@@ -1,28 +1,28 @@
1TEMPLATE = lib 1TEMPLATE = lib
2CONFIG += qt warn_on release 2CONFIG += qt warn_on release
3 #CONFIG += qt warn_on debug 3 #CONFIG += qt warn_on debug
4 DESTDIR = $(OPIEDIR)/lib$(PROJMAK) 4 DESTDIR = $(OPIEDIR)/lib$(PROJMAK)
5 HEADERS = netnode.h \ 5 HEADERS = netnode.h \
6 resources.h \ 6 resources.h \
7 system.h \ 7 system.h \
8 asline.h \ 8 asline.h \
9 GUIUtils.h \ 9 GUIUtils.h \
10 asconnection.h \ 10 asconnection.h \
11 asfullsetup.h \ 11 asfullsetup.h \
12 systemfile.h \ 12 systemfile.h \
13 wextensions.h \ 13 wextensions.h \
14 asdevice.h 14 asdevice.h
15 SOURCES = netnode.cpp \ 15 SOURCES = netnode.cpp \
16 GUIUtils.cpp \ 16 GUIUtils.cpp \
17 system.cpp \ 17 system.cpp \
18 systemfile.cpp \ 18 systemfile.cpp \
19 wextensions.cpp \ 19 wextensions.cpp \
20 resources.cpp 20 resources.cpp
21 INCLUDEPATH+= $(OPIEDIR)/include ../networksettings2 21 INCLUDEPATH+= $(OPIEDIR)/include ../networksettings2
22 DEPENDPATH+= $(OPIEDIR)/include 22 DEPENDPATH+= $(OPIEDIR)/include
23LIBS += -lqpe -lopiecore2 23LIBS += -lqpe -lopiecore2 -lopieui2
24 INTERFACES= 24 INTERFACES=
25 TARGET = networksettings2 25 TARGET = networksettings2
26 VERSION = 1.0.0 26 VERSION = 1.0.0
27 27
28include ( $(OPIEDIR)/include.pro ) 28include ( $(OPIEDIR)/include.pro )
diff --git a/noncore/settings/networksettings2/networksettings2/resources.cpp b/noncore/settings/networksettings2/networksettings2/resources.cpp
index c95ac7f..71e84cd 100644
--- a/noncore/settings/networksettings2/networksettings2/resources.cpp
+++ b/noncore/settings/networksettings2/networksettings2/resources.cpp
@@ -1,370 +1,444 @@
1#include <unistd.h> 1#include <unistd.h>
2#include <errno.h> 2#include <errno.h>
3#include <fcntl.h> 3#include <fcntl.h>
4#include <pwd.h> 4#include <pwd.h>
5#include <qpixmap.h> 5#include <qpixmap.h>
6#include <qdir.h> 6#include <qdir.h>
7#include <qpe/qlibrary.h> 7#include <qpe/qlibrary.h>
8#include <qpe/qpeapplication.h> 8#include <qpe/qpeapplication.h>
9#include <opie2/odebug.h> 9#include <opie2/odebug.h>
10#include <qtopia/resource.h> 10#include <qtopia/resource.h>
11 11
12#include "netnode.h" 12#include "netnode.h"
13#include "resources.h" 13#include "resources.h"
14 14
15#define PLUGINDIR "plugins/networksettings2" 15#define PLUGINDIR "plugins/networksettings2"
16#define ICONDIR "/pics/networksettings2/" 16#define ICONDIR "/pics/networksettings2/"
17 17
18// single resources instance 18// single resources instance
19TheNSResources * _NSResources = 0; 19TheNSResources * _NSResources = 0;
20 20
21TheNSResources::TheNSResources( void ) : NodeTypeNameMap(), 21TheNSResources::TheNSResources( void ) : NodeTypeNameMap(),
22 ConnectionsMap() { 22 ConnectionsMap() {
23 23
24 _NSResources = this; 24 _NSResources = this;
25 25
26 detectCurrentUser();
27
26 // load available netnodes 28 // load available netnodes
27 findAvailableNetNodes(QPEApplication::qpeDir() + PLUGINDIR ); 29 findAvailableNetNodes(QPEApplication::qpeDir() + PLUGINDIR );
28 30
29 // compile provides and needs lists 31 // compile provides and needs lists
30 { const char ** NeedsRun; 32 { const char ** NeedsRun;
31 QDictIterator<NetNode_t> OuterIt( AllNodeTypes ); 33 QDictIterator<NetNode_t> OuterIt( AllNodeTypes );
32 bool Done; 34 bool Done;
33 35
34 for ( ; OuterIt.current(); ++OuterIt ) { 36 for ( ; OuterIt.current(); ++OuterIt ) {
35 // find needs list 37 // find needs list
36 ANetNode::NetNodeList * NNLP = new ANetNode::NetNodeList; 38 ANetNode::NetNodeList * NNLP = new ANetNode::NetNodeList;
37 ANetNode::NetNodeList & NNL = *(NNLP); 39 ANetNode::NetNodeList & NNL = *(NNLP);
38 40
39 // must iterate this way to avoid duplication pointers 41 // must iterate this way to avoid duplication pointers
40 for ( QDictIterator<NetNode_t> InnerIt( AllNodeTypes ); 42 for ( QDictIterator<NetNode_t> InnerIt( AllNodeTypes );
41 InnerIt.current(); ++InnerIt ) { 43 InnerIt.current(); ++InnerIt ) {
42 if( InnerIt.current() == OuterIt.current() ) 44 if( InnerIt.current() == OuterIt.current() )
43 // avoid recursive 45 // avoid recursive
44 continue; 46 continue;
45 47
46 const char * Provides = InnerIt.current()->NetNode->provides(); 48 const char * Provides = InnerIt.current()->NetNode->provides();
47 NeedsRun = OuterIt.current()->NetNode->needs(); 49 NeedsRun = OuterIt.current()->NetNode->needs();
48 for( ; *NeedsRun; NeedsRun ++ ) { 50 for( ; *NeedsRun; NeedsRun ++ ) {
49 if( strcmp( Provides, *NeedsRun ) == 0 ) { 51 if( strcmp( Provides, *NeedsRun ) == 0 ) {
50 // inner provides what outer needs 52 // inner provides what outer needs
51 NNL.resize( NNL.size() + 1 ); 53 NNL.resize( NNL.size() + 1 );
52 NNL[NNL.size()-1] = InnerIt.current()->NetNode; 54 NNL[NNL.size()-1] = InnerIt.current()->NetNode;
53 Done = 1; // break from 2 loops 55 Done = 1; // break from 2 loops
54 break; 56 break;
55 } 57 }
56 } 58 }
57 } 59 }
58 OuterIt.current()->NetNode->setAlternatives( NNLP ); 60 OuterIt.current()->NetNode->setAlternatives( NNLP );
59 } 61 }
60 } 62 }
61 63
62 // define Node types to Description map 64 // define Node types to Description map
63 NodeTypeNameMap.insert( "device", tr( "Network Device" ) ); 65 NodeTypeNameMap.insert( "device", tr( "Network Device" ) );
64 NodeTypeNameMap.insert( "line", tr( "Character device" ) ); 66 NodeTypeNameMap.insert( "line", tr( "Character device" ) );
65 NodeTypeNameMap.insert( "connection", tr( "IP Connection" ) ); 67 NodeTypeNameMap.insert( "connection", tr( "IP Connection" ) );
66 NodeTypeNameMap.insert( "fullsetup", tr( "Connection Profile" ) ); 68 NodeTypeNameMap.insert( "fullsetup", tr( "Connection Profile" ) );
67 69
68 NodeTypeDescriptionMap.insert( "device", 70 NodeTypeDescriptionMap.insert( "device",
69 tr( "<p>Devices that can handle IP packets</p>" ) ); 71 tr( "<p>Devices that can handle IP packets</p>" ) );
70 NodeTypeDescriptionMap.insert( "line", 72 NodeTypeDescriptionMap.insert( "line",
71 tr( "<p>Devices that can handle single bytes</p>" ) ); 73 tr( "<p>Devices that can handle single bytes</p>" ) );
72 NodeTypeDescriptionMap.insert( "connection", 74 NodeTypeDescriptionMap.insert( "connection",
73 tr( "<p>Nodes that provide working IP connections</p>" ) ); 75 tr( "<p>Nodes that provide working IP connections</p>" ) );
74 NodeTypeDescriptionMap.insert( "fullsetup", 76 NodeTypeDescriptionMap.insert( "fullsetup",
75 tr( "<p>Fully configured connection profile</p>" ) ); 77 tr( "<p>Fully configured connection profile</p>" ) );
76 78
77 // define system files 79 // define system files
78 addSystemFile( new SystemFile( "interfaces", "./interfaces" ) ); 80 addSystemFile( new SystemFile( "interfaces", "./interfaces" ) );
79 81
80 // get access to the system 82 // get access to the system
81 TheSystem = new System(); 83 TheSystem = new System();
82 84
83 detectCurrentUser();
84} 85}
85 86
86TheNSResources::~TheNSResources( void ) { 87TheNSResources::~TheNSResources( void ) {
87 delete TheSystem; 88 delete TheSystem;
88} 89}
89 90
91void TheNSResources::busy( bool B ) {
92/*
93 if( B ) {
94 ShowWait->show();
95 qApp->process
96 } else {
97 ShowWait->hide();
98 }
99*/
100}
101
90/** 102/**
91 * Load all modules that are found in the path 103 * Load all modules that are found in the path
92 * @param path a directory that is scaned for any plugins that can be loaded 104 * @param path a directory that is scaned for any plugins that can be loaded
93 * and attempts to load them 105 * and attempts to load them
94 */ 106 */
95void TheNSResources::findAvailableNetNodes(const QString &path){ 107void TheNSResources::findAvailableNetNodes(const QString &path){
96 108
109 Log(("Locate plugins in %s\n", path.latin1() ));
97 QDir d(path); 110 QDir d(path);
98 if(!d.exists()) 111 if(!d.exists())
99 return; 112 return;
100 113
101 QString lang = ::getenv("LANG"); 114 QString lang = ::getenv("LANG");
102 115
103 // Don't want sym links 116 // Don't want sym links
104 d.setFilter( QDir::Files | QDir::NoSymLinks ); 117 d.setFilter( QDir::Files | QDir::NoSymLinks );
105 const QFileInfoList *list = d.entryInfoList(); 118 const QFileInfoList *list = d.entryInfoList();
106 QFileInfoListIterator it( *list ); 119 QFileInfoListIterator it( *list );
107 QFileInfo *fi; 120 QFileInfo *fi;
108 121
109 while ( (fi=it.current()) ) { 122 while ( (fi=it.current()) ) {
110 123
111 if( fi->fileName().contains(".so")){ 124 if( fi->fileName().contains(".so")){
112 /* if loaded install translation */ 125 /* if loaded install translation */
113 if( loadNetNode(path + "/" + fi->fileName()) ) { 126 if( loadNetNode(path + "/" + fi->fileName()) ) {
114 QTranslator *trans = new QTranslator(qApp); 127 QTranslator *trans = new QTranslator(qApp);
115 QString fn = QPEApplication::qpeDir()+ 128 QString fn = QPEApplication::qpeDir()+
116 "/i18n/"+lang+"/"+ 129 "/i18n/"+lang+"/"+
117 fi->fileName().left( fi->fileName().find(".") )+ 130 fi->fileName().left( fi->fileName().find(".") )+
118 ".qm"; 131 ".qm";
119 132
120 if( trans->load( fn ) ) 133 if( trans->load( fn ) )
121 qApp->installTranslator( trans ); 134 qApp->installTranslator( trans );
122 else 135 else
123 delete trans; 136 delete trans;
124 } 137 }
125 } 138 }
126 ++it; 139 ++it;
127 } 140 }
128} 141}
129 142
143// used to find unique connection number
144int TheNSResources::assignConnectionNumber( void ) {
145 bool found = 1;
146 for( int trial = 0; ; trial ++ ) {
147 found = 1;
148 for( QDictIterator<NodeCollection> it(ConnectionsMap);
149 it.current();
150 ++it ) {
151 if( it.current()->number() == trial ) {
152 found = 0;
153 break;
154 }
155 }
156
157 if( found ) {
158 Log(("Assign profile number %d\n", trial ));
159 return trial;
160 }
161 }
162}
163
130/** 164/**
131 * Attempt to load a function and resolve a function. 165 * Attempt to load a function and resolve a function.
132 * @param pluginFileName - the name of the file in which to attempt to load 166 * @param pluginFileName - the name of the file in which to attempt to load
133 * @param resolveString - function pointer to resolve 167 * @param resolveString - function pointer to resolve
134 * @return true of loading is successful 168 * @return true of loading is successful
135 */ 169 */
136bool TheNSResources::loadNetNode( 170bool TheNSResources::loadNetNode(
137 const QString &pluginFileName, const QString &resolveString){ 171 const QString &pluginFileName, const QString &resolveString){
138 172
139 QLibrary *lib = new QLibrary(pluginFileName); 173 QLibrary *lib = new QLibrary(pluginFileName);
140 void * res = lib->resolve(resolveString); 174 void * res = lib->resolve(resolveString);
141 if( ! res ){ 175 if( ! res ){
142 delete lib; 176 delete lib;
143 return 0; 177 return 0;
144 } 178 }
145 179
146 GetNetNodeListFt_t getNetNodeList = (GetNetNodeListFt_t)res; 180 GetNetNodeListFt_t getNetNodeList = (GetNetNodeListFt_t)res;
147 181
148 // Try to get an object. 182 // Try to get an object.
149 QList<ANetNode> PNN; 183 QList<ANetNode> PNN;
150 184
151 getNetNodeList( PNN ); 185 getNetNodeList( PNN );
152 if( PNN.isEmpty() ) { 186 if( PNN.isEmpty() ) {
153 delete lib; 187 delete lib;
154 return 0; 188 return 0;
155 } 189 }
156 190
157 ANetNode * NNP; 191 ANetNode * NNP;
158 for( QListIterator<ANetNode> it(PNN); 192 for( QListIterator<ANetNode> it(PNN);
159 it.current(); 193 it.current();
160 ++it ) { 194 ++it ) {
161 NetNode_t * NN; 195 NetNode_t * NN;
162 196
163 NNP = it.current(); 197 NNP = it.current();
164 NN = new NetNode_t; 198 NN = new NetNode_t;
165 NN->NetNode = NNP; 199 NN->NetNode = NNP;
166 NN->TheLibrary = lib; 200 NN->TheLibrary = lib;
167 NN->NodeCountInLib = PNN.count(); 201 NN->NodeCountInLib = PNN.count();
168 202
169 // store mapping 203 // store mapping
170 printf( "Store %s\n", NN->NetNode->name() );
171 AllNodeTypes.insert( NN->NetNode->name(), NN ); 204 AllNodeTypes.insert( NN->NetNode->name(), NN );
172 } 205 }
173 206
174 return 1; 207 return 1;
175} 208}
176 209
177QPixmap TheNSResources::getPixmap( const QString & QS ) { 210QPixmap TheNSResources::getPixmap( const QString & QS ) {
211 QPixmap P;
178 QString S("networksettings2/"); 212 QString S("networksettings2/");
179 S += QS; 213 S += QS;
180 fprintf( stderr, "%s\n", S.latin1() ); 214 Log(("%s\n", S.latin1() ));
181 return Resource::loadPixmap( S ); 215 P = Resource::loadPixmap( S );
216 return ( P.isNull() ) ? QPixmap() : P;
182} 217}
183 218
184QString TheNSResources::tr( const char * s ) { 219QString TheNSResources::tr( const char * s ) {
185 return qApp->translate( "resource", s ); 220 return qApp->translate( "resource", s );
186} 221}
187 222
188const QString & TheNSResources::netNode2Name( const char * s ) { 223const QString & TheNSResources::netNode2Name( const char * s ) {
189 return NodeTypeNameMap[s]; 224 return NodeTypeNameMap[s];
190} 225}
191 226
192const QString & TheNSResources::netNode2Description( const char * s ) { 227const QString & TheNSResources::netNode2Description( const char * s ) {
193 return NodeTypeDescriptionMap[s]; 228 return NodeTypeDescriptionMap[s];
194} 229}
195 230
196void TheNSResources::addConnection( NodeCollection * NC ) { 231void TheNSResources::addConnection( NodeCollection * NC ) {
197 ANetNodeInstance * NNI; 232 ANetNodeInstance * NNI;
198 ConnectionsMap.insert( NC->name(), NC ); 233 ConnectionsMap.insert( NC->name(), NC );
199 // add (new) nodes to NodeList 234 // add (new) nodes to NodeList
200 for( QListIterator<ANetNodeInstance> it(*NC); 235 for( QListIterator<ANetNodeInstance> it(*NC);
201 it.current(); 236 it.current();
202 ++it ) { 237 ++it ) {
203 NNI = it.current(); 238 NNI = it.current();
204 if( findNodeInstance( NNI->name() ) == 0 ) { 239 if( findNodeInstance( NNI->name() ) == 0 ) {
205 // new item 240 // new item
206 addNodeInstance( NNI ); 241 addNodeInstance( NNI );
207 } 242 }
208 } 243 }
209} 244}
210 245
211void TheNSResources::removeConnection( const QString & N ) { 246void TheNSResources::removeConnection( const QString & N ) {
212 NodeCollection * NC = findConnection( N ); 247 NodeCollection * NC = findConnection( N );
213 if( ! NC ) 248 if( ! NC )
214 return; 249 return;
215 250
216 // delete netnodes in this connection 251 // delete netnodes in this connection
217 ANetNodeInstance * NNI; 252 ANetNodeInstance * NNI;
218 for( NNI = NC->first(); NNI != 0; NNI = NC->next() ) { 253 for( NNI = NC->first(); NNI != 0; NNI = NC->next() ) {
219 removeNodeInstance( NNI->name() ); 254 removeNodeInstance( NNI->name() );
220 } 255 }
221 ConnectionsMap.remove( N ); 256 ConnectionsMap.remove( N );
222} 257}
223 258
224NodeCollection * TheNSResources::findConnection( const QString & S ) { 259NodeCollection * TheNSResources::findConnection( const QString & S ) {
225 return ConnectionsMap[ S ]; 260 return ConnectionsMap[ S ];
226} 261}
227 262
263/*
228void TheNSResources::renumberConnections( void ) { 264void TheNSResources::renumberConnections( void ) {
229 Name2Connection_t & M = NSResources->connections(); 265 Name2Connection_t & M = NSResources->connections();
230 NodeCollection * NC; 266 NodeCollection * NC;
231 267
232 // for all connections 268 // for all connections
233 NodeCollection::resetMaxNr(); 269 NodeCollection::resetMaxNr();
234 for( QDictIterator<NodeCollection> it(M); 270 for( QDictIterator<NodeCollection> it(M);
235 it.current(); 271 it.current();
236 ++it ) { 272 ++it ) {
237 NC = it.current(); 273 NC = it.current();
238 NC->setNumber( NC->maxConnectionNumber()+1 ); 274 NC->setNumber( NC->maxConnectionNumber()+1 );
239 NC->setModified( 1 ); 275 NC->setModified( 1 );
240 } 276 }
241} 277}
278*/
242 279
243typedef struct EnvVars { 280typedef struct EnvVars {
244 char * Name; 281 char * Name;
245 int Len; 282 int Len;
246} EnvVar_t; 283} EnvVar_t;
247 284
248#define AnEV(x) x, sizeof(x)-1 285#define AnEV(x) x, sizeof(x)-1
249 286
250static EnvVar_t EV[] = { 287static EnvVar_t EV[] = {
251 // AnEV( "HOME=" ), -> SPECIAL 288 // AnEV( "HOME=" ), -> SPECIAL
252 // AnEV( "LOGNAME=" ), -> SPECIAL 289 // AnEV( "LOGNAME=" ), -> SPECIAL
253 AnEV( "USER=" ), 290 AnEV( "USER=" ),
254 AnEV( "LD_LIBRARY_PATH=" ), 291 AnEV( "LD_LIBRARY_PATH=" ),
255 AnEV( "PATH=" ), 292 AnEV( "PATH=" ),
256 AnEV( "QTDIR=" ), 293 AnEV( "QTDIR=" ),
257 AnEV( "OPIEDIR=" ), 294 AnEV( "OPIEDIR=" ),
258 AnEV( "SHELL=" ), 295 AnEV( "SHELL=" ),
259 { NULL, 0 } 296 { NULL, 0 }
260}; 297};
261 298
262void TheNSResources::detectCurrentUser( void ) { 299void TheNSResources::detectCurrentUser( void ) {
263 // find current running qpe 300 // find current running qpe
264 QString QPEEnvFile = ""; 301 QString QPEEnvFile = "";
265 302
266 // open proc dir and find all dirs in it 303 if( getenv( "OPIEDIR" ) == 0 ) {
267 { QRegExp R("[0-9]+"); 304 // nothing known
268 QDir ProcDir( "/proc" ); 305 { // open proc dir and find all dirs in it
269 QString QPELoc = QPEApplication::qpeDir() + "bin/qpe"; 306 QRegExp R("[0-9]+");
270 QFileInfo FI; 307 QDir ProcDir( "/proc" );
271 QStringList EL = ProcDir.entryList( QDir::Dirs ); 308 QFileInfo FI;
272 309 QStringList EL = ProcDir.entryList( QDir::Dirs );
273 // print it out 310
274 for ( QStringList::Iterator it = EL.begin(); 311 // print it out
275 it != EL.end(); 312 for ( QStringList::Iterator it = EL.begin();
276 ++it ) { 313 it != EL.end();
277 if( R.match( (*it) ) >= 0 ) { 314 ++it ) {
278 QString S = ProcDir.path()+"/"+ (*it); 315 if( R.match( (*it) ) >= 0 ) {
279 S.append( "/exe" ); 316 QString S = ProcDir.path()+"/"+ (*it);
280 FI.setFile( S ); 317 S.append( "/exe" );
281 // get the linke 318 FI.setFile( S );
282 S = FI.readLink(); 319 // get the link
283 if( S == QPELoc ) { 320 S = FI.readLink();
284 // found running qpe 321 if( S.right( 8 ) == "/bin/qpe" ) {
285 QPEEnvFile.sprintf( ProcDir.path()+ "/" + (*it) + "/environ" ); 322 // found running qpe
286 break; 323 QPEEnvFile.sprintf( ProcDir.path()+ "/" + (*it) + "/environ" );
324 break;
325 }
287 } 326 }
288 } 327 }
289 } 328 }
290 }
291 329
292 if( QPEEnvFile.isEmpty() ) { 330 if( QPEEnvFile.isEmpty() ) {
293 // could not find qpe 331 // could not find qpe
294 fprintf( stderr, "Could not find qpe\n" ); 332 Log(("Could not find qpe\n" ));
295 return;
296 }
297
298 // FI now contains path ProcDir to the cmd dir
299 { char * Buf = 0;
300 char TB[1024];
301 long BufSize = 0;
302 int fd;
303 int rd;
304
305 fd = open( QPEEnvFile.latin1(), O_RDONLY );
306 if( fd < 0 ) {
307 fprintf( stderr, "Could not open %s : %d\n",
308 QPEEnvFile.latin1(), errno );
309 return; 333 return;
310 } 334 }
311 335
312 while( (rd = read( fd, TB, sizeof(TB) ) ) > 0 ) { 336 // FI now contains path ProcDir to the cmd dir
313 Buf = (char *)realloc( Buf, BufSize+rd ); 337 { char * Buf = 0;
314 memcpy( Buf+BufSize, TB, rd ); 338 char TB[1024];
315 BufSize += rd; 339 long BufSize = 0;
316 } 340 int fd;
341 int rd;
342
343 fd = open( QPEEnvFile.latin1(), O_RDONLY );
344 if( fd < 0 ) {
345 Log(("Could not open %s : %d\n",
346 QPEEnvFile.latin1(), errno ));
347 return;
348 }
317 349
318 char * Data = Buf; 350 while( (rd = read( fd, TB, sizeof(TB) ) ) > 0 ) {
319 char * DataEnd = Data+BufSize-1; 351 Buf = (char *)realloc( Buf, BufSize+rd );
320 352 memcpy( Buf+BufSize, TB, rd );
321 // get env items out of list 353 BufSize += rd;
322 while( Data < DataEnd ) { 354 }
323 if( strncmp( Data, "LOGNAME=", 8 ) == 0 ) { 355
324 CurrentUser.UserName = Data+8; 356 char * Data = Buf;
325 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); 357 char * DataEnd = Data+BufSize-1;
326 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = 358
327 strdup( Data ); 359 // get env items out of list
328 } else if( strncmp( Data, "HOME=", 5 ) == 0 ) { 360 while( Data < DataEnd ) {
329 CurrentUser.HomeDir = Data+5; 361 if( strncmp( Data, "LOGNAME=", 8 ) == 0 ) {
330 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); 362 CurrentUser.UserName = Data+8;
331 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = 363 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 );
332 strdup( Data ); 364 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] =
333 } else { 365 strdup( Data );
334 EnvVar_t * Run = EV; 366 } else if( strncmp( Data, "HOME=", 5 ) == 0 ) {
335 while( Run->Name ) { 367 CurrentUser.HomeDir = Data+5;
336 if( strncmp( Data, Run->Name, Run->Len ) == 0 ) { 368 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 );
337 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); 369 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] =
338 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = 370 strdup( Data );
339 strdup( Data ); 371 } else {
340 break; 372 EnvVar_t * Run = EV;
373 while( Run->Name ) {
374 if( strncmp( Data, Run->Name, Run->Len ) == 0 ) {
375 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 );
376 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] =
377 strdup( Data );
378 // put OPIEDIR in env
379 if( strcmp( Run->Name, "OPIEDIR=" ) == 0 ) {
380 putenv( CurrentUser.EnvList[CurrentUser.EnvList.size()-1] );
381
382 }
383 break;
384 }
385 Run ++;
341 } 386 }
342 Run ++;
343 } 387 }
344 }
345 388
346 Data += strlen( Data )+1; 389 Data += strlen( Data )+1;
347 } 390 }
348 391
349 free( Buf ); 392 free( Buf );
350 393
351 if( ! CurrentUser.UserName.isEmpty() ) { 394 if( ! CurrentUser.UserName.isEmpty() ) {
352 // find user info 395 // find user info
353 struct passwd pwd; 396 struct passwd pwd;
354 struct passwd * pwdres; 397 struct passwd * pwdres;
355 398
356 if( getpwnam_r( CurrentUser.UserName.latin1(), 399 if( getpwnam_r( CurrentUser.UserName.latin1(),
357 &pwd, TB, sizeof(TB), &pwdres ) || 400 &pwd, TB, sizeof(TB), &pwdres ) ||
358 pwdres == 0 ) { 401 pwdres == 0 ) {
359 fprintf( stderr, "Could not determine user %s : %d\n", 402 Log(("Could not determine user %s : %d\n",
360 CurrentUser.UserName.latin1(), errno ); 403 CurrentUser.UserName.latin1(), errno ));
361 return; 404 return;
405 }
406 CurrentUser.Uid = pwd.pw_uid;
407 CurrentUser.Gid = pwd.pw_gid;
408 } else{
409 CurrentUser.Uid =
410 CurrentUser.Gid = -1;
362 } 411 }
363 CurrentUser.Uid = pwd.pw_uid;
364 CurrentUser.Gid = pwd.pw_gid;
365 } else{
366 CurrentUser.Uid =
367 CurrentUser.Gid = -1;
368 } 412 }
413
414 } else {
415 CurrentUser.UserName = getenv( "LOGNAME" );
416 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 );
417 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] =
418 strdup( CurrentUser.UserName );
419
420 CurrentUser.HomeDir = getenv( "HOME" );
421 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 );
422 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] =
423 strdup( CurrentUser.HomeDir );
424
425 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 );
426 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = getenv("USER");
427 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 );
428 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = getenv("LD_LIBRARY_PATH");
429
430 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 );
431 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = getenv("PATH");
432
433 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 );
434 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = getenv("QTDIR");
435
436 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 );
437 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = getenv("OPIEDIR");
438 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 );
439 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = getenv("SHELL");
440
441 CurrentUser.Uid = getuid();
442 CurrentUser.Gid = getgid();
369 } 443 }
370} 444}
diff --git a/noncore/settings/networksettings2/networksettings2/resources.h b/noncore/settings/networksettings2/networksettings2/resources.h
index 3d6a44f..55d2f29 100644
--- a/noncore/settings/networksettings2/networksettings2/resources.h
+++ b/noncore/settings/networksettings2/networksettings2/resources.h
@@ -1,128 +1,131 @@
1#ifndef __RESOURCES__H 1#ifndef __RESOURCES__H
2#define __RESOURCES__H 2#define __RESOURCES__H
3 3
4#include <qstring.h> 4#include <qstring.h>
5#include <qdict.h> 5#include <qdict.h>
6#include <qmap.h> 6#include <qmap.h>
7#include <qlist.h> 7#include <qlist.h>
8#include "netnode.h" 8#include "netnode.h"
9#include "systemfile.h" 9#include "systemfile.h"
10#include "system.h" 10#include "system.h"
11 11
12class QLibrary; 12class QLibrary;
13class QPixmap; 13class QPixmap;
14class ANetNode; 14class ANetNode;
15class ANetNodeInstance; 15class ANetNodeInstance;
16 16
17typedef void (*GetNetNodeListFt_t)(QList<ANetNode>& PNN ); 17typedef void (*GetNetNodeListFt_t)(QList<ANetNode>& PNN );
18 18
19typedef struct NetNode_S { 19typedef struct NetNode_S {
20 ANetNode * NetNode; 20 ANetNode * NetNode;
21 QLibrary * TheLibrary; 21 QLibrary * TheLibrary;
22 long NodeCountInLib; 22 long NodeCountInLib;
23} NetNode_t; 23} NetNode_t;
24 24
25class CurrentQPEUser { 25class CurrentQPEUser {
26 26
27public : 27public :
28 CurrentQPEUser() : UserName(), HomeDir(), EnvList() {} 28 CurrentQPEUser() : UserName(), HomeDir(), EnvList() {}
29 29
30 QString UserName; 30 QString UserName;
31 QString HomeDir; 31 QString HomeDir;
32 int Uid; 32 int Uid;
33 int Gid; 33 int Gid;
34 QArray<char *> EnvList; 34 QArray<char *> EnvList;
35}; 35};
36 36
37typedef QDict<NetNode_t> Name2NetNode_t; 37typedef QDict<NetNode_t> Name2NetNode_t;
38typedef QDict<ANetNodeInstance > Name2Instance_t; 38typedef QDict<ANetNodeInstance > Name2Instance_t;
39typedef QDict<NodeCollection> Name2Connection_t; 39typedef QDict<NodeCollection> Name2Connection_t;
40typedef QDict<SystemFile> Name2SystemFile_t; 40typedef QDict<SystemFile> Name2SystemFile_t;
41 41
42class TheNSResources { 42class TheNSResources {
43 43
44public : 44public :
45 45
46 TheNSResources( void ); 46 TheNSResources( void );
47 ~TheNSResources( ); 47 ~TheNSResources( );
48 48
49 // give busy feedback
50 void busy( bool B );
51
49 System & system() 52 System & system()
50 { return *TheSystem; } 53 { return *TheSystem; }
51 54
55 int assignConnectionNumber(void);
52 QPixmap getPixmap( const QString & Name ); 56 QPixmap getPixmap( const QString & Name );
53 57
54 Name2NetNode_t & netNodes( void ) 58 Name2NetNode_t & netNodes( void )
55 { return AllNodeTypes; } 59 { return AllNodeTypes; }
56 bool netNodeExists( const QString & X ) 60 bool netNodeExists( const QString & X )
57 { return AllNodeTypes.find(X)!=0; } 61 { return AllNodeTypes.find(X)!=0; }
58 ANetNode * findNetNode( const QString & N ) 62 ANetNode * findNetNode( const QString & N )
59 { NetNode_t * NNT = AllNodeTypes.find(N); 63 { NetNode_t * NNT = AllNodeTypes.find(N);
60 return (NNT) ? NNT->NetNode : 0; 64 return (NNT) ? NNT->NetNode : 0;
61 } 65 }
62 66
63 Name2SystemFile_t & systemFiles( void ) 67 Name2SystemFile_t & systemFiles( void )
64 { return SystemFiles; } 68 { return SystemFiles; }
65 void addSystemFile( SystemFile * SF ) 69 void addSystemFile( SystemFile * SF )
66 { SystemFiles.insert( SF->name(), SF ); } 70 { SystemFiles.insert( SF->name(), SF ); }
67 71
68 ANetNodeInstance * createNodeInstance( const QString & S ) 72 ANetNodeInstance * createNodeInstance( const QString & S )
69 { ANetNodeInstance * NNI = 0; 73 { ANetNodeInstance * NNI = 0;
70 NetNode_t * NNT = AllNodeTypes[S]; 74 NetNode_t * NNT = AllNodeTypes[S];
71 if( ! NNT ) { 75 if( ! NNT ) {
72 return 0; 76 return 0;
73 } 77 }
74 NNI = NNT->NetNode->createInstance(); 78 NNI = NNT->NetNode->createInstance();
75 NNI->initialize(); 79 NNI->initialize();
76 return NNI; 80 return NNI;
77 } 81 }
78 82
79 Name2Instance_t & netNodeInstances( void ) 83 Name2Instance_t & netNodeInstances( void )
80 { return AllNodes; } 84 { return AllNodes; }
81 void addNodeInstance( ANetNodeInstance * I ) 85 void addNodeInstance( ANetNodeInstance * I )
82 { AllNodes.insert( I->name(), I ); } 86 { AllNodes.insert( I->name(), I ); }
83 void removeNodeInstance( const QString & N ) 87 void removeNodeInstance( const QString & N )
84 { AllNodes.remove( N );} 88 { AllNodes.remove( N );}
85 ANetNodeInstance * findNodeInstance( const QString & S ) 89 ANetNodeInstance * findNodeInstance( const QString & S )
86 { return (AllNodes.find(S)!=0) ? AllNodes[S] : 0; } 90 { return (AllNodes.find(S)!=0) ? AllNodes[S] : 0; }
87 91
88 const QString & netNode2Name( const char * Type ); 92 const QString & netNode2Name( const char * Type );
89 const QString & netNode2Description( const char * Type ); 93 const QString & netNode2Description( const char * Type );
90 94
91 void renumberConnections( void );
92 void addConnection( NodeCollection * NC ); 95 void addConnection( NodeCollection * NC );
93 void removeConnection( const QString & N ); 96 void removeConnection( const QString & N );
94 NodeCollection * findConnection( const QString & N ); 97 NodeCollection * findConnection( const QString & N );
95 Name2Connection_t & connections( void ) 98 Name2Connection_t & connections( void )
96 { return ConnectionsMap; } 99 { return ConnectionsMap; }
97 100
98 CurrentQPEUser & currentUser( void ) 101 CurrentQPEUser & currentUser( void )
99 { return CurrentUser; } 102 { return CurrentUser; }
100 103
101private : 104private :
102 105
103 void detectCurrentUser( void ); 106 void detectCurrentUser( void );
104 QString tr( const char * path ); 107 QString tr( const char * path );
105 void findAvailableNetNodes( const QString &path ); 108 void findAvailableNetNodes( const QString &path );
106 bool loadNetNode( 109 bool loadNetNode(
107 const QString &pluginFileName, 110 const QString &pluginFileName,
108 const QString &resolveString = "create_plugin"); 111 const QString &resolveString = "create_plugin");
109 112
110 QMap< QString, QString> NodeTypeNameMap; 113 QMap< QString, QString> NodeTypeNameMap;
111 QMap< QString, QString> NodeTypeDescriptionMap; 114 QMap< QString, QString> NodeTypeDescriptionMap;
112 Name2Connection_t ConnectionsMap; 115 Name2Connection_t ConnectionsMap;
113 System * TheSystem; 116 System * TheSystem;
114 Name2SystemFile_t SystemFiles; 117 Name2SystemFile_t SystemFiles;
115 118
116 // all node type classes 119 // all node type classes
117 Name2NetNode_t AllNodeTypes; 120 Name2NetNode_t AllNodeTypes;
118 121
119 // all nodes 122 // all nodes
120 Name2Instance_t AllNodes; 123 Name2Instance_t AllNodes;
121 124
122 CurrentQPEUser CurrentUser; 125 CurrentQPEUser CurrentUser;
123}; 126};
124 127
125extern TheNSResources * _NSResources; 128extern TheNSResources * _NSResources;
126#define NSResources _NSResources 129#define NSResources _NSResources
127 130
128#endif 131#endif
diff --git a/noncore/settings/networksettings2/networksettings2/system.cpp b/noncore/settings/networksettings2/networksettings2/system.cpp
index 2133d34..a579396 100644
--- a/noncore/settings/networksettings2/networksettings2/system.cpp
+++ b/noncore/settings/networksettings2/networksettings2/system.cpp
@@ -1,355 +1,417 @@
1#include <sys/types.h> 1#include <sys/types.h>
2#include <sys/wait.h> 2#include <sys/wait.h>
3 3
4#include <net/if.h> 4#include <net/if.h>
5#include <net/if_arp.h> 5#include <net/if_arp.h>
6#include <netinet/in.h> 6#include <netinet/in.h>
7#include <arpa/inet.h> 7#include <arpa/inet.h>
8#include <sys/ioctl.h> 8#include <sys/ioctl.h>
9#include <sys/socket.h> 9#include <sys/socket.h>
10#include <stdlib.h> 10#include <stdlib.h>
11#include <stdio.h>
11#include <fcntl.h> 12#include <fcntl.h>
12#include <errno.h> 13#include <errno.h>
13#include <unistd.h> 14#include <unistd.h>
14 15
15#include <qdir.h> 16#include <qdir.h>
16#include <qregexp.h> 17#include <qregexp.h>
17#include <qstringlist.h> 18#include <qstringlist.h>
18#include <qfile.h> 19#include <qfile.h>
19#include <qtextstream.h> 20#include <qtextstream.h>
21#include <qapplication.h>
20 22
21#include "resources.h" 23#include "resources.h"
22#include "system.h" 24#include "system.h"
23 25
24#define PROCNETDEV "/proc/net/dev" 26#define PROCNETDEV "/proc/net/dev"
25 27
26static char Dig2Hex[] = { 28static char Dig2Hex[] = {
27 '0', '1', '2', '3', 29 '0', '1', '2', '3',
28 '4', '5', '6', '7', 30 '4', '5', '6', '7',
29 '8', '9', 'A', 'B', 31 '8', '9', 'A', 'B',
30 'C', 'D', 'E', 'F' 32 'C', 'D', 'E', 'F'
31}; 33};
32 34
33// get HIGH nibble of byte 35// get HIGH nibble of byte
34#define HN(x) Dig2Hex[(((x)&0xf0)>>4)] 36#define HN(x) Dig2Hex[(((x)&0xf0)>>4)]
35// get LOW nibble of byte 37// get LOW nibble of byte
36#define LN(x) Dig2Hex[((x)&0x0f)] 38#define LN(x) Dig2Hex[((x)&0x0f)]
37 39
38System::System( void ) : ProbedInterfaces() { 40System::System( void ) : QObject(), ProbedInterfaces() {
39 probeInterfaces(); 41 probeInterfaces();
40} 42}
41 43
42System::~System( void ) { 44System::~System( void ) {
43 if( ProcDevNet ) 45 if( ProcDevNet )
44 delete ProcDevNet; 46 delete ProcDevNet;
45} 47}
46 48
47int System::runAsRoot( const QString & S ) { 49int System::runAsRoot( const QString & S ) {
48 QString MyS = S; 50 QString MyS = S;
49 char * usr = getenv("USER"); 51 char * usr = getenv("USER");
50 int rv; 52 char ch;
51 53
52 if( S.isEmpty() ) { 54 if( S.isEmpty() ) {
53 // loophole to start shell 55 // loophole to start shell
54 return 8888; 56 return 8888;
55 } 57 }
56 if( usr == 0 || strcmp( usr, "root" ) ) { 58 if( usr == 0 || strcmp( usr, "root" ) ) {
57 // unknown or non-root user -> use SUDO 59 // unknown or non-root user -> use SUDO
58 MyS.prepend( "sudo " ); 60 MyS.prepend( "sudo " );
59 } 61 }
60 62
61 fprintf( stderr, "Executing %s\n", MyS.latin1() ); 63 Log(("Executing %s\n", MyS.latin1() ));
62 64
63 rv = system( MyS.latin1() ) ; 65 emit lineFromCommand( tr("Command : ") + MyS );
64 switch( rv ) { 66 emit lineFromCommand( "---------------" );
65 case -1 : 67 Log(( "Command : %s\n", MyS.latin1() ) );
66 // cannot fork 68 MyS += " 2>&1 ";
67 return 1; 69 OutputOfCmd = popen( MyS.latin1(), "r" ) ;
68 case 127 : 70 if( ! OutputOfCmd ) {
69 // cannot start shell 71 // cannot fork
70 return 2; 72 return 1;
71 default : 73 }
72 if( WEXITSTATUS(rv) != 0 ) { 74
73 // error in command 75 // read all data
74 return 3; 76 QString Line = "";
77 while( 1 ) {
78 if( fread( &ch, 1, 1, OutputOfCmd ) < 1 )
79 // eof
80 break;
81 if( ch == '\n' || ch == '\r' ) {
82 if( ! Line.isEmpty() ) {
83 Log(( "read cmd output : **%s**\n", Line.latin1() ) );
84 emit lineFromCommand( Line );
85 Line = "";
86 qApp->processEvents();
75 } 87 }
88 } else {
89 Line += ch;
90 }
91 }
92
93 if( ! Line.isEmpty() ) {
94 emit lineFromCommand( Line );
95 Log(( "read cmd output : **%s**\n", Line.latin1() ) );
96 }
97 Log(( "End of command\n", Line.latin1() ) );
98
99 if( pclose( OutputOfCmd ) < 0 ) {
100 // error in command
101 return 3;
76 } 102 }
103
77 // all is fine 104 // all is fine
78 return 0; 105 return 0;
79} 106}
80 107
81void System::refreshStatistics( InterfaceInfo & I ) { 108void System::refreshStatistics( InterfaceInfo & I ) {
82 if( ! ProcDevNet ) { 109 if( ! ProcDevNet ) {
83 return; 110 return;
84 } 111 }
85 // cannot seek on dev 112 // cannot seek on dev
86 ProcDevNet->close(); 113 ProcDevNet->close();
87 ProcDevNet->open( IO_ReadOnly ); 114 ProcDevNet->open( IO_ReadOnly );
88 115
89 QString line; 116 QString line;
90 QTextStream procTs(ProcDevNet); 117 QTextStream procTs(ProcDevNet);
91 QStringList SL; 118 QStringList SL;
92 int loc = -1; 119 int loc = -1;
93 int version; 120 int version;
94 121
95 procTs.readLine(); 122 procTs.readLine();
96 line = procTs.readLine(); 123 line = procTs.readLine();
97 // get version 124 // get version
98 if( line.find("compressed") ) 125 if( line.find("compressed") )
99 version = 3; 126 version = 3;
100 else if( line.find( "bytes" ) ) 127 else if( line.find( "bytes" ) )
101 version = 2; 128 version = 2;
102 else 129 else
103 version = 1; 130 version = 1;
104 while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) { 131 while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) {
105 if( (loc = line.find(":") ) == -1) { 132 if( (loc = line.find(":") ) == -1) {
106 continue; 133 continue;
107 } 134 }
108 135
109 if( I.Name != line.left(loc) ) 136 if( I.Name != line.left(loc) )
110 continue; 137 continue;
111 138
112 // tokenize 139 // tokenize
113 SL = QStringList::split( ' ', line, FALSE ); 140 SL = QStringList::split( ' ', line, FALSE );
114 141
115 // update data 142 // update data
116 switch( version ) { 143 switch( version ) {
117 case 1 : 144 case 1 :
118 I.RcvBytes = SL[1]; 145 I.RcvBytes = SL[1];
119 I.RcvErrors = SL[3]; 146 I.RcvErrors = SL[3];
120 I.RcvDropped = SL[4]; 147 I.RcvDropped = SL[4];
121 I.SndBytes = SL[6]; 148 I.SndBytes = SL[6];
122 I.SndErrors = SL[8]; 149 I.SndErrors = SL[8];
123 I.SndDropped = SL[9]; 150 I.SndDropped = SL[9];
124 I.Collisions = SL[11]; 151 I.Collisions = SL[11];
125 break; 152 break;
126 case 2 : 153 case 2 :
127 I.RcvBytes = SL[1]; 154 I.RcvBytes = SL[1];
128 I.RcvErrors = SL[3]; 155 I.RcvErrors = SL[3];
129 I.RcvDropped = SL[4]; 156 I.RcvDropped = SL[4];
130 I.SndBytes = SL[7]; 157 I.SndBytes = SL[7];
131 I.SndErrors = SL[9]; 158 I.SndErrors = SL[9];
132 I.SndDropped = SL[10]; 159 I.SndDropped = SL[10];
133 I.Collisions = SL[12]; 160 I.Collisions = SL[12];
134 break; 161 break;
135 case 3 : 162 case 3 :
136 I.RcvBytes = SL[1]; 163 I.RcvBytes = SL[1];
137 I.RcvErrors = SL[3]; 164 I.RcvErrors = SL[3];
138 I.RcvDropped = SL[4]; 165 I.RcvDropped = SL[4];
139 I.SndBytes = SL[9]; 166 I.SndBytes = SL[9];
140 I.SndErrors = SL[11]; 167 I.SndErrors = SL[11];
141 I.SndDropped = SL[12]; 168 I.SndDropped = SL[12];
142 I.Collisions = SL[14]; 169 I.Collisions = SL[14];
143 break; 170 break;
144 } 171 }
145 break; 172 break;
146 } 173 }
147} 174}
148 175
149// 176//
150// THIS UPDATES THE LIST -> INTERFACES ARE NOT DELETED BUT 177// THIS UPDATES THE LIST -> INTERFACES ARE NOT DELETED BUT
151// FLAGGED AS ! 'IsUp' IF NO LONGER PRESENT 178// FLAGGED AS ! 'IsUp' IF NO LONGER PRESENT
152// 179//
153 180
154void System::probeInterfaces( void ) { 181void System::probeInterfaces( void ) {
155 182
156 // probe interfaces 183 // probe interfaces
157 int sockfd; 184 int sockfd;
158 // get list of all interfaces 185 // get list of all interfaces
159 struct ifreq ifrs; 186 struct ifreq ifrs;
160 InterfaceInfo * IFI; 187 InterfaceInfo * IFI;
161 188
162 // flag all as 'down' 189 // flag all as 'down'
163 for( QDictIterator<InterfaceInfo> it( ProbedInterfaces ); 190 for( QDictIterator<InterfaceInfo> it( ProbedInterfaces );
164 it.current(); 191 it.current();
165 ++it ) { 192 ++it ) {
166 it.current()->IsUp = 0; 193 it.current()->IsUp = 0;
167 } 194 }
168 195
169 sockfd = socket(PF_INET, SOCK_DGRAM, 0); 196 sockfd = socket(PF_INET, SOCK_DGRAM, 0);
170 if(sockfd == -1) 197 if(sockfd == -1)
171 return; 198 return;
172 199
173 // read interfaces from /proc/dev/net 200 // read interfaces from /proc/dev/net
174 // SIOCGIFCONF does not return ALL interfaces ???!? 201 // SIOCGIFCONF does not return ALL interfaces ???!?
175 ProcDevNet = new QFile(PROCNETDEV); 202 ProcDevNet = new QFile(PROCNETDEV);
176 if( ! ProcDevNet->open(IO_ReadOnly) ) { 203 if( ! ProcDevNet->open(IO_ReadOnly) ) {
177 delete ProcDevNet; 204 delete ProcDevNet;
178 ProcDevNet =0; 205 ProcDevNet =0;
179 return; 206 return;
180 } 207 }
181 208
182 QString line; 209 QString line;
183 QString NicName; 210 QString NicName;
184 QTextStream procTs(ProcDevNet); 211 QTextStream procTs(ProcDevNet);
185 int loc = -1; 212 int loc = -1;
186 213
187 procTs.readLine(); // eat a line 214 procTs.readLine(); // eat a line
188 procTs.readLine(); // eat a line 215 procTs.readLine(); // eat a line
189 while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) { 216 while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) {
190 if((loc = line.find(":")) == -1) { 217 if((loc = line.find(":")) == -1) {
191 continue; 218 continue;
192 } 219 }
193 220
194 NicName = line.left(loc); 221 NicName = line.left(loc);
195 222
196 // set name for ioctl 223 // set name for ioctl
197 strcpy( ifrs.ifr_name, NicName.latin1() ); 224 strcpy( ifrs.ifr_name, NicName.latin1() );
198 225
199 if ( ! ( IFI = ProbedInterfaces.find( NicName ) ) ) { 226 if ( ! ( IFI = ProbedInterfaces.find( NicName ) ) ) {
200 // new nic 227 // new nic
201 fprintf( stderr, "NEWNIC %s\n", NicName.latin1()); 228 Log(("NEWNIC %s\n", NicName.latin1()));
202 IFI = new InterfaceInfo; 229 IFI = new InterfaceInfo;
203 IFI->Name = line.left(loc); 230 IFI->Name = line.left(loc);
204 IFI->NetNode = 0; 231 IFI->NetNode = 0;
205 ProbedInterfaces.insert( IFI->Name, IFI ); 232 ProbedInterfaces.insert( IFI->Name, IFI );
206 233
207 // get dynamic info 234 // get dynamic info
208 if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) { 235 if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) {
209 IFI->IsPointToPoint = ((ifrs.ifr_flags & IFF_POINTOPOINT) == IFF_POINTOPOINT); 236 IFI->IsPointToPoint = ((ifrs.ifr_flags & IFF_POINTOPOINT) == IFF_POINTOPOINT);
210 } else { 237 } else {
211 IFI->IsPointToPoint = 0; 238 IFI->IsPointToPoint = 0;
212 } 239 }
213 240
214 // settings that never change 241 // settings that never change
215 IFI->DstAddress = ""; 242 IFI->DstAddress = "";
216 243
217 if( IFI->IsPointToPoint ) { 244 if( IFI->IsPointToPoint ) {
218 if( ioctl(sockfd, SIOCGIFDSTADDR, &ifrs) >= 0 ) { 245 if( ioctl(sockfd, SIOCGIFDSTADDR, &ifrs) >= 0 ) {
219 IFI->DstAddress = 246 IFI->DstAddress =
220 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_dstaddr)->sin_addr); 247 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_dstaddr)->sin_addr);
221 } 248 }
222 } 249 }
223 250
224 IFI->CardType = 999999; 251 IFI->CardType = 999999;
225 IFI->MACAddress = ""; 252 IFI->MACAddress = "";
226 253
227 if( ioctl(sockfd, SIOCGIFHWADDR, &ifrs) >= 0 ) { 254 if( ioctl(sockfd, SIOCGIFHWADDR, &ifrs) >= 0 ) {
228 fprintf( stderr, "%s = %d\n", IFI->Name.latin1(), 255 Log(("%s = %d\n", IFI->Name.latin1(),
229 ifrs.ifr_hwaddr.sa_family ); 256 ifrs.ifr_hwaddr.sa_family ));
230 257
231 IFI->CardType = ifrs.ifr_hwaddr.sa_family; 258 IFI->CardType = ifrs.ifr_hwaddr.sa_family;
232 switch( ifrs.ifr_hwaddr.sa_family ) { 259 switch( ifrs.ifr_hwaddr.sa_family ) {
233 case ARPHRD_ETHER : // regular MAC address 260 case ARPHRD_ETHER : // regular MAC address
234 // valid address -> convert to regular ::: format 261 // valid address -> convert to regular ::: format
235 // length = 6 bytes = 12 DIGITS -> 6 : 262 // length = 6 bytes = 12 DIGITS -> 6 :
236 IFI->MACAddress.sprintf( 263 IFI->MACAddress.sprintf(
237 "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c", 264 "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",
238 HN( ifrs.ifr_hwaddr.sa_data[0] ), 265 HN( ifrs.ifr_hwaddr.sa_data[0] ),
239 LN( ifrs.ifr_hwaddr.sa_data[0] ), 266 LN( ifrs.ifr_hwaddr.sa_data[0] ),
240 HN( ifrs.ifr_hwaddr.sa_data[1] ), 267 HN( ifrs.ifr_hwaddr.sa_data[1] ),
241 LN( ifrs.ifr_hwaddr.sa_data[1] ), 268 LN( ifrs.ifr_hwaddr.sa_data[1] ),
242 HN( ifrs.ifr_hwaddr.sa_data[2] ), 269 HN( ifrs.ifr_hwaddr.sa_data[2] ),
243 LN( ifrs.ifr_hwaddr.sa_data[2] ), 270 LN( ifrs.ifr_hwaddr.sa_data[2] ),
244 HN( ifrs.ifr_hwaddr.sa_data[3] ), 271 HN( ifrs.ifr_hwaddr.sa_data[3] ),
245 LN( ifrs.ifr_hwaddr.sa_data[3] ), 272 LN( ifrs.ifr_hwaddr.sa_data[3] ),
246 HN( ifrs.ifr_hwaddr.sa_data[4] ), 273 HN( ifrs.ifr_hwaddr.sa_data[4] ),
247 LN( ifrs.ifr_hwaddr.sa_data[4] ), 274 LN( ifrs.ifr_hwaddr.sa_data[4] ),
248 HN( ifrs.ifr_hwaddr.sa_data[5] ), 275 HN( ifrs.ifr_hwaddr.sa_data[5] ),
249 LN( ifrs.ifr_hwaddr.sa_data[5] ) 276 LN( ifrs.ifr_hwaddr.sa_data[5] )
250 ); 277 );
251 break; 278 break;
252#ifdef ARPHRD_IEEE1394 279#ifdef ARPHRD_IEEE1394
253 case ARPHRD_IEEE1394 : // Firewire Eth address 280 case ARPHRD_IEEE1394 : // Firewire Eth address
254 IFI->MACAddress.sprintf( 281 IFI->MACAddress.sprintf(
255 "%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-00-00", 282 "%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-00-00",
256 HN( ifrs.ifr_hwaddr.sa_data[0] ), 283 HN( ifrs.ifr_hwaddr.sa_data[0] ),
257 LN( ifrs.ifr_hwaddr.sa_data[0] ), 284 LN( ifrs.ifr_hwaddr.sa_data[0] ),
258 HN( ifrs.ifr_hwaddr.sa_data[1] ), 285 HN( ifrs.ifr_hwaddr.sa_data[1] ),
259 LN( ifrs.ifr_hwaddr.sa_data[1] ), 286 LN( ifrs.ifr_hwaddr.sa_data[1] ),
260 HN( ifrs.ifr_hwaddr.sa_data[2] ), 287 HN( ifrs.ifr_hwaddr.sa_data[2] ),
261 LN( ifrs.ifr_hwaddr.sa_data[2] ), 288 LN( ifrs.ifr_hwaddr.sa_data[2] ),
262 HN( ifrs.ifr_hwaddr.sa_data[3] ), 289 HN( ifrs.ifr_hwaddr.sa_data[3] ),
263 LN( ifrs.ifr_hwaddr.sa_data[3] ), 290 LN( ifrs.ifr_hwaddr.sa_data[3] ),
264 HN( ifrs.ifr_hwaddr.sa_data[4] ), 291 HN( ifrs.ifr_hwaddr.sa_data[4] ),
265 LN( ifrs.ifr_hwaddr.sa_data[4] ), 292 LN( ifrs.ifr_hwaddr.sa_data[4] ),
266 HN( ifrs.ifr_hwaddr.sa_data[5] ), 293 HN( ifrs.ifr_hwaddr.sa_data[5] ),
267 LN( ifrs.ifr_hwaddr.sa_data[5] ), 294 LN( ifrs.ifr_hwaddr.sa_data[5] ),
268 HN( ifrs.ifr_hwaddr.sa_data[6] ), 295 HN( ifrs.ifr_hwaddr.sa_data[6] ),
269 LN( ifrs.ifr_hwaddr.sa_data[6] ), 296 LN( ifrs.ifr_hwaddr.sa_data[6] ),
270 HN( ifrs.ifr_hwaddr.sa_data[7] ), 297 HN( ifrs.ifr_hwaddr.sa_data[7] ),
271 LN( ifrs.ifr_hwaddr.sa_data[7] ), 298 LN( ifrs.ifr_hwaddr.sa_data[7] ),
272 HN( ifrs.ifr_hwaddr.sa_data[8] ), 299 HN( ifrs.ifr_hwaddr.sa_data[8] ),
273 LN( ifrs.ifr_hwaddr.sa_data[8] ), 300 LN( ifrs.ifr_hwaddr.sa_data[8] ),
274 HN( ifrs.ifr_hwaddr.sa_data[9] ), 301 HN( ifrs.ifr_hwaddr.sa_data[9] ),
275 LN( ifrs.ifr_hwaddr.sa_data[9] ), 302 LN( ifrs.ifr_hwaddr.sa_data[9] ),
276 HN( ifrs.ifr_hwaddr.sa_data[10] ), 303 HN( ifrs.ifr_hwaddr.sa_data[10] ),
277 LN( ifrs.ifr_hwaddr.sa_data[10] ), 304 LN( ifrs.ifr_hwaddr.sa_data[10] ),
278 HN( ifrs.ifr_hwaddr.sa_data[11] ), 305 HN( ifrs.ifr_hwaddr.sa_data[11] ),
279 LN( ifrs.ifr_hwaddr.sa_data[11] ), 306 LN( ifrs.ifr_hwaddr.sa_data[11] ),
280 HN( ifrs.ifr_hwaddr.sa_data[12] ), 307 HN( ifrs.ifr_hwaddr.sa_data[12] ),
281 LN( ifrs.ifr_hwaddr.sa_data[12] ), 308 LN( ifrs.ifr_hwaddr.sa_data[12] ),
282 HN( ifrs.ifr_hwaddr.sa_data[13] ), 309 HN( ifrs.ifr_hwaddr.sa_data[13] ),
283 LN( ifrs.ifr_hwaddr.sa_data[13] ) 310 LN( ifrs.ifr_hwaddr.sa_data[13] )
284 ); 311 );
285 break; 312 break;
286#endif 313#endif
287 case ARPHRD_PPP : // PPP 314 case ARPHRD_PPP : // PPP
288 break; 315 break;
289 case ARPHRD_IEEE80211 : // WLAN 316 case ARPHRD_IEEE80211 : // WLAN
290 break; 317 break;
291 case ARPHRD_IRDA : // IRDA 318 case ARPHRD_IRDA : // IRDA
292 break; 319 break;
293 } 320 }
294 } 321 }
295 } else // else already probed before -> just update 322 } else // else already probed before -> just update
296 fprintf( stderr, "OLDNIC %s\n", NicName.latin1()); 323 Log(("OLDNIC %s\n", NicName.latin1()));
297 324
298 // get dynamic info 325 // get dynamic info
299 if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) { 326 if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) {
300 IFI->IsUp = ((ifrs.ifr_flags & IFF_UP) == IFF_UP); 327 IFI->IsUp = ((ifrs.ifr_flags & IFF_UP) == IFF_UP);
301 IFI->HasMulticast = ((ifrs.ifr_flags & IFF_MULTICAST) == IFF_MULTICAST); 328 IFI->HasMulticast = ((ifrs.ifr_flags & IFF_MULTICAST) == IFF_MULTICAST);
302 } else { 329 } else {
303 IFI->IsUp = 0; 330 IFI->IsUp = 0;
304 IFI->HasMulticast = 0; 331 IFI->HasMulticast = 0;
305 } 332 }
306 333
307 if( ioctl(sockfd, SIOCGIFADDR, &ifrs) >= 0 ) { 334 if( ioctl(sockfd, SIOCGIFADDR, &ifrs) >= 0 ) {
308 IFI->Address = 335 IFI->Address =
309 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_addr)->sin_addr); 336 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_addr)->sin_addr);
310 } else { 337 } else {
311 IFI->Address = ""; 338 IFI->Address = "";
312 IFI->IsUp = 0; 339 IFI->IsUp = 0;
313 } 340 }
314 if( ioctl(sockfd, SIOCGIFBRDADDR, &ifrs) >= 0 ) { 341 if( ioctl(sockfd, SIOCGIFBRDADDR, &ifrs) >= 0 ) {
315 IFI->BCastAddress = 342 IFI->BCastAddress =
316 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_broadaddr)->sin_addr); 343 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_broadaddr)->sin_addr);
317 } else { 344 } else {
318 IFI->BCastAddress = ""; 345 IFI->BCastAddress = "";
319 } 346 }
320 if( ioctl(sockfd, SIOCGIFNETMASK, &ifrs) >= 0 ) { 347 if( ioctl(sockfd, SIOCGIFNETMASK, &ifrs) >= 0 ) {
321 IFI->Netmask = 348 IFI->Netmask =
322 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_netmask)->sin_addr); 349 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_netmask)->sin_addr);
323 } else { 350 } else {
324 IFI->Netmask = ""; 351 IFI->Netmask = "";
325 } 352 }
326 fprintf( stderr, "NIC %s UP %d\n", NicName.latin1(), IFI->IsUp ); 353 Log(("NIC %s UP %d\n", NicName.latin1(), IFI->IsUp ));
327 } 354 }
328} 355}
329 356
330void System::execAsUser( QString & Cmd, char * argv[] ) { 357void System::execAsUser( QString & Cmd, char * argv[] ) {
331 CurrentQPEUser CU = NSResources->currentUser(); 358 CurrentQPEUser CU = NSResources->currentUser();
332 359
333 if( CU.UserName.isEmpty() ) { 360 if( CU.UserName.isEmpty() ) {
334 // if we come here, the exec was not successfull 361 // if we come here, the exec was not successfull
335 fprintf( stderr, "User not known \n" ); 362 Log(("User not known \n" ));
336 return; 363 return;
337 } 364 }
338 365
339 // now we are ready to exec the requested command 366 // now we are ready to exec the requested command
340 setuid( CU.Uid ); 367 setuid( CU.Uid );
341 setgid( CU.Gid ); 368 setgid( CU.Gid );
342 369
343 char ** envp = (char **)alloca( sizeof( char *) * 370 char ** envp = (char **)alloca( sizeof( char *) *
344 (CU.EnvList.count()+1) ); 371 (CU.EnvList.count()+1) );
345 372
346 for( unsigned int i = 0 ; i < CU.EnvList.count() ; i ++ ) { 373 for( unsigned int i = 0 ; i < CU.EnvList.count() ; i ++ ) {
347 *(envp+i) = CU.EnvList[i]; 374 *(envp+i) = CU.EnvList[i];
348 } 375 }
349 envp[CU.EnvList.count()]=NULL; 376 envp[CU.EnvList.count()]=NULL;
350 377
351 execve( Cmd.latin1(), argv, envp ); 378 execve( Cmd.latin1(), argv, envp );
352 379
353 // if we come here, the exec was not successfull 380 // if we come here, the exec was not successfull
354 fprintf( stderr, "Could not exec : %d\n", errno ); 381 Log(("Could not exec : %d\n", errno ));
382}
383
384#include <stdarg.h>
385static FILE * logf = 0;
386
387void VLog( char * Format, ... ) {
388 va_list l;
389
390 va_start(l, Format );
391
392 if( logf == (FILE *)0 ) {
393 // logf = fopen( "/tmp/ns2log", "a" );
394 logf = stderr;
395 if( ! logf ) {
396 fprintf( stderr, "Cannot open logfile /tmp/ns2log %d\n",
397 errno );
398 logf = (FILE *)1;
399 } else {
400 fprintf( logf, "____ OPEN LOGFILE ____\n");
401 }
402 }
403
404 if( (long)logf > 1 ) {
405 vfprintf( logf, Format, l );
406 }
407 va_end( l );
408
409}
410
411void LogClose( void ) {
412 if( (long)logf > 1 ) {
413 fprintf( logf, "____ CLOSE LOGFILE ____\n");
414 fclose( logf );
415 logf = 0;
416 }
355} 417}
diff --git a/noncore/settings/networksettings2/networksettings2/system.h b/noncore/settings/networksettings2/networksettings2/system.h
index 96ee9bd..33af391 100644
--- a/noncore/settings/networksettings2/networksettings2/system.h
+++ b/noncore/settings/networksettings2/networksettings2/system.h
@@ -1,81 +1,90 @@
1#ifndef __SYSTEM__H 1#ifndef __SYSTEM__H
2#define __SYSTEM__H 2#define __SYSTEM__H
3 3
4// for hardware types 4// for hardware types
5#include <net/if_arp.h> 5#include <net/if_arp.h>
6#include <qdict.h> 6#include <qdict.h>
7#include <qobject.h>
8#include <stdio.h>
7 9
8class ANetNodeInstance; 10class ANetNodeInstance;
9class QFile; 11class QFile;
10 12
11class InterfaceInfo { 13class InterfaceInfo {
12 14
13public : 15public :
14 16
15 InterfaceInfo() : 17 InterfaceInfo() :
16 Name(), 18 Name(),
17 MACAddress(), 19 MACAddress(),
18 BCastAddress(), 20 BCastAddress(),
19 Netmask(), 21 Netmask(),
20 DstAddress() { 22 DstAddress() {
21 } 23 }
22 24
23 ANetNodeInstance * assignedNode() 25 ANetNodeInstance * assignedNode()
24 { return NetNode; } 26 { return NetNode; }
25 27
26 void assignNode( ANetNodeInstance * NNI ) 28 void assignNode( ANetNodeInstance * NNI )
27 { NetNode = NNI; } 29 { NetNode = NNI; }
28 30
29 ANetNodeInstance * NetNode; // netnode taking care of me 31 ANetNodeInstance * NetNode; // netnode taking care of me
30 QString Name; // name of interface 32 QString Name; // name of interface
31 int CardType; // type of card 33 int CardType; // type of card
32 QString MACAddress; // MAC address 34 QString MACAddress; // MAC address
33 QString Address; // IP Address 35 QString Address; // IP Address
34 QString BCastAddress; // Broadcast Address 36 QString BCastAddress; // Broadcast Address
35 QString Netmask; // Netmask 37 QString Netmask; // Netmask
36 QString DstAddress; // Peer address (if P-t-P) 38 QString DstAddress; // Peer address (if P-t-P)
37 bool IsUp; // interface is UP 39 bool IsUp; // interface is UP
38 bool HasMulticast; // Supports Multicast 40 bool HasMulticast; // Supports Multicast
39 bool IsPointToPoint; // IsPointToPoint card 41 bool IsPointToPoint; // IsPointToPoint card
40 42
41 QString RcvBytes; 43 QString RcvBytes;
42 QString SndBytes; 44 QString SndBytes;
43 QString RcvErrors; 45 QString RcvErrors;
44 QString SndErrors; 46 QString SndErrors;
45 QString RcvDropped; 47 QString RcvDropped;
46 QString SndDropped; 48 QString SndDropped;
47 QString Collisions; 49 QString Collisions;
48}; 50};
49 51
50class System { 52class System : public QObject {
53
54 Q_OBJECT
51 55
52public : 56public :
53 57
54 System( void ); 58 System( void );
55 ~System( void ); 59 ~System( void );
56 60
57 QDict<InterfaceInfo> & interfaces( void ) 61 QDict<InterfaceInfo> & interfaces( void )
58 { return ProbedInterfaces; } 62 { return ProbedInterfaces; }
59 InterfaceInfo * interface( const QString& N ) 63 InterfaceInfo * interface( const QString& N )
60 { return ProbedInterfaces[N]; } 64 { return ProbedInterfaces[N]; }
61 65
62 // exec command as root 66 // exec command as root
63 int runAsRoot( const QString & S ); 67 int runAsRoot( const QString & S );
64 68
65 // exec command as user 69 // exec command as user
66 void execAsUser( QString & Cmd, char * argv[] ); 70 void execAsUser( QString & Cmd, char * argv[] );
67 71
68 // refresh stats for this interface 72 // refresh stats for this interface
69 void refreshStatistics( InterfaceInfo & ); 73 void refreshStatistics( InterfaceInfo & );
70 74
71 // reloads interfaces 75 // reloads interfaces
72 void probeInterfaces( void ); 76 void probeInterfaces( void );
73 77
78signals :
79
80 void lineFromCommand( const QString & S );
81
74private : 82private :
75 83
76 QDict<InterfaceInfo> ProbedInterfaces; 84 QDict<InterfaceInfo> ProbedInterfaces;
85 FILE * OutputOfCmd;
77 QFile * ProcDevNet; 86 QFile * ProcDevNet;
78 87
79}; 88};
80 89
81#endif 90#endif
diff --git a/noncore/settings/networksettings2/networksettingsGUI.ui b/noncore/settings/networksettings2/networksettingsGUI.ui
index 7ef2f64..6ed29f3 100644
--- a/noncore/settings/networksettings2/networksettingsGUI.ui
+++ b/noncore/settings/networksettings2/networksettingsGUI.ui
@@ -1,630 +1,572 @@
1<!DOCTYPE UI><UI> 1<!DOCTYPE UI><UI>
2<class>NetworkSettingsGUI</class> 2<class>NetworkSettingsGUI</class>
3<widget> 3<widget>
4 <class>QWidget</class> 4 <class>QWidget</class>
5 <property stdset="1"> 5 <property stdset="1">
6 <name>name</name> 6 <name>name</name>
7 <cstring>NetworkSettingsGUI</cstring> 7 <cstring>NetworkSettingsGUI</cstring>
8 </property> 8 </property>
9 <property stdset="1"> 9 <property stdset="1">
10 <name>geometry</name> 10 <name>geometry</name>
11 <rect> 11 <rect>
12 <x>0</x> 12 <x>0</x>
13 <y>0</y> 13 <y>0</y>
14 <width>160</width> 14 <width>144</width>
15 <height>260</height> 15 <height>260</height>
16 </rect> 16 </rect>
17 </property> 17 </property>
18 <property stdset="1"> 18 <property stdset="1">
19 <name>caption</name> 19 <name>caption</name>
20 <string>Network Settings</string> 20 <string>Network Settings</string>
21 </property> 21 </property>
22 <property> 22 <property>
23 <name>layoutMargin</name> 23 <name>layoutMargin</name>
24 </property> 24 </property>
25 <property> 25 <property>
26 <name>layoutSpacing</name> 26 <name>layoutSpacing</name>
27 </property> 27 </property>
28 <vbox> 28 <vbox>
29 <property stdset="1"> 29 <property stdset="1">
30 <name>margin</name> 30 <name>margin</name>
31 <number>0</number> 31 <number>2</number>
32 </property> 32 </property>
33 <property stdset="1"> 33 <property stdset="1">
34 <name>spacing</name> 34 <name>spacing</name>
35 <number>2</number> 35 <number>2</number>
36 </property> 36 </property>
37 <widget> 37 <widget>
38 <class>QFrame</class> 38 <class>QFrame</class>
39 <property stdset="1"> 39 <property stdset="1">
40 <name>name</name> 40 <name>name</name>
41 <cstring>Frame4</cstring> 41 <cstring>Frame4</cstring>
42 </property> 42 </property>
43 <property stdset="1"> 43 <property stdset="1">
44 <name>sizePolicy</name> 44 <name>sizePolicy</name>
45 <sizepolicy> 45 <sizepolicy>
46 <hsizetype>7</hsizetype> 46 <hsizetype>7</hsizetype>
47 <vsizetype>0</vsizetype> 47 <vsizetype>0</vsizetype>
48 </sizepolicy> 48 </sizepolicy>
49 </property> 49 </property>
50 <property stdset="1"> 50 <property stdset="1">
51 <name>frameShape</name> 51 <name>frameShape</name>
52 <enum>NoFrame</enum> 52 <enum>NoFrame</enum>
53 </property> 53 </property>
54 <property stdset="1"> 54 <property stdset="1">
55 <name>frameShadow</name> 55 <name>frameShadow</name>
56 <enum>Raised</enum> 56 <enum>Raised</enum>
57 </property> 57 </property>
58 <property> 58 <property>
59 <name>layoutMargin</name> 59 <name>layoutMargin</name>
60 </property> 60 </property>
61 <property> 61 <property>
62 <name>layoutSpacing</name> 62 <name>layoutSpacing</name>
63 </property> 63 </property>
64 <hbox> 64 <hbox>
65 <property stdset="1"> 65 <property stdset="1">
66 <name>margin</name> 66 <name>margin</name>
67 <number>0</number> 67 <number>0</number>
68 </property> 68 </property>
69 <property stdset="1"> 69 <property stdset="1">
70 <name>spacing</name> 70 <name>spacing</name>
71 <number>1</number> 71 <number>1</number>
72 </property> 72 </property>
73 <widget> 73 <widget>
74 <class>QToolButton</class> 74 <class>QToolButton</class>
75 <property stdset="1"> 75 <property stdset="1">
76 <name>name</name> 76 <name>name</name>
77 <cstring>Add_TB</cstring> 77 <cstring>Add_TB</cstring>
78 </property> 78 </property>
79 <property stdset="1"> 79 <property stdset="1">
80 <name>sizePolicy</name> 80 <name>sizePolicy</name>
81 <sizepolicy> 81 <sizepolicy>
82 <hsizetype>0</hsizetype> 82 <hsizetype>0</hsizetype>
83 <vsizetype>0</vsizetype> 83 <vsizetype>0</vsizetype>
84 </sizepolicy> 84 </sizepolicy>
85 </property> 85 </property>
86 <property stdset="1"> 86 <property stdset="1">
87 <name>text</name> 87 <name>text</name>
88 <string>...</string> 88 <string>...</string>
89 </property> 89 </property>
90 </widget> 90 </widget>
91 <widget> 91 <widget>
92 <class>QToolButton</class> 92 <class>QToolButton</class>
93 <property stdset="1"> 93 <property stdset="1">
94 <name>name</name> 94 <name>name</name>
95 <cstring>Delete_TB</cstring> 95 <cstring>Delete_TB</cstring>
96 </property> 96 </property>
97 <property stdset="1"> 97 <property stdset="1">
98 <name>sizePolicy</name> 98 <name>sizePolicy</name>
99 <sizepolicy> 99 <sizepolicy>
100 <hsizetype>0</hsizetype> 100 <hsizetype>0</hsizetype>
101 <vsizetype>0</vsizetype> 101 <vsizetype>0</vsizetype>
102 </sizepolicy> 102 </sizepolicy>
103 </property> 103 </property>
104 <property stdset="1"> 104 <property stdset="1">
105 <name>text</name> 105 <name>text</name>
106 <string>...</string> 106 <string>...</string>
107 </property> 107 </property>
108 </widget> 108 </widget>
109 <widget> 109 <widget>
110 <class>QToolButton</class> 110 <class>QToolButton</class>
111 <property stdset="1"> 111 <property stdset="1">
112 <name>name</name> 112 <name>name</name>
113 <cstring>CheckState_TB</cstring> 113 <cstring>CheckState_TB</cstring>
114 </property> 114 </property>
115 <property stdset="1"> 115 <property stdset="1">
116 <name>sizePolicy</name> 116 <name>sizePolicy</name>
117 <sizepolicy> 117 <sizepolicy>
118 <hsizetype>0</hsizetype> 118 <hsizetype>0</hsizetype>
119 <vsizetype>0</vsizetype> 119 <vsizetype>0</vsizetype>
120 </sizepolicy> 120 </sizepolicy>
121 </property> 121 </property>
122 <property stdset="1"> 122 <property stdset="1">
123 <name>text</name> 123 <name>text</name>
124 <string>...</string> 124 <string>...</string>
125 </property> 125 </property>
126 </widget> 126 </widget>
127 <widget> 127 <widget>
128 <class>QToolButton</class> 128 <class>QToolButton</class>
129 <property stdset="1"> 129 <property stdset="1">
130 <name>name</name> 130 <name>name</name>
131 <cstring>GenConfig_TB</cstring> 131 <cstring>GenConfig_TB</cstring>
132 </property> 132 </property>
133 <property stdset="1"> 133 <property stdset="1">
134 <name>sizePolicy</name> 134 <name>sizePolicy</name>
135 <sizepolicy> 135 <sizepolicy>
136 <hsizetype>0</hsizetype> 136 <hsizetype>0</hsizetype>
137 <vsizetype>0</vsizetype> 137 <vsizetype>0</vsizetype>
138 </sizepolicy> 138 </sizepolicy>
139 </property> 139 </property>
140 <property stdset="1"> 140 <property stdset="1">
141 <name>text</name> 141 <name>text</name>
142 <string>...</string> 142 <string>...</string>
143 </property> 143 </property>
144 </widget> 144 </widget>
145 <spacer> 145 <spacer>
146 <property> 146 <property>
147 <name>name</name> 147 <name>name</name>
148 <cstring>Spacer1</cstring> 148 <cstring>Spacer1</cstring>
149 </property> 149 </property>
150 <property stdset="1"> 150 <property stdset="1">
151 <name>orientation</name> 151 <name>orientation</name>
152 <enum>Horizontal</enum> 152 <enum>Horizontal</enum>
153 </property> 153 </property>
154 <property stdset="1"> 154 <property stdset="1">
155 <name>sizeType</name> 155 <name>sizeType</name>
156 <enum>Expanding</enum> 156 <enum>Expanding</enum>
157 </property> 157 </property>
158 <property> 158 <property>
159 <name>sizeHint</name> 159 <name>sizeHint</name>
160 <size> 160 <size>
161 <width>20</width> 161 <width>20</width>
162 <height>20</height> 162 <height>20</height>
163 </size> 163 </size>
164 </property> 164 </property>
165 </spacer> 165 </spacer>
166 <widget> 166 <widget>
167 <class>QToolButton</class> 167 <class>QToolButton</class>
168 <property stdset="1"> 168 <property stdset="1">
169 <name>name</name> 169 <name>name</name>
170 <cstring>Enable_TB</cstring> 170 <cstring>Enable_TB</cstring>
171 </property> 171 </property>
172 <property stdset="1"> 172 <property stdset="1">
173 <name>sizePolicy</name> 173 <name>sizePolicy</name>
174 <sizepolicy> 174 <sizepolicy>
175 <hsizetype>0</hsizetype> 175 <hsizetype>0</hsizetype>
176 <vsizetype>0</vsizetype> 176 <vsizetype>0</vsizetype>
177 </sizepolicy> 177 </sizepolicy>
178 </property> 178 </property>
179 <property stdset="1"> 179 <property stdset="1">
180 <name>text</name> 180 <name>text</name>
181 <string>...</string> 181 <string>...</string>
182 </property> 182 </property>
183 <property stdset="1"> 183 <property stdset="1">
184 <name>toggleButton</name> 184 <name>toggleButton</name>
185 <bool>true</bool> 185 <bool>true</bool>
186 </property> 186 </property>
187 <property stdset="1"> 187 <property stdset="1">
188 <name>toggleButton</name> 188 <name>toggleButton</name>
189 <bool>true</bool> 189 <bool>true</bool>
190 </property> 190 </property>
191 </widget> 191 </widget>
192 <widget> 192 <widget>
193 <class>QToolButton</class> 193 <class>QToolButton</class>
194 <property stdset="1"> 194 <property stdset="1">
195 <name>name</name> 195 <name>name</name>
196 <cstring>On_TB</cstring> 196 <cstring>On_TB</cstring>
197 </property> 197 </property>
198 <property stdset="1"> 198 <property stdset="1">
199 <name>sizePolicy</name> 199 <name>sizePolicy</name>
200 <sizepolicy> 200 <sizepolicy>
201 <hsizetype>0</hsizetype> 201 <hsizetype>0</hsizetype>
202 <vsizetype>0</vsizetype> 202 <vsizetype>0</vsizetype>
203 </sizepolicy> 203 </sizepolicy>
204 </property> 204 </property>
205 <property stdset="1"> 205 <property stdset="1">
206 <name>text</name> 206 <name>text</name>
207 <string>...</string> 207 <string>...</string>
208 </property> 208 </property>
209 <property stdset="1"> 209 <property stdset="1">
210 <name>toggleButton</name> 210 <name>toggleButton</name>
211 <bool>true</bool> 211 <bool>true</bool>
212 </property> 212 </property>
213 <property stdset="1"> 213 <property stdset="1">
214 <name>toggleButton</name> 214 <name>toggleButton</name>
215 <bool>true</bool> 215 <bool>true</bool>
216 </property> 216 </property>
217 </widget> 217 </widget>
218 <widget> 218 <widget>
219 <class>QToolButton</class> 219 <class>QToolButton</class>
220 <property stdset="1"> 220 <property stdset="1">
221 <name>name</name> 221 <name>name</name>
222 <cstring>Connect_TB</cstring> 222 <cstring>Connect_TB</cstring>
223 </property> 223 </property>
224 <property stdset="1"> 224 <property stdset="1">
225 <name>sizePolicy</name> 225 <name>sizePolicy</name>
226 <sizepolicy> 226 <sizepolicy>
227 <hsizetype>0</hsizetype> 227 <hsizetype>0</hsizetype>
228 <vsizetype>0</vsizetype> 228 <vsizetype>0</vsizetype>
229 </sizepolicy> 229 </sizepolicy>
230 </property> 230 </property>
231 <property stdset="1"> 231 <property stdset="1">
232 <name>text</name> 232 <name>text</name>
233 <string>...</string> 233 <string>...</string>
234 </property> 234 </property>
235 <property stdset="1"> 235 <property stdset="1">
236 <name>toggleButton</name> 236 <name>toggleButton</name>
237 <bool>true</bool> 237 <bool>true</bool>
238 </property> 238 </property>
239 <property stdset="1"> 239 <property stdset="1">
240 <name>toggleButton</name> 240 <name>toggleButton</name>
241 <bool>true</bool> 241 <bool>true</bool>
242 </property> 242 </property>
243 </widget> 243 </widget>
244 <widget> 244 <widget>
245 <class>QToolButton</class> 245 <class>QToolButton</class>
246 <property stdset="1"> 246 <property stdset="1">
247 <name>name</name> 247 <name>name</name>
248 <cstring>Disconnect_TB</cstring> 248 <cstring>Disconnect_TB</cstring>
249 </property> 249 </property>
250 <property stdset="1"> 250 <property stdset="1">
251 <name>sizePolicy</name> 251 <name>sizePolicy</name>
252 <sizepolicy> 252 <sizepolicy>
253 <hsizetype>0</hsizetype> 253 <hsizetype>0</hsizetype>
254 <vsizetype>0</vsizetype> 254 <vsizetype>0</vsizetype>
255 </sizepolicy> 255 </sizepolicy>
256 </property> 256 </property>
257 <property stdset="1"> 257 <property stdset="1">
258 <name>text</name> 258 <name>text</name>
259 <string>...</string> 259 <string>...</string>
260 </property> 260 </property>
261 <property stdset="1"> 261 <property stdset="1">
262 <name>toggleButton</name> 262 <name>toggleButton</name>
263 <bool>true</bool> 263 <bool>true</bool>
264 </property> 264 </property>
265 <property stdset="1"> 265 <property stdset="1">
266 <name>toggleButton</name> 266 <name>toggleButton</name>
267 <bool>true</bool> 267 <bool>true</bool>
268 </property> 268 </property>
269 </widget> 269 </widget>
270 </hbox> 270 </hbox>
271 </widget> 271 </widget>
272 <widget> 272 <widget>
273 <class>QListBox</class> 273 <class>QListBox</class>
274 <property stdset="1"> 274 <property stdset="1">
275 <name>name</name> 275 <name>name</name>
276 <cstring>Profiles_LB</cstring> 276 <cstring>Profiles_LB</cstring>
277 </property> 277 </property>
278 </widget> 278 </widget>
279 <widget> 279 <widget>
280 <class>QGroupBox</class> 280 <class>QGroupBox</class>
281 <property stdset="1"> 281 <property stdset="1">
282 <name>name</name> 282 <name>name</name>
283 <cstring>Profile_GB</cstring> 283 <cstring>Profile_GB</cstring>
284 </property> 284 </property>
285 <property stdset="1"> 285 <property stdset="1">
286 <name>title</name> 286 <name>title</name>
287 <string>Profile</string> 287 <string>Profile</string>
288 </property> 288 </property>
289 <property> 289 <property>
290 <name>layoutMargin</name> 290 <name>layoutMargin</name>
291 </property> 291 </property>
292 <property> 292 <property>
293 <name>layoutSpacing</name> 293 <name>layoutSpacing</name>
294 </property> 294 </property>
295 <vbox> 295 <vbox>
296 <property stdset="1"> 296 <property stdset="1">
297 <name>margin</name> 297 <name>margin</name>
298 <number>4</number> 298 <number>4</number>
299 </property> 299 </property>
300 <property stdset="1"> 300 <property stdset="1">
301 <name>spacing</name> 301 <name>spacing</name>
302 <number>2</number> 302 <number>2</number>
303 </property> 303 </property>
304 <widget> 304 <widget>
305 <class>QLayoutWidget</class>
306 <property stdset="1">
307 <name>name</name>
308 <cstring>Layout3</cstring>
309 </property>
310 <hbox>
311 <property stdset="1">
312 <name>margin</name>
313 <number>0</number>
314 </property>
315 <property stdset="1">
316 <name>spacing</name>
317 <number>6</number>
318 </property>
319 <widget>
320 <class>QLabel</class>
321 <property stdset="1">
322 <name>name</name>
323 <cstring>TextLabel2_2</cstring>
324 </property>
325 <property stdset="1">
326 <name>text</name>
327 <string>State</string>
328 </property>
329 </widget>
330 <widget>
331 <class>QLabel</class>
332 <property stdset="1">
333 <name>name</name>
334 <cstring>State_LBL</cstring>
335 </property>
336 <property stdset="1">
337 <name>text</name>
338 <string>State</string>
339 </property>
340 <property stdset="1">
341 <name>indent</name>
342 <number>0</number>
343 </property>
344 </widget>
345 <spacer>
346 <property>
347 <name>name</name>
348 <cstring>Spacer6_2</cstring>
349 </property>
350 <property stdset="1">
351 <name>orientation</name>
352 <enum>Horizontal</enum>
353 </property>
354 <property stdset="1">
355 <name>sizeType</name>
356 <enum>Expanding</enum>
357 </property>
358 <property>
359 <name>sizeHint</name>
360 <size>
361 <width>20</width>
362 <height>20</height>
363 </size>
364 </property>
365 </spacer>
366 </hbox>
367 </widget>
368 <widget>
369 <class>QLabel</class> 305 <class>QLabel</class>
370 <property stdset="1"> 306 <property stdset="1">
371 <name>name</name> 307 <name>name</name>
372 <cstring>Description_LBL</cstring> 308 <cstring>Description_LBL</cstring>
373 </property> 309 </property>
374 <property stdset="1"> 310 <property stdset="1">
375 <name>sizePolicy</name> 311 <name>sizePolicy</name>
376 <sizepolicy> 312 <sizepolicy>
377 <hsizetype>5</hsizetype> 313 <hsizetype>5</hsizetype>
378 <vsizetype>7</vsizetype> 314 <vsizetype>7</vsizetype>
379 </sizepolicy> 315 </sizepolicy>
380 </property> 316 </property>
381 <property stdset="1"> 317 <property stdset="1">
382 <name>frameShape</name> 318 <name>frameShape</name>
383 <enum>NoFrame</enum> 319 <enum>NoFrame</enum>
384 </property> 320 </property>
385 <property stdset="1"> 321 <property stdset="1">
386 <name>frameShadow</name> 322 <name>frameShadow</name>
387 <enum>Raised</enum> 323 <enum>Raised</enum>
388 </property> 324 </property>
389 <property stdset="1"> 325 <property stdset="1">
390 <name>text</name> 326 <name>text</name>
391 <string></string> 327 <string></string>
392 </property> 328 </property>
393 <property stdset="1"> 329 <property stdset="1">
394 <name>alignment</name> 330 <name>alignment</name>
395 <set>AlignTop|AlignLeft</set> 331 <set>AlignTop|AlignLeft</set>
396 </property> 332 </property>
397 <property> 333 <property>
398 <name>vAlign</name> 334 <name>vAlign</name>
399 </property> 335 </property>
400 </widget> 336 </widget>
401 <widget> 337 <widget>
402 <class>QLayoutWidget</class> 338 <class>QLayoutWidget</class>
403 <property stdset="1"> 339 <property stdset="1">
404 <name>name</name> 340 <name>name</name>
405 <cstring>Layout4</cstring> 341 <cstring>Layout4</cstring>
406 </property> 342 </property>
407 <hbox> 343 <hbox>
408 <property stdset="1"> 344 <property stdset="1">
409 <name>margin</name> 345 <name>margin</name>
410 <number>0</number> 346 <number>0</number>
411 </property> 347 </property>
412 <property stdset="1"> 348 <property stdset="1">
413 <name>spacing</name> 349 <name>spacing</name>
414 <number>6</number> 350 <number>6</number>
415 </property> 351 </property>
416 <spacer> 352 <spacer>
417 <property> 353 <property>
418 <name>name</name> 354 <name>name</name>
419 <cstring>Spacer4</cstring> 355 <cstring>Spacer4</cstring>
420 </property> 356 </property>
421 <property stdset="1"> 357 <property stdset="1">
422 <name>orientation</name> 358 <name>orientation</name>
423 <enum>Horizontal</enum> 359 <enum>Horizontal</enum>
424 </property> 360 </property>
425 <property stdset="1"> 361 <property stdset="1">
426 <name>sizeType</name> 362 <name>sizeType</name>
427 <enum>Expanding</enum> 363 <enum>Expanding</enum>
428 </property> 364 </property>
429 <property> 365 <property>
430 <name>sizeHint</name> 366 <name>sizeHint</name>
431 <size> 367 <size>
432 <width>20</width> 368 <width>20</width>
433 <height>20</height> 369 <height>20</height>
434 </size> 370 </size>
435 </property> 371 </property>
436 </spacer> 372 </spacer>
437 <widget> 373 <widget>
438 <class>QPushButton</class> 374 <class>QPushButton</class>
439 <property stdset="1"> 375 <property stdset="1">
440 <name>name</name> 376 <name>name</name>
441 <cstring>ToMessages_BUT</cstring> 377 <cstring>ToMessages_BUT</cstring>
442 </property> 378 </property>
443 <property stdset="1"> 379 <property stdset="1">
444 <name>sizePolicy</name> 380 <name>sizePolicy</name>
445 <sizepolicy> 381 <sizepolicy>
446 <hsizetype>1</hsizetype> 382 <hsizetype>1</hsizetype>
447 <vsizetype>0</vsizetype> 383 <vsizetype>0</vsizetype>
448 </sizepolicy> 384 </sizepolicy>
449 </property> 385 </property>
450 <property stdset="1"> 386 <property stdset="1">
451 <name>text</name> 387 <name>text</name>
452 <string>Messages ...</string> 388 <string>Messages ...</string>
453 </property> 389 </property>
454 </widget> 390 </widget>
455 </hbox> 391 </hbox>
456 </widget> 392 </widget>
457 </vbox> 393 </vbox>
458 </widget> 394 </widget>
459 <widget> 395 <widget>
460 <class>QGroupBox</class> 396 <class>QGroupBox</class>
461 <property stdset="1"> 397 <property stdset="1">
462 <name>name</name> 398 <name>name</name>
463 <cstring>Messages_GB</cstring> 399 <cstring>Messages_GB</cstring>
464 </property> 400 </property>
465 <property stdset="1"> 401 <property stdset="1">
466 <name>title</name> 402 <name>title</name>
467 <string>Messages</string> 403 <string>Messages</string>
468 </property> 404 </property>
469 <property> 405 <property>
470 <name>layoutMargin</name> 406 <name>layoutMargin</name>
471 </property> 407 </property>
472 <property> 408 <property>
473 <name>layoutSpacing</name> 409 <name>layoutSpacing</name>
474 </property> 410 </property>
475 <vbox> 411 <vbox>
476 <property stdset="1"> 412 <property stdset="1">
477 <name>margin</name> 413 <name>margin</name>
478 <number>4</number> 414 <number>4</number>
479 </property> 415 </property>
480 <property stdset="1"> 416 <property stdset="1">
481 <name>spacing</name> 417 <name>spacing</name>
482 <number>2</number> 418 <number>2</number>
483 </property> 419 </property>
484 <widget> 420 <widget>
485 <class>QListBox</class> 421 <class>QListBox</class>
486 <property stdset="1"> 422 <property stdset="1">
487 <name>name</name> 423 <name>name</name>
488 <cstring>Mesages_LB</cstring> 424 <cstring>Messages_LB</cstring>
489 </property> 425 </property>
490 </widget> 426 </widget>
491 <widget> 427 <widget>
492 <class>QLayoutWidget</class> 428 <class>QLayoutWidget</class>
493 <property stdset="1"> 429 <property stdset="1">
494 <name>name</name> 430 <name>name</name>
495 <cstring>Layout2</cstring> 431 <cstring>Layout2</cstring>
496 </property> 432 </property>
497 <hbox> 433 <hbox>
498 <property stdset="1"> 434 <property stdset="1">
499 <name>margin</name> 435 <name>margin</name>
500 <number>0</number> 436 <number>0</number>
501 </property> 437 </property>
502 <property stdset="1"> 438 <property stdset="1">
503 <name>spacing</name> 439 <name>spacing</name>
504 <number>6</number> 440 <number>6</number>
505 </property> 441 </property>
506 <spacer> 442 <spacer>
507 <property> 443 <property>
508 <name>name</name> 444 <name>name</name>
509 <cstring>Spacer3</cstring> 445 <cstring>Spacer3</cstring>
510 </property> 446 </property>
511 <property stdset="1"> 447 <property stdset="1">
512 <name>orientation</name> 448 <name>orientation</name>
513 <enum>Horizontal</enum> 449 <enum>Horizontal</enum>
514 </property> 450 </property>
515 <property stdset="1"> 451 <property stdset="1">
516 <name>sizeType</name> 452 <name>sizeType</name>
517 <enum>Expanding</enum> 453 <enum>Expanding</enum>
518 </property> 454 </property>
519 <property> 455 <property>
520 <name>sizeHint</name> 456 <name>sizeHint</name>
521 <size> 457 <size>
522 <width>20</width> 458 <width>20</width>
523 <height>20</height> 459 <height>20</height>
524 </size> 460 </size>
525 </property> 461 </property>
526 </spacer> 462 </spacer>
527 <widget> 463 <widget>
528 <class>QPushButton</class> 464 <class>QPushButton</class>
529 <property stdset="1"> 465 <property stdset="1">
530 <name>name</name> 466 <name>name</name>
531 <cstring>ToProfile_BUT</cstring> 467 <cstring>ToProfile_BUT</cstring>
532 </property> 468 </property>
533 <property stdset="1"> 469 <property stdset="1">
534 <name>text</name> 470 <name>text</name>
535 <string>Profile ...</string> 471 <string>Profile ...</string>
536 </property> 472 </property>
537 </widget> 473 </widget>
538 </hbox> 474 </hbox>
539 </widget> 475 </widget>
540 </vbox> 476 </vbox>
541 </widget> 477 </widget>
542 </vbox> 478 </vbox>
543</widget> 479</widget>
544<connections> 480<connections>
545 <connection> 481 <connection>
546 <sender>Add_TB</sender> 482 <sender>Add_TB</sender>
547 <signal>clicked()</signal> 483 <signal>clicked()</signal>
548 <receiver>NetworkSettingsGUI</receiver> 484 <receiver>NetworkSettingsGUI</receiver>
549 <slot>SLOT_AddNode()</slot> 485 <slot>SLOT_AddNode()</slot>
550 </connection> 486 </connection>
551 <connection> 487 <connection>
552 <sender>Delete_TB</sender> 488 <sender>Delete_TB</sender>
553 <signal>clicked()</signal> 489 <signal>clicked()</signal>
554 <receiver>NetworkSettingsGUI</receiver> 490 <receiver>NetworkSettingsGUI</receiver>
555 <slot>SLOT_DeleteNode()</slot> 491 <slot>SLOT_DeleteNode()</slot>
556 </connection> 492 </connection>
557 <connection> 493 <connection>
558 <sender>CheckState_TB</sender> 494 <sender>CheckState_TB</sender>
559 <signal>clicked()</signal> 495 <signal>clicked()</signal>
560 <receiver>NetworkSettingsGUI</receiver> 496 <receiver>NetworkSettingsGUI</receiver>
561 <slot>SLOT_CheckState()</slot> 497 <slot>SLOT_CheckState()</slot>
562 </connection> 498 </connection>
563 <connection> 499 <connection>
564 <sender>Enable_TB</sender> 500 <sender>Enable_TB</sender>
565 <signal>clicked()</signal> 501 <signal>clicked()</signal>
566 <receiver>NetworkSettingsGUI</receiver> 502 <receiver>NetworkSettingsGUI</receiver>
567 <slot>SLOT_Enable()</slot> 503 <slot>SLOT_Enable()</slot>
568 </connection> 504 </connection>
569 <connection> 505 <connection>
570 <sender>Connect_TB</sender> 506 <sender>Connect_TB</sender>
571 <signal>clicked()</signal> 507 <signal>clicked()</signal>
572 <receiver>NetworkSettingsGUI</receiver> 508 <receiver>NetworkSettingsGUI</receiver>
573 <slot>SLOT_Connect()</slot> 509 <slot>SLOT_Connect()</slot>
574 </connection> 510 </connection>
575 <connection> 511 <connection>
576 <sender>On_TB</sender> 512 <sender>On_TB</sender>
577 <signal>clicked()</signal> 513 <signal>clicked()</signal>
578 <receiver>NetworkSettingsGUI</receiver> 514 <receiver>NetworkSettingsGUI</receiver>
579 <slot>SLOT_On()</slot> 515 <slot>SLOT_On()</slot>
580 </connection> 516 </connection>
581 <connection> 517 <connection>
582 <sender>GenConfig_TB</sender> 518 <sender>GenConfig_TB</sender>
583 <signal>clicked()</signal> 519 <signal>clicked()</signal>
584 <receiver>NetworkSettingsGUI</receiver> 520 <receiver>NetworkSettingsGUI</receiver>
585 <slot>SLOT_GenerateConfig()</slot> 521 <slot>SLOT_GenerateConfig()</slot>
586 </connection> 522 </connection>
587 <connection> 523 <connection>
588 <sender>Profiles_LB</sender> 524 <sender>Profiles_LB</sender>
589 <signal>clicked(QListBoxItem*)</signal> 525 <signal>clicked(QListBoxItem*)</signal>
590 <receiver>NetworkSettingsGUI</receiver> 526 <receiver>NetworkSettingsGUI</receiver>
591 <slot>SLOT_ShowNode( QListBoxItem*)</slot> 527 <slot>SLOT_ShowNode( QListBoxItem*)</slot>
592 </connection> 528 </connection>
593 <connection> 529 <connection>
594 <sender>Profiles_LB</sender> 530 <sender>Profiles_LB</sender>
595 <signal>currentChanged(QListBoxItem*)</signal> 531 <signal>currentChanged(QListBoxItem*)</signal>
596 <receiver>NetworkSettingsGUI</receiver> 532 <receiver>NetworkSettingsGUI</receiver>
597 <slot>SLOT_ShowNode( QListBoxItem*)</slot> 533 <slot>SLOT_ShowNode( QListBoxItem*)</slot>
598 </connection> 534 </connection>
599 <connection> 535 <connection>
600 <sender>Profiles_LB</sender> 536 <sender>Profiles_LB</sender>
601 <signal>doubleClicked(QListBoxItem*)</signal> 537 <signal>doubleClicked(QListBoxItem*)</signal>
602 <receiver>NetworkSettingsGUI</receiver> 538 <receiver>NetworkSettingsGUI</receiver>
603 <slot>SLOT_EditNode( QListBoxItem *)</slot> 539 <slot>SLOT_EditNode( QListBoxItem *)</slot>
604 </connection> 540 </connection>
605 <connection> 541 <connection>
606 <sender>ToProfile_BUT</sender> 542 <sender>ToProfile_BUT</sender>
607 <signal>clicked()</signal> 543 <signal>clicked()</signal>
608 <receiver>NetworkSettingsGUI</receiver> 544 <receiver>NetworkSettingsGUI</receiver>
609 <slot>SLOT_ToProfile()</slot> 545 <slot>SLOT_ToProfile()</slot>
610 </connection> 546 </connection>
611 <connection> 547 <connection>
612 <sender>ToMessages_BUT</sender> 548 <sender>ToMessages_BUT</sender>
613 <signal>clicked()</signal> 549 <signal>clicked()</signal>
614 <receiver>NetworkSettingsGUI</receiver> 550 <receiver>NetworkSettingsGUI</receiver>
615 <slot>SLOT_ToMessages()</slot> 551 <slot>SLOT_ToMessages()</slot>
616 </connection> 552 </connection>
553 <connection>
554 <sender>Disconnect_TB</sender>
555 <signal>clicked()</signal>
556 <receiver>NetworkSettingsGUI</receiver>
557 <slot>SLOT_Disconnect()</slot>
558 </connection>
617 <slot access="public">SLOT_AddNode()</slot> 559 <slot access="public">SLOT_AddNode()</slot>
618 <slot access="public">SLOT_CheckState()</slot> 560 <slot access="public">SLOT_CheckState()</slot>
619 <slot access="public">SLOT_Connect()</slot> 561 <slot access="public">SLOT_Connect()</slot>
620 <slot access="public">SLOT_DeleteNode()</slot> 562 <slot access="public">SLOT_DeleteNode()</slot>
621 <slot access="public">SLOT_EditNode( QListBoxItem *)</slot> 563 <slot access="public">SLOT_EditNode( QListBoxItem *)</slot>
622 <slot access="public">SLOT_Enable()</slot> 564 <slot access="public">SLOT_Enable()</slot>
623 <slot access="public">SLOT_GenerateConfig()</slot> 565 <slot access="public">SLOT_GenerateConfig()</slot>
624 <slot access="public">SLOT_On()</slot> 566 <slot access="public">SLOT_On()</slot>
625 <slot access="public">SLOT_ShowNode( QListBoxItem*)</slot> 567 <slot access="public">SLOT_ShowNode( QListBoxItem*)</slot>
626 <slot access="public">SLOT_ToMessages()</slot> 568 <slot access="public">SLOT_ToMessages()</slot>
627 <slot access="public">SLOT_ToProfile()</slot> 569 <slot access="public">SLOT_ToProfile()</slot>
628 <slot access="public">SLOT_Disconnect()</slot> 570 <slot access="public">SLOT_Disconnect()</slot>
629</connections> 571</connections>
630</UI> 572</UI>
diff --git a/noncore/settings/networksettings2/nsdata.cpp b/noncore/settings/networksettings2/nsdata.cpp
index bb37f10..3b17548 100644
--- a/noncore/settings/networksettings2/nsdata.cpp
+++ b/noncore/settings/networksettings2/nsdata.cpp
@@ -1,582 +1,573 @@
1#include <stdlib.h> 1#include <stdlib.h>
2#include <qpe/qpeapplication.h> 2#include <qpe/qpeapplication.h>
3#include <qtextstream.h> 3#include <qtextstream.h>
4#include <qdir.h> 4#include <qdir.h>
5#include <qfile.h> 5#include <qfile.h>
6#include <qfileinfo.h> 6#include <qfileinfo.h>
7 7
8#include "nsdata.h" 8#include "nsdata.h"
9#include <asdevice.h> 9#include <asdevice.h>
10#include <resources.h> 10#include <resources.h>
11 11
12static QString CfgFile; 12static QString CfgFile;
13 13
14NetworkSettingsData::NetworkSettingsData( void ) { 14NetworkSettingsData::NetworkSettingsData( void ) {
15 // init global resources structure 15 // init global resources structure
16 new TheNSResources(); 16 new TheNSResources();
17 17
18 CfgFile.sprintf( "%s/Settings/NS2.conf", 18 CfgFile.sprintf( "%s/Settings/NS2.conf",
19 NSResources->currentUser().HomeDir.latin1() ); 19 NSResources->currentUser().HomeDir.latin1() );
20 fprintf( stderr, "Cfg from %s\n", CfgFile.latin1() ); 20 Log(( "Cfg from %s\n", CfgFile.latin1() ));
21 21
22 // load settings 22 // load settings
23 Force = 0; 23 Force = 0;
24 IsModified = 0; 24 IsModified = 0;
25 loadSettings(); 25 loadSettings();
26} 26}
27 27
28// saving is done by caller 28// saving is done by caller
29NetworkSettingsData::~NetworkSettingsData( void ) { 29NetworkSettingsData::~NetworkSettingsData( void ) {
30 delete NSResources; 30 delete NSResources;
31} 31}
32 32
33void NetworkSettingsData::loadSettings( void ) { 33void NetworkSettingsData::loadSettings( void ) {
34 QString Line, S; 34 QString Line, S;
35 QString Attr, Value; 35 QString Attr, Value;
36 long idx; 36 long idx;
37 37
38 QFile F( CfgFile ); 38 QFile F( CfgFile );
39 QTextStream TS( &F ); 39 QTextStream TS( &F );
40 40
41 do { 41 do {
42 42
43 if( ! F.open(IO_ReadOnly) ) 43 if( ! F.open(IO_ReadOnly) )
44 break; 44 break;
45 45
46 /* load the file -> 46 /* load the file ->
47 47
48 FORMAT : 48 FORMAT :
49 49
50 [NETNODETYPE] 50 [NETNODETYPE]
51 Entries ... 51 Entries ...
52 <EMPTYLINE> 52 <EMPTYLINE>
53 [connection] 53 [connection]
54 Name=Name 54 Name=Name
55 Node=Name 55 Node=Name
56 <EMPTYLINE> 56 <EMPTYLINE>
57 */ 57 */
58 while( ! TS.atEnd() ) { 58 while( ! TS.atEnd() ) {
59 S = Line = TS.readLine(); 59 S = Line = TS.readLine();
60 60
61 if ( S.isEmpty() || S[0] != '[' ) 61 if ( S.isEmpty() || S[0] != '[' )
62 continue; 62 continue;
63 63
64 S = S.mid( 1, S.length()-2 ); 64 S = S.mid( 1, S.length()-2 );
65 65
66 if( ! NSResources ) { 66 if( ! NSResources ) {
67 continue; 67 continue;
68 } 68 }
69 69
70 if( S == "connection" ) { 70 if( S == "connection" ) {
71 // load connections -> collections of nodes 71 // load connections -> collections of nodes
72 NodeCollection * NC = new NodeCollection( TS ); 72 NodeCollection * NC = new NodeCollection( TS );
73 NSResources->addConnection( NC ); 73 NSResources->addConnection( NC );
74 } else { 74 } else {
75 ANetNode * NN = 0; 75 ANetNode * NN = 0;
76 ANetNodeInstance* NNI = 0; 76 ANetNodeInstance* NNI = 0;
77 if( S.startsWith( "nodetype " ) ) { 77 if( S.startsWith( "nodetype " ) ) {
78 S = S.mid( 9, S.length()-9 ); 78 S = S.mid( 9, S.length()-9 );
79 S = deQuote(S); 79 S = deQuote(S);
80 // try to find netnode 80 // try to find netnode
81 NN = NSResources->findNetNode( S ); 81 NN = NSResources->findNetNode( S );
82 fprintf( stderr, "Node %s : %p\n", S.latin1(), NN ); 82 Log( ( "Node %s : %p\n", S.latin1(), NN ) );
83 } else { 83 } else {
84 // try to find instance 84 // try to find instance
85 NNI = NSResources->createNodeInstance( S ); 85 NNI = NSResources->createNodeInstance( S );
86 fprintf( stderr, "NodeInstance %s : %p\n", S.latin1(), NNI ); 86 Log( ( "NodeInstance %s : %p\n", S.latin1(), NNI ));
87 } 87 }
88 88
89 if( NN == 0 && NNI == 0 ) { 89 if( NN == 0 && NNI == 0 ) {
90 LeftOvers.append( Line ); 90 LeftOvers.append( Line );
91 } 91 }
92 92
93 do { 93 do {
94 S = Line = TS.readLine(); 94 S = Line = TS.readLine();
95 95
96 if( NN || NNI ) { 96 if( NN || NNI ) {
97 if( S.isEmpty() ) { 97 if( S.isEmpty() ) {
98 // empty line 98 // empty line
99 break; 99 break;
100 } 100 }
101 idx = S.find( '=' ); 101 idx = S.find( '=' );
102 if( idx > 0 ) { 102 if( idx > 0 ) {
103 Attr = S.left( idx ); 103 Attr = S.left( idx );
104 Value = S.mid( idx+1, S.length() ); 104 Value = S.mid( idx+1, S.length() );
105 } else { 105 } else {
106 Value=""; 106 Value="";
107 Attr = S; 107 Attr = S;
108 } 108 }
109 109
110 Value.stripWhiteSpace(); 110 Value.stripWhiteSpace();
111 Attr.stripWhiteSpace(); 111 Attr.stripWhiteSpace();
112 Attr.lower(); 112 Attr.lower();
113 // dequote Attr 113 // dequote Attr
114 Value = deQuote(Value); 114 Value = deQuote(Value);
115 115
116 if( NN ) { 116 if( NN ) {
117 // set the attribute 117 // set the attribute
118 NN->setAttribute( Attr, Value ); 118 NN->setAttribute( Attr, Value );
119 } else { 119 } else {
120 // set the attribute 120 // set the attribute
121 NNI->setAttribute( Attr, Value ); 121 NNI->setAttribute( Attr, Value );
122 } 122 }
123 } else { 123 } else {
124 LeftOvers.append( Line ); 124 LeftOvers.append( Line );
125 // add empty line too as delimiter 125 // add empty line too as delimiter
126 if( S.isEmpty() ) { 126 if( S.isEmpty() ) {
127 // empty line 127 // empty line
128 break; 128 break;
129 } 129 }
130 } 130 }
131 } while( 1 ); 131 } while( 1 );
132 132
133 if( NNI ) { 133 if( NNI ) {
134 // loading from file -> exists 134 // loading from file -> exists
135 NNI->setNew( FALSE ); 135 NNI->setNew( FALSE );
136 NSResources->addNodeInstance( NNI ); 136 NSResources->addNodeInstance( NNI );
137 } 137 }
138 } 138 }
139 } 139 }
140 140
141 } while( 0 ); 141 } while( 0 );
142 142
143} 143}
144 144
145QString NetworkSettingsData::saveSettings( void ) { 145QString NetworkSettingsData::saveSettings( void ) {
146 QString ErrS = ""; 146 QString ErrS = "";
147 147
148 if( ! isModified() ) 148 if( ! isModified() )
149 return ErrS; 149 return ErrS;
150 150
151 QString S; 151 QString S;
152 QFile F( CfgFile + ".bup" ); 152 QFile F( CfgFile + ".bup" );
153 153
154 printf( "Saving settings to %s\n", CfgFile.latin1() ); 154 Log( ( "Saving settings to %s\n", CfgFile.latin1() ));
155 if( ! F.open( IO_WriteOnly | IO_Truncate ) ) { 155 if( ! F.open( IO_WriteOnly | IO_Truncate ) ) {
156 ErrS = qApp->translate( "NetworkSettings", 156 ErrS = qApp->translate( "NetworkSettings",
157 "<p>Could not save setup to \"%1\" !</p>" ). 157 "<p>Could not save setup to \"%1\" !</p>" ).
158 arg(CfgFile); 158 arg(CfgFile);
159 // problem 159 // problem
160 return ErrS; 160 return ErrS;
161 } 161 }
162 162
163 QTextStream TS( &F ); 163 QTextStream TS( &F );
164 164
165 // save leftovers 165 // save leftovers
166 for ( QStringList::Iterator it = LeftOvers.begin(); 166 for ( QStringList::Iterator it = LeftOvers.begin();
167 it != LeftOvers.end(); ++it ) { 167 it != LeftOvers.end(); ++it ) {
168 TS << (*it) << endl; 168 TS << (*it) << endl;
169 } 169 }
170 170
171 // save global configs 171 // save global configs
172 for( QDictIterator<NetNode_t> it( NSResources->netNodes() ); 172 for( QDictIterator<NetNode_t> it( NSResources->netNodes() );
173 it.current(); 173 it.current();
174 ++it ) { 174 ++it ) {
175 TS << "[nodetype " 175 TS << "[nodetype "
176 << quote( QString( it.current()->NetNode->name() ) ) 176 << quote( QString( it.current()->NetNode->name() ) )
177 << "]" 177 << "]"
178 << endl; 178 << endl;
179 179
180 it.current()->NetNode->saveAttributes( TS ); 180 it.current()->NetNode->saveAttributes( TS );
181 TS << endl; 181 TS << endl;
182 } 182 }
183 183
184 { Name2Connection_t & M = NSResources->connections(); 184 { Name2Connection_t & M = NSResources->connections();
185 ANetNodeInstance * NNI; 185 ANetNodeInstance * NNI;
186 186
187 // for all connections 187 // for all connections
188 for( QDictIterator<NodeCollection> it(M); 188 for( QDictIterator<NodeCollection> it(M);
189 it.current(); 189 it.current();
190 ++it ) { 190 ++it ) {
191 // all nodes in those connections 191 // all nodes in those connections
192 for( QListIterator<ANetNodeInstance> nit(*(it.current())); 192 for( QListIterator<ANetNodeInstance> nit(*(it.current()));
193 nit.current(); 193 nit.current();
194 ++nit ) { 194 ++nit ) {
195 // header 195 // header
196 NNI = nit.current(); 196 NNI = nit.current();
197 TS << '[' 197 TS << '['
198 << QString(NNI->nodeClass()->name()) 198 << QString(NNI->nodeClass()->name())
199 << ']' 199 << ']'
200 << endl; 200 << endl;
201 NNI->saveAttributes( TS ); 201 NNI->saveAttributes( TS );
202 TS << endl; 202 TS << endl;
203 } 203 }
204 204
205 TS << "[connection]" << endl; 205 TS << "[connection]" << endl;
206 it.current()->save(TS); 206 it.current()->save(TS);
207 } 207 }
208 } 208 }
209 209
210 QDir D("."); 210 QDir D(".");
211 D.rename( CfgFile + ".bup", CfgFile ); 211 D.rename( CfgFile + ".bup", CfgFile );
212 212
213 // 213 //
214 // proper files AND system files regenerated 214 // proper files AND system files regenerated
215 // 215 //
216 216
217 setModified( 0 ); 217 setModified( 0 );
218 return ErrS; 218 return ErrS;
219} 219}
220 220
221QString NetworkSettingsData::generateSettings( bool ForceReq ) { 221QString NetworkSettingsData::generateSettings( bool ForceReq ) {
222 bool ForceIt; 222 bool ForceIt;
223 QString S = ""; 223 QString S = "";
224 224
225 // include own force flag 225 // include own force flag
226 ForceIt = (Force) ? 1 : ForceReq; 226 ForceIt = (Force) ? 1 : ForceReq;
227 227
228 if( ! ForceIt && ! isModified() ) 228 if( ! ForceIt && ! isModified() )
229 return S; 229 return S;
230 230
231 // regenerate system files 231 // regenerate system files
232 fprintf( stderr, "Generating settings from %s\n", CfgFile.latin1() ); 232 Log( ( "Generating settings from %s\n", CfgFile.latin1() ));
233 233
234 { Name2SystemFile_t & SFM = NSResources->systemFiles(); 234 { Name2SystemFile_t & SFM = NSResources->systemFiles();
235 Name2Connection_t & M = NSResources->connections(); 235 Name2Connection_t & M = NSResources->connections();
236 NodeCollection * NC; 236 NodeCollection * NC;
237 ANetNodeInstance * NNI; 237 ANetNodeInstance * NNI;
238 SystemFile * SF; 238 SystemFile * SF;
239 AsDevice * CurDev; 239 AsDevice * CurDev;
240 ANetNode * CurDevNN; 240 ANetNode * CurDevNN;
241 bool needToRegenerate = ForceIt; 241 bool needToRegenerate = ForceIt;
242 242
243 // 243 //
244 // check if we need to generate at least one of the system files 244 // check if we need to generate at least one of the system files
245 // 245 //
246 if( ! ForceIt ) { 246 if( ! ForceIt ) {
247 for( QDictIterator<SystemFile> sfit(SFM); 247 for( QDictIterator<SystemFile> sfit(SFM);
248 sfit.current(); 248 sfit.current();
249 ++sfit ) { 249 ++sfit ) {
250 SF = sfit.current(); 250 SF = sfit.current();
251 251
252 // check if there are nodes that are modified and require 252 // check if there are nodes that are modified and require
253 // data for this system file 253 // data for this system file
254 254
255 // for all connections 255 // for all connections
256 for( QDictIterator<NodeCollection> ncit(M); 256 for( QDictIterator<NodeCollection> ncit(M);
257 ncit.current(); 257 ncit.current();
258 ++ncit ) { 258 ++ncit ) {
259 NC = ncit.current(); 259 NC = ncit.current();
260 260
261 if( NC->isModified() ) { 261 if( NC->isModified() ) {
262 // does this connection 'touch' this system file ? 262 // does this connection 'touch' this system file ?
263 for( QListIterator<ANetNodeInstance> cncit(*NC); 263 for( QListIterator<ANetNodeInstance> cncit(*NC);
264 cncit.current(); 264 cncit.current();
265 ++cncit ) { 265 ++cncit ) {
266 NNI = cncit.current(); 266 NNI = cncit.current();
267 if( ( NNI->nodeClass()->hasDataFor( SF->name() ) || 267 if( ( NNI->nodeClass()->hasDataFor( SF->name() ) ||
268 NNI->hasDataFor( SF->name() ) 268 NNI->hasDataFor( SF->name() )
269 ) && 269 ) &&
270 NNI->isModified() ) { 270 NNI->isModified() ) {
271 needToRegenerate = 1; 271 needToRegenerate = 1;
272 break; 272 break;
273 } 273 }
274 } 274 }
275 } 275 }
276 if( needToRegenerate ) 276 if( needToRegenerate )
277 break; 277 break;
278 } 278 }
279 if( needToRegenerate ) 279 if( needToRegenerate )
280 break; 280 break;
281 } 281 }
282 } 282 }
283 283
284 // we cannot renumber with a FORCE request since
285 // we probably are NOT going to save the config
286 // e.g. when using --regen option
287 if( ! ForceReq && needToRegenerate ) {
288 NSResources->renumberConnections();
289 setModified(1);
290 }
291
292 // 284 //
293 // generate files proper to each netnodeinstance 285 // generate files proper to each netnodeinstance
294 // 286 //
295 { Name2Instance_t & NNIs = NSResources->netNodeInstances(); 287 { Name2Instance_t & NNIs = NSResources->netNodeInstances();
296 288
297 for( QDictIterator<ANetNodeInstance> NNIIt(NNIs); 289 for( QDictIterator<ANetNodeInstance> NNIIt(NNIs);
298 NNIIt.current(); 290 NNIIt.current();
299 ++NNIIt 291 ++NNIIt
300 ){ 292 ){
301 // for all nodes find those that are modified 293 // for all nodes find those that are modified
302 NNI = NNIIt.current(); 294 NNI = NNIIt.current();
303 295
304 if( ForceIt || NNI->isModified() ) { 296 if( ForceIt || NNI->isModified() ) {
305 if( NNI->nodeClass()->generateProperFilesFor( NNI ) ) { 297 if( NNI->nodeClass()->generateProperFilesFor( NNI ) ) {
306 // problem generating 298 // problem generating
307 S = qApp->translate( "NetworkSettings", 299 S = qApp->translate( "NetworkSettings",
308 "<p>Cannot generate files proper to \"%1\"</p>" ). 300 "<p>Cannot generate files proper to \"%1\"</p>" ).
309 arg(NNI->nodeClass()->name()) ; 301 arg(NNI->nodeClass()->name()) ;
310 return S; 302 return S;
311 } 303 }
312 } 304 }
313 } 305 }
314 } 306 }
315 307
316 // 308 //
317 // generate all system files 309 // generate all system files
318 // 310 //
319 for( QDictIterator<SystemFile> sfit(SFM); 311 for( QDictIterator<SystemFile> sfit(SFM);
320 sfit.current(); 312 sfit.current();
321 ++sfit ) { 313 ++sfit ) {
322 SF = sfit.current(); 314 SF = sfit.current();
323 315
324 fprintf( stderr, "Generating %s\n", SF->name().latin1() ); 316 Log( ( "Generating %s\n", SF->name().latin1() ));
325 SF->open(); 317 SF->open();
326 318
327 do { // so we can break; 319 do { // so we can break;
328 320
329 // global presection for this system file 321 // global presection for this system file
330 if( SF->preSection() ) { 322 if( SF->preSection() ) {
331 S = qApp->translate( "NetworkSettings", 323 S = qApp->translate( "NetworkSettings",
332 "<p>Error in preSection for file \"%1\"</p>" ). 324 "<p>Error in preSection for file \"%1\"</p>" ).
333 arg( SF->name() ); 325 arg( SF->name() );
334 return S; 326 return S;
335 } 327 }
336 328
337 // find all netnodes and figure out if 329 // find all netnodes and figure out if
338 // for that node there are instances 330 // for that node there are instances
339 for( QDictIterator<NetNode_t> nnit( 331 for( QDictIterator<NetNode_t> nnit(
340 NSResources->netNodes() ); 332 NSResources->netNodes() );
341 nnit.current(); 333 nnit.current();
342 ++nnit ) { 334 ++nnit ) {
343 335
344 CurDevNN = nnit.current()->NetNode; 336 CurDevNN = nnit.current()->NetNode;
345 337
346 // are there instances for this netnode ? 338 // are there instances for this netnode ?
347 NNI = 0; 339 NNI = 0;
348 for( QDictIterator<ANetNodeInstance> nniit( 340 for( QDictIterator<ANetNodeInstance> nniit(
349 NSResources->netNodeInstances() ); 341 NSResources->netNodeInstances() );
350 nniit.current(); 342 nniit.current();
351 ++nniit ) { 343 ++nniit ) {
352 if( nniit.current()->nodeClass() == CurDevNN ) { 344 if( nniit.current()->nodeClass() == CurDevNN ) {
353 NNI = nniit.current(); 345 NNI = nniit.current();
354 break; 346 break;
355 } 347 }
356 } 348 }
357 349
358 if( ! NNI ) 350 if( ! NNI )
359 // no instances -> next netnode type 351 // no instances -> next netnode type
360 continue; 352 continue;
361 353
362 // has this node data for this system file ? 354 // has this node data for this system file ?
363 if( (CurDev = NNI->runtime()->asDevice() ) ) { 355 if( (CurDev = NNI->runtime()->asDevice() ) ) {
364 // generate start for this nodetype for all possible devices of this type 356 // generate start for this nodetype for all possible devices of this type
365 for( int i = 0; i < CurDevNN->instanceCount(); i ++ ) { 357 for( int i = 0; i < CurDevNN->instanceCount(); i ++ ) {
366 S = generateSystemFileNode( *SF, CurDev, NNI, i ); 358 S = generateSystemFileNode( *SF, CurDev, NNI, i );
367 if( ! S.isEmpty() ) 359 if( ! S.isEmpty() )
368 return S; 360 return S;
369 } 361 }
370 } else { 362 } else {
371 S = generateSystemFileNode( *SF, 0, NNI, -1 ); 363 S = generateSystemFileNode( *SF, 0, NNI, -1 );
372 if( ! S.isEmpty() ) 364 if( ! S.isEmpty() )
373 return S; 365 return S;
374 } 366 }
375 } 367 }
376 368
377 if( SF->postSection() ) { 369 if( SF->postSection() ) {
378 S = qApp->translate( "NetworkSettings", 370 S = qApp->translate( "NetworkSettings",
379 "<p>Error in postSection for file \"%1\"</p>" ). 371 "<p>Error in postSection for file \"%1\"</p>" ).
380 arg( SF->name() ); 372 arg( SF->name() );
381 return S; 373 return S;
382 } 374 }
383 375
384 } while( 0 ); 376 } while( 0 );
385 SF->close(); 377 SF->close();
386 } 378 }
387 } 379 }
388 Force = 0; 380 Force = 0;
389 return S; 381 return S;
390} 382}
391 383
392QList<NodeCollection> NetworkSettingsData::collectPossible( const char * Interface ) { 384QList<NodeCollection> NetworkSettingsData::collectPossible( const char * Interface ) {
393 // collect connections that can work on top of this interface 385 // collect connections that can work on top of this interface
394 NodeCollection * NC; 386 NodeCollection * NC;
395 QList<NodeCollection> PossibleConnections; 387 QList<NodeCollection> PossibleConnections;
396 Name2Connection_t & M = NSResources->connections(); 388 Name2Connection_t & M = NSResources->connections();
397 389
398 // for all connections 390 // for all connections
399 for( QDictIterator<NodeCollection> it(M); 391 for( QDictIterator<NodeCollection> it(M);
400 it.current(); 392 it.current();
401 ++it ) { 393 ++it ) {
402 NC = it.current(); 394 NC = it.current();
403 // check if this profile handles the requested interface 395 // check if this profile handles the requested interface
404 if( NC->handlesInterface( Interface ) && // if different Intf. 396 if( NC->handlesInterface( Interface ) && // if different Intf.
405 NC->state() != Disabled && // if not enabled 397 NC->state() != Disabled && // if not enabled
406 NC->state() != IsUp // if already used 398 NC->state() != IsUp // if already used
407 ) { 399 ) {
408 fprintf( stderr, "Append %s for %s\n", NC->name().latin1(), Interface); 400 Log( ( "Append %s for %s\n", NC->name().latin1(), Interface));
409 PossibleConnections.append( NC ); 401 PossibleConnections.append( NC );
410 } 402 }
411 } 403 }
412 return PossibleConnections; 404 return PossibleConnections;
413} 405}
414 406
415 407
416/* 408/*
417 Called by the system to see if interface can be brought UP 409 Called by the system to see if interface can be brought UP
418 410
419 if allowed, echo Interface-allowed else Interface-disallowed 411 if allowed, echo Interface-allowed else Interface-disallowed
420*/ 412*/
421 413
422bool NetworkSettingsData::canStart( const char * Interface ) { 414bool NetworkSettingsData::canStart( const char * Interface ) {
423 // load situation 415 // load situation
424 NodeCollection * NC = 0; 416 NodeCollection * NC = 0;
425 QList<NodeCollection> PossibleConnections; 417 QList<NodeCollection> PossibleConnections;
426 418
427 PossibleConnections = collectPossible( Interface ); 419 PossibleConnections = collectPossible( Interface );
428 420
429 fprintf( stderr, "Possiblilies %d\n", 421 Log( ( "Possiblilies %d\n", PossibleConnections.count() ));
430 PossibleConnections.count() );
431 switch( PossibleConnections.count() ) { 422 switch( PossibleConnections.count() ) {
432 case 0 : // no connections 423 case 0 : // no connections
433 break; 424 break;
434 case 1 : // one connection 425 case 1 : // one connection
435 NC = PossibleConnections.first(); 426 NC = PossibleConnections.first();
436 break; 427 break;
437 default : // need to ask user ? 428 default : // need to ask user ?
438 return 1; 429 return 1;
439 } 430 }
440 431
441 if( NC ) { 432 if( NC ) {
442 switch( NC->state() ) { 433 switch( NC->state() ) {
443 case Unchecked : 434 case Unchecked :
444 case Unknown : 435 case Unknown :
445 case Unavailable : 436 case Unavailable :
446 case Disabled : 437 case Disabled :
447 // this profile does not allow interface to be UP 438 // this profile does not allow interface to be UP
448 // -> try others 439 // -> try others
449 break; 440 break;
450 case Off : 441 case Off :
451 // try to UP the device 442 // try to UP the device
452 if( ! NC->setState( Activate ) ) { 443 if( ! NC->setState( Activate ) ) {
453 // cannot bring device Online -> try other alters 444 // cannot bring device Online -> try other alters
454 break; 445 break;
455 } 446 }
456 // FT 447 // FT
457 case Available : 448 case Available :
458 case IsUp : // also called for 'ifdown' 449 case IsUp : // also called for 'ifdown'
459 // device is ready -> done 450 // device is ready -> done
460 printf( "%s-c%d-allowed\n", Interface, NC->number() ); 451 printf( "%s-c%d-allowed\n", Interface, NC->number() );
461 return 0; 452 return 0;
462 } 453 }
463 } 454 }
464 455
465 // if we come here no alternatives are possible 456 // if we come here no alternatives are possible
466 printf( "%s-cnn-disallowed\n", Interface ); 457 printf( "%s-cnn-disallowed\n", Interface );
467 return 0; 458 return 0;
468} 459}
469 460
470/* 461/*
471 Called by the system to regenerate config files 462 Called by the system to regenerate config files
472*/ 463*/
473 464
474bool NetworkSettingsData::regenerate( void ) { 465bool NetworkSettingsData::regenerate( void ) {
475 QString S; 466 QString S;
476 // load situation 467 // load situation
477 S = generateSettings( TRUE ); 468 S = generateSettings( TRUE );
478 if( ! S.isEmpty() ) { 469 if( ! S.isEmpty() ) {
479 fprintf( stdout, "%s\n", S.latin1() ); 470 fprintf( stdout, "%s\n", S.latin1() );
480 return 1; 471 return 1;
481 } 472 }
482 return 0; 473 return 0;
483} 474}
484 475
485QString NetworkSettingsData::generateSystemFileNode( 476QString NetworkSettingsData::generateSystemFileNode(
486 SystemFile &SF, 477 SystemFile &SF,
487 AsDevice * CurDev, 478 AsDevice * CurDev,
488 ANetNodeInstance * DevNNI, 479 ANetNodeInstance * DevNNI,
489 long DevInstNr ) { 480 long DevInstNr ) {
490 481
491 QString S=""; 482 QString S="";
492 ANetNode * CurDevNN = DevNNI->nodeClass(); 483 ANetNode * CurDevNN = DevNNI->nodeClass();
493 Name2Connection_t & M = NSResources->connections(); 484 Name2Connection_t & M = NSResources->connections();
494 485
495 if( SF.preDeviceSection( CurDevNN ) ) { 486 if( SF.preDeviceSection( CurDevNN ) ) {
496 S = qApp->translate( "NetworkSettings", 487 S = qApp->translate( "NetworkSettings",
497 "<p>Error in \"Pre-Device Part\" for file \"%1\" and nodetype \"%2\"</p>" ). 488 "<p>Error in \"Pre-Device Part\" for file \"%1\" and nodetype \"%2\"</p>" ).
498 arg( SF.name() ). 489 arg( SF.name() ).
499 arg( CurDevNN->name() ); 490 arg( CurDevNN->name() );
500 return S; 491 return S;
501 } 492 }
502 493
503 if( CurDevNN->hasDataFor( SF.name() ) ) { 494 if( CurDevNN->hasDataFor( SF.name() ) ) {
504 if( CurDevNN->generateDeviceDataForCommonFile( SF, DevInstNr ) ) { 495 if( CurDevNN->generateDeviceDataForCommonFile( SF, DevInstNr ) ) {
505 S = qApp->translate( "NetworkSettings", 496 S = qApp->translate( "NetworkSettings",
506 "<p>Error in \"Device Part\" for file \"%1\" and node \"%2\"</p>" ). 497 "<p>Error in \"Device Part\" for file \"%1\" and node \"%2\"</p>" ).
507 arg( SF.name() ). 498 arg( SF.name() ).
508 arg( CurDevNN->name() ); 499 arg( CurDevNN->name() );
509 return S; 500 return S;
510 } 501 }
511 } 502 }
512 503
513 // now generate profile specific data for all 504 // now generate profile specific data for all
514 // connections working on a device of the current 505 // connections working on a device of the current
515 // netnode type 506 // netnode type
516 for( QDictIterator<NodeCollection> ncit(M); 507 for( QDictIterator<NodeCollection> ncit(M);
517 ncit.current(); 508 ncit.current();
518 ++ncit ) { 509 ++ncit ) {
519 NodeCollection * NC = ncit.current(); 510 NodeCollection * NC = ncit.current();
520 511
521 // currenly only those connections that work on 512 // currenly only those connections that work on
522 // the current device (or on no device if no current) 513 // the current device (or on no device if no current)
523 AsDevice * Dev = NC->device(); 514 AsDevice * Dev = NC->device();
524 515
525 if( CurDev ) { 516 if( CurDev ) {
526 if( CurDevNN != Dev->netNode()->nodeClass() ) { 517 if( CurDevNN != Dev->netNode()->nodeClass() ) {
527 // other device type -> later 518 // other device type -> later
528 continue; 519 continue;
529 } 520 }
530 } else { 521 } else {
531 if( Dev ) { 522 if( Dev ) {
532 // other 523 // other
533 continue; 524 continue;
534 } 525 }
535 } 526 }
536 527
537 // generate 'entry' 528 // generate 'entry'
538 if( SF.preNodeSection( DevNNI, DevInstNr ) ) { 529 if( SF.preNodeSection( DevNNI, DevInstNr ) ) {
539 S = qApp->translate( "NetworkSettings", 530 S = qApp->translate( "NetworkSettings",
540 "<p>Error in \"Pre-Node Part\" for file \"%1\" and node \"%2\"</p>" ). 531 "<p>Error in \"Pre-Node Part\" for file \"%1\" and node \"%2\"</p>" ).
541 arg( SF.name() ). 532 arg( SF.name() ).
542 arg( CurDevNN->name() ); 533 arg( CurDevNN->name() );
543 return S; 534 return S;
544 } 535 }
545 536
546 // ask all nodes in connection 537 // ask all nodes in connection
547 for( QListIterator<ANetNodeInstance> cncit(*NC); 538 for( QListIterator<ANetNodeInstance> cncit(*NC);
548 cncit.current(); 539 cncit.current();
549 ++cncit ) { 540 ++cncit ) {
550 ANetNodeInstance * NNI = cncit.current(); 541 ANetNodeInstance * NNI = cncit.current();
551 542
552 if( NNI->hasDataFor( SF.name() ) ) { 543 if( NNI->hasDataFor( SF.name() ) ) {
553 if( NNI->generateDataForCommonFile(SF,DevInstNr) ) { 544 if( NNI->generateDataForCommonFile(SF,DevInstNr) ) {
554 S = qApp->translate( "NetworkSettings", 545 S = qApp->translate( "NetworkSettings",
555 "<p>Error in \"Node Part\" for file \"%1\" and node \"%2\"</p>" ). 546 "<p>Error in \"Node Part\" for file \"%1\" and node \"%2\"</p>" ).
556 arg( SF.name() ). 547 arg( SF.name() ).
557 arg( NNI->nodeClass()->name() ); 548 arg( NNI->nodeClass()->name() );
558 return S; 549 return S;
559 } 550 }
560 } 551 }
561 } 552 }
562 553
563 if( SF.postNodeSection( DevNNI, DevInstNr ) ) { 554 if( SF.postNodeSection( DevNNI, DevInstNr ) ) {
564 S = qApp->translate( "NetworkSettings", 555 S = qApp->translate( "NetworkSettings",
565 "<p>Error in \"Post-Node Part\" for file \"%1\" and node \"%2\"</p>" ). 556 "<p>Error in \"Post-Node Part\" for file \"%1\" and node \"%2\"</p>" ).
566 arg( SF.name() ). 557 arg( SF.name() ).
567 arg( CurDevNN->name() ); 558 arg( CurDevNN->name() );
568 return S; 559 return S;
569 } 560 }
570 SF << endl; 561 SF << endl;
571 } 562 }
572 563
573 if( SF.postDeviceSection( CurDevNN ) ) { 564 if( SF.postDeviceSection( CurDevNN ) ) {
574 S = qApp->translate( "NetworkSettings", 565 S = qApp->translate( "NetworkSettings",
575 "<p>Error in \"Post-Device Part\" for file \"%1\" and node \"%2\"</p>" ). 566 "<p>Error in \"Post-Device Part\" for file \"%1\" and node \"%2\"</p>" ).
576 arg( SF.name() ). 567 arg( SF.name() ).
577 arg( CurDevNN->name() ); 568 arg( CurDevNN->name() );
578 return S; 569 return S;
579 } 570 }
580 571
581 return S; 572 return S;
582} 573}
diff --git a/noncore/settings/networksettings2/profile/profileGUI.ui b/noncore/settings/networksettings2/profile/profileGUI.ui
index 365704b..5bf9a9c 100644
--- a/noncore/settings/networksettings2/profile/profileGUI.ui
+++ b/noncore/settings/networksettings2/profile/profileGUI.ui
@@ -1,305 +1,375 @@
1<!DOCTYPE UI><UI> 1<!DOCTYPE UI><UI>
2<class>ProfileGUI</class> 2<class>ProfileGUI</class>
3<widget> 3<widget>
4 <class>QWidget</class> 4 <class>QWidget</class>
5 <property stdset="1"> 5 <property stdset="1">
6 <name>name</name> 6 <name>name</name>
7 <cstring>Profile_FRM</cstring> 7 <cstring>Profile_FRM</cstring>
8 </property> 8 </property>
9 <property stdset="1"> 9 <property stdset="1">
10 <name>geometry</name> 10 <name>geometry</name>
11 <rect> 11 <rect>
12 <x>0</x> 12 <x>0</x>
13 <y>0</y> 13 <y>0</y>
14 <width>225</width> 14 <width>276</width>
15 <height>301</height> 15 <height>231</height>
16 </rect> 16 </rect>
17 </property> 17 </property>
18 <property stdset="1"> 18 <property stdset="1">
19 <name>caption</name> 19 <name>caption</name>
20 <string>Profile</string> 20 <string>Profile</string>
21 </property> 21 </property>
22 <property> 22 <property>
23 <name>layoutMargin</name> 23 <name>layoutMargin</name>
24 </property> 24 </property>
25 <property> 25 <property>
26 <name>layoutSpacing</name> 26 <name>layoutSpacing</name>
27 </property> 27 </property>
28 <vbox> 28 <vbox>
29 <property stdset="1"> 29 <property stdset="1">
30 <name>margin</name> 30 <name>margin</name>
31 <number>0</number> 31 <number>0</number>
32 </property> 32 </property>
33 <property stdset="1"> 33 <property stdset="1">
34 <name>spacing</name> 34 <name>spacing</name>
35 <number>0</number> 35 <number>0</number>
36 </property> 36 </property>
37 <widget> 37 <widget>
38 <class>QTabWidget</class> 38 <class>QTabWidget</class>
39 <property stdset="1"> 39 <property stdset="1">
40 <name>name</name> 40 <name>name</name>
41 <cstring>TabWidget6</cstring> 41 <cstring>TabWidget6</cstring>
42 </property> 42 </property>
43 <property> 43 <property>
44 <name>layoutMargin</name> 44 <name>layoutMargin</name>
45 </property> 45 </property>
46 <property> 46 <property>
47 <name>layoutSpacing</name> 47 <name>layoutSpacing</name>
48 </property> 48 </property>
49 <widget> 49 <widget>
50 <class>QWidget</class> 50 <class>QWidget</class>
51 <property stdset="1"> 51 <property stdset="1">
52 <name>name</name> 52 <name>name</name>
53 <cstring>tab</cstring> 53 <cstring>tab</cstring>
54 </property> 54 </property>
55 <attribute> 55 <attribute>
56 <name>title</name> 56 <name>title</name>
57 <string>Setup</string> 57 <string>Setup</string>
58 </attribute> 58 </attribute>
59 <vbox> 59 <vbox>
60 <property stdset="1"> 60 <property stdset="1">
61 <name>margin</name> 61 <name>margin</name>
62 <number>2</number> 62 <number>1</number>
63 </property> 63 </property>
64 <property stdset="1"> 64 <property stdset="1">
65 <name>spacing</name> 65 <name>spacing</name>
66 <number>0</number> 66 <number>2</number>
67 </property> 67 </property>
68 <widget> 68 <widget>
69 <class>QCheckBox</class> 69 <class>QLayoutWidget</class>
70 <property stdset="1">
71 <name>name</name>
72 <cstring>Automatic_CB</cstring>
73 </property>
74 <property stdset="1">
75 <name>text</name>
76 <string>Start automatically</string>
77 </property>
78 </widget>
79 <widget>
80 <class>QCheckBox</class>
81 <property stdset="1">
82 <name>name</name>
83 <cstring>Confirm_CB</cstring>
84 </property>
85 <property stdset="1">
86 <name>enabled</name>
87 <bool>true</bool>
88 </property>
89 <property stdset="1">
90 <name>text</name>
91 <string>Confirm before start</string>
92 </property>
93 <property>
94 <name>layoutMargin</name>
95 </property>
96 </widget>
97 <widget>
98 <class>QCheckBox</class>
99 <property stdset="1"> 70 <property stdset="1">
100 <name>name</name> 71 <name>name</name>
101 <cstring>Disabled_CB</cstring> 72 <cstring>Layout8</cstring>
102 </property>
103 <property stdset="1">
104 <name>enabled</name>
105 <bool>true</bool>
106 </property>
107 <property stdset="1">
108 <name>text</name>
109 <string>Disabled</string>
110 </property>
111 <property>
112 <name>layoutMargin</name>
113 </property> 73 </property>
74 <grid>
75 <property stdset="1">
76 <name>margin</name>
77 <number>0</number>
78 </property>
79 <property stdset="1">
80 <name>spacing</name>
81 <number>6</number>
82 </property>
83 <widget row="0" column="0" rowspan="2" colspan="1" >
84 <class>QGroupBox</class>
85 <property stdset="1">
86 <name>name</name>
87 <cstring>GroupBox1</cstring>
88 </property>
89 <property stdset="1">
90 <name>title</name>
91 <string>Start</string>
92 </property>
93 <vbox>
94 <property stdset="1">
95 <name>margin</name>
96 <number>11</number>
97 </property>
98 <property stdset="1">
99 <name>spacing</name>
100 <number>6</number>
101 </property>
102 <widget>
103 <class>QCheckBox</class>
104 <property stdset="1">
105 <name>name</name>
106 <cstring>Automatic_CB</cstring>
107 </property>
108 <property stdset="1">
109 <name>text</name>
110 <string>Automatically</string>
111 </property>
112 </widget>
113 <widget>
114 <class>QCheckBox</class>
115 <property stdset="1">
116 <name>name</name>
117 <cstring>Confirm_CB</cstring>
118 </property>
119 <property stdset="1">
120 <name>enabled</name>
121 <bool>true</bool>
122 </property>
123 <property stdset="1">
124 <name>text</name>
125 <string>Ask</string>
126 </property>
127 <property>
128 <name>layoutMargin</name>
129 </property>
130 </widget>
131 <widget>
132 <class>QCheckBox</class>
133 <property stdset="1">
134 <name>name</name>
135 <cstring>Disabled_CB</cstring>
136 </property>
137 <property stdset="1">
138 <name>enabled</name>
139 <bool>true</bool>
140 </property>
141 <property stdset="1">
142 <name>text</name>
143 <string>Disabled</string>
144 </property>
145 <property>
146 <name>layoutMargin</name>
147 </property>
148 </widget>
149 </vbox>
150 </widget>
151 <widget row="0" column="1" >
152 <class>QCheckBox</class>
153 <property stdset="1">
154 <name>name</name>
155 <cstring>TriggersVPN_CB</cstring>
156 </property>
157 <property stdset="1">
158 <name>text</name>
159 <string>Trigger VPN</string>
160 </property>
161 </widget>
162 <spacer row="1" column="1" >
163 <property>
164 <name>name</name>
165 <cstring>Spacer8</cstring>
166 </property>
167 <property stdset="1">
168 <name>orientation</name>
169 <enum>Vertical</enum>
170 </property>
171 <property stdset="1">
172 <name>sizeType</name>
173 <enum>Expanding</enum>
174 </property>
175 <property>
176 <name>sizeHint</name>
177 <size>
178 <width>20</width>
179 <height>20</height>
180 </size>
181 </property>
182 </spacer>
183 </grid>
114 </widget> 184 </widget>
115 <widget> 185 <widget>
116 <class>QLabel</class> 186 <class>QLabel</class>
117 <property stdset="1"> 187 <property stdset="1">
118 <name>name</name> 188 <name>name</name>
119 <cstring>TextLabel3</cstring> 189 <cstring>TextLabel3</cstring>
120 </property> 190 </property>
121 <property stdset="1"> 191 <property stdset="1">
122 <name>text</name> 192 <name>text</name>
123 <string>Description</string> 193 <string>Description</string>
124 </property> 194 </property>
125 </widget> 195 </widget>
126 <widget> 196 <widget>
127 <class>QMultiLineEdit</class> 197 <class>QMultiLineEdit</class>
128 <property stdset="1"> 198 <property stdset="1">
129 <name>name</name> 199 <name>name</name>
130 <cstring>Description_LE</cstring> 200 <cstring>Description_LE</cstring>
131 </property> 201 </property>
132 </widget> 202 </widget>
133 </vbox> 203 </vbox>
134 </widget> 204 </widget>
135 <widget> 205 <widget>
136 <class>QWidget</class> 206 <class>QWidget</class>
137 <property stdset="1"> 207 <property stdset="1">
138 <name>name</name> 208 <name>name</name>
139 <cstring>tab</cstring> 209 <cstring>tab</cstring>
140 </property> 210 </property>
141 <attribute> 211 <attribute>
142 <name>title</name> 212 <name>title</name>
143 <string>State</string> 213 <string>State</string>
144 </attribute> 214 </attribute>
145 <vbox> 215 <vbox>
146 <property stdset="1"> 216 <property stdset="1">
147 <name>margin</name> 217 <name>margin</name>
148 <number>0</number> 218 <number>0</number>
149 </property> 219 </property>
150 <property stdset="1"> 220 <property stdset="1">
151 <name>spacing</name> 221 <name>spacing</name>
152 <number>2</number> 222 <number>2</number>
153 </property> 223 </property>
154 <widget> 224 <widget>
155 <class>QFrame</class> 225 <class>QFrame</class>
156 <property stdset="1"> 226 <property stdset="1">
157 <name>name</name> 227 <name>name</name>
158 <cstring>Frame73</cstring> 228 <cstring>Frame73</cstring>
159 </property> 229 </property>
160 <property stdset="1"> 230 <property stdset="1">
161 <name>sizePolicy</name> 231 <name>sizePolicy</name>
162 <sizepolicy> 232 <sizepolicy>
163 <hsizetype>7</hsizetype> 233 <hsizetype>7</hsizetype>
164 <vsizetype>5</vsizetype> 234 <vsizetype>5</vsizetype>
165 </sizepolicy> 235 </sizepolicy>
166 </property> 236 </property>
167 <property stdset="1"> 237 <property stdset="1">
168 <name>frameShape</name> 238 <name>frameShape</name>
169 <enum>NoFrame</enum> 239 <enum>NoFrame</enum>
170 </property> 240 </property>
171 <property stdset="1"> 241 <property stdset="1">
172 <name>frameShadow</name> 242 <name>frameShadow</name>
173 <enum>Plain</enum> 243 <enum>Plain</enum>
174 </property> 244 </property>
175 <property> 245 <property>
176 <name>layoutMargin</name> 246 <name>layoutMargin</name>
177 </property> 247 </property>
178 <property> 248 <property>
179 <name>layoutSpacing</name> 249 <name>layoutSpacing</name>
180 </property> 250 </property>
181 <hbox> 251 <hbox>
182 <property stdset="1"> 252 <property stdset="1">
183 <name>margin</name> 253 <name>margin</name>
184 <number>2</number> 254 <number>2</number>
185 </property> 255 </property>
186 <property stdset="1"> 256 <property stdset="1">
187 <name>spacing</name> 257 <name>spacing</name>
188 <number>0</number> 258 <number>0</number>
189 </property> 259 </property>
190 <widget> 260 <widget>
191 <class>QLabel</class> 261 <class>QLabel</class>
192 <property stdset="1"> 262 <property stdset="1">
193 <name>name</name> 263 <name>name</name>
194 <cstring>InterfaceName_LBL</cstring> 264 <cstring>InterfaceName_LBL</cstring>
195 </property> 265 </property>
196 <property stdset="1"> 266 <property stdset="1">
197 <name>font</name> 267 <name>font</name>
198 <font> 268 <font>
199 <underline>1</underline> 269 <underline>1</underline>
200 </font> 270 </font>
201 </property> 271 </property>
202 <property stdset="1"> 272 <property stdset="1">
203 <name>text</name> 273 <name>text</name>
204 <string>eth0</string> 274 <string>eth0</string>
205 </property> 275 </property>
206 </widget> 276 </widget>
207 <widget> 277 <widget>
208 <class>QLabel</class> 278 <class>QLabel</class>
209 <property stdset="1"> 279 <property stdset="1">
210 <name>name</name> 280 <name>name</name>
211 <cstring>InterfaceOptions_LBL</cstring> 281 <cstring>InterfaceOptions_LBL</cstring>
212 </property> 282 </property>
213 <property stdset="1"> 283 <property stdset="1">
214 <name>sizePolicy</name> 284 <name>sizePolicy</name>
215 <sizepolicy> 285 <sizepolicy>
216 <hsizetype>7</hsizetype> 286 <hsizetype>7</hsizetype>
217 <vsizetype>1</vsizetype> 287 <vsizetype>1</vsizetype>
218 </sizepolicy> 288 </sizepolicy>
219 </property> 289 </property>
220 <property stdset="1"> 290 <property stdset="1">
221 <name>font</name> 291 <name>font</name>
222 <font> 292 <font>
223 <underline>1</underline> 293 <underline>1</underline>
224 </font> 294 </font>
225 </property> 295 </property>
226 <property stdset="1"> 296 <property stdset="1">
227 <name>text</name> 297 <name>text</name>
228 <string>(Multicast, Up)</string> 298 <string>(Multicast, Up)</string>
229 </property> 299 </property>
230 <property stdset="1"> 300 <property stdset="1">
231 <name>indent</name> 301 <name>indent</name>
232 <number>0</number> 302 <number>0</number>
233 </property> 303 </property>
234 </widget> 304 </widget>
235 </hbox> 305 </hbox>
236 </widget> 306 </widget>
237 <widget> 307 <widget>
238 <class>QFrame</class> 308 <class>QFrame</class>
239 <property stdset="1"> 309 <property stdset="1">
240 <name>name</name> 310 <name>name</name>
241 <cstring>Interface_GB</cstring> 311 <cstring>Interface_GB</cstring>
242 </property> 312 </property>
243 <property stdset="1"> 313 <property stdset="1">
244 <name>enabled</name> 314 <name>enabled</name>
245 <bool>true</bool> 315 <bool>true</bool>
246 </property> 316 </property>
247 <property stdset="1"> 317 <property stdset="1">
248 <name>sizePolicy</name> 318 <name>sizePolicy</name>
249 <sizepolicy> 319 <sizepolicy>
250 <hsizetype>7</hsizetype> 320 <hsizetype>7</hsizetype>
251 <vsizetype>5</vsizetype> 321 <vsizetype>5</vsizetype>
252 </sizepolicy> 322 </sizepolicy>
253 </property> 323 </property>
254 <property stdset="1"> 324 <property stdset="1">
255 <name>frameShape</name> 325 <name>frameShape</name>
256 <enum>NoFrame</enum> 326 <enum>NoFrame</enum>
257 </property> 327 </property>
258 <property stdset="1"> 328 <property stdset="1">
259 <name>frameShadow</name> 329 <name>frameShadow</name>
260 <enum>Raised</enum> 330 <enum>Raised</enum>
261 </property> 331 </property>
262 <property> 332 <property>
263 <name>layoutMargin</name> 333 <name>layoutMargin</name>
264 </property> 334 </property>
265 <property> 335 <property>
266 <name>layoutSpacing</name> 336 <name>layoutSpacing</name>
267 </property> 337 </property>
268 <grid> 338 <grid>
269 <property stdset="1"> 339 <property stdset="1">
270 <name>margin</name> 340 <name>margin</name>
271 <number>2</number> 341 <number>2</number>
272 </property> 342 </property>
273 <property stdset="1"> 343 <property stdset="1">
274 <name>spacing</name> 344 <name>spacing</name>
275 <number>1</number> 345 <number>1</number>
276 </property> 346 </property>
277 <widget row="0" column="2" > 347 <widget row="0" column="2" >
278 <class>QLabel</class> 348 <class>QLabel</class>
279 <property stdset="1"> 349 <property stdset="1">
280 <name>name</name> 350 <name>name</name>
281 <cstring>TextLabel4_2_3</cstring> 351 <cstring>TextLabel4_2_3</cstring>
282 </property> 352 </property>
283 <property stdset="1"> 353 <property stdset="1">
284 <name>enabled</name> 354 <name>enabled</name>
285 <bool>true</bool> 355 <bool>true</bool>
286 </property> 356 </property>
287 <property stdset="1"> 357 <property stdset="1">
288 <name>sizePolicy</name> 358 <name>sizePolicy</name>
289 <sizepolicy> 359 <sizepolicy>
290 <hsizetype>0</hsizetype> 360 <hsizetype>0</hsizetype>
291 <vsizetype>1</vsizetype> 361 <vsizetype>1</vsizetype>
292 </sizepolicy> 362 </sizepolicy>
293 </property> 363 </property>
294 <property stdset="1"> 364 <property stdset="1">
295 <name>frameShape</name> 365 <name>frameShape</name>
296 <enum>NoFrame</enum> 366 <enum>NoFrame</enum>
297 </property> 367 </property>
298 <property stdset="1"> 368 <property stdset="1">
299 <name>frameShadow</name> 369 <name>frameShadow</name>
300 <enum>Raised</enum> 370 <enum>Raised</enum>
301 </property> 371 </property>
302 <property stdset="1"> 372 <property stdset="1">
303 <name>text</name> 373 <name>text</name>
304 <string>Subnet Mask</string> 374 <string>Subnet Mask</string>
305 </property> 375 </property>
diff --git a/noncore/settings/networksettings2/profile/profile_NNI.cpp b/noncore/settings/networksettings2/profile/profile_NNI.cpp
index 5b54aa4..cb52b2a 100644
--- a/noncore/settings/networksettings2/profile/profile_NNI.cpp
+++ b/noncore/settings/networksettings2/profile/profile_NNI.cpp
@@ -1,54 +1,58 @@
1#include "profileedit.h" 1#include "profileedit.h"
2#include "profile_NNI.h" 2#include "profile_NNI.h"
3#include "profile_NN.h" 3#include "profile_NN.h"
4 4
5AProfile::AProfile( ProfileNetNode * PNN ) : ANetNodeInstance( PNN ) { 5AProfile::AProfile( ProfileNetNode * PNN ) : ANetNodeInstance( PNN ) {
6 Data.Automatic = 1; 6 Data.Automatic = 1;
7 Data.Confirm = 0; 7 Data.Confirm = 0;
8 Data.Description = ""; 8 Data.Description = "";
9 Data.Disabled = 0; 9 Data.Disabled = 0;
10 Data.TriggerVPN = 0;
10 GUI = 0; 11 GUI = 0;
11 RT = 0; 12 RT = 0;
12} 13}
13 14
14void AProfile::setSpecificAttribute( QString & Attr, QString & Value ) { 15void AProfile::setSpecificAttribute( QString & Attr, QString & Value ) {
15 16
16 if ( Attr == "automatic" ) { 17 if ( Attr == "automatic" ) {
17 Data.Automatic = (Value=="yes"); 18 Data.Automatic = (Value=="yes");
18 } else if ( Attr == "preconfirm" ) { 19 } else if ( Attr == "preconfirm" ) {
19 Data.Confirm = (Value=="yes"); 20 Data.Confirm = (Value=="yes");
20 } else if ( Attr == "disabled" ) { 21 } else if ( Attr == "disabled" ) {
21 Data.Disabled = (Value=="yes"); 22 Data.Disabled = (Value=="yes");
23 } else if ( Attr == "triggervpn" ) {
24 Data.TriggerVPN = (Value=="yes");
22 } else if ( Attr == "description" ) { 25 } else if ( Attr == "description" ) {
23 Data.Description = Value; 26 Data.Description = Value;
24 } 27 }
25} 28}
26 29
27void AProfile::saveSpecificAttribute( QTextStream & TS ) { 30void AProfile::saveSpecificAttribute( QTextStream & TS ) {
28 TS << "automatic=" << ((Data.Automatic) ? "yes" : "no") << endl; 31 TS << "automatic=" << ((Data.Automatic) ? "yes" : "no") << endl;
29 TS << "preconfirm=" << ((Data.Confirm) ? "yes" : "no") << endl; 32 TS << "preconfirm=" << ((Data.Confirm) ? "yes" : "no") << endl;
30 TS << "disabled=" << ((Data.Disabled) ? "yes" : "no") << endl; 33 TS << "disabled=" << ((Data.Disabled) ? "yes" : "no") << endl;
34 TS << "triggervpn=" << ((Data.TriggerVPN) ? "yes" : "no") << endl;
31 TS << "description=" << Data.Description << endl; 35 TS << "description=" << Data.Description << endl;
32} 36}
33 37
34QWidget * AProfile::edit( QWidget * parent ) { 38QWidget * AProfile::edit( QWidget * parent ) {
35 GUI = new ProfileEdit( parent, this ); 39 GUI = new ProfileEdit( parent, this );
36 GUI->showData( Data ); 40 GUI->showData( Data );
37 return GUI; 41 return GUI;
38} 42}
39 43
40QString AProfile::acceptable( void ) { 44QString AProfile::acceptable( void ) {
41 return ( GUI ) ? GUI->acceptable( ) : QString(); 45 return ( GUI ) ? GUI->acceptable( ) : QString();
42} 46}
43 47
44void AProfile::commit( void ) { 48void AProfile::commit( void ) {
45 if( GUI && GUI->commit( Data ) ) 49 if( GUI && GUI->commit( Data ) )
46 setModified( 1 ); 50 setModified( 1 );
47} 51}
48 52
49bool AProfile::generateDataForCommonFile( 53bool AProfile::generateDataForCommonFile(
50 SystemFile & , 54 SystemFile & ,
51 long) { 55 long) {
52 return 1; 56 return 1;
53} 57}
54 58
diff --git a/noncore/settings/networksettings2/profile/profiledata.h b/noncore/settings/networksettings2/profile/profiledata.h
index b4168e2..246d50c 100644
--- a/noncore/settings/networksettings2/profile/profiledata.h
+++ b/noncore/settings/networksettings2/profile/profiledata.h
@@ -1,15 +1,16 @@
1#ifndef PROFILE_DATA_H 1#ifndef PROFILE_DATA_H
2#define PROFILE_DATA_H 2#define PROFILE_DATA_H
3 3
4#include <qstring.h> 4#include <qstring.h>
5typedef struct ProfileData { 5typedef struct ProfileData {
6 QString Description; 6 QString Description;
7 // start up automatically 7 // start up automatically
8 bool Automatic; 8 bool Automatic;
9 // if started up automatically, ask user for confirmation 9 // if started up automatically, ask user for confirmation
10 bool Confirm; 10 bool Confirm;
11 // Do not bring this connection up 11 // Do not bring this connection up
12 bool Disabled; 12 bool Disabled;
13 bool TriggerVPN;
13} ProfileData_t; 14} ProfileData_t;
14 15
15#endif 16#endif
diff --git a/noncore/settings/networksettings2/profile/profileedit.cpp b/noncore/settings/networksettings2/profile/profileedit.cpp
index c9fb650..87e503e 100644
--- a/noncore/settings/networksettings2/profile/profileedit.cpp
+++ b/noncore/settings/networksettings2/profile/profileedit.cpp
@@ -1,96 +1,98 @@
1#include <qlabel.h> 1#include <qlabel.h>
2#include <qframe.h> 2#include <qframe.h>
3#include <qcheckbox.h> 3#include <qcheckbox.h>
4#include <qmultilineedit.h> 4#include <qmultilineedit.h>
5#include <qcheckbox.h> 5#include <qcheckbox.h>
6 6
7#include <GUIUtils.h> 7#include <GUIUtils.h>
8#include <asdevice.h> 8#include <asdevice.h>
9#include <resources.h> 9#include <resources.h>
10 10
11#include "profileedit.h" 11#include "profileedit.h"
12 12
13ProfileEdit::ProfileEdit( QWidget * Parent, ANetNodeInstance * TNNI ) : 13ProfileEdit::ProfileEdit( QWidget * Parent, ANetNodeInstance * TNNI ) :
14 ProfileGUI( Parent ), RefreshTimer(this) { 14 ProfileGUI( Parent ), RefreshTimer(this) {
15 InterfaceInfo * II; 15 InterfaceInfo * II;
16 16
17 NNI = TNNI; 17 NNI = TNNI;
18 Dev = NNI->runtime()->device(); 18 Dev = NNI->runtime()->device();
19 if( ( II = Dev->assignedInterface() ) ) { 19 if( ( II = Dev->assignedInterface() ) ) {
20 20
21 Refresh_CB->setEnabled( TRUE ); 21 Refresh_CB->setEnabled( TRUE );
22 Snd_GB->setEnabled( TRUE ); 22 Snd_GB->setEnabled( TRUE );
23 Rcv_GB->setEnabled( TRUE ); 23 Rcv_GB->setEnabled( TRUE );
24 Collisions_FRM->setEnabled( TRUE ); 24 Collisions_FRM->setEnabled( TRUE );
25 25
26 // show current content 26 // show current content
27 SLOT_Refresh(); 27 SLOT_Refresh();
28 28
29 // fill in static data 29 // fill in static data
30 InterfaceName_LBL->setText( II->Name ); 30 InterfaceName_LBL->setText( II->Name );
31 IPAddress_LBL->setText( II->Address ); 31 IPAddress_LBL->setText( II->Address );
32 SubnetMask_LBL->setText( II->Netmask ); 32 SubnetMask_LBL->setText( II->Netmask );
33 Broadcast_LBL->setText( II->BCastAddress ); 33 Broadcast_LBL->setText( II->BCastAddress );
34 MACAddress_LBL->setText( II->MACAddress ); 34 MACAddress_LBL->setText( II->MACAddress );
35 if( II->IsPointToPoint ) { 35 if( II->IsPointToPoint ) {
36 PointToPoint_LBL->setText( II->DstAddress ); 36 PointToPoint_LBL->setText( II->DstAddress );
37 } 37 }
38 QString S; 38 QString S;
39 InterfaceName_LBL->setText( II->Name ); 39 InterfaceName_LBL->setText( II->Name );
40 if( II->HasMulticast ) { 40 if( II->HasMulticast ) {
41 S += "Multicast"; 41 S += "Multicast";
42 } 42 }
43 if( ! S.isEmpty() ) { 43 if( ! S.isEmpty() ) {
44 S.prepend( " : " ); 44 S.prepend( " : " );
45 } 45 }
46 InterfaceOptions_LBL->setText( S ); 46 InterfaceOptions_LBL->setText( S );
47 47
48 connect( &RefreshTimer, SIGNAL( timeout() ), 48 connect( &RefreshTimer, SIGNAL( timeout() ),
49 this, SLOT( SLOT_Refresh() ) ); 49 this, SLOT( SLOT_Refresh() ) );
50 } 50 }
51 51
52} 52}
53 53
54QString ProfileEdit::acceptable( void ) { 54QString ProfileEdit::acceptable( void ) {
55 return QString(); 55 return QString();
56} 56}
57 57
58void ProfileEdit::showData( ProfileData_t & Data ) { 58void ProfileEdit::showData( ProfileData_t & Data ) {
59 Description_LE->setText( Data.Description ); 59 Description_LE->setText( Data.Description );
60 Automatic_CB->setChecked( Data.Automatic ); 60 Automatic_CB->setChecked( Data.Automatic );
61 TriggersVPN_CB->setChecked( Data.TriggerVPN );
61 Confirm_CB->setChecked( Data.Confirm ); 62 Confirm_CB->setChecked( Data.Confirm );
62 Disabled_CB->setChecked( Data.Disabled ); 63 Disabled_CB->setChecked( Data.Disabled );
63} 64}
64 65
65 66
66bool ProfileEdit::commit( ProfileData_t & Data ) { 67bool ProfileEdit::commit( ProfileData_t & Data ) {
67 bool SM = 0; 68 bool SM = 0;
68 TXTM( Data.Description, Description_LE, SM ); 69 TXTM( Data.Description, Description_LE, SM );
69 70
70 CBM( Data.Automatic, Automatic_CB, SM ); 71 CBM( Data.Automatic, Automatic_CB, SM );
72 CBM( Data.TriggerVPN, TriggersVPN_CB, SM );
71 CBM( Data.Disabled, Disabled_CB, SM ); 73 CBM( Data.Disabled, Disabled_CB, SM );
72 CBM( Data.Confirm, Confirm_CB, SM ); 74 CBM( Data.Confirm, Confirm_CB, SM );
73 75
74 return SM; 76 return SM;
75} 77}
76 78
77void ProfileEdit::SLOT_Refresh( void ) { 79void ProfileEdit::SLOT_Refresh( void ) {
78 InterfaceInfo * II = Dev->assignedInterface(); 80 InterfaceInfo * II = Dev->assignedInterface();
79 NSResources->system().refreshStatistics( *II ); 81 NSResources->system().refreshStatistics( *II );
80 RcvBytes_LBL->setText( II->RcvBytes ); 82 RcvBytes_LBL->setText( II->RcvBytes );
81 SndBytes_LBL->setText( II->SndBytes ); 83 SndBytes_LBL->setText( II->SndBytes );
82 RcvErrors_LBL->setText( II->RcvErrors ); 84 RcvErrors_LBL->setText( II->RcvErrors );
83 SndErrors_LBL->setText( II->SndErrors ); 85 SndErrors_LBL->setText( II->SndErrors );
84 RcvDropped_LBL->setText( II->RcvDropped ); 86 RcvDropped_LBL->setText( II->RcvDropped );
85 SndDropped_LBL->setText( II->SndDropped ); 87 SndDropped_LBL->setText( II->SndDropped );
86 Collisions_LBL->setText( II->Collisions ); 88 Collisions_LBL->setText( II->Collisions );
87} 89}
88 90
89void ProfileEdit::SLOT_AutoRefresh( bool ar ) { 91void ProfileEdit::SLOT_AutoRefresh( bool ar ) {
90 if( ar ) { 92 if( ar ) {
91 RefreshTimer.start( 1000 ); 93 RefreshTimer.start( 1000 );
92 SLOT_Refresh(); 94 SLOT_Refresh();
93 } else { 95 } else {
94 RefreshTimer.stop(); 96 RefreshTimer.stop();
95 } 97 }
96} 98}
diff --git a/noncore/settings/networksettings2/profile/profilerun.cpp b/noncore/settings/networksettings2/profile/profilerun.cpp
index 79bb93e..1a5b15b 100644
--- a/noncore/settings/networksettings2/profile/profilerun.cpp
+++ b/noncore/settings/networksettings2/profile/profilerun.cpp
@@ -1,65 +1,67 @@
1#include <resources.h> 1#include <resources.h>
2 2
3#include "profilerun.h" 3#include "profilerun.h"
4 4
5void ProfileRun::detectState( NodeCollection * NC ) { 5void ProfileRun::detectState( NodeCollection * NC ) {
6 if( Data->Disabled ) { 6 if( Data->Disabled ) {
7 Log(( "%s disabled\n", NC->name().latin1() ));
7 NC->setCurrentState( Disabled ); 8 NC->setCurrentState( Disabled );
8 } else { 9 } else {
10 Log(( "%s not disabled\n", NC->name().latin1() ));
9 // find next item in connection 11 // find next item in connection
10 // convert to runtime and ask to detect the state 12 // convert to runtime and ask to detect the state
11 netNode()->nextNode()->runtime()->detectState( NC ); 13 netNode()->nextNode()->runtime()->detectState( NC );
12 } 14 }
13} 15}
14 16
15bool ProfileRun::setState( NodeCollection * NC, Action_t A, bool ) { 17bool ProfileRun::setState( NodeCollection * NC, Action_t A, bool F ) {
16 ANetNodeInstance * NNNI; 18 ANetNodeInstance * NNNI;
17 19
18 NNNI = netNode()->nextNode(); 20 NNNI = netNode()->nextNode();
19 switch ( A ) { 21 switch ( A ) {
20 case Enable : 22 case Enable :
21 if( NC->currentState() == Disabled ) { 23 if( NC->currentState() == Disabled ) {
22 Data->Disabled = 0; 24 Data->Disabled = 0;
23 NC->setCurrentState( Off ); // at least 25 NC->setCurrentState( Off ); // at least
24 // ... but request deeper 26 // ... but request deeper
25 NNNI->runtime()->detectState(NC); 27 NNNI->runtime()->detectState(NC);
26 } 28 }
27 return 1; 29 return 1;
28 case Disable : 30 case Disable :
29 switch( NC->currentState() ) { 31 switch( NC->currentState() ) {
30 case IsUp : 32 case IsUp :
31 case Available : 33 case Available :
32 // bring Deactivate (will bring down) 34 // bring Deactivate (will bring down)
33 if( ! NNNI->runtime()->setState(NC, Deactivate) ) 35 if( ! NNNI->runtime()->setState(NC, Deactivate) )
34 return 0; 36 return 0;
35 default : 37 default :
36 break; 38 break;
37 } 39 }
38 Data->Disabled = 1; 40 Data->Disabled = 1;
39 NC->setCurrentState( Disabled ); 41 NC->setCurrentState( Disabled );
40 return 1; 42 return 1;
41 default : 43 default :
42 break; 44 break;
43 } 45 }
44 return NNNI->runtime()->setState(NC, A); 46 return NNNI->runtime()->setState(NC, A, F );
45} 47}
46 48
47bool ProfileRun::canSetState( State_t Curr, Action_t A ) { 49bool ProfileRun::canSetState( State_t Curr, Action_t A ) {
48 RuntimeInfo * RI; 50 RuntimeInfo * RI;
49 switch ( A ) { 51 switch ( A ) {
50 case Enable : 52 case Enable :
51 case Disable : 53 case Disable :
52 // always possible 54 // always possible
53 return 1; 55 return 1;
54 default : 56 default :
55 break; 57 break;
56 } 58 }
57 RI = netNode()->nextNode()->runtime(); 59 RI = netNode()->nextNode()->runtime();
58 return ( Curr != Disabled ) ? 60 return ( Curr != Disabled ) ?
59 RI->canSetState(Curr, A) : 0; 61 RI->canSetState(Curr, A) : 0;
60} 62}
61 63
62bool ProfileRun::handlesInterface( const QString & S ) { 64bool ProfileRun::handlesInterface( const QString & S ) {
63 // donno -> pass deeper 65 // donno -> pass deeper
64 return netNode()->nextNode()->runtime()->handlesInterface(S); 66 return netNode()->nextNode()->runtime()->handlesInterface(S);
65} 67}
diff --git a/noncore/settings/networksettings2/profile/profilerun.h b/noncore/settings/networksettings2/profile/profilerun.h
index c8ea063..400b56c 100644
--- a/noncore/settings/networksettings2/profile/profilerun.h
+++ b/noncore/settings/networksettings2/profile/profilerun.h
@@ -1,31 +1,35 @@
1#ifndef PROFILERUN_H 1#ifndef PROFILERUN_H
2#define PROFILERUN_H 2#define PROFILERUN_H
3 3
4#include <asfullsetup.h> 4#include <asfullsetup.h>
5#include "profiledata.h" 5#include "profiledata.h"
6 6
7class ProfileRun : public AsFullSetup { 7class ProfileRun : public AsFullSetup {
8 8
9public : 9public :
10 10
11 ProfileRun( ANetNodeInstance * NNI, ProfileData & D ) : 11 ProfileRun( ANetNodeInstance * NNI, ProfileData & D ) :
12 AsFullSetup( NNI ) 12 AsFullSetup( NNI )
13 { Data = &D; } 13 { Data = &D; }
14 14
15 void detectState( NodeCollection * NC ); 15 void detectState( NodeCollection * NC );
16 bool setState( NodeCollection * NC, Action_t A, bool ); 16 bool setState( NodeCollection * NC, Action_t A, bool );
17 bool canSetState( State_t Curr, Action_t A ); 17 bool canSetState( State_t Curr, Action_t A );
18 18
19 bool handlesInterface( const QString & I ); 19 bool handlesInterface( const QString & I );
20 20
21 virtual const QString & description( void ) 21 virtual const QString & description( void )
22 { return Data->Description; } 22 { return Data->Description; }
23 23
24 virtual AsFullSetup * asFullSetup( void ) 24 virtual AsFullSetup * asFullSetup( void )
25 { return (AsFullSetup *)this; } 25 { return (AsFullSetup *)this; }
26
27 virtual bool triggersVPN( void )
28 { return Data->TriggerVPN; }
29
26private : 30private :
27 31
28 ProfileData * Data; 32 ProfileData * Data;
29 33
30}; 34};
31#endif 35#endif
diff --git a/noncore/settings/networksettings2/usb/usbrun.cpp b/noncore/settings/networksettings2/usb/usbrun.cpp
index beacd7b..b8ac8a8 100644
--- a/noncore/settings/networksettings2/usb/usbrun.cpp
+++ b/noncore/settings/networksettings2/usb/usbrun.cpp
@@ -1,176 +1,178 @@
1#include <qfile.h> 1#include <qfile.h>
2#include <qfileinfo.h> 2#include <qfileinfo.h>
3#include <qtextstream.h> 3#include <qtextstream.h>
4#include <resources.h> 4#include <resources.h>
5#include "usbrun.h" 5#include "usbrun.h"
6 6
7void USBRun::detectState( NodeCollection * NC ) { 7void USBRun::detectState( NodeCollection * NC ) {
8 // unavailable : no card found 8 // unavailable : no card found
9 // available : card found and assigned to us or free 9 // available : card found and assigned to us or free
10 // up : card found and assigned to us and up 10 // up : card found and assigned to us and up
11 QString S = QString( "/tmp/profile-%1.up" ).arg(NC->number()); 11 QString S = QString( "/tmp/profile-%1.up" ).arg(NC->number());
12 System & Sys = NSResources->system(); 12 System & Sys = NSResources->system();
13 InterfaceInfo * Run; 13 InterfaceInfo * Run;
14 QFile F( S ); 14 QFile F( S );
15 Log(("Detecting for %s\n", NC->name().latin1() ));
15 16
16 if( F.open( IO_ReadOnly ) ) { 17 if( F.open( IO_ReadOnly ) ) {
17 // could open file -> read interface and assign 18 // could open file -> read interface and assign
18 QString X; 19 QString X;
19 QTextStream TS(&F); 20 QTextStream TS(&F);
20 X = TS.readLine(); 21 X = TS.readLine();
22 Log(("%s exists\n", S.latin1() ));
21 // find interface 23 // find interface
22 if( handlesInterface( X ) ) { 24 if( handlesInterface( X ) ) {
23 for( QDictIterator<InterfaceInfo> It(Sys.interfaces()); 25 for( QDictIterator<InterfaceInfo> It(Sys.interfaces());
24 It.current(); 26 It.current();
25 ++It ) { 27 ++It ) {
26 Run = It.current(); 28 Run = It.current();
27 if( X == Run->Name ) { 29 if( X == Run->Name ) {
28 Run->assignNode( netNode() ); 30 Run->assignNode( netNode() );
29 assignInterface( Run ); 31 assignInterface( Run );
30 NC->setCurrentState( IsUp ); 32 NC->setCurrentState( IsUp );
31 return; 33 return;
32 } 34 }
33 } 35 }
34 } 36 }
35 } 37 }
36 38
37 fprintf( stderr, "Assigned %p\n", assignedInterface() ); 39 Log(("Assigned %p\n", assignedInterface() ));
38 if( ( Run = assignedInterface() ) ) { 40 if( ( Run = assignedInterface() ) ) {
39 // we already have an interface assigned -> still present ? 41 // we already have an interface assigned -> still present ?
40 if( ! Run->IsUp ) { 42 if( ! Run->IsUp ) {
41 // usb is still free -> keep assignment 43 // usb is still free -> keep assignment
42 NC->setCurrentState( Available ); 44 NC->setCurrentState( Available );
43 return; 45 return;
44 } // else interface is up but NOT us -> some other profile 46 } // else interface is up but NOT us -> some other profile
45 } 47 }
46 48
47 // nothing (valid) assigned to us 49 // nothing (valid) assigned to us
48 assignInterface( 0 ); 50 assignInterface( 0 );
49 51
50 // find possible interface 52 // find possible interface
51 for( QDictIterator<InterfaceInfo> It(Sys.interfaces()); 53 for( QDictIterator<InterfaceInfo> It(Sys.interfaces());
52 It.current(); 54 It.current();
53 ++It ) { 55 ++It ) {
54 Run = It.current(); 56 Run = It.current();
55 57
56 fprintf( stderr, "%s %d %d=%d %d\n", 58 Log(("%s %d %d=%d %d\n",
57 Run->Name.latin1(), 59 Run->Name.latin1(),
58 handlesInterface( Run->Name ), 60 handlesInterface( Run->Name ),
59 Run->CardType, ARPHRD_ETHER, 61 Run->CardType, ARPHRD_ETHER,
60 ! Run->IsUp ); 62 ! Run->IsUp ));
61 63
62 if( handlesInterface( Run->Name ) && 64 if( handlesInterface( Run->Name ) &&
63 Run->CardType == ARPHRD_ETHER && 65 Run->CardType == ARPHRD_ETHER &&
64 ! Run->IsUp 66 ! Run->IsUp
65 ) { 67 ) {
66 fprintf( stderr, "Released(OFF)\n" ); 68 Log(("Released(OFF)\n" ));
67 // proper type, and Not UP -> free 69 // proper type, and Not UP -> free
68 NC->setCurrentState( Off ); 70 NC->setCurrentState( Off );
69 return; 71 return;
70 } 72 }
71 } 73 }
72 // no free found 74 // no free found
73 fprintf( stderr, "UNA\n" ); 75 Log(("UNA\n" ));
74 76
75 NC->setCurrentState( Unavailable ); 77 NC->setCurrentState( Unavailable );
76} 78}
77 79
78bool USBRun::setState( NodeCollection * NC, Action_t A, bool ) { 80bool USBRun::setState( NodeCollection * NC, Action_t A, bool ) {
79 81
80 // we only handle activate and deactivate 82 // we only handle activate and deactivate
81 switch( A ) { 83 switch( A ) {
82 case Activate : 84 case Activate :
83 { 85 {
84 if( NC->currentState() != Off ) { 86 if( NC->currentState() != Off ) {
85 return 0; 87 return 0;
86 } 88 }
87 InterfaceInfo * N = getInterface(); 89 InterfaceInfo * N = getInterface();
88 if( ! N ) { 90 if( ! N ) {
89 // no interface available 91 // no interface available
90 NC->setCurrentState( Unavailable ); 92 NC->setCurrentState( Unavailable );
91 return 0; 93 return 0;
92 } 94 }
93 // because we were OFF the interface 95 // because we were OFF the interface
94 // we get back is NOT assigned 96 // we get back is NOT assigned
95 N->assignNode( netNode() ); 97 N->assignNode( netNode() );
96 assignInterface( N ); 98 assignInterface( N );
97 fprintf( stderr, "Assing %p\n", N ); 99 Log(("Assing %p\n", N ));
98 NC->setCurrentState( Available ); 100 NC->setCurrentState( Available );
99 return 1; 101 return 1;
100 } 102 }
101 case Deactivate : 103 case Deactivate :
102 if( NC->currentState() == IsUp ) { 104 if( NC->currentState() == IsUp ) {
103 // bring down first 105 // bring down first
104 if( ! connection()->setState( Down ) ) 106 if( ! connection()->setState( Down ) )
105 // could not ... 107 // could not ...
106 return 0; 108 return 0;
107 } else if( NC->currentState() != Available ) { 109 } else if( NC->currentState() != Available ) {
108 return 1; 110 return 1;
109 } 111 }
110 assignedInterface()->assignNode( 0 ); // release 112 assignedInterface()->assignNode( 0 ); // release
111 assignInterface( 0 ); 113 assignInterface( 0 );
112 NC->setCurrentState( Off ); 114 NC->setCurrentState( Off );
113 return 1; 115 return 1;
114 default : 116 default :
115 // FT 117 // FT
116 break; 118 break;
117 } 119 }
118 return 0; 120 return 0;
119} 121}
120 122
121bool USBRun::canSetState( State_t Curr, Action_t A ) { 123bool USBRun::canSetState( State_t Curr, Action_t A ) {
122 // we only handle up down activate and deactivate 124 // we only handle up down activate and deactivate
123 switch( A ) { 125 switch( A ) {
124 case Activate : 126 case Activate :
125 { // at least available 127 { // at least available
126 if( Curr == Available ) { 128 if( Curr == Available ) {
127 return 1; 129 return 1;
128 } 130 }
129 // or we can make one available 131 // or we can make one available
130 InterfaceInfo * N = getInterface(); 132 InterfaceInfo * N = getInterface();
131 if( ! N || N->assignedNode() != 0 ) { 133 if( ! N || N->assignedNode() != 0 ) {
132 // non available or assigned 134 // non available or assigned
133 return 0; 135 return 0;
134 } 136 }
135 return 1; 137 return 1;
136 } 138 }
137 case Deactivate : 139 case Deactivate :
138 return ( Curr >= Available ); 140 return ( Curr >= Available );
139 default : 141 default :
140 // FT 142 // FT
141 break; 143 break;
142 } 144 }
143 return 0; 145 return 0;
144} 146}
145 147
146// get interface that is free or assigned to us 148// get interface that is free or assigned to us
147InterfaceInfo * USBRun::getInterface( void ) { 149InterfaceInfo * USBRun::getInterface( void ) {
148 150
149 System & S = NSResources->system(); 151 System & S = NSResources->system();
150 InterfaceInfo * best = 0, * Run; 152 InterfaceInfo * best = 0, * Run;
151 QRegExp R( "usb[0-9abcdef]" ); 153 QRegExp R( "usb[0-9abcdef]" );
152 154
153 for( QDictIterator<InterfaceInfo> It(S.interfaces()); 155 for( QDictIterator<InterfaceInfo> It(S.interfaces());
154 It.current(); 156 It.current();
155 ++It ) { 157 ++It ) {
156 Run = It.current(); 158 Run = It.current();
157 if( handlesInterface( Run->Name ) && 159 if( handlesInterface( Run->Name ) &&
158 Run->CardType == ARPHRD_ETHER 160 Run->CardType == ARPHRD_ETHER
159 ) { 161 ) {
160 // this is a USB card 162 // this is a USB card
161 if( Run->assignedNode() == netNode() ) { 163 if( Run->assignedNode() == netNode() ) {
162 // assigned to us 164 // assigned to us
163 return Run; 165 return Run;
164 } else if( Run->assignedNode() == 0 ) { 166 } else if( Run->assignedNode() == 0 ) {
165 // free 167 // free
166 best = Run; 168 best = Run;
167 } 169 }
168 } 170 }
169 } 171 }
170 return best; // can be 0 172 return best; // can be 0
171} 173}
172 174
173bool USBRun::handlesInterface( const QString & S ) { 175bool USBRun::handlesInterface( const QString & S ) {
174 return Pat.match( S ) >= 0; 176 return Pat.match( S ) >= 0;
175} 177}
176 178