summaryrefslogtreecommitdiff
path: root/noncore/settings
authorwimpie <wimpie>2004-08-09 02:31:25 (UTC)
committer wimpie <wimpie>2004-08-09 02:31:25 (UTC)
commit0784cfdbd261c43856b45be6ab7439841e69b858 (patch) (unidiff)
treef6a27d6b2e1e6d8dcc908b2ef5836cd320ddfab1 /noncore/settings
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 (limited to 'noncore/settings') (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
@@ -93,51 +93,51 @@ void LanCardEdit::populateList( void ) {
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
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
@@ -57,77 +57,84 @@ int main( int argc, char * argv[] ) {
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,25 +1,26 @@
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 );
@@ -40,194 +41,209 @@ NetworkSettings::NetworkSettings( QWidget *parent,
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
@@ -236,73 +252,78 @@ void NetworkSettings::SLOT_ShowNode( QListBoxItem * LBI ) {
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 );
@@ -393,57 +414,62 @@ void NetworkSettings::SLOT_Connect( void ) {
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
@@ -7,46 +7,48 @@ class 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
@@ -82,91 +82,90 @@ void ANetNodeInstance::initialize( void ) {
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 );
@@ -274,37 +273,40 @@ QString NodeCollection::stateName( State_t S) {
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,34 +1,36 @@
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,
@@ -262,121 +264,121 @@ public :
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
@@ -2,48 +2,50 @@
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 ) {
@@ -59,312 +61,384 @@ TheNSResources::TheNSResources( void ) : NodeTypeNameMap(),
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
@@ -25,104 +25,107 @@ typedef struct NetNode_S {
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,100 +1,127 @@
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" ) )
@@ -177,77 +204,77 @@ void System::probeInterfaces( void ) {
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
@@ -272,84 +299,119 @@ void System::probeInterfaces( void ) {
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,55 +1,55 @@
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>
@@ -281,112 +281,48 @@
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>
@@ -464,49 +400,49 @@
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>
@@ -593,38 +529,44 @@
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,44 +1,44 @@
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;
@@ -58,53 +58,53 @@ void NetworkSettingsData::loadSettings( void ) {
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();
@@ -130,49 +130,49 @@ void NetworkSettingsData::loadSettings( void ) {
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;
@@ -208,49 +208,49 @@ QString NetworkSettingsData::saveSettings( void ) {
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);
@@ -260,89 +260,81 @@ QString NetworkSettingsData::generateSettings( bool ForceReq ) {
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(
@@ -384,71 +376,70 @@ QString NetworkSettingsData::generateSettings( bool ForceReq ) {
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;
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,137 +1,207 @@
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">
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
@@ -37,58 +37,60 @@ ProfileEdit::ProfileEdit( QWidget * Parent, ANetNodeInstance * TNNI ) :
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();
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
@@ -2,30 +2,34 @@
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,121 +1,123 @@
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 ) {