summaryrefslogtreecommitdiff
authorwimpie <wimpie>2005-01-11 15:35:46 (UTC)
committer wimpie <wimpie>2005-01-11 15:35:46 (UTC)
commit4c4cdd76caea5a8be4a971892375c7c6b4f4a8b9 (patch) (unidiff)
tree0e8adcc616a1d20b637aad3de568dcb45af05f71
parent32e8aa951218c0bd6118ee04bb22ef83b3b7ec2e (diff)
downloadopie-4c4cdd76caea5a8be4a971892375c7c6b4f4a8b9.zip
opie-4c4cdd76caea5a8be4a971892375c7c6b4f4a8b9.tar.gz
opie-4c4cdd76caea5a8be4a971892375c7c6b4f4a8b9.tar.bz2
vpn should now work IF only the vpn plugin would do something.
shortened logical interface names (busybox only supports 10 characters and then ONLY if you recompile it with mappings enabled) Other small fixes
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/networksettings2/activateprofileGUI.ui29
-rw-r--r--noncore/settings/networksettings2/activatevpn.cpp5
-rw-r--r--noncore/settings/networksettings2/activatevpn.h2
-rw-r--r--noncore/settings/networksettings2/main.cpp48
-rw-r--r--noncore/settings/networksettings2/network/network_NNI.cpp11
-rw-r--r--noncore/settings/networksettings2/network/networkrun.cpp9
-rw-r--r--noncore/settings/networksettings2/networksettings2/resources.cpp2
-rw-r--r--noncore/settings/networksettings2/networksettings2/resources.h2
-rw-r--r--noncore/settings/networksettings2/networksettings2/system.cpp30
-rw-r--r--noncore/settings/networksettings2/networksettings2/system.h8
-rw-r--r--noncore/settings/networksettings2/networksettings2/systemfile.cpp1
-rw-r--r--noncore/settings/networksettings2/nsdata.cpp66
-rw-r--r--noncore/settings/networksettings2/nsdata.h8
-rw-r--r--noncore/settings/networksettings2/profile/profile_NNI.cpp7
14 files changed, 174 insertions, 54 deletions
diff --git a/noncore/settings/networksettings2/activateprofileGUI.ui b/noncore/settings/networksettings2/activateprofileGUI.ui
index 12ab051..861ce96 100644
--- a/noncore/settings/networksettings2/activateprofileGUI.ui
+++ b/noncore/settings/networksettings2/activateprofileGUI.ui
@@ -1,85 +1,110 @@
1<!DOCTYPE UI><UI> 1<!DOCTYPE UI><UI>
2<class>ActivateProfileGUI</class> 2<class>ActivateProfileGUI</class>
3<widget> 3<widget>
4 <class>QDialog</class> 4 <class>QDialog</class>
5 <property stdset="1"> 5 <property stdset="1">
6 <name>name</name> 6 <name>name</name>
7 <cstring>ActivateProfileGUI</cstring> 7 <cstring>ActivateProfileGUI</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>231</width> 14 <width>219</width>
15 <height>121</height> 15 <height>121</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>Activate Network</string> 20 <string>Activate Network</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>2</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>QLayoutWidget</class> 38 <class>QLayoutWidget</class>
39 <property stdset="1"> 39 <property stdset="1">
40 <name>name</name> 40 <name>name</name>
41 <cstring>Layout2</cstring> 41 <cstring>Layout2</cstring>
42 </property> 42 </property>
43 <property>
44 <name>layoutSpacing</name>
45 </property>
43 <hbox> 46 <hbox>
44 <property stdset="1"> 47 <property stdset="1">
45 <name>margin</name> 48 <name>margin</name>
46 <number>0</number> 49 <number>0</number>
47 </property> 50 </property>
48 <property stdset="1"> 51 <property stdset="1">
49 <name>spacing</name> 52 <name>spacing</name>
50 <number>6</number> 53 <number>0</number>
51 </property> 54 </property>
52 <widget> 55 <widget>
53 <class>QLabel</class> 56 <class>QLabel</class>
54 <property stdset="1"> 57 <property stdset="1">
55 <name>name</name> 58 <name>name</name>
56 <cstring>TextLabel1</cstring> 59 <cstring>TextLabel1</cstring>
57 </property> 60 </property>
58 <property stdset="1"> 61 <property stdset="1">
62 <name>sizePolicy</name>
63 <sizepolicy>
64 <hsizetype>0</hsizetype>
65 <vsizetype>1</vsizetype>
66 </sizepolicy>
67 </property>
68 <property stdset="1">
59 <name>text</name> 69 <name>text</name>
60 <string>Select profile to activate for </string> 70 <string>Select profile to activate for </string>
61 </property> 71 </property>
62 </widget> 72 </widget>
63 <widget> 73 <widget>
64 <class>QLabel</class> 74 <class>QLabel</class>
65 <property stdset="1"> 75 <property stdset="1">
66 <name>name</name> 76 <name>name</name>
67 <cstring>DeviceName_LBL</cstring> 77 <cstring>DeviceName_LBL</cstring>
68 </property> 78 </property>
69 <property stdset="1"> 79 <property stdset="1">
80 <name>sizePolicy</name>
81 <sizepolicy>
82 <hsizetype>7</hsizetype>
83 <vsizetype>1</vsizetype>
84 </sizepolicy>
85 </property>
86 <property stdset="1">
70 <name>text</name> 87 <name>text</name>
71 <string>TextLabel2</string> 88 <string>TextLabel2</string>
72 </property> 89 </property>
73 </widget> 90 </widget>
74 </hbox> 91 </hbox>
75 </widget> 92 </widget>
76 <widget> 93 <widget>
77 <class>QListBox</class> 94 <class>QListBox</class>
78 <property stdset="1"> 95 <property stdset="1">
79 <name>name</name> 96 <name>name</name>
80 <cstring>Profiles_LB</cstring> 97 <cstring>Profiles_LB</cstring>
81 </property> 98 </property>
82 </widget> 99 </widget>
83 </vbox> 100 </vbox>
84</widget> 101</widget>
102<connections>
103 <connection>
104 <sender>Profiles_LB</sender>
105 <signal>doubleClicked(QListBoxItem*)</signal>
106 <receiver>ActivateProfileGUI</receiver>
107 <slot>accept()</slot>
108 </connection>
109</connections>
85</UI> 110</UI>
diff --git a/noncore/settings/networksettings2/activatevpn.cpp b/noncore/settings/networksettings2/activatevpn.cpp
index b75e623..768a031 100644
--- a/noncore/settings/networksettings2/activatevpn.cpp
+++ b/noncore/settings/networksettings2/activatevpn.cpp
@@ -1,47 +1,48 @@
1#include <qlistview.h> 1#include <qlistview.h>
2#include <qheader.h> 2#include <qheader.h>
3#include <resources.h> 3#include <resources.h>
4#include "activatevpn.h" 4#include "activatevpn.h"
5 5
6class MyCheckListItem : public QCheckListItem { 6class MyCheckListItem : public QCheckListItem {
7 7
8public : 8public :
9 9
10 MyCheckListItem( NodeCollection * N, QListView * V ); 10 MyCheckListItem( NodeCollection * N, QListView * V );
11 11
12 NodeCollection * NC; 12 NodeCollection * NC;
13 13
14}; 14};
15 15
16MyCheckListItem::MyCheckListItem( NodeCollection * N, QListView * V ): 16MyCheckListItem::MyCheckListItem( NodeCollection * N, QListView * V ):
17 QCheckListItem( V, N->name() ) { 17 QCheckListItem( V, N->name() ) {
18 NC = N; 18 NC = N;
19} 19}
20 20
21ActivateVPN::ActivateVPN( void ) : 21ActivateVPN::ActivateVPN( const QString & I ) :
22 ActivateVPNGUI( 0, 0, TRUE ), NSD() { 22 ActivateVPNGUI( 0, 0, TRUE ), NSD() {
23 23
24 QCheckListItem * CI; 24 QCheckListItem * CI;
25 VPN_LV->clear(); 25 VPN_LV->clear();
26 VPN_LV->header()->hide(); 26 VPN_LV->header()->hide();
27 27
28 // find all connections that want to be triggered by this interface
28 for( QDictIterator<NodeCollection> it(NSResources->connections()); 29 for( QDictIterator<NodeCollection> it(NSResources->connections());
29 it.current(); 30 it.current();
30 ++it ) { 31 ++it ) {
31 if( it.current()->triggeredBy( "vpn" ) ) { 32 if( it.current()->triggeredBy( I ) ) {
32 CI = new MyCheckListItem( it.current(), VPN_LV ); 33 CI = new MyCheckListItem( it.current(), VPN_LV );
33 } 34 }
34 } 35 }
35} 36}
36 37
37ActivateVPN::~ActivateVPN( void ) { 38ActivateVPN::~ActivateVPN( void ) {
38} 39}
39 40
40void ActivateVPN::SLOT_ChangedVPNSetting( QListViewItem * I ) { 41void ActivateVPN::SLOT_ChangedVPNSetting( QListViewItem * I ) {
41 42
42 MyCheckListItem * MI = (MyCheckListItem *)I; 43 MyCheckListItem * MI = (MyCheckListItem *)I;
43 44
44 printf( "%s : %d\n", 45 printf( "%s : %d\n",
45 MI->text(0).latin1(), 46 MI->text(0).latin1(),
46 MI->isOn() ); 47 MI->isOn() );
47} 48}
diff --git a/noncore/settings/networksettings2/activatevpn.h b/noncore/settings/networksettings2/activatevpn.h
index 5794757..49a940b 100644
--- a/noncore/settings/networksettings2/activatevpn.h
+++ b/noncore/settings/networksettings2/activatevpn.h
@@ -1,20 +1,20 @@
1#include "activatevpnGUI.h" 1#include "activatevpnGUI.h"
2#include "nsdata.h" 2#include "nsdata.h"
3 3
4class ActivateVPN : public ActivateVPNGUI { 4class ActivateVPN : public ActivateVPNGUI {
5 5
6 Q_OBJECT 6 Q_OBJECT
7 7
8public : 8public :
9 9
10 ActivateVPN( void ); 10 ActivateVPN( const QString & Interface );
11 ~ActivateVPN( void ); 11 ~ActivateVPN( void );
12 12
13public slots : 13public slots :
14 14
15 void SLOT_ChangedVPNSetting( QListViewItem * ); 15 void SLOT_ChangedVPNSetting( QListViewItem * );
16 16
17private : 17private :
18 18
19 NetworkSettingsData NSD; 19 NetworkSettingsData NSD;
20}; 20};
diff --git a/noncore/settings/networksettings2/main.cpp b/noncore/settings/networksettings2/main.cpp
index 973b4b7..2243826 100644
--- a/noncore/settings/networksettings2/main.cpp
+++ b/noncore/settings/networksettings2/main.cpp
@@ -1,163 +1,179 @@
1#include "nsdata.h" 1#include "nsdata.h"
2#include "activateprofile.h" 2#include "activateprofile.h"
3#include "activatevpn.h" 3#include "activatevpn.h"
4#include "networksettings.h" 4#include "networksettings.h"
5 5
6#include <opie2/odebug.h> 6#include <opie2/odebug.h>
7#include <qpe/qpeapplication.h> 7#include <qpe/qpeapplication.h>
8 8
9#include <opie2/oapplicationfactory.h> 9#include <opie2/oapplicationfactory.h>
10using namespace Opie::Core; 10using namespace Opie::Core;
11 11
12#ifdef GONE 12#ifdef GONE
13 13
14OPIE_EXPORT_APP( OApplicationFactory<NetworkSettings> ) 14OPIE_EXPORT_APP( OApplicationFactory<NetworkSettings> )
15 15
16#else 16#else
17 17
18// just standard GUI 18// just standard GUI
19#define ACT_GUI 0 19#define ACT_GUI 0
20// used by interfaces to request for allow of up/down 20// used by interfaces to request for allow of up/down
21#define ACT_REQUEST 1 21#define ACT_REQUEST 1
22// regenerate config files 22// regenerate config files
23#define ACT_REGEN 2 23#define ACT_REGEN 2
24// used by interfaces to request user prompt 24// used by interfaces to request user prompt
25#define ACT_PROMPT 3 25#define ACT_PROMPT 3
26// used by interfaces to trigger VPN 26// used by interfaces to trigger VPN prompting
27#define ACT_VPN 4 27#define ACT_TRIGGERVPN 4
28// activate opietooth 28// activate opietooth
29#define ACT_OT 5 29#define ACT_OT 5
30// prompt for VPN networks
31#define ACT_PROMPTVPN 6
30 32
31// include Opietooth GUI 33// include Opietooth GUI
32#include <opietooth2/Opietooth.h> 34#include <opietooth2/Opietooth.h>
33using namespace Opietooth2; 35using namespace Opietooth2;
34 36
35#include <qpushbutton.h> 37#include <qpushbutton.h>
36#include <qlayout.h> 38#include <qlayout.h>
37#include <qframe.h> 39#include <qframe.h>
38#include <qlabel.h> 40#include <qlabel.h>
39 41
40int main( int argc, char * argv[] ) { 42int main( int argc, char * argv[] ) {
41 int rv = 0; 43 int rv = 0;
42 int Action = ACT_GUI; 44 int Action = ACT_GUI;
43 // could be overruled by -qws 45 // could be overruled by -qws
44 QApplication::Type GuiType = QApplication::GuiClient; 46 QApplication::Type GuiType = QApplication::GuiClient;
45 47
46 QPEApplication * TheApp; 48 QPEApplication * TheApp;
47 49
48 for ( int i = 1; i < argc; i ++ ) { 50 for ( int i = 1; i < argc; i ++ ) {
49 int rmv; 51 int rmv;
50 rmv = 0; 52 rmv = 0;
51 if( strcmp( argv[i], "--regen" ) == 0 ) { 53 if( strcmp( argv[i], "--regen" ) == 0 ) {
52 Action = ACT_REGEN; 54 Action = ACT_REGEN;
53 GuiType = QApplication::Tty; 55 GuiType = QApplication::Tty;
54 rmv = 1; 56 rmv = 1;
55 } else if( strcmp( argv[i], "--prompt" ) == 0 ) { 57 } else if( strcmp( argv[i], "--prompt" ) == 0 ) {
56 Action = ACT_PROMPT; 58 Action = ACT_PROMPT;
57 rmv = 1; 59 rmv = 1;
58 } else if( strcmp( argv[i], "--triggervpn" ) == 0 ) { 60 } else if( strcmp( argv[i], "--triggervpn" ) == 0 ) {
59 Action = ACT_VPN; 61 GuiType = QApplication::Tty;
62 Action = ACT_TRIGGERVPN;
63 rmv = 1;
64 } else if( strcmp( argv[i], "--promptvpn" ) == 0 ) {
65 Action = ACT_PROMPTVPN;
60 rmv = 1; 66 rmv = 1;
61 } else if( strcmp( argv[i], "--opietooth" ) == 0 ) { 67 } else if( strcmp( argv[i], "--opietooth" ) == 0 ) {
62 Action = ACT_OT; 68 Action = ACT_OT;
63 rmv = 1; 69 rmv = 1;
64 } 70 }
65 if( rmv ) { 71 if( rmv ) {
66 memmove( argv+i, argv+i+rmv, 72 memmove( argv+i, argv+i+rmv,
67 sizeof( char * ) * (argc-i-rmv) ); 73 sizeof( char * ) * (argc-i-rmv) );
68 i --; 74 i --;
69 argc -= rmv; 75 argc -= rmv;
70 } 76 }
71 } 77 }
72 78
73 if( strstr( argv[0], "-request" ) ) { 79 if( strstr( argv[0], "-request" ) ) {
74 // called from system to request something 80 // called from system to request something
75 GuiType = QApplication::Tty; 81 GuiType = QApplication::Tty;
76 Action = ACT_REQUEST; 82 Action = ACT_REQUEST;
77 Log(("Request : %s\n", argv[1] )); 83 Log(("Request : %s\n", argv[1] ));
78 } else if( strstr( argv[0], "-opietooth" ) ) { 84 } else if( strstr( argv[0], "-opietooth" ) ) {
79 Action = ACT_OT; 85 Action = ACT_OT;
80 } 86 }
81 87
82 // Start Qt 88 // Start Qt
83 // because QPEApplication does not handle GuiType well 89 // because QPEApplication does not handle GuiType well
84 if( GuiType == QApplication::Tty ) { 90 if( GuiType == QApplication::Tty ) {
85 // this cast is NOT correct but we do not use 91 // this cast is NOT correct but we do not use
86 // TheApp anymore ... 92 // TheApp anymore ...
87 TheApp = (QPEApplication *)new QApplication( argc, argv, GuiType ); 93 TheApp = (QPEApplication *)new QApplication( argc, argv, GuiType );
88 } else { 94 } else {
89 TheApp = new QPEApplication( argc, argv, GuiType ); 95 TheApp = new QPEApplication( argc, argv, GuiType );
90 } 96 }
91 97
92 // init qt with app widget 98 // init qt with app widget
93 99
94 switch( Action ) { 100 switch( Action ) {
95 case ACT_REQUEST : 101 case ACT_REQUEST :
96 { NetworkSettingsData NS; 102 { NetworkSettingsData NS;
97 if( NS.canStart( argv[1] ) ) { 103 if( NS.canStart( argv[1] ) ) {
104 QStringList SL;
105 SL << QPEApplication::qpeDir() + "bin/networksettings2"
106 << "--prompt"
107 << argv[1];
108 // exec synchronous -> blocks
109 NSResources->system().execAsUser( SL, 1 );
110 }
111 }
112 break;
113 case ACT_TRIGGERVPN :
114 { NetworkSettingsData NS;
115 if( NS.couldBeTriggered( argv[1] ) ) {
116 // there are VPNS that can be triggered
98 QStringList S; 117 QStringList S;
99 S << QPEApplication::qpeDir() + "/bin/networksettings2"; 118 S << QPEApplication::qpeDir() + "bin/networksettings2";
100 S << "networksettings2"; 119 S << "--promptvpn";
101 S << "--prompt";
102 S << argv[1]; 120 S << argv[1];
103 NSResources->system().execAsUser( S ); 121 NSResources->system().execAsUser( S );
104 Log(("FAILED %s-cNN-allowed\n", argv[1] ));
105 // if we come here , failed
106 printf( "%s-cNN-disallowed", argv[1] );
107 } 122 }
108 } 123 }
109 break; 124 break;
110 case ACT_REGEN : 125 case ACT_REGEN :
111 { NetworkSettingsData NS; 126 { NetworkSettingsData NS;
112 QString S= NS.generateSettings(); 127 QString S= NS.generateSettings();
113 // regen returns 0 if OK 128 // regen returns 0 if OK
114 rv = ( S.isEmpty() ) ? 0 : 1; 129 rv = ( S.isEmpty() ) ? 0 : 1;
115 } 130 }
116 break; 131 break;
117 case ACT_PROMPT : 132 case ACT_PROMPT :
118 { ActivateProfile AP(argv[1]); 133 { ActivateProfile AP(argv[1]);
119 if( AP.exec() == QDialog::Accepted ) { 134 if( AP.exec() == QDialog::Accepted ) {
120 Log(("%s-c%ld-allowed\n", 135 Log(("allow profile %ld for %s\n",
121 argv[1], AP.selectedProfile() )); 136 AP.selectedProfile(), argv[1] ));
122 printf( "%s-c%ld-allowed", argv[1], AP.selectedProfile() ); 137 printf( "A%ld%s\n", AP.selectedProfile(), argv[1] );
123 } else { 138 } else {
124 Log(("%s-c%NN-disallowed\n", argv[1] )); 139 Log(("disallow %s\n", argv[1] ));
125 printf( "%s-cNN-disallowed", argv[1] ); 140 printf( "D-%s\n", argv[1] );
126 } 141 }
127 } 142 }
128 break; 143 break;
129 case ACT_VPN : 144 case ACT_PROMPTVPN :
130 { ActivateVPN AVPN; 145 { ActivateVPN AVPN( argv[1] );
146 Log(("Trigger vpns on interface %s\n", argv[1] ));
131 AVPN.exec(); 147 AVPN.exec();
132 } 148 }
133 break; 149 break;
134 case ACT_GUI : 150 case ACT_GUI :
135 case ACT_OT : 151 case ACT_OT :
136 { QWidget * W; 152 { QWidget * W;
137 153
138 if( Action == ACT_OT ) { 154 if( Action == ACT_OT ) {
139 W = new OTMain( 0 ); 155 W = new OTMain( 0 );
140 } else { 156 } else {
141 W = new NetworkSettings(0); 157 W = new NetworkSettings(0);
142 } 158 }
143 TheApp->setMainWidget( W ); 159 TheApp->setMainWidget( W );
144 160
145 W->show(); 161 W->show();
146 W->showMaximized(); 162 W->showMaximized();
147 rv = TheApp->exec(); 163 rv = TheApp->exec();
148 164
149 delete W; 165 delete W;
150 } 166 }
151 break; 167 break;
152 } 168 }
153 169
154 LogClose(); 170 LogClose();
155 171
156 return rv; 172 return rv;
157} 173}
158 174
159#endif 175#endif
160 176
161 177
162// main.cpp 178// main.cpp
163 179
diff --git a/noncore/settings/networksettings2/network/network_NNI.cpp b/noncore/settings/networksettings2/network/network_NNI.cpp
index 78e6545..34dac54 100644
--- a/noncore/settings/networksettings2/network/network_NNI.cpp
+++ b/noncore/settings/networksettings2/network/network_NNI.cpp
@@ -1,217 +1,218 @@
1#include <system.h> 1#include <system.h>
2#include <netnode.h> 2#include <netnode.h>
3#include "networkedit.h" 3#include "networkedit.h"
4#include "network_NNI.h" 4#include "network_NNI.h"
5#include "network_NN.h" 5#include "network_NN.h"
6 6
7ANetwork::ANetwork( NetworkNetNode * PNN ) : ANetNodeInstance( PNN ) { 7ANetwork::ANetwork( NetworkNetNode * PNN ) : ANetNodeInstance( PNN ) {
8 Data.UseDHCP = 1; 8 Data.UseDHCP = 1;
9 Data.IPAddress = ""; 9 Data.IPAddress = "";
10 Data.NetMask = ""; 10 Data.NetMask = "";
11 Data.Broadcast = ""; 11 Data.Broadcast = "";
12 Data.Gateway = ""; 12 Data.Gateway = "";
13 Data.DNS1 = ""; 13 Data.DNS1 = "";
14 Data.DNS2 = ""; 14 Data.DNS2 = "";
15 Data.SendHostname = 0; 15 Data.SendHostname = 0;
16 Data.Hostname = ""; 16 Data.Hostname = "";
17 Data.PreUp_SL.clear(); 17 Data.PreUp_SL.clear();
18 Data.PreDown_SL.clear(); 18 Data.PreDown_SL.clear();
19 Data.PostUp_SL.clear(); 19 Data.PostUp_SL.clear();
20 Data.PostDown_SL.clear(); 20 Data.PostDown_SL.clear();
21 GUI = 0; 21 GUI = 0;
22 RT = 0; 22 RT = 0;
23} 23}
24 24
25void ANetwork::setSpecificAttribute( QString & A, QString & V ) { 25void ANetwork::setSpecificAttribute( QString & A, QString & V ) {
26 if( A == "usedhcp" ) { 26 if( A == "usedhcp" ) {
27 Data.UseDHCP = (V == "yes"); 27 Data.UseDHCP = (V == "yes");
28 } else if( A == "sendhostname" ) { 28 } else if( A == "sendhostname" ) {
29 Data.SendHostname = (V=="yes"); 29 Data.SendHostname = (V=="yes");
30 } else if( A == "hostname" ) { 30 } else if( A == "hostname" ) {
31 Data.Hostname = V; 31 Data.Hostname = V;
32 } else if( A == "ipaddress" ) { 32 } else if( A == "ipaddress" ) {
33 Data.IPAddress = V; 33 Data.IPAddress = V;
34 } else if( A == "netmask" ) { 34 } else if( A == "netmask" ) {
35 Data.NetMask = V; 35 Data.NetMask = V;
36 } else if( A == "broadcast" ) { 36 } else if( A == "broadcast" ) {
37 Data.Broadcast = V; 37 Data.Broadcast = V;
38 } else if( A == "gateway" ) { 38 } else if( A == "gateway" ) {
39 Data.Gateway = V; 39 Data.Gateway = V;
40 } else if( A == "dns1" ) { 40 } else if( A == "dns1" ) {
41 Data.DNS1 = V; 41 Data.DNS1 = V;
42 } else if( A == "dns2" ) { 42 } else if( A == "dns2" ) {
43 Data.DNS2 = V; 43 Data.DNS2 = V;
44 } else if( A == "preup" ) { 44 } else if( A == "preup" ) {
45 Data.PreUp_SL.append( V ); 45 Data.PreUp_SL.append( V );
46 } else if( A == "predown" ) { 46 } else if( A == "predown" ) {
47 Data.PreDown_SL.append( V ); 47 Data.PreDown_SL.append( V );
48 } else if( A == "postup" ) { 48 } else if( A == "postup" ) {
49 Data.PostUp_SL.append( V ); 49 Data.PostUp_SL.append( V );
50 } else if( A == "postdown" ) { 50 } else if( A == "postdown" ) {
51 Data.PostDown_SL.append( V ); 51 Data.PostDown_SL.append( V );
52 } 52 }
53} 53}
54 54
55void ANetwork::saveSpecificAttribute( QTextStream & TS ) { 55void ANetwork::saveSpecificAttribute( QTextStream & TS ) {
56 TS << "usedhcp=" << ((Data.UseDHCP) ? "yes" : "no") << endl; 56 TS << "usedhcp=" << ((Data.UseDHCP) ? "yes" : "no") << endl;
57 TS << "sendhostname=" << ((Data.SendHostname) ? "yes" : "no") << endl; 57 TS << "sendhostname=" << ((Data.SendHostname) ? "yes" : "no") << endl;
58 TS << "hostname=" << Data.Hostname << endl; 58 TS << "hostname=" << Data.Hostname << endl;
59 TS << "ipaddress=" << Data.IPAddress << endl; 59 TS << "ipaddress=" << Data.IPAddress << endl;
60 TS << "netmask=" << Data.NetMask << endl; 60 TS << "netmask=" << Data.NetMask << endl;
61 TS << "broadcast=" << Data.Broadcast << endl; 61 TS << "broadcast=" << Data.Broadcast << endl;
62 TS << "gateway=" << Data.Gateway << endl; 62 TS << "gateway=" << Data.Gateway << endl;
63 TS << "dns1=" << Data.DNS1 << endl; 63 TS << "dns1=" << Data.DNS1 << endl;
64 TS << "dns2=" << Data.DNS2 << endl; 64 TS << "dns2=" << Data.DNS2 << endl;
65 for ( QStringList::Iterator it = Data.PreUp_SL.begin(); 65 for ( QStringList::Iterator it = Data.PreUp_SL.begin();
66 it != Data.PreUp_SL.end(); 66 it != Data.PreUp_SL.end();
67 ++it ) { 67 ++it ) {
68 TS << "preup=" << quote(*it) << endl; 68 TS << "preup=" << quote(*it) << endl;
69 } 69 }
70 for ( QStringList::Iterator it = Data.PreDown_SL.begin(); 70 for ( QStringList::Iterator it = Data.PreDown_SL.begin();
71 it != Data.PreDown_SL.end(); 71 it != Data.PreDown_SL.end();
72 ++it ) { 72 ++it ) {
73 TS << "predown=" << quote(*it) << endl; 73 TS << "predown=" << quote(*it) << endl;
74 } 74 }
75 for ( QStringList::Iterator it = Data.PostUp_SL.begin(); 75 for ( QStringList::Iterator it = Data.PostUp_SL.begin();
76 it != Data.PostUp_SL.end(); 76 it != Data.PostUp_SL.end();
77 ++it ) { 77 ++it ) {
78 TS << "postup=" << quote(*it) << endl; 78 TS << "postup=" << quote(*it) << endl;
79 } 79 }
80 for ( QStringList::Iterator it = Data.PostDown_SL.begin(); 80 for ( QStringList::Iterator it = Data.PostDown_SL.begin();
81 it != Data.PostDown_SL.end(); 81 it != Data.PostDown_SL.end();
82 ++it ) { 82 ++it ) {
83 TS << "postdown=" << quote(*it) << endl; 83 TS << "postdown=" << quote(*it) << endl;
84 } 84 }
85} 85}
86 86
87QWidget * ANetwork::edit( QWidget * parent ) { 87QWidget * ANetwork::edit( QWidget * parent ) {
88 GUI = new NetworkEdit( parent ); 88 GUI = new NetworkEdit( parent );
89 GUI->showData( Data ); 89 GUI->showData( Data );
90 return GUI; 90 return GUI;
91} 91}
92 92
93QString ANetwork::acceptable( void ) { 93QString ANetwork::acceptable( void ) {
94 return ( GUI ) ? GUI->acceptable( ) : QString(); 94 return ( GUI ) ? GUI->acceptable( ) : QString();
95} 95}
96 96
97void ANetwork::commit( void ) { 97void ANetwork::commit( void ) {
98 if( GUI && GUI->commit( Data ) ) 98 if( GUI && GUI->commit( Data ) )
99 setModified( 1 ); 99 setModified( 1 );
100} 100}
101 101
102bool ANetwork::hasDataForFile( SystemFile & S ) { 102bool ANetwork::hasDataForFile( SystemFile & S ) {
103 return S.name() == "interfaces"; 103 return S.name() == "interfaces";
104} 104}
105 105
106short ANetwork::generateFile( SystemFile &SF, 106short ANetwork::generateFile( SystemFile &SF,
107 long DevNr 107 long DevNr
108 ) { 108 ) {
109 109
110 short rvl, rvd ; 110 short rvl, rvd ;
111 QString NIC = runtime()->device()->netNode()->nodeClass()->genNic( DevNr ); 111 QString NIC = runtime()->device()->netNode()->nodeClass()->genNic( DevNr );
112 112
113 rvl = 1; 113 rvl = 1;
114 if( SF.name() == "interfaces" ) { 114 if( SF.name() == "interfaces" ) {
115 Log(("Generate Network for %s\n", SF.name().latin1() )); 115 Log(("Generate Network for %s\n", SF.name().latin1() ));
116 // we can safely call from here since device item is deeper 116 // we can safely call from here since device item is deeper
117 if( Data.UseDHCP ) { 117 if( Data.UseDHCP ) {
118 SF << "iface " 118 SF << "iface "
119 << NIC 119 << "A"
120 << "-c"
121 << connection()->number() 120 << connection()->number()
122 << "-allowed inet dhcp" 121 << NIC
122 << " inet dhcp"
123 << endl; 123 << endl;
124 SF << " up echo \"" 124 SF << " up echo \""
125 << NIC 125 << NIC
126 << "\" > /tmp/profile-" 126 << "\" > /tmp/profile-"
127 << connection()->number() 127 << connection()->number()
128 << ".up" 128 << ".up"
129 << endl; 129 << endl;
130 if( Data.SendHostname ) { 130 if( Data.SendHostname ) {
131 SF << " hostname " 131 SF << " hostname "
132 << Data.Hostname 132 << Data.Hostname
133 << endl; 133 << endl;
134 } 134 }
135 135
136 SF << " down rm -f /tmp/profile-" 136 SF << " down rm -f /tmp/profile-"
137 << connection()->number() 137 << connection()->number()
138 << ".up" 138 << ".up"
139 << endl; 139 << endl;
140 } else { 140 } else {
141 SF << "iface " 141 SF << "iface "
142 << NIC << "-c" 142 << "A"
143 << connection()->number() 143 << connection()->number()
144 << "-allowed inet static" 144 << NIC
145 << " inet static"
145 << endl; 146 << endl;
146 SF << " up echo \"" 147 SF << " up echo \""
147 << NIC 148 << NIC
148 << "\" > /tmp/profile-" 149 << "\" > /tmp/profile-"
149 << connection()->number() 150 << connection()->number()
150 << ".up" 151 << ".up"
151 << endl; 152 << endl;
152 SF << " down rm -f /tmp/profile-" 153 SF << " down rm -f /tmp/profile-"
153 << connection()->number() 154 << connection()->number()
154 << ".up" 155 << ".up"
155 << endl; 156 << endl;
156 SF << " address " 157 SF << " address "
157 << Data.IPAddress 158 << Data.IPAddress
158 << endl; 159 << endl;
159 SF << " broadcast " 160 SF << " broadcast "
160 << Data.Broadcast 161 << Data.Broadcast
161 << endl; 162 << endl;
162 SF << " netmask " 163 SF << " netmask "
163 << Data.NetMask 164 << Data.NetMask
164 << endl; 165 << endl;
165 166
166 // derive network address = IPAddress & netmask 167 // derive network address = IPAddress & netmask
167 { QString NW; 168 { QString NW;
168 QStringList ipal = QStringList::split( '.', Data.IPAddress ); 169 QStringList ipal = QStringList::split( '.', Data.IPAddress );
169 QStringList nmal = QStringList::split( '.', Data.NetMask ); 170 QStringList nmal = QStringList::split( '.', Data.NetMask );
170 171
171 NW = QString( "%1.%2.%3.%4" ). 172 NW = QString( "%1.%2.%3.%4" ).
172 arg( ipal[0].toShort() & nmal[0].toShort() ). 173 arg( ipal[0].toShort() & nmal[0].toShort() ).
173 arg( ipal[1].toShort() & nmal[1].toShort() ). 174 arg( ipal[1].toShort() & nmal[1].toShort() ).
174 arg( ipal[2].toShort() & nmal[2].toShort() ). 175 arg( ipal[2].toShort() & nmal[2].toShort() ).
175 arg( ipal[3].toShort() & nmal[3].toShort() ); 176 arg( ipal[3].toShort() & nmal[3].toShort() );
176 SF << " network " 177 SF << " network "
177 << NW 178 << NW
178 << endl; 179 << endl;
179 } 180 }
180 } 181 }
181 for ( QStringList::Iterator it = Data.PreUp_SL.begin(); 182 for ( QStringList::Iterator it = Data.PreUp_SL.begin();
182 it != Data.PreUp_SL.end(); 183 it != Data.PreUp_SL.end();
183 ++it ) { 184 ++it ) {
184 SF << " pre-up " 185 SF << " pre-up "
185 << (*it) 186 << (*it)
186 << endl; 187 << endl;
187 } 188 }
188 for ( QStringList::Iterator it = Data.PostUp_SL.begin(); 189 for ( QStringList::Iterator it = Data.PostUp_SL.begin();
189 it != Data.PostUp_SL.end(); 190 it != Data.PostUp_SL.end();
190 ++it ) { 191 ++it ) {
191 SF << " up " 192 SF << " up "
192 << (*it) 193 << (*it)
193 << endl; 194 << endl;
194 } 195 }
195 for ( QStringList::Iterator it = Data.PreDown_SL.begin(); 196 for ( QStringList::Iterator it = Data.PreDown_SL.begin();
196 it != Data.PreDown_SL.end(); 197 it != Data.PreDown_SL.end();
197 ++it ) { 198 ++it ) {
198 SF << " down " 199 SF << " down "
199 << (*it) 200 << (*it)
200 << endl; 201 << endl;
201 } 202 }
202 for ( QStringList::Iterator it = Data.PostDown_SL.begin(); 203 for ( QStringList::Iterator it = Data.PostDown_SL.begin();
203 it != Data.PostDown_SL.end(); 204 it != Data.PostDown_SL.end();
204 ++it ) { 205 ++it ) {
205 SF << " post-down " 206 SF << " post-down "
206 << (*it) 207 << (*it)
207 << endl; 208 << endl;
208 } 209 }
209 rvl = 0; 210 rvl = 0;
210 } 211 }
211 212
212 // embed other info in it 213 // embed other info in it
213 rvd = connection()->getToplevel()->generateFileEmbedded( SF, DevNr ); 214 rvd = connection()->getToplevel()->generateFileEmbedded( SF, DevNr );
214 215
215 return (rvd == 2 || rvl == 2 ) ? 2 : 216 return (rvd == 2 || rvl == 2 ) ? 2 :
216 (rvd == 0 || rvl == 0 ) ? 0 : 1; 217 (rvd == 0 || rvl == 0 ) ? 0 : 1;
217} 218}
diff --git a/noncore/settings/networksettings2/network/networkrun.cpp b/noncore/settings/networksettings2/network/networkrun.cpp
index 2c93d9d..74467ad 100644
--- a/noncore/settings/networksettings2/network/networkrun.cpp
+++ b/noncore/settings/networksettings2/network/networkrun.cpp
@@ -1,50 +1,51 @@
1#include <system.h> 1#include <system.h>
2#include <netnode.h> 2#include <netnode.h>
3#include <resources.h> 3#include <resources.h>
4#include "networkrun.h" 4#include "networkrun.h"
5 5
6State_t NetworkRun::detectState( void ) { 6State_t NetworkRun::detectState( void ) {
7 InterfaceInfo * II = nodeCollection()->assignedInterface(); 7 InterfaceInfo * II = nodeCollection()->assignedInterface();
8 8
9 Log(( "Interface %p : %d\n", II, (II) ? II->IsUp : 0 )); 9 Log(( "Interface %p %p : %d\n", II, nodeCollection(), (II) ? II->IsUp : 0 ));
10 if( II && II->IsUp ) { 10 if( II && II->IsUp ) {
11 // device has assigned interface 11 // device has assigned interface
12 return IsUp; 12 return IsUp;
13 } 13 }
14 14
15 // had no interface or interface is no longer up -> release 15 // had no interface or interface is no longer up -> release
16 nodeCollection()->assignInterface( 0 ); 16 nodeCollection()->assignInterface( 0 );
17 17
18 return Unknown; 18 return Unknown;
19} 19}
20 20
21QString NetworkRun::setMyState( NodeCollection * NC, Action_t A, bool ) { 21QString NetworkRun::setMyState( NodeCollection * NC, Action_t A, bool ) {
22 // we handle UP and DOWN 22 // we handle UP and DOWN
23 InterfaceInfo * II = NC->assignedInterface(); 23 InterfaceInfo * II = NC->assignedInterface();
24 24
25 if( ! II ) { 25 if( ! II ) {
26 Log(( "no interface assigned." )); 26 Log(( "no interface assigned." ));
27 return QString(); 27 return QString();
28 } 28 }
29 29
30 QStringList SL; 30 QStringList SL;
31 31
32 if( A == Up ) { 32 if( A == Up ) {
33 // we can bring UP if lower level is available 33 // we can bring UP if lower level is available
34 SL << "ifup"; 34 SL << "ifup";
35 } else if( A == Down ) { 35 } else if( A == Down ) {
36 SL << "ifdown"; 36 SL << "ifdown";
37 } else { 37 } else {
38 return QString(); 38 return QString();
39 } 39 }
40 40
41 SL << QString().sprintf( "%s=%s-c%d-allowed", 41 SL << QString().sprintf( "%s=A%ld%s",
42 II->Name.latin1(), II->Name.latin1(), 42 II->Name.latin1(),
43 nodeCollection()->number() ); 43 nodeCollection()->number(),
44 II->Name.latin1() );
44 45
45 if( ! NSResources->system().runAsRoot( SL ) ) { 46 if( ! NSResources->system().runAsRoot( SL ) ) {
46 return QString("Cannot call %1").arg(SL.join(" ")); 47 return QString("Cannot call %1").arg(SL.join(" "));
47 } 48 }
48 49
49 return QString(); 50 return QString();
50} 51}
diff --git a/noncore/settings/networksettings2/networksettings2/resources.cpp b/noncore/settings/networksettings2/networksettings2/resources.cpp
index 3479abb..b81dcaa 100644
--- a/noncore/settings/networksettings2/networksettings2/resources.cpp
+++ b/noncore/settings/networksettings2/networksettings2/resources.cpp
@@ -1,479 +1,481 @@
1#include <unistd.h> 1#include <unistd.h>
2#include <errno.h> 2#include <errno.h>
3#include <fcntl.h> 3#include <fcntl.h>
4#include <pwd.h> 4#include <pwd.h>
5#include <qpixmap.h> 5#include <qpixmap.h>
6#include <qdir.h> 6#include <qdir.h>
7#include <qmessagebox.h> 7#include <qmessagebox.h>
8 8
9#include <qpe/qlibrary.h> 9#include <qpe/qlibrary.h>
10#include <qpe/qpeapplication.h> 10#include <qpe/qpeapplication.h>
11 11
12#include <opie2/odebug.h> 12#include <opie2/odebug.h>
13#include <opie2/opluginloader.h> 13#include <opie2/opluginloader.h>
14 14
15#include <qtopia/resource.h> 15#include <qtopia/resource.h>
16 16
17#include "netnode.h" 17#include "netnode.h"
18#include "resources.h" 18#include "resources.h"
19#include "netnodeinterface.h" 19#include "netnodeinterface.h"
20 20
21#define PLUGINDIR "plugins/networksettings2" 21#define PLUGINDIR "plugins/networksettings2"
22#define ICONDIR "/pics/networksettings2/" 22#define ICONDIR "/pics/networksettings2/"
23 23
24// single resources instance 24// single resources instance
25TheNSResources * _NSResources = 0; 25TheNSResources * _NSResources = 0;
26 26
27TheNSResources::TheNSResources( void ) : NodeTypeNameMap(), 27TheNSResources::TheNSResources( void ) : NodeTypeNameMap(),
28 ConnectionsMap(), DanglingConnectionsMap() { 28 ConnectionsMap(), DanglingConnectionsMap() {
29 29
30 _NSResources = this; 30 _NSResources = this;
31 31
32 detectCurrentUser(); 32 detectCurrentUser();
33 33
34 // load available netnodes 34 // load available netnodes
35 35
36 Plugins = 0; 36 Plugins = 0;
37 findAvailableNetNodes(); 37 findAvailableNetNodes();
38 38
39 // compile provides and needs lists 39 // compile provides and needs lists
40 { const char ** NeedsRun; 40 { const char ** NeedsRun;
41 QDictIterator<ANetNode> OuterIt( AllNodeTypes ); 41 QDictIterator<ANetNode> OuterIt( AllNodeTypes );
42 bool Done; 42 bool Done;
43 43
44 for ( ; OuterIt.current(); ++OuterIt ) { 44 for ( ; OuterIt.current(); ++OuterIt ) {
45 // find needs list 45 // find needs list
46 ANetNode::NetNodeList * NNLP = new ANetNode::NetNodeList; 46 ANetNode::NetNodeList * NNLP = new ANetNode::NetNodeList;
47 ANetNode::NetNodeList & NNL = *(NNLP); 47 ANetNode::NetNodeList & NNL = *(NNLP);
48 48
49 // must iterate this way to avoid duplication pointers 49 // must iterate this way to avoid duplication pointers
50 for ( QDictIterator<ANetNode> InnerIt( AllNodeTypes ); 50 for ( QDictIterator<ANetNode> InnerIt( AllNodeTypes );
51 InnerIt.current(); ++InnerIt ) { 51 InnerIt.current(); ++InnerIt ) {
52 52
53 if( InnerIt.current() == OuterIt.current() ) 53 if( InnerIt.current() == OuterIt.current() )
54 // avoid recursive 54 // avoid recursive
55 continue; 55 continue;
56 56
57 const char ** Provides = InnerIt.current()->provides(); 57 const char ** Provides = InnerIt.current()->provides();
58 NeedsRun = OuterIt.current()->needs(); 58 NeedsRun = OuterIt.current()->needs();
59 59
60 for( ; *NeedsRun; NeedsRun ++ ) { 60 for( ; *NeedsRun; NeedsRun ++ ) {
61 const char ** PRun; 61 const char ** PRun;
62 PRun = Provides; 62 PRun = Provides;
63 for( ; *PRun; PRun ++ ) { 63 for( ; *PRun; PRun ++ ) {
64 if( strcmp( *PRun, *NeedsRun ) == 0 ) { 64 if( strcmp( *PRun, *NeedsRun ) == 0 ) {
65 // inner provides what outer needs 65 // inner provides what outer needs
66 NNL.resize( NNL.size() + 1 ); 66 NNL.resize( NNL.size() + 1 );
67 NNL[NNL.size()-1] = InnerIt.current(); 67 NNL[NNL.size()-1] = InnerIt.current();
68 Done = 1; // break from 2 loops 68 Done = 1; // break from 2 loops
69 break; 69 break;
70 } 70 }
71 } 71 }
72 } 72 }
73 } 73 }
74 OuterIt.current()->setAlternatives( NNLP ); 74 OuterIt.current()->setAlternatives( NNLP );
75 } 75 }
76 } 76 }
77 77
78 // define built in Node types to Description map 78 // define built in Node types to Description map
79 addNodeType( "device", tr( "Network Device" ), 79 addNodeType( "device", tr( "Network Device" ),
80 tr( "<p>Devices that can handle IP packets</p>" ) ); 80 tr( "<p>Devices that can handle IP packets</p>" ) );
81 addNodeType( "line", tr( "Character device" ), 81 addNodeType( "line", tr( "Character device" ),
82 tr( "<p>Devices that can handle single bytes</p>" ) ); 82 tr( "<p>Devices that can handle single bytes</p>" ) );
83 addNodeType( "connection", tr( "IP Connection" ), 83 addNodeType( "connection", tr( "IP Connection" ),
84 tr( "<p>Nodes that provide working IP connections</p>" ) ); 84 tr( "<p>Nodes that provide working IP connections</p>" ) );
85 addNodeType( "fullsetup", tr( "Connection Profile" ), 85 addNodeType( "fullsetup", tr( "Connection Profile" ),
86 tr( "<p>Fully configured connection profile</p>" ) ); 86 tr( "<p>Fully configured connection profile</p>" ) );
87 addNodeType( "GPRS", tr( "Connection to GPRS device" ), 87 addNodeType( "GPRS", tr( "Connection to GPRS device" ),
88 tr( "<p>Connection to a GPRS capable device</p>" ) ); 88 tr( "<p>Connection to a GPRS capable device</p>" ) );
89 89
90 // get access to the system 90 // get access to the system
91 TheSystem = new System(); 91 TheSystem = new System();
92 92
93} 93}
94 94
95TheNSResources::~TheNSResources( void ) { 95TheNSResources::~TheNSResources( void ) {
96 96
97 if( Plugins ) { 97 if( Plugins ) {
98 delete Plugins; 98 delete Plugins;
99 delete PluginManager; 99 delete PluginManager;
100 } 100 }
101 delete TheSystem; 101 delete TheSystem;
102 102
103} 103}
104 104
105void TheNSResources::addNodeType( const QString & ID, 105void TheNSResources::addNodeType( const QString & ID,
106 const QString & Name, 106 const QString & Name,
107 const QString & Descr ) { 107 const QString & Descr ) {
108 if( NodeTypeNameMap[ID].isEmpty() ) { 108 if( NodeTypeNameMap[ID].isEmpty() ) {
109 NodeTypeNameMap.insert( ID, Name ); 109 NodeTypeNameMap.insert( ID, Name );
110 NodeTypeDescriptionMap.insert( ID, Descr ); 110 NodeTypeDescriptionMap.insert( ID, Descr );
111 } 111 }
112} 112}
113 113
114void TheNSResources::addSystemFile( const QString & ID, 114void TheNSResources::addSystemFile( const QString & ID,
115 const QString & P, 115 const QString & P,
116 bool KDI ) { 116 bool KDI ) {
117 if( ! SystemFiles.find( ID ) ) { 117 if( ! SystemFiles.find( ID ) ) {
118 // new system file 118 // new system file
119 SystemFiles.insert( ID, new SystemFile( ID, P, KDI ) ); 119 SystemFiles.insert( ID, new SystemFile( ID, P, KDI ) );
120 } // else existed 120 } // else existed
121} 121}
122 122
123void TheNSResources::busy( bool ) { 123void TheNSResources::busy( bool ) {
124/* 124/*
125 if( B ) { 125 if( B ) {
126 ShowWait->show(); 126 ShowWait->show();
127 qApp->process 127 qApp->process
128 } else { 128 } else {
129 ShowWait->hide(); 129 ShowWait->hide();
130 } 130 }
131*/ 131*/
132} 132}
133 133
134void TheNSResources::findAvailableNetNodes( void ){ 134void TheNSResources::findAvailableNetNodes( void ){
135 135
136 Plugins = new OPluginLoader( "networksettings2" ); 136 Plugins = new OPluginLoader( "networksettings2" );
137 Plugins->setAutoDelete( true ); 137 Plugins->setAutoDelete( true );
138 138
139 PluginManager = new OPluginManager( Plugins ); 139 PluginManager = new OPluginManager( Plugins );
140 PluginManager->load(); 140 PluginManager->load();
141 141
142 if( Plugins->isInSafeMode() ) { 142 if( Plugins->isInSafeMode() ) {
143 QMessageBox::information( 143 QMessageBox::information(
144 0, 144 0,
145 tr( "Today Error"), 145 tr( "Today Error"),
146 tr( "<qt>The plugin '%1' caused Today to crash." 146 tr( "<qt>The plugin '%1' caused Today to crash."
147 " It could be that the plugin is not properly" 147 " It could be that the plugin is not properly"
148 " installed.<br>Today tries to continue loading" 148 " installed.<br>Today tries to continue loading"
149 " plugins.</qt>" ) 149 " plugins.</qt>" )
150 .arg( PluginManager->crashedPlugin().name())); 150 .arg( PluginManager->crashedPlugin().name()));
151 } 151 }
152 152
153 // Get All Plugins 153 // Get All Plugins
154 OPluginLoader::List allplugins = Plugins->filtered(); 154 OPluginLoader::List allplugins = Plugins->filtered();
155 QString lang = ::getenv("LANG"); 155 QString lang = ::getenv("LANG");
156 156
157 for( OPluginLoader::List::Iterator it = allplugins.begin(); 157 for( OPluginLoader::List::Iterator it = allplugins.begin();
158 it != allplugins.end(); 158 it != allplugins.end();
159 ++it ) { 159 ++it ) {
160 160
161 // check if this plugin supports the proper interface 161 // check if this plugin supports the proper interface
162 NetNodeInterface * interface = 162 NetNodeInterface * interface =
163 Plugins->load<NetNodeInterface>( *it, IID_NetworkSettings2 ); 163 Plugins->load<NetNodeInterface>( *it, IID_NetworkSettings2 );
164 164
165 if( ! interface ) { 165 if( ! interface ) {
166 Log(( "Plugin %s from %s does not support proper interface\n", 166 Log(( "Plugin %s from %s does not support proper interface\n",
167 (*it).name().latin1(), (*it).path().latin1() )); 167 (*it).name().latin1(), (*it).path().latin1() ));
168 continue; 168 continue;
169 } 169 }
170 170
171 // add the nodes in this plugin to the dictionary 171 // add the nodes in this plugin to the dictionary
172 { QList<ANetNode> PNN; 172 { QList<ANetNode> PNN;
173 173
174 interface->create_plugin( PNN ); 174 interface->create_plugin( PNN );
175 175
176 if( PNN.isEmpty() ) { 176 if( PNN.isEmpty() ) {
177 Log(( "Plugin %s from %s does offer any nodes\n", 177 Log(( "Plugin %s from %s does offer any nodes\n",
178 (*it).name().latin1(), (*it).path().latin1() )); 178 (*it).name().latin1(), (*it).path().latin1() ));
179 delete interface; 179 delete interface;
180 continue; 180 continue;
181 } 181 }
182 182
183 // merge this node with global node 183 // merge this node with global node
184 for( QListIterator<ANetNode> it(PNN); 184 for( QListIterator<ANetNode> it(PNN);
185 it.current(); 185 it.current();
186 ++it ) { 186 ++it ) {
187 AllNodeTypes.insert( it.current()->name(), it.current() ); 187 AllNodeTypes.insert( it.current()->name(), it.current() );
188 } 188 }
189 } 189 }
190 190
191 // load the translation 191 // load the translation
192 QTranslator *trans = new QTranslator(qApp); 192 QTranslator *trans = new QTranslator(qApp);
193 QString fn = QPEApplication::qpeDir()+ 193 QString fn = QPEApplication::qpeDir()+
194 "/i18n/"+lang+"/"+ (*it).name() + ".qm"; 194 "/i18n/"+lang+"/"+ (*it).name() + ".qm";
195 195
196 if( trans->load( fn ) ) 196 if( trans->load( fn ) )
197 qApp->installTranslator( trans ); 197 qApp->installTranslator( trans );
198 else 198 else
199 delete trans; 199 delete trans;
200 } 200 }
201 201
202} 202}
203 203
204// used to find unique connection number 204// used to find unique connection number
205int TheNSResources::assignConnectionNumber( void ) { 205int TheNSResources::assignConnectionNumber( void ) {
206 bool found = 1; 206 bool found = 1;
207 for( int trial = 0; ; trial ++ ) { 207 for( int trial = 0; ; trial ++ ) {
208 found = 1; 208 found = 1;
209 for( QDictIterator<NodeCollection> it(ConnectionsMap); 209 for( QDictIterator<NodeCollection> it(ConnectionsMap);
210 it.current(); 210 it.current();
211 ++it ) { 211 ++it ) {
212 if( it.current()->number() == trial ) { 212 if( it.current()->number() == trial ) {
213 found = 0; 213 found = 0;
214 break; 214 break;
215 } 215 }
216 } 216 }
217 217
218 if( found ) { 218 if( found ) {
219 Log(("Assign profile number %d\n", trial )); 219 Log(("Assign profile number %d\n", trial ));
220 return trial; 220 return trial;
221 } 221 }
222 } 222 }
223} 223}
224 224
225QPixmap TheNSResources::getPixmap( const QString & QS ) { 225QPixmap TheNSResources::getPixmap( const QString & QS ) {
226 QPixmap P; 226 QPixmap P;
227 QString S("networksettings2/"); 227 QString S("networksettings2/");
228 S += QS; 228 S += QS;
229 P = Resource::loadPixmap( S ); 229 P = Resource::loadPixmap( S );
230 if( P.isNull() ) { 230 if( P.isNull() ) {
231 Log(( "Cannot load %s\n", S.latin1() )); 231 Log(( "Cannot load %s\n", S.latin1() ));
232 } 232 }
233 return ( P.isNull() ) ? QPixmap() : P; 233 return ( P.isNull() ) ? QPixmap() : P;
234} 234}
235 235
236QString TheNSResources::tr( const char * s ) { 236QString TheNSResources::tr( const char * s ) {
237 return qApp->translate( "resource", s ); 237 return qApp->translate( "resource", s );
238} 238}
239 239
240const QString & TheNSResources::netNode2Name( const char * s ) { 240const QString & TheNSResources::netNode2Name( const char * s ) {
241 return NodeTypeNameMap[s]; 241 return NodeTypeNameMap[s];
242} 242}
243 243
244const QString & TheNSResources::netNode2Description( const char * s ) { 244const QString & TheNSResources::netNode2Description( const char * s ) {
245 return NodeTypeDescriptionMap[s]; 245 return NodeTypeDescriptionMap[s];
246} 246}
247 247
248void TheNSResources::addConnection( NodeCollection * NC, bool Dangling ) { 248void TheNSResources::addConnection( NodeCollection * NC, bool Dangling ) {
249 ANetNodeInstance * NNI; 249 ANetNodeInstance * NNI;
250 Log(( "Add Connection %s, Dangling %d\n",
251 NC->name().latin1(), Dangling ));
250 if( Dangling ) { 252 if( Dangling ) {
251 DanglingConnectionsMap.insert( NC->name(), NC ); 253 DanglingConnectionsMap.insert( NC->name(), NC );
252 } else { 254 } else {
253 ConnectionsMap.insert( NC->name(), NC ); 255 ConnectionsMap.insert( NC->name(), NC );
254 } 256 }
255 257
256 // add (new) nodes to NodeList 258 // add (new) nodes to NodeList
257 for( QListIterator<ANetNodeInstance> it(*NC); 259 for( QListIterator<ANetNodeInstance> it(*NC);
258 it.current(); 260 it.current();
259 ++it ) { 261 ++it ) {
260 NNI = it.current(); 262 NNI = it.current();
261 if( findNodeInstance( NNI->name() ) == 0 ) { 263 if( findNodeInstance( NNI->name() ) == 0 ) {
262 // new item 264 // new item
263 addNodeInstance( NNI ); 265 addNodeInstance( NNI );
264 } 266 }
265 } 267 }
266} 268}
267 269
268void TheNSResources::removeConnection( const QString & N ) { 270void TheNSResources::removeConnection( const QString & N ) {
269 NodeCollection * NC = findConnection( N ); 271 NodeCollection * NC = findConnection( N );
270 if( ! NC ) 272 if( ! NC )
271 return; 273 return;
272 274
273 // delete netnodes in this connection 275 // delete netnodes in this connection
274 ANetNodeInstance * NNI; 276 ANetNodeInstance * NNI;
275 for( NNI = NC->first(); NNI != 0; NNI = NC->next() ) { 277 for( NNI = NC->first(); NNI != 0; NNI = NC->next() ) {
276 removeNodeInstance( NNI->name() ); 278 removeNodeInstance( NNI->name() );
277 } 279 }
278 if( ConnectionsMap.find( N ) ) { 280 if( ConnectionsMap.find( N ) ) {
279 ConnectionsMap.remove( N ); 281 ConnectionsMap.remove( N );
280 } else { 282 } else {
281 DanglingConnectionsMap.remove( N ); 283 DanglingConnectionsMap.remove( N );
282 } 284 }
283 285
284} 286}
285 287
286// dangling connections are filtered out 288// dangling connections are filtered out
287NodeCollection * TheNSResources::findConnection( const QString & S ) { 289NodeCollection * TheNSResources::findConnection( const QString & S ) {
288 return ConnectionsMap[ S ]; 290 return ConnectionsMap[ S ];
289} 291}
290 292
291NodeCollection * TheNSResources::getConnection( int nr ) { 293NodeCollection * TheNSResources::getConnection( int nr ) {
292 for( QDictIterator<NodeCollection> it(ConnectionsMap); 294 for( QDictIterator<NodeCollection> it(ConnectionsMap);
293 it.current(); 295 it.current();
294 ++it ) { 296 ++it ) {
295 if( it.current()->number() == nr ) { 297 if( it.current()->number() == nr ) {
296 return it.current(); 298 return it.current();
297 } 299 }
298 } 300 }
299 return 0; 301 return 0;
300} 302}
301/* 303/*
302void TheNSResources::renumberConnections( void ) { 304void TheNSResources::renumberConnections( void ) {
303 Name2Connection_t & M = NSResources->connections(); 305 Name2Connection_t & M = NSResources->connections();
304 NodeCollection * NC; 306 NodeCollection * NC;
305 307
306 // for all connections 308 // for all connections
307 NodeCollection::resetMaxNr(); 309 NodeCollection::resetMaxNr();
308 for( QDictIterator<NodeCollection> it(M); 310 for( QDictIterator<NodeCollection> it(M);
309 it.current(); 311 it.current();
310 ++it ) { 312 ++it ) {
311 NC = it.current(); 313 NC = it.current();
312 NC->setNumber( NC->maxConnectionNumber()+1 ); 314 NC->setNumber( NC->maxConnectionNumber()+1 );
313 NC->setModified( 1 ); 315 NC->setModified( 1 );
314 } 316 }
315} 317}
316*/ 318*/
317 319
318typedef struct EnvVars { 320typedef struct EnvVars {
319 char * Name; 321 char * Name;
320 int Len; 322 int Len;
321} EnvVar_t; 323} EnvVar_t;
322 324
323#define AnEV(x) x, sizeof(x)-1 325#define AnEV(x) x, sizeof(x)-1
324 326
325static EnvVar_t EV[] = { 327static EnvVar_t EV[] = {
326 AnEV( "HOME" ), 328 AnEV( "HOME" ),
327 AnEV( "LOGNAME" ), 329 AnEV( "LOGNAME" ),
328 AnEV( "USER" ), 330 AnEV( "USER" ),
329 AnEV( "LD_LIBRARY_PATH" ), 331 AnEV( "LD_LIBRARY_PATH" ),
330 AnEV( "PATH" ), 332 AnEV( "PATH" ),
331 AnEV( "QTDIR" ), 333 AnEV( "QTDIR" ),
332 AnEV( "OPIEDIR" ), 334 AnEV( "OPIEDIR" ),
333 AnEV( "SHELL" ), 335 AnEV( "SHELL" ),
334 { NULL, 0 } 336 { NULL, 0 }
335}; 337};
336 338
337void TheNSResources::detectCurrentUser( void ) { 339void TheNSResources::detectCurrentUser( void ) {
338 // find current running qpe 340 // find current running qpe
339 QString QPEEnvFile = ""; 341 QString QPEEnvFile = "";
340 342
341 CurrentUser.UserName = ""; 343 CurrentUser.UserName = "";
342 CurrentUser.HomeDir = ""; 344 CurrentUser.HomeDir = "";
343 345
344 if( getenv( "OPIEDIR" ) == 0 ) { 346 if( getenv( "OPIEDIR" ) == 0 ) {
345 // nothing known 347 // nothing known
346 { // open proc dir and find all dirs in it 348 { // open proc dir and find all dirs in it
347 QRegExp R("[0-9]+"); 349 QRegExp R("[0-9]+");
348 QDir ProcDir( "/proc" ); 350 QDir ProcDir( "/proc" );
349 QFileInfo FI; 351 QFileInfo FI;
350 QStringList EL = ProcDir.entryList( QDir::Dirs ); 352 QStringList EL = ProcDir.entryList( QDir::Dirs );
351 353
352 // print it out 354 // print it out
353 for ( QStringList::Iterator it = EL.begin(); 355 for ( QStringList::Iterator it = EL.begin();
354 it != EL.end(); 356 it != EL.end();
355 ++it ) { 357 ++it ) {
356 if( R.match( (*it) ) >= 0 ) { 358 if( R.match( (*it) ) >= 0 ) {
357 QString S = ProcDir.path()+"/"+ (*it); 359 QString S = ProcDir.path()+"/"+ (*it);
358 S.append( "/exe" ); 360 S.append( "/exe" );
359 FI.setFile( S ); 361 FI.setFile( S );
360 // get the link 362 // get the link
361 S = FI.readLink(); 363 S = FI.readLink();
362 if( S.right( 8 ) == "/bin/qpe" ) { 364 if( S.right( 8 ) == "/bin/qpe" ) {
363 // found running qpe 365 // found running qpe
364 QPEEnvFile.sprintf( ProcDir.path()+ "/" + (*it) + "/environ" ); 366 QPEEnvFile.sprintf( ProcDir.path()+ "/" + (*it) + "/environ" );
365 break; 367 break;
366 } 368 }
367 } 369 }
368 } 370 }
369 } 371 }
370 372
371 if( QPEEnvFile.isEmpty() ) { 373 if( QPEEnvFile.isEmpty() ) {
372 // could not find qpe 374 // could not find qpe
373 Log(("Could not find qpe\n" )); 375 Log(("Could not find qpe\n" ));
374 return; 376 return;
375 } 377 }
376 378
377 // FI now contains path ProcDir to the cmd dir 379 // FI now contains path ProcDir to the cmd dir
378 { char * Buf = 0; 380 { char * Buf = 0;
379 char TB[1024]; 381 char TB[1024];
380 long BufSize = 0; 382 long BufSize = 0;
381 int fd; 383 int fd;
382 int rd; 384 int rd;
383 385
384 fd = open( QPEEnvFile.latin1(), O_RDONLY ); 386 fd = open( QPEEnvFile.latin1(), O_RDONLY );
385 if( fd < 0 ) { 387 if( fd < 0 ) {
386 Log(("Could not open %s : %d\n", 388 Log(("Could not open %s : %d\n",
387 QPEEnvFile.latin1(), errno )); 389 QPEEnvFile.latin1(), errno ));
388 return; 390 return;
389 } 391 }
390 392
391 while( (rd = read( fd, TB, sizeof(TB) ) ) > 0 ) { 393 while( (rd = read( fd, TB, sizeof(TB) ) ) > 0 ) {
392 Buf = (char *)realloc( Buf, BufSize+rd ); 394 Buf = (char *)realloc( Buf, BufSize+rd );
393 memcpy( Buf+BufSize, TB, rd ); 395 memcpy( Buf+BufSize, TB, rd );
394 BufSize += rd; 396 BufSize += rd;
395 } 397 }
396 398
397 char * Data = Buf; 399 char * Data = Buf;
398 char * DataEnd = Data+BufSize-1; 400 char * DataEnd = Data+BufSize-1;
399 401
400 // get env items out of list 402 // get env items out of list
401 while( Data < DataEnd ) { 403 while( Data < DataEnd ) {
402 404
403 EnvVar_t * Run = EV; 405 EnvVar_t * Run = EV;
404 while( Run->Name ) { 406 while( Run->Name ) {
405 if( strncmp( Data, Run->Name, Run->Len ) == 0 && 407 if( strncmp( Data, Run->Name, Run->Len ) == 0 &&
406 Data[Run->Len] == '=' 408 Data[Run->Len] == '='
407 ) { 409 ) {
408 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); 410 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 );
409 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = 411 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] =
410 strdup( Data ); 412 strdup( Data );
411 413
412 if( strcmp( Run->Name, "OPIEDIR" ) == 0 ) { 414 if( strcmp( Run->Name, "OPIEDIR" ) == 0 ) {
413 // put OPIEDIR in env 415 // put OPIEDIR in env
414 putenv( CurrentUser.EnvList[CurrentUser.EnvList.size()-1] ); 416 putenv( CurrentUser.EnvList[CurrentUser.EnvList.size()-1] );
415 } else if( strcmp( Run->Name, "HOME" ) == 0 ) { 417 } else if( strcmp( Run->Name, "HOME" ) == 0 ) {
416 CurrentUser.HomeDir = Data+5; 418 CurrentUser.HomeDir = Data+5;
417 } else if( strcmp( Run->Name, "LOGNAME" ) == 0 ) { 419 } else if( strcmp( Run->Name, "LOGNAME" ) == 0 ) {
418 CurrentUser.UserName = Data+8; 420 CurrentUser.UserName = Data+8;
419 } 421 }
420 break; 422 break;
421 } 423 }
422 Run ++; 424 Run ++;
423 } 425 }
424 426
425 Data += strlen( Data )+1; 427 Data += strlen( Data )+1;
426 } 428 }
427 429
428 free( Buf ); 430 free( Buf );
429 431
430 if( ! CurrentUser.UserName.isEmpty() ) { 432 if( ! CurrentUser.UserName.isEmpty() ) {
431 // find user info 433 // find user info
432 struct passwd pwd; 434 struct passwd pwd;
433 struct passwd * pwdres; 435 struct passwd * pwdres;
434 436
435 if( getpwnam_r( CurrentUser.UserName.latin1(), 437 if( getpwnam_r( CurrentUser.UserName.latin1(),
436 &pwd, TB, sizeof(TB), &pwdres ) || 438 &pwd, TB, sizeof(TB), &pwdres ) ||
437 pwdres == 0 ) { 439 pwdres == 0 ) {
438 Log(("Could not determine user %s : %d\n", 440 Log(("Could not determine user %s : %d\n",
439 CurrentUser.UserName.latin1(), errno )); 441 CurrentUser.UserName.latin1(), errno ));
440 return; 442 return;
441 } 443 }
442 CurrentUser.Uid = pwd.pw_uid; 444 CurrentUser.Uid = pwd.pw_uid;
443 CurrentUser.Gid = pwd.pw_gid; 445 CurrentUser.Gid = pwd.pw_gid;
444 } else{ 446 } else{
445 CurrentUser.Uid = 447 CurrentUser.Uid =
446 CurrentUser.Gid = -1; 448 CurrentUser.Gid = -1;
447 } 449 }
448 } 450 }
449 451
450 } else { 452 } else {
451 char * X; 453 char * X;
452 QString S; 454 QString S;
453 455
454 EnvVar_t * Run = EV; 456 EnvVar_t * Run = EV;
455 while( Run->Name ) { 457 while( Run->Name ) {
456 458
457 if( ( X = getenv( Run->Name ) ) ) { 459 if( ( X = getenv( Run->Name ) ) ) {
458 Log(( "Env : %s = %s\n", Run->Name, X )); 460 Log(( "Env : %s = %s\n", Run->Name, X ));
459 461
460 S.sprintf( "%s=%s", Run->Name, X ); 462 S.sprintf( "%s=%s", Run->Name, X );
461 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); 463 CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 );
462 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = 464 CurrentUser.EnvList[CurrentUser.EnvList.size()-1] =
463 strdup( S.latin1() ); 465 strdup( S.latin1() );
464 466
465 if( strcmp( Run->Name, "LOGNAME" ) == 0 ) { 467 if( strcmp( Run->Name, "LOGNAME" ) == 0 ) {
466 CurrentUser.UserName = X; 468 CurrentUser.UserName = X;
467 } else if( strcmp( Run->Name, "HOME" ) == 0 ) { 469 } else if( strcmp( Run->Name, "HOME" ) == 0 ) {
468 CurrentUser.HomeDir = X; 470 CurrentUser.HomeDir = X;
469 } // regulare env var 471 } // regulare env var
470 } else { 472 } else {
471 Log(("Could not determine %s\n", Run->Name )); 473 Log(("Could not determine %s\n", Run->Name ));
472 } 474 }
473 Run ++; 475 Run ++;
474 } 476 }
475 477
476 CurrentUser.Uid = getuid(); 478 CurrentUser.Uid = getuid();
477 CurrentUser.Gid = getgid(); 479 CurrentUser.Gid = getgid();
478 } 480 }
479} 481}
diff --git a/noncore/settings/networksettings2/networksettings2/resources.h b/noncore/settings/networksettings2/networksettings2/resources.h
index b27cda1..51c4250 100644
--- a/noncore/settings/networksettings2/networksettings2/resources.h
+++ b/noncore/settings/networksettings2/networksettings2/resources.h
@@ -1,153 +1,153 @@
1#ifndef __RESOURCES__H 1#ifndef __RESOURCES__H
2#define __RESOURCES__H 2#define __RESOURCES__H
3 3
4#include <qstring.h> 4#include <qstring.h>
5#include <qdict.h> 5#include <qdict.h>
6#include <qmap.h> 6#include <qmap.h>
7#include <qlist.h> 7#include <qlist.h>
8#include "netnode.h" 8#include "netnode.h"
9#include "systemfile.h" 9#include "systemfile.h"
10#include "system.h" 10#include "system.h"
11 11
12class QLibrary; 12class QLibrary;
13class QPixmap; 13class QPixmap;
14class ANetNode; 14class ANetNode;
15class ANetNodeInstance; 15class ANetNodeInstance;
16 16
17namespace Opie { 17namespace Opie {
18 namespace Core { 18 namespace Core {
19 class OPluginLoader; 19 class OPluginLoader;
20 class OPluginManager; 20 class OPluginManager;
21 } 21 }
22} 22}
23 23
24typedef void (*GetNetNodeListFt_t)(QList<ANetNode>& PNN ); 24typedef void (*GetNetNodeListFt_t)(QList<ANetNode>& PNN );
25 25
26class CurrentQPEUser { 26class CurrentQPEUser {
27 27
28public : 28public :
29 CurrentQPEUser() : UserName(), HomeDir(), EnvList() {} 29 CurrentQPEUser() : UserName(), HomeDir(), EnvList() {}
30 30
31 inline bool known( void ) 31 inline bool known( void )
32 { return ! HomeDir.isEmpty() && ! UserName.isEmpty(); } 32 { return ! HomeDir.isEmpty() && ! UserName.isEmpty(); }
33 33
34 QString UserName; 34 QString UserName;
35 QString HomeDir; 35 QString HomeDir;
36 int Uid; 36 int Uid;
37 int Gid; 37 int Gid;
38 QArray<char *> EnvList; 38 QArray<char *> EnvList;
39}; 39};
40 40
41typedef QDict<ANetNode> Name2NetNode_t; 41typedef QDict<ANetNode> Name2NetNode_t;
42typedef QDict<ANetNodeInstance > Name2Instance_t; 42typedef QDict<ANetNodeInstance > Name2Instance_t;
43typedef QDict<NodeCollection> Name2Connection_t; 43typedef QDict<NodeCollection> Name2Connection_t;
44typedef QDict<SystemFile> Name2SystemFile_t; 44typedef QDict<SystemFile> Name2SystemFile_t;
45 45
46class TheNSResources { 46class TheNSResources {
47 47
48public : 48public :
49 49
50 TheNSResources( void ); 50 TheNSResources( void );
51 ~TheNSResources( ); 51 ~TheNSResources( );
52 52
53 // give busy feedback 53 // give busy feedback
54 void busy( bool B ); 54 void busy( bool B );
55 55
56 System & system() 56 System & system()
57 { return *TheSystem; } 57 { return *TheSystem; }
58 58
59 int assignConnectionNumber(void); 59 int assignConnectionNumber(void);
60 QPixmap getPixmap( const QString & Name ); 60 QPixmap getPixmap( const QString & Name );
61 61
62 Name2NetNode_t & netNodes( void ) 62 Name2NetNode_t & netNodes( void )
63 { return AllNodeTypes; } 63 { return AllNodeTypes; }
64 bool netNodeExists( const QString & X ) 64 bool netNodeExists( const QString & X )
65 { return AllNodeTypes.find(X)!=0; } 65 { return AllNodeTypes.find(X)!=0; }
66 ANetNode * findNetNode( const QString & N ) 66 ANetNode * findNetNode( const QString & N )
67 { return AllNodeTypes.find(N); 67 { return AllNodeTypes.find(N);
68 } 68 }
69 // define new plugin (=node) 69 // define new plugin (=node)
70 void addNodeType( const QString & ID, 70 void addNodeType( const QString & ID,
71 const QString & LongName, 71 const QString & LongName,
72 const QString & Description ); 72 const QString & Description );
73 73
74 Name2SystemFile_t & systemFiles( void ) 74 Name2SystemFile_t & systemFiles( void )
75 { return SystemFiles; } 75 { return SystemFiles; }
76 void addSystemFile( const QString & ID, 76 void addSystemFile( const QString & ID,
77 const QString & P, 77 const QString & P,
78 bool KDI ); 78 bool KDI );
79 79
80 ANetNodeInstance * createNodeInstance( const QString & S ) 80 ANetNodeInstance * createNodeInstance( const QString & S )
81 { ANetNode * NN = findNetNode( S ); 81 { ANetNode * NN = findNetNode( S );
82 82
83 Log(( "Find node type %s : %p\n", S.latin1(), NN )); 83 Log(( "Find node type %s : %p\n", S.latin1(), NN ));
84 84
85 if( NN == 0 ) 85 if( NN == 0 )
86 // type of this instance not found 86 // type of this instance not found
87 return 0; 87 return 0;
88 88
89 ANetNodeInstance * NNI = NN->createInstance(); 89 ANetNodeInstance * NNI = NN->createInstance();
90 NNI->initialize(); 90 NNI->initialize();
91 return NNI; 91 return NNI;
92 } 92 }
93 93
94 Name2Instance_t & netNodeInstances( void ) 94 Name2Instance_t & netNodeInstances( void )
95 { return AllNodes; } 95 { return AllNodes; }
96 void addNodeInstance( ANetNodeInstance * I ) 96 void addNodeInstance( ANetNodeInstance * I )
97 { AllNodes.insert( I->name(), I ); } 97 { AllNodes.insert( I->name(), I ); }
98 void removeNodeInstance( const QString & N ) 98 void removeNodeInstance( const QString & N )
99 { AllNodes.remove( N );} 99 { AllNodes.remove( N );}
100 ANetNodeInstance * findNodeInstance( const QString & S ) 100 ANetNodeInstance * findNodeInstance( const QString & S )
101 { return AllNodes[S]; } 101 { return AllNodes[S]; }
102 102
103 const QString & netNode2Name( const char * Type ); 103 const QString & netNode2Name( const char * Type );
104 const QString & netNode2Description( const char * Type ); 104 const QString & netNode2Description( const char * Type );
105 105
106 void addConnection( NodeCollection * NC, bool Dangling ); 106 void addConnection( NodeCollection * NC, bool Dangling );
107 void removeConnection( const QString & N ); 107 void removeConnection( const QString & N );
108 NodeCollection * findConnection( const QString & N ); 108 NodeCollection * findConnection( const QString & N );
109 NodeCollection * getConnection( int nr ); 109 NodeCollection * getConnection( int nr );
110 Name2Connection_t & connections( void ) 110 Name2Connection_t & connections( void )
111 { return ConnectionsMap; } 111 { return ConnectionsMap; }
112 Name2Connection_t & danglingConnections( void ) 112 Name2Connection_t & danglingConnections( void )
113 { return ConnectionsMap; } 113 { return DanglingConnectionsMap; }
114 114
115 inline bool userKnown( void ) 115 inline bool userKnown( void )
116 { return CurrentUser.known(); } 116 { return CurrentUser.known(); }
117 CurrentQPEUser & currentUser( void ) 117 CurrentQPEUser & currentUser( void )
118 { return CurrentUser; } 118 { return CurrentUser; }
119 119
120private : 120private :
121 121
122 void detectCurrentUser( void ); 122 void detectCurrentUser( void );
123 QString tr( const char * path ); 123 QString tr( const char * path );
124 124
125 void findAvailableNetNodes( void ); 125 void findAvailableNetNodes( void );
126 126
127 QMap< QString, QString> NodeTypeNameMap; 127 QMap< QString, QString> NodeTypeNameMap;
128 QMap< QString, QString> NodeTypeDescriptionMap; 128 QMap< QString, QString> NodeTypeDescriptionMap;
129 // list of connections that are valid 129 // list of connections that are valid
130 Name2Connection_t ConnectionsMap; 130 Name2Connection_t ConnectionsMap;
131 // list of connection configurations that are not valid 131 // list of connection configurations that are not valid
132 // e.g. because plugins are missing 132 // e.g. because plugins are missing
133 Name2Connection_t DanglingConnectionsMap; 133 Name2Connection_t DanglingConnectionsMap;
134 System * TheSystem; 134 System * TheSystem;
135 Name2SystemFile_t SystemFiles; 135 Name2SystemFile_t SystemFiles;
136 136
137 // all node type classes 137 // all node type classes
138 Name2NetNode_t AllNodeTypes; 138 Name2NetNode_t AllNodeTypes;
139 139
140 // all nodes 140 // all nodes
141 Name2Instance_t AllNodes; 141 Name2Instance_t AllNodes;
142 142
143 CurrentQPEUser CurrentUser; 143 CurrentQPEUser CurrentUser;
144 144
145 Opie::Core::OPluginLoader * Plugins; 145 Opie::Core::OPluginLoader * Plugins;
146 Opie::Core::OPluginManager * PluginManager; 146 Opie::Core::OPluginManager * PluginManager;
147 147
148}; 148};
149 149
150extern TheNSResources * _NSResources; 150extern TheNSResources * _NSResources;
151#define NSResources _NSResources 151#define NSResources _NSResources
152 152
153#endif 153#endif
diff --git a/noncore/settings/networksettings2/networksettings2/system.cpp b/noncore/settings/networksettings2/networksettings2/system.cpp
index f027d35..a290f08 100644
--- a/noncore/settings/networksettings2/networksettings2/system.cpp
+++ b/noncore/settings/networksettings2/networksettings2/system.cpp
@@ -1,587 +1,603 @@
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 <stdio.h>
12#include <fcntl.h> 12#include <fcntl.h>
13#include <errno.h> 13#include <errno.h>
14#include <unistd.h> 14#include <unistd.h>
15 15
16#include <opie2/oprocess.h> 16#include <opie2/oprocess.h>
17 17
18#include <qdir.h> 18#include <qdir.h>
19#include <qregexp.h> 19#include <qregexp.h>
20#include <qstringlist.h> 20#include <qstringlist.h>
21#include <qfile.h> 21#include <qfile.h>
22#include <qtextstream.h> 22#include <qtextstream.h>
23#include <qapplication.h> 23#include <qapplication.h>
24 24
25#include "resources.h" 25#include "resources.h"
26#include "system.h" 26#include "system.h"
27 27
28#define PROCNETDEV "/proc/net/dev" 28#define PROCNETDEV "/proc/net/dev"
29 29
30#ifndef ARPHRD_IEEE80211 30#ifndef ARPHRD_IEEE80211
31#define ARPHRD_IEEE80211 801 31#define ARPHRD_IEEE80211 801
32#endif 32#endif
33 33
34static char Dig2Hex[] = { 34static char Dig2Hex[] = {
35 '0', '1', '2', '3', 35 '0', '1', '2', '3',
36 '4', '5', '6', '7', 36 '4', '5', '6', '7',
37 '8', '9', 'A', 'B', 37 '8', '9', 'A', 'B',
38 'C', 'D', 'E', 'F' 38 'C', 'D', 'E', 'F'
39}; 39};
40 40
41// get HIGH nibble of byte 41// get HIGH nibble of byte
42#define HN(x) Dig2Hex[(((x)&0xf0)>>4)] 42#define HN(x) Dig2Hex[(((x)&0xf0)>>4)]
43// get LOW nibble of byte 43// get LOW nibble of byte
44#define LN(x) Dig2Hex[((x)&0x0f)] 44#define LN(x) Dig2Hex[((x)&0x0f)]
45 45
46System::System( void ) : QObject(), ProbedInterfaces() { 46System::System( void ) : QObject(), ProbedInterfaces() {
47 ProcDevNet = 0; 47 ProcDevNet = 0;
48} 48}
49 49
50System::~System( void ) { 50System::~System( void ) {
51 if( ProcDevNet ) 51 if( ProcDevNet )
52 delete ProcDevNet; 52 delete ProcDevNet;
53} 53}
54 54
55QDict<InterfaceInfo> & System::interfaces( void ) { 55QDict<InterfaceInfo> & System::interfaces( void ) {
56 if( ProbedInterfaces.count() == 0 ) { 56 if( ProbedInterfaces.count() == 0 ) {
57 probeInterfaces(); 57 probeInterfaces();
58 } 58 }
59 return ProbedInterfaces; 59 return ProbedInterfaces;
60} 60}
61 61
62int System::runAsRoot( QStringList & S, MyProcess * Prc ) { 62int System::runAsRoot( QStringList & S, MyProcess * Prc ) {
63 char * usr = getenv("USER"); 63 char * usr = getenv("USER");
64 64
65 if( S.count() == 0 ) { 65 if( S.count() == 0 ) {
66 // loophole to start shell 66 // close loophole to start shell
67 return 8888; 67 return 8888;
68 } 68 }
69 if( usr == 0 || strcmp( usr, "root" ) ) { 69 if( usr == 0 || strcmp( usr, "root" ) ) {
70 // unknown or non-root user -> use SUDO 70 // unknown or non-root user -> use SUDO
71 S.prepend( "sudo" ); 71 S.prepend( "sudo" );
72 } 72 }
73 73
74 if( getenv( "NS2TESTMODE" ) ) { 74 if( getenv( "NS2TESTMODE" ) ) {
75 odebug << "TESTMODE !!! execute " 75 odebug << "TESTMODE !!! execute "
76 << S.join( " ") 76 << S.join( " ")
77 << oendl; 77 << oendl;
78 } else { 78 } else {
79 MyProcess * P; 79 MyProcess * P;
80 80
81 if( Prc ) { 81 if( Prc ) {
82 P = Prc; 82 P = Prc;
83 } else { 83 } else {
84 P = new MyProcess(); 84 P = new MyProcess();
85 emit processEvent( tr("Command : ") + S.join( " " ) ); 85 emit processEvent( tr("Command : ") + S.join( " " ) );
86 86
87 connect( P, 87 connect( P,
88 SIGNAL( stdoutLine( const QString & ) ), 88 SIGNAL( stdoutLine( const QString & ) ),
89 this, 89 this,
90 SIGNAL( stdoutLine( const QString & ) ) ); 90 SIGNAL( stdoutLine( const QString & ) ) );
91 91
92 connect( P, 92 connect( P,
93 SIGNAL( stderrLine( const QString & ) ), 93 SIGNAL( stderrLine( const QString & ) ),
94 this, 94 this,
95 SIGNAL( stderrLine( const QString & ) ) ); 95 SIGNAL( stderrLine( const QString & ) ) );
96 96
97 connect( P, 97 connect( P,
98 SIGNAL(processExited(MyProcess*) ), 98 SIGNAL(processExited(MyProcess*) ),
99 this, SLOT 99 this, SLOT
100 (SLOT_ProcessExited(MyProcess*) ) ); 100 (SLOT_ProcessExited(MyProcess*) ) );
101 } 101 }
102 102
103 P->process() << S; 103 P->process() << S;
104 104
105 Log(("Executing %s\n", S.join( " " ).latin1() )); 105 Log(("Executing %s\n", S.join( " " ).latin1() ));
106 106
107 if( ! P->process().start( OProcess::DontCare, 107 if( ! P->process().start( OProcess::DontCare,
108 OProcess::AllOutput ) ) { 108 OProcess::AllOutput ) ) {
109 odebug << "Error starting " << S << oendl; 109 odebug << "Error starting " << S << oendl;
110 if( ! Prc ) 110 if( ! Prc )
111 delete P; 111 delete P;
112 // error starting app 112 // error starting app
113 return 0; 113 return 0;
114 } 114 }
115 odebug << "Started " << S << oendl; 115 odebug << "Started " << S << oendl;
116 } 116 }
117 117
118 // all is fine 118 // all is fine
119 return 1; 119 return 1;
120} 120}
121 121
122int System::execAsUser( QStringList & SL ) { 122int System::execAsUser( QStringList & SL, bool Synchronous ) {
123 MyProcess * P = new MyProcess(); 123 MyProcess * P = new MyProcess();
124 CurrentQPEUser CU = NSResources->currentUser(); 124 CurrentQPEUser CU = NSResources->currentUser();
125 char * usr = getenv("USER"); 125 char * usr = getenv("USER");
126 126
127 if( strcmp( usr, "root" ) == 0 ) { 127 if( usr == 0 ||
128 strcmp( usr, "root" ) == 0 ) {
128 // find user running qpe 129 // find user running qpe
129 if( CU.UserName.isEmpty() ) { 130 if( CU.UserName.isEmpty() ) {
130 // if we come here, the exec was not successfull 131 // if we come here, the exec was not successfull
131 Log(("User not known \n" )); 132 Log(("User not known \n" ));
132 return 0; 133 return 0;
133 } 134 }
134 } 135 }
135 136
136 // now we are ready to exec the requested command 137 // now we are ready to exec the requested command
137 setuid( CU.Uid ); 138 setuid( CU.Uid );
138 setgid( CU.Gid ); 139 setgid( CU.Gid );
139 140
140 for( unsigned int i = 0 ; i < CU.EnvList.count() ; i ++ ) { 141 for( unsigned int i = 0 ; i < CU.EnvList.count() ; i ++ ) {
141 QString X; 142 QString X;
142 QStringList SL; 143 QStringList SL;
143 X = CU.EnvList[i]; 144 X = CU.EnvList[i];
144 SL = QStringList::split( "=", X ); 145 SL = QStringList::split( "=", X );
145 P->process().setEnvironment( SL[0], SL[1] ); 146 P->process().setEnvironment( SL[0], SL[1] );
146 } 147 }
147 148
148 P->process() << SL; 149 P->process() << SL;
149 150
150 emit processEvent( tr("Command : ") + SL.join( " " ) ); 151 emit processEvent( tr("Command : ") + SL.join( " " ) );
151 152
152 Log(("Executing as user %s : %s\n", 153 Log(("Executing as user %s : %s\n",
153 CU.UserName.latin1(), 154 CU.UserName.latin1(),
154 SL.join( " " ).latin1() )); 155 SL.join( " " ).latin1() ));
155 156
156 int rv = ( P->process().start( OProcess::DontCare, 157 P->setEchoMode( Synchronous );
157 OProcess::NoCommunication ) ); 158
159 bool rv = P->process().start(
160 (Synchronous) ? OProcess::Block :
161 OProcess::DontCare,
162 (Synchronous) ? OProcess::AllOutput :
163 OProcess::NoCommunication );
158 delete P; 164 delete P;
159 165
160 if( rv ) { 166 if( ! rv ) {
161 // if we come here, the exec was not successfull 167 // if we come here, the exec was not successfull
162 Log(("Could not exec : %d\n", errno )); 168 Log(("Could not exec : %d\n", errno ));
163 } 169 }
164 170
165 return ! rv; 171 return rv;
166} 172}
167 173
168void System::SLOT_ProcessExited( MyProcess * P ) { 174void System::SLOT_ProcessExited( MyProcess * P ) {
169 QString R; 175 QString R;
170 176
171 for( QValueListConstIterator<QCString> it = P->process().args().begin(); 177 for( QValueListConstIterator<QCString> it = P->process().args().begin();
172 it != P->process().args().end(); 178 it != P->process().args().end();
173 ++it ) { 179 ++it ) {
174 R += (*it); 180 R += (*it);
175 R += " "; 181 R += " ";
176 } 182 }
177 183
178 R += "Returned with " + QString().setNum( P->process().exitStatus() ); 184 R += "Returned with " + QString().setNum( P->process().exitStatus() );
179 emit processEvent( R ); 185 emit processEvent( R );
180 delete P; 186 delete P;
181} 187}
182 188
183void System::refreshStatistics( InterfaceInfo & I ) { 189void System::refreshStatistics( InterfaceInfo & I ) {
184 if( ! ProcDevNet ) { 190 if( ! ProcDevNet ) {
185 return; 191 return;
186 } 192 }
187 // cannot seek on dev 193 // cannot seek on dev
188 ProcDevNet->close(); 194 ProcDevNet->close();
189 ProcDevNet->open( IO_ReadOnly ); 195 ProcDevNet->open( IO_ReadOnly );
190 196
191 QString line; 197 QString line;
192 QTextStream procTs(ProcDevNet); 198 QTextStream procTs(ProcDevNet);
193 QStringList SL; 199 QStringList SL;
194 int loc = -1; 200 int loc = -1;
195 int version; 201 int version;
196 202
197 procTs.readLine(); 203 procTs.readLine();
198 line = procTs.readLine(); 204 line = procTs.readLine();
199 // get version 205 // get version
200 if( line.find("compressed") ) 206 if( line.find("compressed") )
201 version = 3; 207 version = 3;
202 else if( line.find( "bytes" ) ) 208 else if( line.find( "bytes" ) )
203 version = 2; 209 version = 2;
204 else 210 else
205 version = 1; 211 version = 1;
206 while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) { 212 while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) {
207 if( (loc = line.find(":") ) == -1) { 213 if( (loc = line.find(":") ) == -1) {
208 continue; 214 continue;
209 } 215 }
210 216
211 if( I.Name != line.left(loc) ) 217 if( I.Name != line.left(loc) )
212 continue; 218 continue;
213 219
214 // tokenize 220 // tokenize
215 SL = QStringList::split( ' ', line, FALSE ); 221 SL = QStringList::split( ' ', line, FALSE );
216 222
217 // update data 223 // update data
218 switch( version ) { 224 switch( version ) {
219 case 1 : 225 case 1 :
220 I.RcvBytes = SL[1]; 226 I.RcvBytes = SL[1];
221 I.RcvErrors = SL[3]; 227 I.RcvErrors = SL[3];
222 I.RcvDropped = SL[4]; 228 I.RcvDropped = SL[4];
223 I.SndBytes = SL[6]; 229 I.SndBytes = SL[6];
224 I.SndErrors = SL[8]; 230 I.SndErrors = SL[8];
225 I.SndDropped = SL[9]; 231 I.SndDropped = SL[9];
226 I.Collisions = SL[11]; 232 I.Collisions = SL[11];
227 break; 233 break;
228 case 2 : 234 case 2 :
229 I.RcvBytes = SL[1]; 235 I.RcvBytes = SL[1];
230 I.RcvErrors = SL[3]; 236 I.RcvErrors = SL[3];
231 I.RcvDropped = SL[4]; 237 I.RcvDropped = SL[4];
232 I.SndBytes = SL[7]; 238 I.SndBytes = SL[7];
233 I.SndErrors = SL[9]; 239 I.SndErrors = SL[9];
234 I.SndDropped = SL[10]; 240 I.SndDropped = SL[10];
235 I.Collisions = SL[12]; 241 I.Collisions = SL[12];
236 break; 242 break;
237 case 3 : 243 case 3 :
238 I.RcvBytes = SL[1]; 244 I.RcvBytes = SL[1];
239 I.RcvErrors = SL[3]; 245 I.RcvErrors = SL[3];
240 I.RcvDropped = SL[4]; 246 I.RcvDropped = SL[4];
241 I.SndBytes = SL[9]; 247 I.SndBytes = SL[9];
242 I.SndErrors = SL[11]; 248 I.SndErrors = SL[11];
243 I.SndDropped = SL[12]; 249 I.SndDropped = SL[12];
244 I.Collisions = SL[14]; 250 I.Collisions = SL[14];
245 break; 251 break;
246 } 252 }
247 break; 253 break;
248 } 254 }
249} 255}
250 256
251// 257//
252// THIS UPDATES THE LIST -> INTERFACES ARE NOT DELETED BUT 258// THIS UPDATES THE LIST -> INTERFACES ARE NOT DELETED BUT
253// FLAGGED AS ! 'IsUp' IF NO LONGER PRESENT 259// FLAGGED AS ! 'IsUp' IF NO LONGER PRESENT
254// 260//
255 261
256void System::probeInterfaces( void ) { 262void System::probeInterfaces( void ) {
257 263
258 // probe interfaces 264 // probe interfaces
259 int sockfd; 265 int sockfd;
260 // get list of all interfaces 266 // get list of all interfaces
261 struct ifreq ifrs; 267 struct ifreq ifrs;
262 InterfaceInfo * IFI; 268 InterfaceInfo * IFI;
263 269
264 // flag all as 'down' 270 // flag all as 'down'
265 for( QDictIterator<InterfaceInfo> it( ProbedInterfaces ); 271 for( QDictIterator<InterfaceInfo> it( ProbedInterfaces );
266 it.current(); 272 it.current();
267 ++it ) { 273 ++it ) {
268 it.current()->IsUp = 0; 274 it.current()->IsUp = 0;
269 } 275 }
270 276
271 sockfd = socket(PF_INET, SOCK_DGRAM, 0); 277 sockfd = socket(PF_INET, SOCK_DGRAM, 0);
272 if(sockfd == -1) { 278 if(sockfd == -1) {
273 odebug << "Cannot open INET socket " 279 odebug << "Cannot open INET socket "
274 << errno 280 << errno
275 << " " 281 << " "
276 << strerror( errno ) 282 << strerror( errno )
277 << oendl; 283 << oendl;
278 return; 284 return;
279 } 285 }
280 286
281 // read interfaces from /proc/dev/net 287 // read interfaces from /proc/dev/net
282 // SIOCGIFCONF does not return ALL interfaces ???!? 288 // SIOCGIFCONF does not return ALL interfaces ???!?
283 ProcDevNet = new QFile(PROCNETDEV); 289 ProcDevNet = new QFile(PROCNETDEV);
284 if( ! ProcDevNet->open(IO_ReadOnly) ) { 290 if( ! ProcDevNet->open(IO_ReadOnly) ) {
285 odebug << "Cannot open " 291 odebug << "Cannot open "
286 << PROCNETDEV 292 << PROCNETDEV
287 << " " 293 << " "
288 << errno 294 << errno
289 << " " 295 << " "
290 << strerror( errno ) 296 << strerror( errno )
291 << oendl; 297 << oendl;
292 delete ProcDevNet; 298 delete ProcDevNet;
293 ProcDevNet =0; 299 ProcDevNet =0;
294 ::close( sockfd ); 300 ::close( sockfd );
295 return; 301 return;
296 } 302 }
297 303
298 QString line; 304 QString line;
299 QString NicName; 305 QString NicName;
300 QTextStream procTs(ProcDevNet); 306 QTextStream procTs(ProcDevNet);
301 int loc = -1; 307 int loc = -1;
302 308
303 procTs.readLine(); // eat a line 309 procTs.readLine(); // eat a line
304 procTs.readLine(); // eat a line 310 procTs.readLine(); // eat a line
305 while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) { 311 while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) {
306 if((loc = line.find(":")) == -1) { 312 if((loc = line.find(":")) == -1) {
307 continue; 313 continue;
308 } 314 }
309 315
310 NicName = line.left(loc); 316 NicName = line.left(loc);
311 317
312 // set name for ioctl 318 // set name for ioctl
313 strcpy( ifrs.ifr_name, NicName.latin1() ); 319 strcpy( ifrs.ifr_name, NicName.latin1() );
314 320
315 if ( ! ( IFI = ProbedInterfaces.find( NicName ) ) ) { 321 if ( ! ( IFI = ProbedInterfaces.find( NicName ) ) ) {
316 // new nic 322 // new nic
317 Log(("New NIC found : %s\n", NicName.latin1())); 323 Log(("New NIC found : %s\n", NicName.latin1()));
318 IFI = new InterfaceInfo; 324 IFI = new InterfaceInfo;
319 IFI->Name = line.left(loc); 325 IFI->Name = line.left(loc);
320 IFI->Collection = 0; 326 IFI->Collection = 0;
321 ProbedInterfaces.insert( IFI->Name, IFI ); 327 ProbedInterfaces.insert( IFI->Name, IFI );
322 328
323 // get dynamic info 329 // get dynamic info
324 if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) { 330 if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) {
325 IFI->IsPointToPoint = ((ifrs.ifr_flags & IFF_POINTOPOINT) == IFF_POINTOPOINT); 331 IFI->IsPointToPoint = ((ifrs.ifr_flags & IFF_POINTOPOINT) == IFF_POINTOPOINT);
326 } else { 332 } else {
327 IFI->IsPointToPoint = 0; 333 IFI->IsPointToPoint = 0;
328 } 334 }
329 335
330 // settings that never change 336 // settings that never change
331 IFI->DstAddress = ""; 337 IFI->DstAddress = "";
332 338
333 if( IFI->IsPointToPoint ) { 339 if( IFI->IsPointToPoint ) {
334 if( ioctl(sockfd, SIOCGIFDSTADDR, &ifrs) >= 0 ) { 340 if( ioctl(sockfd, SIOCGIFDSTADDR, &ifrs) >= 0 ) {
335 IFI->DstAddress = 341 IFI->DstAddress =
336 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_dstaddr)->sin_addr); 342 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_dstaddr)->sin_addr);
337 } 343 }
338 } 344 }
339 345
340 IFI->CardType = 999999; 346 IFI->CardType = 999999;
341 IFI->MACAddress = ""; 347 IFI->MACAddress = "";
342 348
343 if( ioctl(sockfd, SIOCGIFHWADDR, &ifrs) >= 0 ) { 349 if( ioctl(sockfd, SIOCGIFHWADDR, &ifrs) >= 0 ) {
344 Log(("Family for NIC %s : %d\n", IFI->Name.latin1(), 350 Log(("Family for NIC %s : %d\n", IFI->Name.latin1(),
345 ifrs.ifr_hwaddr.sa_family )); 351 ifrs.ifr_hwaddr.sa_family ));
346 352
347 IFI->CardType = ifrs.ifr_hwaddr.sa_family; 353 IFI->CardType = ifrs.ifr_hwaddr.sa_family;
348 switch( ifrs.ifr_hwaddr.sa_family ) { 354 switch( ifrs.ifr_hwaddr.sa_family ) {
349 case ARPHRD_ETHER : // regular MAC address 355 case ARPHRD_ETHER : // regular MAC address
350 // valid address -> convert to regular ::: format 356 // valid address -> convert to regular ::: format
351 // length = 6 bytes = 12 DIGITS -> 6 : 357 // length = 6 bytes = 12 DIGITS -> 6 :
352 IFI->MACAddress.sprintf( 358 IFI->MACAddress.sprintf(
353 "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c", 359 "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",
354 HN( ifrs.ifr_hwaddr.sa_data[0] ), 360 HN( ifrs.ifr_hwaddr.sa_data[0] ),
355 LN( ifrs.ifr_hwaddr.sa_data[0] ), 361 LN( ifrs.ifr_hwaddr.sa_data[0] ),
356 HN( ifrs.ifr_hwaddr.sa_data[1] ), 362 HN( ifrs.ifr_hwaddr.sa_data[1] ),
357 LN( ifrs.ifr_hwaddr.sa_data[1] ), 363 LN( ifrs.ifr_hwaddr.sa_data[1] ),
358 HN( ifrs.ifr_hwaddr.sa_data[2] ), 364 HN( ifrs.ifr_hwaddr.sa_data[2] ),
359 LN( ifrs.ifr_hwaddr.sa_data[2] ), 365 LN( ifrs.ifr_hwaddr.sa_data[2] ),
360 HN( ifrs.ifr_hwaddr.sa_data[3] ), 366 HN( ifrs.ifr_hwaddr.sa_data[3] ),
361 LN( ifrs.ifr_hwaddr.sa_data[3] ), 367 LN( ifrs.ifr_hwaddr.sa_data[3] ),
362 HN( ifrs.ifr_hwaddr.sa_data[4] ), 368 HN( ifrs.ifr_hwaddr.sa_data[4] ),
363 LN( ifrs.ifr_hwaddr.sa_data[4] ), 369 LN( ifrs.ifr_hwaddr.sa_data[4] ),
364 HN( ifrs.ifr_hwaddr.sa_data[5] ), 370 HN( ifrs.ifr_hwaddr.sa_data[5] ),
365 LN( ifrs.ifr_hwaddr.sa_data[5] ) 371 LN( ifrs.ifr_hwaddr.sa_data[5] )
366 ); 372 );
367 break; 373 break;
368#ifdef ARPHRD_IEEE1394 374#ifdef ARPHRD_IEEE1394
369 case ARPHRD_IEEE1394 : // Firewire Eth address 375 case ARPHRD_IEEE1394 : // Firewire Eth address
370 IFI->MACAddress.sprintf( 376 IFI->MACAddress.sprintf(
371 "%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-00-00", 377 "%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-00-00",
372 HN( ifrs.ifr_hwaddr.sa_data[0] ), 378 HN( ifrs.ifr_hwaddr.sa_data[0] ),
373 LN( ifrs.ifr_hwaddr.sa_data[0] ), 379 LN( ifrs.ifr_hwaddr.sa_data[0] ),
374 HN( ifrs.ifr_hwaddr.sa_data[1] ), 380 HN( ifrs.ifr_hwaddr.sa_data[1] ),
375 LN( ifrs.ifr_hwaddr.sa_data[1] ), 381 LN( ifrs.ifr_hwaddr.sa_data[1] ),
376 HN( ifrs.ifr_hwaddr.sa_data[2] ), 382 HN( ifrs.ifr_hwaddr.sa_data[2] ),
377 LN( ifrs.ifr_hwaddr.sa_data[2] ), 383 LN( ifrs.ifr_hwaddr.sa_data[2] ),
378 HN( ifrs.ifr_hwaddr.sa_data[3] ), 384 HN( ifrs.ifr_hwaddr.sa_data[3] ),
379 LN( ifrs.ifr_hwaddr.sa_data[3] ), 385 LN( ifrs.ifr_hwaddr.sa_data[3] ),
380 HN( ifrs.ifr_hwaddr.sa_data[4] ), 386 HN( ifrs.ifr_hwaddr.sa_data[4] ),
381 LN( ifrs.ifr_hwaddr.sa_data[4] ), 387 LN( ifrs.ifr_hwaddr.sa_data[4] ),
382 HN( ifrs.ifr_hwaddr.sa_data[5] ), 388 HN( ifrs.ifr_hwaddr.sa_data[5] ),
383 LN( ifrs.ifr_hwaddr.sa_data[5] ), 389 LN( ifrs.ifr_hwaddr.sa_data[5] ),
384 HN( ifrs.ifr_hwaddr.sa_data[6] ), 390 HN( ifrs.ifr_hwaddr.sa_data[6] ),
385 LN( ifrs.ifr_hwaddr.sa_data[6] ), 391 LN( ifrs.ifr_hwaddr.sa_data[6] ),
386 HN( ifrs.ifr_hwaddr.sa_data[7] ), 392 HN( ifrs.ifr_hwaddr.sa_data[7] ),
387 LN( ifrs.ifr_hwaddr.sa_data[7] ), 393 LN( ifrs.ifr_hwaddr.sa_data[7] ),
388 HN( ifrs.ifr_hwaddr.sa_data[8] ), 394 HN( ifrs.ifr_hwaddr.sa_data[8] ),
389 LN( ifrs.ifr_hwaddr.sa_data[8] ), 395 LN( ifrs.ifr_hwaddr.sa_data[8] ),
390 HN( ifrs.ifr_hwaddr.sa_data[9] ), 396 HN( ifrs.ifr_hwaddr.sa_data[9] ),
391 LN( ifrs.ifr_hwaddr.sa_data[9] ), 397 LN( ifrs.ifr_hwaddr.sa_data[9] ),
392 HN( ifrs.ifr_hwaddr.sa_data[10] ), 398 HN( ifrs.ifr_hwaddr.sa_data[10] ),
393 LN( ifrs.ifr_hwaddr.sa_data[10] ), 399 LN( ifrs.ifr_hwaddr.sa_data[10] ),
394 HN( ifrs.ifr_hwaddr.sa_data[11] ), 400 HN( ifrs.ifr_hwaddr.sa_data[11] ),
395 LN( ifrs.ifr_hwaddr.sa_data[11] ), 401 LN( ifrs.ifr_hwaddr.sa_data[11] ),
396 HN( ifrs.ifr_hwaddr.sa_data[12] ), 402 HN( ifrs.ifr_hwaddr.sa_data[12] ),
397 LN( ifrs.ifr_hwaddr.sa_data[12] ), 403 LN( ifrs.ifr_hwaddr.sa_data[12] ),
398 HN( ifrs.ifr_hwaddr.sa_data[13] ), 404 HN( ifrs.ifr_hwaddr.sa_data[13] ),
399 LN( ifrs.ifr_hwaddr.sa_data[13] ) 405 LN( ifrs.ifr_hwaddr.sa_data[13] )
400 ); 406 );
401 break; 407 break;
402#endif 408#endif
403 case ARPHRD_PPP : // PPP 409 case ARPHRD_PPP : // PPP
404 break; 410 break;
405 case ARPHRD_IEEE80211 : // WLAN 411 case ARPHRD_IEEE80211 : // WLAN
406 break; 412 break;
407 case ARPHRD_IRDA : // IRDA 413 case ARPHRD_IRDA : // IRDA
408 break; 414 break;
409 } 415 }
410 } 416 }
411 } else // else already probed before -> just update 417 } else // else already probed before -> just update
412 Log(("Redetected NIC %s\n", NicName.latin1())); 418 Log(("Redetected NIC %s\n", NicName.latin1()));
413 419
414 // get dynamic info 420 // get dynamic info
415 if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) { 421 if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) {
416 IFI->IsUp = ((ifrs.ifr_flags & IFF_UP) == IFF_UP); 422 IFI->IsUp = ((ifrs.ifr_flags & IFF_UP) == IFF_UP);
417 IFI->HasMulticast = ((ifrs.ifr_flags & IFF_MULTICAST) == IFF_MULTICAST); 423 IFI->HasMulticast = ((ifrs.ifr_flags & IFF_MULTICAST) == IFF_MULTICAST);
418 } else { 424 } else {
419 IFI->IsUp = 0; 425 IFI->IsUp = 0;
420 IFI->HasMulticast = 0; 426 IFI->HasMulticast = 0;
421 } 427 }
422 428
423 if( ioctl(sockfd, SIOCGIFADDR, &ifrs) >= 0 ) { 429 if( ioctl(sockfd, SIOCGIFADDR, &ifrs) >= 0 ) {
424 IFI->Address = 430 IFI->Address =
425 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_addr)->sin_addr); 431 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_addr)->sin_addr);
426 } else { 432 } else {
427 IFI->Address = ""; 433 IFI->Address = "";
428 IFI->IsUp = 0; 434 IFI->IsUp = 0;
429 } 435 }
430 if( ioctl(sockfd, SIOCGIFBRDADDR, &ifrs) >= 0 ) { 436 if( ioctl(sockfd, SIOCGIFBRDADDR, &ifrs) >= 0 ) {
431 IFI->BCastAddress = 437 IFI->BCastAddress =
432 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_broadaddr)->sin_addr); 438 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_broadaddr)->sin_addr);
433 } else { 439 } else {
434 IFI->BCastAddress = ""; 440 IFI->BCastAddress = "";
435 } 441 }
436 if( ioctl(sockfd, SIOCGIFNETMASK, &ifrs) >= 0 ) { 442 if( ioctl(sockfd, SIOCGIFNETMASK, &ifrs) >= 0 ) {
437 IFI->Netmask = 443 IFI->Netmask =
438 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_netmask)->sin_addr); 444 inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_netmask)->sin_addr);
439 } else { 445 } else {
440 IFI->Netmask = ""; 446 IFI->Netmask = "";
441 } 447 }
442 Log(("NIC %s UP ? %d\n", NicName.latin1(), IFI->IsUp )); 448 Log(("NIC %s UP ? %d\n", NicName.latin1(), IFI->IsUp ));
443 } 449 }
444 450
445 ::close( sockfd ); 451 ::close( sockfd );
446} 452}
447 453
448InterfaceInfo * System::findInterface( const QString & N ) { 454InterfaceInfo * System::findInterface( const QString & N ) {
449 InterfaceInfo * Run; 455 InterfaceInfo * Run;
450 // has PAN connection UP interface ? 456 // has PAN connection UP interface ?
451 for( QDictIterator<InterfaceInfo> It(ProbedInterfaces); 457 for( QDictIterator<InterfaceInfo> It(ProbedInterfaces);
452 It.current(); 458 It.current();
453 ++It ) { 459 ++It ) {
454 Run = It.current(); 460 Run = It.current();
455 if( N == Run->Name ) { 461 if( N == Run->Name ) {
456 // this PAN connection is up 462 // this PAN connection is up
457 return Run; 463 return Run;
458 } 464 }
459 } 465 }
460 return 0; 466 return 0;
461} 467}
462 468
463#include <stdarg.h> 469#include <stdarg.h>
464static FILE * logf = 0; 470static FILE * logf = 0;
465 471
466void VLog( char * Format, ... ) { 472void VLog( char * Format, ... ) {
467 va_list l; 473 va_list l;
468 474
469 va_start(l, Format ); 475 va_start(l, Format );
470 476
471 if( logf == (FILE *)0 ) { 477 if( logf == (FILE *)0 ) {
472 QString S = getenv("NS2LOG"); 478 QString S = getenv("NS2LOG");
473 if( S == "stderr" ) { 479 if( S == "stderr" ) {
474 logf = stderr; 480 logf = stderr;
475 } else if( S.isEmpty() ) { 481 } else if( S.isEmpty() ) {
476 logf = fopen( "/tmp/ns2log", "a" ); 482 logf = fopen( "/tmp/ns2log", "a" );
477 } else { 483 } else {
478 logf = fopen( S, "a" ); 484 logf = fopen( S, "a" );
479 } 485 }
480 486
481 if( ! logf ) { 487 if( ! logf ) {
482 fprintf( stderr, "Cannot open logfile %s : %d\n", 488 fprintf( stderr, "Cannot open logfile %s : %d\n",
483 S.latin1(), errno ); 489 S.latin1(), errno );
484 logf = (FILE *)1; 490 logf = (FILE *)1;
485 } else { 491 } else {
486 fprintf( logf, "____ OPEN LOGFILE ____\n"); 492 fprintf( logf, "____ OPEN LOGFILE ____\n");
487 } 493 }
488 } 494 }
489 495
490 if( (unsigned long)logf > 1 ) { 496 if( (unsigned long)logf > 1 ) {
491 vfprintf( logf, Format, l ); 497 vfprintf( logf, Format, l );
492 } 498 }
493 va_end( l ); 499 va_end( l );
494 fflush( logf ); 500 fflush( logf );
495 501
496} 502}
497 503
498void LogClose( void ) { 504void LogClose( void ) {
499 if( (long)logf > 1 ) { 505 if( (long)logf > 1 ) {
500 fprintf( logf, "____ CLOSE LOGFILE ____\n"); 506 fprintf( logf, "____ CLOSE LOGFILE ____\n");
501 if( logf != stderr ) { 507 if( logf != stderr ) {
502 fclose( logf ); 508 fclose( logf );
503 } 509 }
504 logf = 0; 510 logf = 0;
505 } 511 }
506} 512}
507 513
508QString removeSpaces( const QString & X ) { 514QString removeSpaces( const QString & X ) {
509 QString Y; 515 QString Y;
510 Y = X.simplifyWhiteSpace(); 516 Y = X.simplifyWhiteSpace();
511 Y.replace( QRegExp(" "), "_" ); 517 Y.replace( QRegExp(" "), "_" );
512 odebug << X << " **" << Y << "**" << oendl; 518 odebug << X << " **" << Y << "**" << oendl;
513 return Y; 519 return Y;
514} 520}
515 521
516// 522//
517// 523//
518// 524//
519// 525//
520// 526//
521 527
522MyProcess::MyProcess() : QObject(), StdoutBuffer(), StderrBuffer() { 528MyProcess::MyProcess() : QObject(), StdoutBuffer(), StderrBuffer() {
523 P = new OProcess(); 529 P = new OProcess();
524 connect( P, 530 connect( P,
525 SIGNAL( receivedStdout(Opie::Core::OProcess*, char*, int ) ), 531 SIGNAL( receivedStdout(Opie::Core::OProcess*, char*, int ) ),
526 this, 532 this,
527 SLOT( SLOT_Stdout(Opie::Core::OProcess*,char*,int) ) ); 533 SLOT( SLOT_Stdout(Opie::Core::OProcess*,char*,int) ) );
528 534
529 connect( P, 535 connect( P,
530 SIGNAL( receivedStderr(Opie::Core::OProcess*, char*, int ) ), 536 SIGNAL( receivedStderr(Opie::Core::OProcess*, char*, int ) ),
531 this, 537 this,
532 SLOT( SLOT_Stderr(Opie::Core::OProcess*,char*,int) ) ); 538 SLOT( SLOT_Stderr(Opie::Core::OProcess*,char*,int) ) );
533 connect( P, 539 connect( P,
534 SIGNAL( processExited(Opie::Core::OProcess*) ), 540 SIGNAL( processExited(Opie::Core::OProcess*) ),
535 this, 541 this,
536 SLOT( SLOT_ProcessExited(Opie::Core::OProcess*) ) ); 542 SLOT( SLOT_ProcessExited(Opie::Core::OProcess*) ) );
537} 543}
538 544
539MyProcess::~MyProcess() { 545MyProcess::~MyProcess() {
540 delete P; 546 delete P;
541} 547}
542 548
543void MyProcess::SLOT_Stdout( Opie::Core::OProcess * , char * Buf, int len ) { 549void MyProcess::SLOT_Stdout( Opie::Core::OProcess * , char * Buf, int len ) {
550 if( EchoMode ) {
551 write( 1, Buf, len );
552 return;
553 }
554
544 char * LB = (char *)alloca( len + 1 ); 555 char * LB = (char *)alloca( len + 1 );
545 memcpy( LB, Buf, len ); 556 memcpy( LB, Buf, len );
546 LB[len] = '\0'; 557 LB[len] = '\0';
547 558
548 // now input is zero terminated 559 // now input is zero terminated
549 StdoutBuffer += LB; 560 StdoutBuffer += LB;
550 561
551 odebug << "Received " << len << " bytes on stdout" << oendl; 562 odebug << "Received " << len << " bytes on stdout" << oendl;
552 // see if we have some lines (allow empty lines) 563 // see if we have some lines (allow empty lines)
553 QStringList SL = QStringList::split( "\n", StdoutBuffer, TRUE ); 564 QStringList SL = QStringList::split( "\n", StdoutBuffer, TRUE );
554 565
555 for( unsigned int i = 0; i < SL.count()-1; i ++ ) { 566 for( unsigned int i = 0; i < SL.count()-1; i ++ ) {
556 Log(( "Stdout : \"%s\"\n", SL[i].latin1() ) ); 567 Log(( "Stdout : \"%s\"\n", SL[i].latin1() ) );
557 emit stdoutLine( SL[i] ); 568 emit stdoutLine( SL[i] );
558 } 569 }
559 570
560 // last line is rest 571 // last line is rest
561 StdoutBuffer = SL[ SL.count()-1 ]; 572 StdoutBuffer = SL[ SL.count()-1 ];
562} 573}
563 574
564void MyProcess::SLOT_Stderr( Opie::Core::OProcess * , char * Buf, int len ) { 575void MyProcess::SLOT_Stderr( Opie::Core::OProcess * , char * Buf, int len ) {
576 if( EchoMode ) {
577 write( 2, Buf, len );
578 return;
579 }
580
565 char * LB = (char *)alloca( len + 1 ); 581 char * LB = (char *)alloca( len + 1 );
566 memcpy( LB, Buf, len ); 582 memcpy( LB, Buf, len );
567 LB[len] = '\0'; 583 LB[len] = '\0';
568 584
569 // now input is zero terminated 585 // now input is zero terminated
570 StderrBuffer += LB; 586 StderrBuffer += LB;
571 587
572 odebug << "Received " << len << " bytes on stderr" << oendl; 588 odebug << "Received " << len << " bytes on stderr" << oendl;
573 // see if we have some lines (allow empty lines) 589 // see if we have some lines (allow empty lines)
574 QStringList SL = QStringList::split( "\n", StderrBuffer, TRUE ); 590 QStringList SL = QStringList::split( "\n", StderrBuffer, TRUE );
575 591
576 for( unsigned int i = 0; i < SL.count()-1; i ++ ) { 592 for( unsigned int i = 0; i < SL.count()-1; i ++ ) {
577 Log(( "Stderr : \"%s\"\n", SL[i].latin1() ) ); 593 Log(( "Stderr : \"%s\"\n", SL[i].latin1() ) );
578 emit stderrLine( SL[i] ); 594 emit stderrLine( SL[i] );
579 } 595 }
580 596
581 // last line is rest 597 // last line is rest
582 StderrBuffer = SL[ SL.count()-1 ]; 598 StderrBuffer = SL[ SL.count()-1 ];
583} 599}
584 600
585void MyProcess::SLOT_ProcessExited( Opie::Core::OProcess * ) { 601void MyProcess::SLOT_ProcessExited( Opie::Core::OProcess * ) {
586 emit processExited( this ); 602 emit processExited( this );
587} 603}
diff --git a/noncore/settings/networksettings2/networksettings2/system.h b/noncore/settings/networksettings2/networksettings2/system.h
index f7a7274..ebee0d5 100644
--- a/noncore/settings/networksettings2/networksettings2/system.h
+++ b/noncore/settings/networksettings2/networksettings2/system.h
@@ -1,134 +1,140 @@
1#ifndef __SYSTEM__H 1#ifndef __SYSTEM__H
2#define __SYSTEM__H 2#define __SYSTEM__H
3 3
4#include <qstring.h> 4#include <qstring.h>
5 5
6#include <opie2/oprocess.h> 6#include <opie2/oprocess.h>
7 7
8using namespace Opie::Core; 8using namespace Opie::Core;
9 9
10// for hardware types 10// for hardware types
11#include <net/if_arp.h> 11#include <net/if_arp.h>
12#include <qdict.h> 12#include <qdict.h>
13#include <qobject.h> 13#include <qobject.h>
14#include <stdio.h> 14#include <stdio.h>
15 15
16class NodeCollection; 16class NodeCollection;
17class ANetNodeInstance; 17class ANetNodeInstance;
18class QFile; 18class QFile;
19 19
20class MyProcess : public QObject { 20class MyProcess : public QObject {
21 21
22 Q_OBJECT 22 Q_OBJECT
23 23
24public : 24public :
25 25
26 MyProcess(); 26 MyProcess();
27 ~MyProcess(); 27 ~MyProcess();
28 28
29 inline OProcess & process() 29 inline OProcess & process()
30 { return *P; } 30 { return *P; }
31 31
32 inline void setEchoMode( bool M ) {
33 EchoMode = M;
34 }
35
32public slots : 36public slots :
33 37
34 void SLOT_Stdout( Opie::Core::OProcess * P, char *, int ); 38 void SLOT_Stdout( Opie::Core::OProcess * P, char *, int );
35 void SLOT_Stderr( Opie::Core::OProcess * P, char *, int ); 39 void SLOT_Stderr( Opie::Core::OProcess * P, char *, int );
36 void SLOT_ProcessExited( Opie::Core::OProcess * P); 40 void SLOT_ProcessExited( Opie::Core::OProcess * P);
37 41
38signals : 42signals :
39 43
40 void stdoutLine( const QString & ); 44 void stdoutLine( const QString & );
41 void stderrLine( const QString & ); 45 void stderrLine( const QString & );
42 void processExited( MyProcess * ); 46 void processExited( MyProcess * );
43 47
44private : 48private :
45 49
46 QString StdoutBuffer; 50 QString StdoutBuffer;
47 QString StderrBuffer; 51 QString StderrBuffer;
48 OProcess * P; 52 OProcess * P;
53 // output all output to my output
54 bool EchoMode;
49}; 55};
50 56
51class InterfaceInfo { 57class InterfaceInfo {
52 58
53public : 59public :
54 60
55 InterfaceInfo() : 61 InterfaceInfo() :
56 Name(), 62 Name(),
57 MACAddress(), 63 MACAddress(),
58 BCastAddress(), 64 BCastAddress(),
59 Netmask(), 65 Netmask(),
60 DstAddress() { 66 DstAddress() {
61 } 67 }
62 68
63 NodeCollection * assignedConnection() 69 NodeCollection * assignedConnection()
64 { return Collection; } 70 { return Collection; }
65 71
66 void assignConnection( NodeCollection * NNI ) 72 void assignConnection( NodeCollection * NNI )
67 { Collection = NNI; } 73 { Collection = NNI; }
68 74
69 NodeCollection * Collection; // connection taking care of me 75 NodeCollection * Collection; // connection taking care of me
70 QString Name; // name of interface 76 QString Name; // name of interface
71 int CardType; // type of card 77 int CardType; // type of card
72 QString MACAddress; // MAC address 78 QString MACAddress; // MAC address
73 QString Address; // IP Address 79 QString Address; // IP Address
74 QString BCastAddress; // Broadcast Address 80 QString BCastAddress; // Broadcast Address
75 QString Netmask; // Netmask 81 QString Netmask; // Netmask
76 QString DstAddress; // Peer address (if P-t-P) 82 QString DstAddress; // Peer address (if P-t-P)
77 bool IsUp; // interface is UP 83 bool IsUp; // interface is UP
78 bool HasMulticast; // Supports Multicast 84 bool HasMulticast; // Supports Multicast
79 bool IsPointToPoint; // IsPointToPoint card 85 bool IsPointToPoint; // IsPointToPoint card
80 86
81 QString RcvBytes; 87 QString RcvBytes;
82 QString SndBytes; 88 QString SndBytes;
83 QString RcvErrors; 89 QString RcvErrors;
84 QString SndErrors; 90 QString SndErrors;
85 QString RcvDropped; 91 QString RcvDropped;
86 QString SndDropped; 92 QString SndDropped;
87 QString Collisions; 93 QString Collisions;
88}; 94};
89 95
90class System : public QObject { 96class System : public QObject {
91 97
92 Q_OBJECT 98 Q_OBJECT
93 99
94public : 100public :
95 101
96 System( void ); 102 System( void );
97 ~System( void ); 103 ~System( void );
98 104
99 QDict<InterfaceInfo> & interfaces( void ); 105 QDict<InterfaceInfo> & interfaces( void );
100 InterfaceInfo * interface( const QString& N ) 106 InterfaceInfo * interface( const QString& N )
101 { return interfaces()[N]; } 107 { return interfaces()[N]; }
102 108
103 // exec command as root 109 // exec command as root
104 int runAsRoot( QStringList & S, MyProcess * Prc = 0 ); 110 int runAsRoot( QStringList & S, MyProcess * Prc = 0 );
105 111
106 // exec command as user 112 // exec command as user
107 int execAsUser( QStringList & Cmd ); 113 int execAsUser( QStringList & Cmd, bool Synchronous = 0 );
108 114
109 // refresh stats for this interface 115 // refresh stats for this interface
110 void refreshStatistics( InterfaceInfo & ); 116 void refreshStatistics( InterfaceInfo & );
111 117
112 // reloads interfaces 118 // reloads interfaces
113 void probeInterfaces( void ); 119 void probeInterfaces( void );
114 120
115 InterfaceInfo * findInterface( const QString & DevName ); 121 InterfaceInfo * findInterface( const QString & DevName );
116 122
117private slots : 123private slots :
118 124
119 void SLOT_ProcessExited( MyProcess * ); 125 void SLOT_ProcessExited( MyProcess * );
120 126
121signals : 127signals :
122 128
123 void stdoutLine( const QString & ); 129 void stdoutLine( const QString & );
124 void stderrLine( const QString & ); 130 void stderrLine( const QString & );
125 void processEvent( const QString & ); 131 void processEvent( const QString & );
126 132
127private : 133private :
128 134
129 QDict<InterfaceInfo> ProbedInterfaces; 135 QDict<InterfaceInfo> ProbedInterfaces;
130 FILE * OutputOfCmd; 136 FILE * OutputOfCmd;
131 QFile * ProcDevNet; 137 QFile * ProcDevNet;
132}; 138};
133 139
134#endif 140#endif
diff --git a/noncore/settings/networksettings2/networksettings2/systemfile.cpp b/noncore/settings/networksettings2/networksettings2/systemfile.cpp
index 1b1988e..0314765 100644
--- a/noncore/settings/networksettings2/networksettings2/systemfile.cpp
+++ b/noncore/settings/networksettings2/networksettings2/systemfile.cpp
@@ -1,235 +1,234 @@
1#include <stdio.h> 1#include <stdio.h>
2#include <qpe/qpeapplication.h> 2#include <qpe/qpeapplication.h>
3#include <qfileinfo.h> 3#include <qfileinfo.h>
4#include <qmessagebox.h> 4#include <qmessagebox.h>
5#include <qfile.h> 5#include <qfile.h>
6#include <qtextstream.h> 6#include <qtextstream.h>
7 7
8#include "resources.h" 8#include "resources.h"
9#include "systemfile.h" 9#include "systemfile.h"
10 10
11#define TEMPLATEDIR "NS2templates/" 11#define TEMPLATEDIR "NS2templates/"
12QString TemplDir; 12QString TemplDir;
13 13
14SystemFile::SystemFile( const QString & N, 14SystemFile::SystemFile( const QString & N,
15 const QString & P, 15 const QString & P,
16 bool KDI ){ 16 bool KDI ){
17 Name = N; 17 Name = N;
18 Path = P; 18 Path = P;
19 InAppend = 0; 19 InAppend = 0;
20 F = 0; 20 F = 0;
21 // get template info 21 // get template info
22 { QString S; 22 { QString S;
23 QFileInfo FI; 23 QFileInfo FI;
24 24
25 // find location of templates 25 // find location of templates
26 TemplDir = QPEApplication::qpeDir() + "etc/" + TEMPLATEDIR; 26 TemplDir = QPEApplication::qpeDir() + "etc/" + TEMPLATEDIR;
27 FI.setFile( TemplDir ); 27 FI.setFile( TemplDir );
28 if( ! FI.isDir() ) { 28 if( ! FI.isDir() ) {
29 // try current dir 29 // try current dir
30 TemplDir = "./" TEMPLATEDIR; 30 TemplDir = "./" TEMPLATEDIR;
31 FI.setFile( TemplDir ); 31 FI.setFile( TemplDir );
32 if( ! FI.isDir() ) { 32 if( ! FI.isDir() ) {
33 hasPreSection = 33 hasPreSection =
34 hasPostSection = 34 hasPostSection =
35 hasPreNodeSection = 35 hasPreNodeSection =
36 hasPostNodeSection = 36 hasPostNodeSection =
37 hasPreDeviceSection = 37 hasPreDeviceSection =
38 hasPostDeviceSection = 0; 38 hasPostDeviceSection = 0;
39 return; 39 return;
40 } 40 }
41 } 41 }
42 42
43 // have found location 43 // have found location
44 S = TemplDir + Name + "/presection"; 44 S = TemplDir + Name + "/presection";
45 FI.setFile( S ); 45 FI.setFile( S );
46 hasPreSection = ( FI.exists() && FI.isReadable() ); 46 hasPreSection = ( FI.exists() && FI.isReadable() );
47 S = TemplDir + Name + "/postsection"; 47 S = TemplDir + Name + "/postsection";
48 FI.setFile( S ); 48 FI.setFile( S );
49 hasPostSection = ( FI.exists() && FI.isReadable() ); 49 hasPostSection = ( FI.exists() && FI.isReadable() );
50 S = TemplDir + Name + "/prenodesection"; 50 S = TemplDir + Name + "/prenodesection";
51 FI.setFile( S ); 51 FI.setFile( S );
52 hasPreNodeSection = ( FI.exists() && FI.isReadable() ); 52 hasPreNodeSection = ( FI.exists() && FI.isReadable() );
53 S = TemplDir + Name + "/postnodesection"; 53 S = TemplDir + Name + "/postnodesection";
54 FI.setFile( S ); 54 FI.setFile( S );
55 hasPostNodeSection = ( FI.exists() && FI.isReadable() ); 55 hasPostNodeSection = ( FI.exists() && FI.isReadable() );
56 S = TemplDir + Name + "/predevicesection"; 56 S = TemplDir + Name + "/predevicesection";
57 FI.setFile( S ); 57 FI.setFile( S );
58 hasPreDeviceSection = ( FI.exists() && FI.isReadable() ); 58 hasPreDeviceSection = ( FI.exists() && FI.isReadable() );
59 S = TemplDir + Name + "/postdevicesection"; 59 S = TemplDir + Name + "/postdevicesection";
60 FI.setFile( S ); 60 FI.setFile( S );
61 hasPostDeviceSection = ( FI.exists() && FI.isReadable() ); 61 hasPostDeviceSection = ( FI.exists() && FI.isReadable() );
62 } 62 }
63 63
64 KnowsDeviceInstances = KDI; 64 KnowsDeviceInstances = KDI;
65} 65}
66 66
67SystemFile::SystemFile( const QString & N, bool KDI ){ 67SystemFile::SystemFile( const QString & N, bool KDI ){
68 Name = N; 68 Name = N;
69 Path = ""; 69 Path = "";
70 InAppend = 0; 70 InAppend = 0;
71 F =0; 71 F =0;
72 KnowsDeviceInstances = KDI; 72 KnowsDeviceInstances = KDI;
73 hasPreSection = 73 hasPreSection =
74 hasPostSection = 74 hasPostSection =
75 hasPreNodeSection = 75 hasPreNodeSection =
76 hasPostNodeSection = 76 hasPostNodeSection =
77 hasPreDeviceSection = 77 hasPreDeviceSection =
78 hasPostDeviceSection = 0; 78 hasPostDeviceSection = 0;
79} 79}
80 80
81SystemFile::~SystemFile( void ) { 81SystemFile::~SystemFile( void ) {
82 close(); 82 close();
83} 83}
84 84
85bool SystemFile::open( void ) { 85bool SystemFile::open( void ) {
86 QString Prefix = getenv( "NS2OUTPUTTO" ); 86 QString Prefix = getenv( "NS2OUTPUTTO" );
87 87
88 if( Prefix != "stderr" /* && Name != "interfaces" */ ) { 88 if( Prefix != "stderr" /* && Name != "interfaces" */ ) {
89 // generate files where the need to be 89 // generate files where the need to be
90 if( F ) { 90 if( F ) {
91 F->close(); 91 F->close();
92 delete F; 92 delete F;
93 } 93 }
94 94
95 F = new QFile( Prefix + Path + ((InAppend)?"":"bup") ); 95 F = new QFile( Prefix + Path + ((InAppend)?"":"bup") );
96 Log(( "Open systemfile %s\n", F->name().latin1() )); 96 Log(( "Open systemfile %s\n", F->name().latin1() ));
97 if( ! F->open( ((InAppend)?IO_Append : 0 ) | IO_WriteOnly ) ) { 97 if( ! F->open( ((InAppend)?IO_Append : 0 ) | IO_WriteOnly ) ) {
98 return 0; 98 return 0;
99 } 99 }
100 } else { 100 } else {
101 if( ! F ) { 101 if( ! F ) {
102 odebug << "!!!!!!!!!!!!!!!!!! " << oendl; 102 odebug << "!!!!!!!!!!!!!!!!!! " << oendl;
103 odebug << "!!!! TESTMODE !!!!" << oendl; 103 odebug << "!!!! TESTMODE !!!!" << oendl;
104 odebug << "!!!!!!!!!!!!!!!!!! " << oendl; 104 odebug << "!!!!!!!!!!!!!!!!!! " << oendl;
105 odebug << "!!!!" << oendl; 105 odebug << "!!!!" << oendl;
106 odebug << "!!!! GENERATE " << Path << oendl; 106 odebug << "!!!! GENERATE " << Path << oendl;
107 if( InAppend ) { 107 if( InAppend ) {
108 odebug << "!!!! In APPEND mode" << oendl; 108 odebug << "!!!! In APPEND mode" << oendl;
109 } 109 }
110 odebug << "!!!!" << oendl; 110 odebug << "!!!!" << oendl;
111 odebug << "!!!!!!!!!!!!!!!!!!" << oendl; 111 odebug << "!!!!!!!!!!!!!!!!!!" << oendl;
112 112
113 F = new QFile(); 113 F = new QFile();
114 F->open( IO_WriteOnly, stderr ); 114 F->open( IO_WriteOnly, stderr );
115 } 115 }
116 } 116 }
117 setDevice( F ); 117 setDevice( F );
118 return 1; 118 return 1;
119} 119}
120 120
121bool SystemFile::close( void ) { 121bool SystemFile::close( void ) {
122 if( ! F || ! F->isOpen() ) { 122 if( ! F || ! F->isOpen() ) {
123 return 1 ; 123 return 1 ;
124 } 124 }
125 125
126 QString Prefix = getenv( "NS2OUTPUTTO" ); 126 QString Prefix = getenv( "NS2OUTPUTTO" );
127 127
128 if( Prefix == "stderr" ) { 128 if( Prefix == "stderr" ) {
129 return 1; 129 return 1;
130 } 130 }
131 131
132 QString OldP = Prefix + Path + "bup"; 132 QString OldP = Prefix + Path + "bup";
133 133
134 F->close(); 134 F->close();
135 delete F; 135 delete F;
136 F = 0; 136 F = 0;
137 137
138 if( ! InAppend ) { 138 if( ! InAppend ) {
139 odebug << "Rename " << OldP << " to " << Path << oendl;
140 return ( rename( OldP.latin1(), Path.latin1() ) >= 0 ); 139 return ( rename( OldP.latin1(), Path.latin1() ) >= 0 );
141 } 140 }
142 return 1; 141 return 1;
143} 142}
144 143
145bool SystemFile::preSection( void ) { 144bool SystemFile::preSection( void ) {
146 if( hasPreSection ) { 145 if( hasPreSection ) {
147 QFile Fl( TemplDir + Name + "/presection" ); 146 QFile Fl( TemplDir + Name + "/presection" );
148 if( ! Fl.open( IO_ReadOnly ) ) 147 if( ! Fl.open( IO_ReadOnly ) )
149 return 0; // error 148 return 0; // error
150 // copy file to this file 149 // copy file to this file
151 F->writeBlock( Fl.readAll() ); 150 F->writeBlock( Fl.readAll() );
152 } 151 }
153 return 1; 152 return 1;
154} 153}
155 154
156bool SystemFile::postSection( void ) { 155bool SystemFile::postSection( void ) {
157 if( hasPostSection ) { 156 if( hasPostSection ) {
158 QFile Fl( TemplDir + Name + "/postsection" ); 157 QFile Fl( TemplDir + Name + "/postsection" );
159 if( ! Fl.open( IO_ReadOnly ) ) 158 if( ! Fl.open( IO_ReadOnly ) )
160 return 0; // error 159 return 0; // error
161 // copy file to this file 160 // copy file to this file
162 F->writeBlock( Fl.readAll() ); 161 F->writeBlock( Fl.readAll() );
163 } 162 }
164 return 1; 163 return 1;
165} 164}
166 165
167bool SystemFile::preNodeSection( ANetNodeInstance * NNI, long ) { 166bool SystemFile::preNodeSection( ANetNodeInstance * NNI, long ) {
168 if( hasPreNodeSection ) { 167 if( hasPreNodeSection ) {
169 QFile Fl( TemplDir + Name + "/prenodesection" ); 168 QFile Fl( TemplDir + Name + "/prenodesection" );
170 if( ! Fl.open( IO_ReadOnly ) ) 169 if( ! Fl.open( IO_ReadOnly ) )
171 return 0; // error 170 return 0; // error
172 QTextStream TX( &Fl ); 171 QTextStream TX( &Fl );
173 QString Out; 172 QString Out;
174 QString S = TX.readLine(); 173 QString S = TX.readLine();
175 while( ! TX.eof() ) { 174 while( ! TX.eof() ) {
176 Out = S. 175 Out = S.
177 arg(NNI->nodeClass()->name()); 176 arg(NNI->nodeClass()->name());
178 (*this) << Out << endl; 177 (*this) << Out << endl;
179 S = TX.readLine(); 178 S = TX.readLine();
180 } 179 }
181 } 180 }
182 return 1; 181 return 1;
183} 182}
184 183
185bool SystemFile::postNodeSection( ANetNodeInstance * NNI, long ) { 184bool SystemFile::postNodeSection( ANetNodeInstance * NNI, long ) {
186 if( hasPostNodeSection ) { 185 if( hasPostNodeSection ) {
187 QFile Fl( TemplDir + Name + "/postnodesection" ); 186 QFile Fl( TemplDir + Name + "/postnodesection" );
188 if( ! Fl.open( IO_ReadOnly ) ) 187 if( ! Fl.open( IO_ReadOnly ) )
189 return 0; // error 188 return 0; // error
190 QTextStream TX( &Fl ); 189 QTextStream TX( &Fl );
191 QString Out; 190 QString Out;
192 QString S = TX.readLine(); 191 QString S = TX.readLine();
193 while( ! TX.eof() ) { 192 while( ! TX.eof() ) {
194 Out = S. 193 Out = S.
195 arg(NNI->name()); 194 arg(NNI->name());
196 (*this) << Out << endl; 195 (*this) << Out << endl;
197 S = TX.readLine(); 196 S = TX.readLine();
198 } 197 }
199 } 198 }
200 return 1; 199 return 1;
201} 200}
202 201
203bool SystemFile::preDeviceSection( ANetNode * NN ) { 202bool SystemFile::preDeviceSection( ANetNode * NN ) {
204 if( hasPreDeviceSection ) { 203 if( hasPreDeviceSection ) {
205 QFile Fl( TemplDir + Name + "/predevicesection" ); 204 QFile Fl( TemplDir + Name + "/predevicesection" );
206 if( ! Fl.open( IO_ReadOnly ) ) 205 if( ! Fl.open( IO_ReadOnly ) )
207 return 0; // error 206 return 0; // error
208 QTextStream TX( &Fl ); 207 QTextStream TX( &Fl );
209 QString Out; 208 QString Out;
210 QString S = TX.readLine(); 209 QString S = TX.readLine();
211 while( ! TX.eof() ) { 210 while( ! TX.eof() ) {
212 Out = S.arg(NN->name()); 211 Out = S.arg(NN->name());
213 (*this) << Out << endl; 212 (*this) << Out << endl;
214 S = TX.readLine(); 213 S = TX.readLine();
215 } 214 }
216 } 215 }
217 return 1; 216 return 1;
218} 217}
219 218
220bool SystemFile::postDeviceSection( ANetNode * NN ) { 219bool SystemFile::postDeviceSection( ANetNode * NN ) {
221 if( hasPostDeviceSection ) { 220 if( hasPostDeviceSection ) {
222 QFile Fl( TemplDir + Name + "/postdevicesection" ); 221 QFile Fl( TemplDir + Name + "/postdevicesection" );
223 if( ! Fl.open( IO_ReadOnly ) ) 222 if( ! Fl.open( IO_ReadOnly ) )
224 return 0; // error 223 return 0; // error
225 QTextStream TX( &Fl ); 224 QTextStream TX( &Fl );
226 QString Out; 225 QString Out;
227 QString S = TX.readLine(); 226 QString S = TX.readLine();
228 while( ! TX.eof() ) { 227 while( ! TX.eof() ) {
229 Out = S.arg(NN->name()); 228 Out = S.arg(NN->name());
230 (*this) << Out << endl; 229 (*this) << Out << endl;
231 S = TX.readLine(); 230 S = TX.readLine();
232 } 231 }
233 } 232 }
234 return 1; 233 return 1;
235} 234}
diff --git a/noncore/settings/networksettings2/nsdata.cpp b/noncore/settings/networksettings2/nsdata.cpp
index d76353a..39031ed 100644
--- a/noncore/settings/networksettings2/nsdata.cpp
+++ b/noncore/settings/networksettings2/nsdata.cpp
@@ -1,743 +1,787 @@
1#include <stdlib.h> 1#include <stdlib.h>
2#include <opie2/odebug.h> 2#include <opie2/odebug.h>
3#include <qpe/qpeapplication.h> 3#include <qpe/qpeapplication.h>
4#include <qtextstream.h> 4#include <qtextstream.h>
5#include <qdir.h> 5#include <qdir.h>
6#include <qfile.h> 6#include <qfile.h>
7#include <qfileinfo.h> 7#include <qfileinfo.h>
8 8
9#include "nsdata.h" 9#include "nsdata.h"
10#include <netnode.h> 10#include <netnode.h>
11#include <resources.h> 11#include <resources.h>
12 12
13static QString CfgFile; 13static QString CfgFile;
14 14
15NetworkSettingsData::NetworkSettingsData( void ) { 15NetworkSettingsData::NetworkSettingsData( void ) {
16 // init global resources structure 16 // init global resources structure
17 new TheNSResources(); 17 new TheNSResources();
18 18
19 if( ! NSResources->userKnown() ) { 19 if( ! NSResources->userKnown() ) {
20 Log(( "Cannot detect qpe user HOME=\"%s\" USER=\"%s\"\n", 20 Log(( "Cannot detect qpe user HOME=\"%s\" USER=\"%s\"\n",
21 NSResources->currentUser().HomeDir.latin1(), 21 NSResources->currentUser().HomeDir.latin1(),
22 NSResources->currentUser().UserName.latin1() )); 22 NSResources->currentUser().UserName.latin1() ));
23 return; 23 return;
24 } 24 }
25 25
26 CfgFile.sprintf( "%s/Settings/NS2.conf", 26 CfgFile.sprintf( "%s/Settings/NS2.conf",
27 NSResources->currentUser().HomeDir.latin1() ); 27 NSResources->currentUser().HomeDir.latin1() );
28 Log(( "Cfg from %s\n", CfgFile.latin1() )); 28 Log(( "Cfg from %s\n", CfgFile.latin1() ));
29 29
30 // load settings 30 // load settings
31 loadSettings(); 31 loadSettings();
32 32
33 // assign interfaces by scanning /tmp/profile-%s.Up files 33 // assign interfaces by scanning /tmp/profile-%s.Up files
34 { QDir D( "/tmp" ); 34 { QDir D( "/tmp" );
35 QFile * F = new QFile; 35 QFile * F = new QFile;
36 int profilenr; 36 int profilenr;
37 QString interfacename; 37 QString interfacename;
38 QTextStream TS ( F ); 38 QTextStream TS ( F );
39 39
40 QStringList SL = D.entryList( "profile-*.up"); 40 QStringList SL = D.entryList( "profile-*.up");
41 41
42 Log(( "System reports %d interfaces. Found %d up\n", 42 Log(( "System reports %d interfaces. Found %d up\n",
43 NSResources->system().interfaces().count(), 43 NSResources->system().interfaces().count(),
44 SL.count() )); 44 SL.count() ));
45 45
46 for ( QStringList::Iterator it = SL.begin(); 46 for ( QStringList::Iterator it = SL.begin();
47 it != SL.end(); 47 it != SL.end();
48 ++it ) { 48 ++it ) {
49 profilenr = atol( (*it).mid( 8 ).latin1() ); 49 profilenr = atol( (*it).mid( 8 ).latin1() );
50 // read the interface store int 'up' 50 // read the interface store int 'up'
51 F->setName( D.path() + "/" + (*it) ); 51 F->setName( D.path() + "/" + (*it) );
52 if( F->open( IO_ReadOnly ) ) { 52 if( F->open( IO_ReadOnly ) ) {
53 NodeCollection * NC; 53 NodeCollection * NC;
54 interfacename = TS.readLine(); 54 interfacename = TS.readLine();
55 F->close(); 55 F->close();
56 56
57 Log(( "Assign interface %s to Profile nr %d\n", 57 Log(( "Assign interface %s to Profile nr %d\n",
58 interfacename.latin1(), profilenr )); 58 interfacename.latin1(), profilenr ));
59 59
60 NC = NSResources->getConnection( profilenr ); 60 NC = NSResources->getConnection( profilenr );
61 if( NC ) { 61 if( NC ) {
62 NC->assignInterface( 62 NC->assignInterface(
63 NSResources->system().findInterface( interfacename ) ); 63 NSResources->system().findInterface( interfacename ) );
64 Log(( "Assign interface %p\n",
65 NC->assignedInterface() ));
64 } else { 66 } else {
65 Log(( "Profile nr %d no longer defined\n", 67 Log(( "Profile nr %d no longer defined\n",
66 profilenr )); 68 profilenr ));
67 } 69 }
68 } 70 }
69 } 71 }
70 } 72 }
71} 73}
72 74
73// saving is done by caller 75// saving is done by caller
74NetworkSettingsData::~NetworkSettingsData( void ) { 76NetworkSettingsData::~NetworkSettingsData( void ) {
75 delete NSResources; 77 delete NSResources;
76} 78}
77 79
78void NetworkSettingsData::loadSettings( void ) { 80void NetworkSettingsData::loadSettings( void ) {
79 QString Line, S; 81 QString Line, S;
80 QString Attr, Value; 82 QString Attr, Value;
81 long idx; 83 long idx;
82 84
83 QFile F( CfgFile ); 85 QFile F( CfgFile );
84 QTextStream TS( &F ); 86 QTextStream TS( &F );
85 87
86 ForceModified = 0; 88 ForceModified = 0;
87 89
88 do { 90 do {
89 91
90 if( ! F.open(IO_ReadOnly) ) 92 if( ! F.open(IO_ReadOnly) )
91 break; 93 break;
92 94
93 /* load the file -> 95 /* load the file ->
94 96
95 FORMAT : 97 FORMAT :
96 98
97 [NETNODETYPE] 99 [NETNODETYPE]
98 Entries ... 100 Entries ...
99 <EMPTYLINE> 101 <EMPTYLINE>
100 [connection] 102 [connection]
101 Name=Name 103 Name=Name
102 Node=Name 104 Node=Name
103 <EMPTYLINE> 105 <EMPTYLINE>
104 */ 106 */
105 while( ! TS.atEnd() ) { 107 while( ! TS.atEnd() ) {
106 S = Line = TS.readLine(); 108 S = Line = TS.readLine();
107 109
108 if ( S.isEmpty() || S[0] != '[' ) 110 if ( S.isEmpty() || S[0] != '[' )
109 continue; 111 continue;
110 112
111 S = S.mid( 1, S.length()-2 ); 113 S = S.mid( 1, S.length()-2 );
112 114
113 if( ! NSResources ) { 115 if( ! NSResources ) {
114 continue; 116 continue;
115 } 117 }
116 118
117 if( S == "connection" ) { 119 if( S == "connection" ) {
118 // load connections -> collections of nodes 120 // load connections -> collections of nodes
119 bool Dangling; 121 bool Dangling;
120 NodeCollection * NC = new NodeCollection( TS, Dangling ); 122 NodeCollection * NC = new NodeCollection( TS, Dangling );
121 NSResources->addConnection( NC, Dangling ); 123 NSResources->addConnection( NC, Dangling );
122 } else { 124 } else {
123 ANetNode * NN = 0; 125 ANetNode * NN = 0;
124 ANetNodeInstance* NNI = 0; 126 ANetNodeInstance* NNI = 0;
125 if( S.startsWith( "nodetype " ) ) { 127 if( S.startsWith( "nodetype " ) ) {
126 S = S.mid( 9, S.length()-9 ); 128 S = S.mid( 9, S.length()-9 );
127 S = deQuote(S); 129 S = deQuote(S);
128 // try to find netnode 130 // try to find netnode
129 NN = NSResources->findNetNode( S ); 131 NN = NSResources->findNetNode( S );
130 } else { 132 } else {
131 // try to find instance 133 // try to find instance
132 NNI = NSResources->createNodeInstance( S ); 134 NNI = NSResources->createNodeInstance( S );
133 } 135 }
134 136
135 if( NN == 0 && NNI == 0 ) { 137 if( NN == 0 && NNI == 0 ) {
136 LeftOvers.append( Line ); 138 LeftOvers.append( Line );
137 do { 139 do {
138 Line = TS.readLine(); 140 Line = TS.readLine();
139 // store even delimiter 141 // store even delimiter
140 LeftOvers.append( Line ); 142 LeftOvers.append( Line );
141 } while ( ! Line.isEmpty() ); 143 } while ( ! Line.isEmpty() );
142 144
143 //next section 145 //next section
144 continue; 146 continue;
145 } 147 }
146 148
147 // read entries of this section 149 // read entries of this section
148 do { 150 do {
149 S = Line = TS.readLine(); 151 S = Line = TS.readLine();
150 152
151 if( S.isEmpty() ) { 153 if( S.isEmpty() ) {
152 // empty line 154 // empty line
153 break; 155 break;
154 } 156 }
155 idx = S.find( '=' ); 157 idx = S.find( '=' );
156 if( idx > 0 ) { 158 if( idx > 0 ) {
157 Attr = S.left( idx ); 159 Attr = S.left( idx );
158 Value = S.mid( idx+1, S.length() ); 160 Value = S.mid( idx+1, S.length() );
159 } else { 161 } else {
160 Value=""; 162 Value="";
161 Attr = S; 163 Attr = S;
162 } 164 }
163 165
164 Value.stripWhiteSpace(); 166 Value.stripWhiteSpace();
165 Attr.stripWhiteSpace(); 167 Attr.stripWhiteSpace();
166 Attr.lower(); 168 Attr.lower();
167 // dequote Attr 169 // dequote Attr
168 Value = deQuote(Value); 170 Value = deQuote(Value);
169 171
170 if( NN ) { 172 if( NN ) {
171 // set the attribute 173 // set the attribute
172 NN->setAttribute( Attr, Value ); 174 NN->setAttribute( Attr, Value );
173 } else { 175 } else {
174 // set the attribute 176 // set the attribute
175 NNI->setAttribute( Attr, Value ); 177 NNI->setAttribute( Attr, Value );
176 } 178 }
177 } while( 1 ); 179 } while( 1 );
178 180
179 if( NNI ) { 181 if( NNI ) {
180 // loading from file -> exists 182 // loading from file -> exists
181 Log( ( "NodeInstance %s : %p\n", NNI->name(), NNI )); 183 Log( ( "NodeInstance %s : %p\n", NNI->name(), NNI ));
182 NNI->setNew( FALSE ); 184 NNI->setNew( FALSE );
183 NSResources->addNodeInstance( NNI ); 185 NSResources->addNodeInstance( NNI );
184 } 186 }
185 187
186 if( NN ) { 188 if( NN ) {
187 Log( ( "Node %s : %p\n", NN->name(), NN ) ); 189 Log( ( "Node %s : %p\n", NN->name(), NN ) );
188 } 190 }
189 } 191 }
190 } 192 }
191 193
192 } while( 0 ); 194 } while( 0 );
193 195
194} 196}
195 197
196QString NetworkSettingsData::saveSettings( void ) { 198QString NetworkSettingsData::saveSettings( void ) {
197 QString ErrS = ""; 199 QString ErrS = "";
198 200
199 if( ! isModified() ) 201 if( ! isModified() )
200 return ErrS; 202 return ErrS;
201 203
202 QString S; 204 QString S;
203 QFile F( CfgFile + ".bup" ); 205 QFile F( CfgFile + ".bup" );
204 206
205 Log( ( "Saving settings to %s\n", CfgFile.latin1() )); 207 Log( ( "Saving settings to %s\n", CfgFile.latin1() ));
206 if( ! F.open( IO_WriteOnly | IO_Truncate ) ) { 208 if( ! F.open( IO_WriteOnly | IO_Truncate ) ) {
207 ErrS = qApp->translate( "NetworkSettings", 209 ErrS = qApp->translate( "NetworkSettings",
208 "<p>Could not save setup to \"%1\" !</p>" ). 210 "<p>Could not save setup to \"%1\" !</p>" ).
209 arg(CfgFile); 211 arg(CfgFile);
210 // problem 212 // problem
211 return ErrS; 213 return ErrS;
212 } 214 }
213 215
214 QTextStream TS( &F ); 216 QTextStream TS( &F );
215 217
216 // save global configs 218 // save global configs
217 for( QDictIterator<ANetNode> it( NSResources->netNodes() ); 219 for( QDictIterator<ANetNode> it( NSResources->netNodes() );
218 it.current(); 220 it.current();
219 ++it ) { 221 ++it ) {
220 TS << "[nodetype " 222 TS << "[nodetype "
221 << quote( QString( it.current()->name() ) ) 223 << quote( QString( it.current()->name() ) )
222 << "]" 224 << "]"
223 << endl; 225 << endl;
224 226
225 it.current()->saveAttributes( TS ); 227 it.current()->saveAttributes( TS );
226 TS << endl; 228 TS << endl;
227 } 229 }
228 230
229 // save leftovers 231 // save leftovers
230 for ( QStringList::Iterator it = LeftOvers.begin(); 232 for ( QStringList::Iterator it = LeftOvers.begin();
231 it != LeftOvers.end(); ++it ) { 233 it != LeftOvers.end(); ++it ) {
232 TS << (*it) << endl; 234 TS << (*it) << endl;
233 } 235 }
234 236
235 // save all netnode instances 237 // save all netnode instances
236 { ANetNodeInstance * NNI; 238 { ANetNodeInstance * NNI;
237 for( QDictIterator<ANetNodeInstance> nit( 239 for( QDictIterator<ANetNodeInstance> nit(
238 NSResources->netNodeInstances()); 240 NSResources->netNodeInstances());
239 nit.current(); 241 nit.current();
240 ++nit ) { 242 ++nit ) {
241 // header 243 // header
242 NNI = nit.current(); 244 NNI = nit.current();
243 TS << '[' 245 TS << '['
244 << QString(NNI->nodeClass()->name()) 246 << QString(NNI->nodeClass()->name())
245 << ']' 247 << ']'
246 << endl; 248 << endl;
247 NNI->saveAttributes( TS ); 249 NNI->saveAttributes( TS );
248 TS << endl; 250 TS << endl;
249 } 251 }
250 } 252 }
251 253
252 // good connections 254 // good connections
253 { Name2Connection_t & M = NSResources->connections(); 255 { Name2Connection_t & M = NSResources->connections();
254 256
255 // for all connections 257 // for all connections
256 for( QDictIterator<NodeCollection> it(M); 258 for( QDictIterator<NodeCollection> it(M);
257 it.current(); 259 it.current();
258 ++it ) { 260 ++it ) {
259 TS << "[connection]" << endl; 261 TS << "[connection]" << endl;
260 it.current()->save(TS); 262 it.current()->save(TS);
261 } 263 }
262 } 264 }
263 265
264 // save dangling connections 266 // save dangling connections
265 { Name2Connection_t & M = NSResources->danglingConnections(); 267 { Name2Connection_t & M = NSResources->danglingConnections();
266 268
267 // for all connections 269 // for all connections
268 for( QDictIterator<NodeCollection> it(M); 270 for( QDictIterator<NodeCollection> it(M);
269 it.current(); 271 it.current();
270 ++it ) { 272 ++it ) {
271 TS << "[connection]" << endl; 273 TS << "[connection]" << endl;
272 it.current()->save(TS); 274 it.current()->save(TS);
273 } 275 }
274 } 276 }
275 277
276 QDir D("."); 278 QDir D(".");
277 D.rename( CfgFile + ".bup", CfgFile ); 279 D.rename( CfgFile + ".bup", CfgFile );
278 280
279 // 281 //
280 // proper files AND system files regenerated 282 // proper files AND system files regenerated
281 // 283 //
282 284
283 285
284 for( QDictIterator<NodeCollection> it(NSResources->connections()); 286 for( QDictIterator<NodeCollection> it(NSResources->connections());
285 it.current(); 287 it.current();
286 ++it ) { 288 ++it ) {
287 it.current()->setModified( 0 ); 289 it.current()->setModified( 0 );
288 } 290 }
289 291
290 return ErrS; 292 return ErrS;
291} 293}
292 294
293QString NetworkSettingsData::generateSettings( void ) { 295QString NetworkSettingsData::generateSettings( void ) {
294 QString S = ""; 296 QString S = "";
295 Name2SystemFile_t & SFM = NSResources->systemFiles(); 297 Name2SystemFile_t & SFM = NSResources->systemFiles();
296 Name2Connection_t & M = NSResources->connections(); 298 Name2Connection_t & M = NSResources->connections();
297 NodeCollection * NC; 299 NodeCollection * NC;
298 ANetNodeInstance * NNI; 300 ANetNodeInstance * NNI;
299 ANetNodeInstance * FirstWithData; 301 ANetNodeInstance * FirstWithData;
300 RuntimeInfo * CurDev; 302 RuntimeInfo * CurDev;
301 ANetNode * NN, * CurDevNN = 0; 303 ANetNode * NN, * CurDevNN = 0;
302 long NoOfDevs; 304 long NoOfDevs;
303 long DevCtStart; 305 long DevCtStart;
304 bool needToGenerate; 306 bool needToGenerate;
305 307
306 // regenerate system files 308 // regenerate system files
307 Log( ( "Generating settings from %s\n", CfgFile.latin1() )); 309 Log( ( "Generating settings from %s\n", CfgFile.latin1() ));
308 310
309 for( QDictIterator<ANetNode> nnit( NSResources->netNodes() ); 311 for( QDictIterator<ANetNode> nnit( NSResources->netNodes() );
310 nnit.current(); 312 nnit.current();
311 ++nnit ) { 313 ++nnit ) {
312 bool FirstItem = 1; 314 bool FirstItem = 1;
313 bool Generated = 0; 315 bool Generated = 0;
314 316
315 CurDevNN = nnit.current(); 317 CurDevNN = nnit.current();
316 318
317 { QStringList SL; 319 { QStringList SL;
318 SL = CurDevNN->properFiles(); 320 SL = CurDevNN->properFiles();
319 321
320 for ( QStringList::Iterator it = SL.begin(); 322 for ( QStringList::Iterator it = SL.begin();
321 it != SL.end(); 323 it != SL.end();
322 ++it ) { 324 ++it ) {
323 325
324 Generated = 0; 326 Generated = 0;
325 FirstItem = 1; 327 FirstItem = 1;
326 // iterate over NNI's of this class 328 // iterate over NNI's of this class
327 for( QDictIterator<ANetNodeInstance> nniit( 329 for( QDictIterator<ANetNodeInstance> nniit(
328 NSResources->netNodeInstances() ); 330 NSResources->netNodeInstances() );
329 nniit.current(); 331 nniit.current();
330 ++nniit ) { 332 ++nniit ) {
331 if( nniit.current()->nodeClass() != CurDevNN ) 333 if( nniit.current()->nodeClass() != CurDevNN )
332 // different class 334 // different class
333 continue; 335 continue;
334 336
335 // open proper file 337 // open proper file
336 { SystemFile SF( (*it) ); 338 { SystemFile SF( (*it) );
337 339
338 if( ! CurDevNN->openFile( SF, nniit.current()) ) { 340 if( ! CurDevNN->openFile( SF, nniit.current()) ) {
339 // cannot open 341 // cannot open
340 S = qApp->translate( "NetworkSettings", 342 S = qApp->translate( "NetworkSettings",
341 "<p>Cannot open proper file \"%1\" for node \"%2\"</p>" ). 343 "<p>Cannot open proper file \"%1\" for node \"%2\"</p>" ).
342 arg( (*it) ).arg( CurDevNN->name() ); 344 arg( (*it) ).arg( CurDevNN->name() );
343 return S; 345 return S;
344 } 346 }
345 347
346 if( ! SF.open() ) { 348 if( ! SF.open() ) {
347 S = qApp->translate( "NetworkSettings", 349 S = qApp->translate( "NetworkSettings",
348 "<p>Cannot open proper file \"%1\" for node \"%2\"</p>" ). 350 "<p>Cannot open proper file \"%1\" for node \"%2\"</p>" ).
349 arg( (*it) ).arg( CurDevNN->name() ); 351 arg( (*it) ).arg( CurDevNN->name() );
350 return S; 352 return S;
351 } 353 }
352 354
353 // preamble on first 355 // preamble on first
354 if( FirstItem ) { 356 if( FirstItem ) {
355 if( CurDevNN->generatePreamble( SF ) == 2 ) { 357 if( CurDevNN->generatePreamble( SF ) == 2 ) {
356 S = qApp->translate( "NetworkSettings", 358 S = qApp->translate( "NetworkSettings",
357 "<p>Error in section \"preamble\" for proper file \"%1\" and node \"%2\"</p>" ). 359 "<p>Error in section \"preamble\" for proper file \"%1\" and node \"%2\"</p>" ).
358 arg( (*it) ). 360 arg( (*it) ).
359 arg( CurDevNN->name() ); 361 arg( CurDevNN->name() );
360 return S; 362 return S;
361 } 363 }
362 } 364 }
363 FirstItem = 0; 365 FirstItem = 0;
364 Generated = 1; 366 Generated = 1;
365 367
366 // item specific 368 // item specific
367 if( nniit.current()->generateFile( SF, -1 ) == 2 ) { 369 if( nniit.current()->generateFile( SF, -1 ) == 2 ) {
368 S = qApp->translate( "NetworkSettings", 370 S = qApp->translate( "NetworkSettings",
369 "<p>Error in section for node \"%1\" for proper file \"%2\" and node class \"%3\"</p>" ). 371 "<p>Error in section for node \"%1\" for proper file \"%2\" and node class \"%3\"</p>" ).
370 arg( nniit.current()->name() ). 372 arg( nniit.current()->name() ).
371 arg( (*it) ). 373 arg( (*it) ).
372 arg( CurDevNN->name() ); 374 arg( CurDevNN->name() );
373 return S; 375 return S;
374 } 376 }
375 } 377 }
376 } 378 }
377 379
378 if( Generated ) { 380 if( Generated ) {
379 SystemFile SF( (*it) ); 381 SystemFile SF( (*it) );
380 382
381 if( CurDevNN->openFile( SF, 0 ) && 383 if( CurDevNN->openFile( SF, 0 ) &&
382 ! SF.path().isEmpty() 384 ! SF.path().isEmpty()
383 ) { 385 ) {
384 386
385 if( ! SF.open() ) { 387 if( ! SF.open() ) {
386 S = qApp->translate( "NetworkSettings", 388 S = qApp->translate( "NetworkSettings",
387 "<p>Cannot open proper file \"%1\" for node \"%2\"</p>" ). 389 "<p>Cannot open proper file \"%1\" for node \"%2\"</p>" ).
388 arg( (*it) ).arg( CurDevNN->name() ); 390 arg( (*it) ).arg( CurDevNN->name() );
389 return S; 391 return S;
390 } 392 }
391 393
392 if( CurDevNN->generatePostamble( SF ) == 2 ) { 394 if( CurDevNN->generatePostamble( SF ) == 2 ) {
393 S = qApp->translate( "NetworkSettings", 395 S = qApp->translate( "NetworkSettings",
394 "<p>Error in section \"postamble\" for proper file \"%1\" and node \"%2\"</p>" ). 396 "<p>Error in section \"postamble\" for proper file \"%1\" and node \"%2\"</p>" ).
395 arg( (*it) ). 397 arg( (*it) ).
396 arg( CurDevNN->name() ); 398 arg( CurDevNN->name() );
397 return S; 399 return S;
398 } 400 }
399 } // no postamble 401 } // no postamble
400 } 402 }
401 } 403 }
402 } 404 }
403 } 405 }
404 406
405 // 407 //
406 // generate all registered files 408 // generate all registered files
407 // 409 //
408 for( QDictIterator<SystemFile> sfit(SFM); 410 for( QDictIterator<SystemFile> sfit(SFM);
409 sfit.current(); 411 sfit.current();
410 ++sfit ) { 412 ++sfit ) {
411 SystemFile * SF; 413 SystemFile * SF;
412 414
413 SF = sfit.current(); 415 SF = sfit.current();
414 416
415 // reset all 417 // reset all
416 for( QDictIterator<ANetNode> nnit( NSResources->netNodes() ); 418 for( QDictIterator<ANetNode> nnit( NSResources->netNodes() );
417 nnit.current(); 419 nnit.current();
418 ++nnit ) { 420 ++nnit ) {
419 nnit.current()->setDone(0); 421 nnit.current()->setDone(0);
420 } 422 }
421 423
422 for( QDictIterator<ANetNodeInstance> nniit( 424 for( QDictIterator<ANetNodeInstance> nniit(
423 NSResources->netNodeInstances() ); 425 NSResources->netNodeInstances() );
424 nniit.current(); 426 nniit.current();
425 ++nniit ) { 427 ++nniit ) {
426 nniit.current()->setDone(0); 428 nniit.current()->setDone(0);
427 } 429 }
428 430
429 for( QDictIterator<NodeCollection> ncit(M); 431 for( QDictIterator<NodeCollection> ncit(M);
430 ncit.current(); 432 ncit.current();
431 ++ncit ) { 433 ++ncit ) {
432 ncit.current()->setDone(0); 434 ncit.current()->setDone(0);
433 } 435 }
434 436
435 Log( ( "Generating system file %s\n", SF->name().latin1() )); 437 Log( ( "Generating system file %s\n", SF->name().latin1() ));
436 438
437 needToGenerate = 0; 439 needToGenerate = 0;
438 440
439 // are there netnodes that have instances and need 441 // are there netnodes that have instances and need
440 // to write data in this system file ? 442 // to write data in this system file ?
441 for( QDictIterator<ANetNode> nnit( NSResources->netNodes() ); 443 for( QDictIterator<ANetNode> nnit( NSResources->netNodes() );
442 ! needToGenerate && nnit.current(); 444 ! needToGenerate && nnit.current();
443 ++nnit ) { 445 ++nnit ) {
444 446
445 NN = nnit.current(); 447 NN = nnit.current();
446 448
447 if( NN->hasDataForFile( *SF ) ) { 449 if( NN->hasDataForFile( *SF ) ) {
448 // netnode can have data 450 // netnode can have data
449 451
450 // are there instances of this node ? 452 // are there instances of this node ?
451 for( QDictIterator<ANetNodeInstance> nniit( 453 for( QDictIterator<ANetNodeInstance> nniit(
452 NSResources->netNodeInstances() ); 454 NSResources->netNodeInstances() );
453 ! needToGenerate && nniit.current(); 455 ! needToGenerate && nniit.current();
454 ++nniit ) { 456 ++nniit ) {
455 if( nniit.current()->nodeClass() == NN ) { 457 if( nniit.current()->nodeClass() == NN ) {
456 // yes 458 // yes
457 Log(("Node %s has data\n", 459 Log(("Node %s has data\n",
458 nniit.current()->name() )); 460 nniit.current()->name() ));
459 needToGenerate = 1; 461 needToGenerate = 1;
460 break; 462 break;
461 } 463 }
462 } 464 }
463 } 465 }
464 } 466 }
465 467
466 if( ! needToGenerate ) { 468 if( ! needToGenerate ) {
467 // no instances found that might need to write data 469 // no instances found that might need to write data
468 // in this systemfile 470 // in this systemfile
469 Log(("No nodes for systemfile %s\n", SF->name().latin1() )); 471 Log(("No nodes for systemfile %s\n", SF->name().latin1() ));
470 continue; 472 continue;
471 } 473 }
472 474
473 // ok generate this system file 475 // ok generate this system file
474 if( ! SF->open() ) { 476 if( ! SF->open() ) {
475 S = qApp->translate( "NetworkSettings", 477 S = qApp->translate( "NetworkSettings",
476 "<p>Cannot open system file \"%1\"</p>" ). 478 "<p>Cannot open system file \"%1\"</p>" ).
477 arg( SF->name() ); 479 arg( SF->name() );
478 return S; 480 return S;
479 } 481 }
480 482
481 // global presection for this system file 483 // global presection for this system file
482 if( ! SF->preSection() ) { 484 if( ! SF->preSection() ) {
483 S = qApp->translate( "NetworkSettings", 485 S = qApp->translate( "NetworkSettings",
484 "<p>Error in section \"Preamble\" for file \"%1\"</p>" ). 486 "<p>Error in section \"Preamble\" for file \"%1\"</p>" ).
485 arg( SF->name() ); 487 arg( SF->name() );
486 return S; 488 return S;
487 } 489 }
488 490
489 // find connections that want to write to this file 491 // find connections that want to write to this file
490 for( QDictIterator<NodeCollection> ncit(M); 492 for( QDictIterator<NodeCollection> ncit(M);
491 ncit.current(); 493 ncit.current();
492 ++ncit ) { 494 ++ncit ) {
493 495
494 NC = ncit.current(); 496 NC = ncit.current();
495 497
496 if( NC->done() ) { 498 if( NC->done() ) {
497 // already done 499 // already done
498 continue; 500 continue;
499 } 501 }
500 502
501 if( ! NC->hasDataForFile( *SF ) ) { 503 if( ! NC->hasDataForFile( *SF ) ) {
502 // no data 504 // no data
503 continue; 505 continue;
504 } 506 }
505 507
506 Log(("Generating %s for connection %s\n", 508 Log(("Generating %s for connection %s\n",
507 SF->name().latin1(), NC->name().latin1() )); 509 SF->name().latin1(), NC->name().latin1() ));
508 // find highest item that wants to write data to this file 510 // find highest item that wants to write data to this file
509 FirstWithData = NC->firstWithDataForFile( *SF ); 511 FirstWithData = NC->firstWithDataForFile( *SF );
510 512
511 // find device on which this connection works 513 // find device on which this connection works
512 CurDev = NC->device(); 514 CurDev = NC->device();
513 // class of that node 515 // class of that node
514 CurDevNN = CurDev->netNode()->nodeClass(); 516 CurDevNN = CurDev->netNode()->nodeClass();
515 517
516 if( ! FirstWithData->nodeClass()->done() ) { 518 if( ! FirstWithData->nodeClass()->done() ) {
517 // generate fixed part 519 // generate fixed part
518 if( ! SF->preDeviceSection( CurDevNN ) ) { 520 if( ! SF->preDeviceSection( CurDevNN ) ) {
519 S = qApp->translate( "NetworkSettings", 521 S = qApp->translate( "NetworkSettings",
520 "<p>Error in section \"Pre-Device\" for file \"%1\"</p>" ). 522 "<p>Error in section \"Pre-Device\" for file \"%1\"</p>" ).
521 arg( SF->name() ); 523 arg( SF->name() );
522 return S; 524 return S;
523 } 525 }
524 526
525 if( FirstWithData->nodeClass()->generateFile( 527 if( FirstWithData->nodeClass()->generateFile(
526 *SF, 528 *SF,
527 FirstWithData, 529 FirstWithData,
528 -2 ) == 2 ) { 530 -2 ) == 2 ) {
529 S = qApp->translate( "NetworkSettings", 531 S = qApp->translate( "NetworkSettings",
530 "<p>Error in section \"Common\" for file \"%1\" and node \"%2\"</p>" ). 532 "<p>Error in section \"Common\" for file \"%1\" and node \"%2\"</p>" ).
531 arg( SF->name() ). 533 arg( SF->name() ).
532 arg( CurDevNN->name() ); 534 arg( CurDevNN->name() );
533 return S; 535 return S;
534 } 536 }
535 FirstWithData->nodeClass()->setDone( 1 ); 537 FirstWithData->nodeClass()->setDone( 1 );
536 Log(( "Systemfile %s for node instance %s is done\n", 538 Log(( "Systemfile %s for node instance %s is done\n",
537 SF->name().latin1(), 539 SF->name().latin1(),
538 FirstWithData->name() )); 540 FirstWithData->name() ));
539 } 541 }
540 542
541 NoOfDevs = 0; 543 NoOfDevs = 0;
542 DevCtStart = -1; 544 DevCtStart = -1;
543 545
544 if( SF->knowsDeviceInstances() ) { 546 if( SF->knowsDeviceInstances() ) {
545 DevCtStart = 0; 547 DevCtStart = 0;
546 NoOfDevs = CurDevNN->instanceCount(); 548 NoOfDevs = CurDevNN->instanceCount();
547 } 549 }
548 550
549 if( ! CurDev->netNode()->nodeClass()->done() ) { 551 if( ! CurDev->netNode()->nodeClass()->done() ) {
550 // first time this device is handled 552 // first time this device is handled
551 // generate common device specific part 553 // generate common device specific part
552 for( int i = DevCtStart; i < NoOfDevs ; i ++ ) { 554 for( int i = DevCtStart; i < NoOfDevs ; i ++ ) {
553 555
554 if( FirstWithData->nodeClass()->generateFile( 556 if( FirstWithData->nodeClass()->generateFile(
555 *SF, CurDev->netNode(), i ) == 2 ) { 557 *SF, CurDev->netNode(), i ) == 2 ) {
556 S = qApp->translate( "NetworkSettings", 558 S = qApp->translate( "NetworkSettings",
557 "<p>Error in section \"Device\" for file \"%1\" and node \"%2\"</p>" ). 559 "<p>Error in section \"Device\" for file \"%1\" and node \"%2\"</p>" ).
558 arg( SF->name() ). 560 arg( SF->name() ).
559 arg( CurDevNN->name() ); 561 arg( CurDevNN->name() );
560 return S; 562 return S;
561 } 563 }
562 } 564 }
563 CurDev->netNode()->nodeClass()->setDone( 1 ); 565 CurDev->netNode()->nodeClass()->setDone( 1 );
564 566
565 Log(( "Systemfile %s for Nodeclass %s is done\n", 567 Log(( "Systemfile %s for Nodeclass %s is done\n",
566 SF->name().latin1(), 568 SF->name().latin1(),
567 CurDev->netNode()->nodeClass()->name() 569 CurDev->netNode()->nodeClass()->name()
568 )); 570 ));
569 } 571 }
570 572
571 // generate profile specific info 573 // generate profile specific info
572 // for all nodeconnections that work on the same device 574 // for all nodeconnections that work on the same device
573 for( QDictIterator<NodeCollection> ncit2(M); 575 for( QDictIterator<NodeCollection> ncit2(M);
574 ncit2.current(); 576 ncit2.current();
575 ++ncit2 ) { 577 ++ncit2 ) {
576 578
577 if( ncit2.current()->device() != CurDev ) { 579 if( ncit2.current()->device() != CurDev ) {
578 // different device 580 // different device
579 continue; 581 continue;
580 } 582 }
581 583
582 Log(("Connection %s of family %s\n", 584 Log(("Connection %s of family %s\n",
583 ncit2.current()->name().latin1(), 585 ncit2.current()->name().latin1(),
584 CurDev->name() )); 586 CurDev->name() ));
585 // generate 587 // generate
586 NNI = ncit2.current()->firstWithDataForFile( *SF ); 588 NNI = ncit2.current()->firstWithDataForFile( *SF );
587 for( int i = DevCtStart; i < NoOfDevs ; i ++ ) { 589 for( int i = DevCtStart; i < NoOfDevs ; i ++ ) {
588 if( ! SF->preNodeSection( NNI, i ) ) { 590 if( ! SF->preNodeSection( NNI, i ) ) {
589 S = qApp->translate( "NetworkSettings", 591 S = qApp->translate( "NetworkSettings",
590 "<p>Error in \"Pre-Node Part\" for file \"%1\" and node \"%2\"</p>" ). 592 "<p>Error in \"Pre-Node Part\" for file \"%1\" and node \"%2\"</p>" ).
591 arg( SF->name() ). 593 arg( SF->name() ).
592 arg( CurDevNN->name() ); 594 arg( CurDevNN->name() );
593 return S; 595 return S;
594 } 596 }
595 597
596 switch( NNI->generateFile( *SF, i ) ) { 598 switch( NNI->generateFile( *SF, i ) ) {
597 case 0 : 599 case 0 :
598 (*SF) << endl; 600 (*SF) << endl;
599 break; 601 break;
600 case 1 : 602 case 1 :
601 break; 603 break;
602 case 2 : 604 case 2 :
603 S = qApp->translate( "NetworkSettings", 605 S = qApp->translate( "NetworkSettings",
604 "<p>Error in section \"Node\" for file \"%1\" and node \"%2\"</p>" ). 606 "<p>Error in section \"Node\" for file \"%1\" and node \"%2\"</p>" ).
605 arg( SF->name() ). 607 arg( SF->name() ).
606 arg( CurDevNN->name() ); 608 arg( CurDevNN->name() );
607 return S; 609 return S;
608 } 610 }
609 611
610 if( ! SF->postNodeSection( NNI, i ) ) { 612 if( ! SF->postNodeSection( NNI, i ) ) {
611 S = qApp->translate( "NetworkSettings", 613 S = qApp->translate( "NetworkSettings",
612 "<p>Error in \"Post-Node Part\" for file \"%1\" and node \"%2\"</p>" ). 614 "<p>Error in \"Post-Node Part\" for file \"%1\" and node \"%2\"</p>" ).
613 arg( SF->name() ). 615 arg( SF->name() ).
614 arg( CurDevNN->name() ); 616 arg( CurDevNN->name() );
615 return S; 617 return S;
616 } 618 }
617 } 619 }
618 620
619 ncit2.current()->setDone( 1 ); 621 ncit2.current()->setDone( 1 );
620 622
621 } 623 }
622 } 624 }
623 625
624 if( ! SF->postDeviceSection( CurDevNN ) ) { 626 if( ! SF->postDeviceSection( CurDevNN ) ) {
625 S = qApp->translate( "NetworkSettings", 627 S = qApp->translate( "NetworkSettings",
626 "<p>Error in section \"Post-Device\" for file \"%1\" and node \"%2\"</p>" ). 628 "<p>Error in section \"Post-Device\" for file \"%1\" and node \"%2\"</p>" ).
627 arg( SF->name() ). 629 arg( SF->name() ).
628 arg( CurDevNN->name() ); 630 arg( CurDevNN->name() );
629 return S; 631 return S;
630 } 632 }
631 633
632 634
633 if( ! SF->postSection() ) { 635 if( ! SF->postSection() ) {
634 S = qApp->translate( "NetworkSettings", 636 S = qApp->translate( "NetworkSettings",
635 "<p>Error in section \"Closure\" for file \"%1\"</p>" ). 637 "<p>Error in section \"Closure\" for file \"%1\"</p>" ).
636 arg( SF->name() ); 638 arg( SF->name() );
637 return S; 639 return S;
638 } 640 }
639 641
640 // end of file 642 // end of file
641 SF->close(); 643 SF->close();
642 } 644 }
643 return S; 645 return S;
644} 646}
645 647
646QList<NodeCollection> NetworkSettingsData::collectPossible( const char * Interface ) { 648QList<NodeCollection> NetworkSettingsData::collectPossible(
649 const QString & Interface ) {
647 // collect connections that can work on top of this interface 650 // collect connections that can work on top of this interface
648 NodeCollection * NC; 651 NodeCollection * NC;
649 QList<NodeCollection> PossibleConnections; 652 QList<NodeCollection> PossibleConnections;
650 Name2Connection_t & M = NSResources->connections(); 653 Name2Connection_t & M = NSResources->connections();
651 654
652 // for all connections 655 // for all connections
653 for( QDictIterator<NodeCollection> it(M); 656 for( QDictIterator<NodeCollection> it(M);
654 it.current(); 657 it.current();
655 ++it ) { 658 ++it ) {
656 NC = it.current(); 659 NC = it.current();
657 // check if this profile handles the requested interface 660 // check if this profile handles the requested interface
658 if( NC->handlesInterface( Interface ) && // if different Intf. 661 if( NC->handlesInterface( Interface ) && // if different Intf.
659 NC->state() != Disabled && // if not enabled 662 NC->state() != Disabled && // if enabled
660 NC->state() != IsUp // if already used 663 NC->state() != IsUp // if already used
661 ) { 664 ) {
662 Log( ( "Append %s for %s\n", NC->name().latin1(), Interface)); 665 Log( ( "Append %s for %s\n",
666 NC->name().latin1(), Interface.latin1() ));
663 PossibleConnections.append( NC ); 667 PossibleConnections.append( NC );
664 } 668 }
665 } 669 }
666 return PossibleConnections; 670 return PossibleConnections;
667} 671}
668 672
669 673
670/* 674/*
671 Called by the system to see if interface can be brought UP 675 Called by the system to see if interface can be brought UP
672 676
673 if allowed, echo Interface-allowed else Interface-disallowed 677 if allowed, echo Interface-allowed else Interface-disallowed
674*/ 678*/
675 679
676bool NetworkSettingsData::canStart( const char * Interface ) { 680bool NetworkSettingsData::canStart( const QString & Interface ) {
677 // load situation 681 // load situation
678 NodeCollection * NC = 0; 682 NodeCollection * NC = 0;
679 QList<NodeCollection> PossibleConnections; 683 QList<NodeCollection> PossibleConnections;
680 684
681 PossibleConnections = collectPossible( Interface ); 685 PossibleConnections = collectPossible( Interface );
682 686
683 Log( ( "for %s : Possiblilies %d\n", 687 Log( ( "for %s : Possiblilies %d\n",
684 Interface, PossibleConnections.count() )); 688 Interface.latin1(), PossibleConnections.count() ));
685 switch( PossibleConnections.count() ) { 689 switch( PossibleConnections.count() ) {
686 case 0 : // no connections 690 case 0 : // no connections
687 break; 691 break;
688 case 1 : // one connection 692 case 1 : // one connection
689 NC = PossibleConnections.first(); 693 NC = PossibleConnections.first();
690 break; 694 break;
691 default : // need to ask user ? 695 default : // need to ask user ?
692 return 1; 696 return 1;
693 } 697 }
694 698
695 if( NC ) { 699 if( NC ) {
696 switch( NC->state() ) { 700 switch( NC->state() ) {
697 case Unchecked : 701 case Unchecked :
698 case Unknown : 702 case Unknown :
699 case Unavailable : 703 case Unavailable :
700 case Disabled : 704 case Disabled :
701 // this profile does not allow interface to be UP 705 // this profile does not allow interface to be UP
702 // -> try others 706 // -> try others
703 break; 707 break;
704 case Off : 708 case Off :
705 // try to UP the device 709 // try to UP the device
706 { QString S= NC->setState( Activate ); 710 { QString S= NC->setState( Activate );
707 if( ! S.isEmpty() ) { 711 if( ! S.isEmpty() ) {
708 // could not bring device Online -> try other alters 712 // could not bring device Online -> try other alters
709 Log(( "%s-c%d-disallowed : %s\n", 713 Log(( "disallow %ld for %s : %s\n",
710 Interface, NC->number(), S.latin1() )); 714 NC->number(), Interface.latin1(), S.latin1() ));
711 break; 715 break;
712 } 716 }
713 // interface assigned 717 // interface assigned
714 } 718 }
715 // FT 719 // FT
716 case Available : 720 case Available :
717 case IsUp : // also called for 'ifdown' 721 case IsUp : // also called for 'ifdown'
718 // device is ready -> done 722 // device is ready -> done
719 Log(( "%s-c%d-allowed\n", Interface, NC->number() )); 723 Log(( "allow %ld for %s\n", NC->number(), Interface.latin1()));
720 printf( "%s-c%d-allowed\n", Interface, NC->number() ); 724 printf( "A%ld%s\n", NC->number(), Interface.latin1() );
721 return 0; 725 return 0;
722 } 726 }
723 } 727 }
724 728
725 // if we come here no alternatives are possible 729 // if we come here no alternatives are possible
726 Log(( "%s-cnn-disallowed\n", Interface )); 730 Log(( "disallow %s\n", Interface.latin1()));
727 printf( "%s-cnn-disallowed\n", Interface ); 731 printf( "D-%s\n", Interface.latin1() );
728 return 0; 732 return 0;
729} 733}
730 734
731bool NetworkSettingsData::isModified( void ) { 735bool NetworkSettingsData::isModified( void ) {
732 if( ForceModified ) 736 if( ForceModified )
733 return 1; 737 return 1;
734 738
735 for( QDictIterator<NodeCollection> it(NSResources->connections()); 739 for( QDictIterator<NodeCollection> it(NSResources->connections());
736 it.current(); 740 it.current();
737 ++it ) { 741 ++it ) {
738 if( it.current()->isModified() ) { 742 if( it.current()->isModified() ) {
739 return 1; 743 return 1;
740 } 744 }
741 } 745 }
742 return 0; 746 return 0;
743} 747}
748
749bool NetworkSettingsData::couldBeTriggered( const QString & Interface ) {
750 // load situation
751 QList<NodeCollection> PossibleTriggered;
752
753 PossibleTriggered = collectTriggered( Interface );
754
755 Log( ( "for %s : Possiblilies %d\n",
756 Interface.latin1(), PossibleTriggered.count() ));
757
758 return ( PossibleTriggered.count() ) ? 1 : 0;
759}
760
761QList<NodeCollection> NetworkSettingsData::collectTriggered(
762 const QString & Interface ) {
763
764 // collect connections that could be triggered by this interface
765 NodeCollection * NC;
766 QList<NodeCollection> PossibleTriggered;
767
768 // for all connections
769 Name2Connection_t & M = NSResources->connections();
770
771 for( QDictIterator<NodeCollection> it(M);
772 it.current();
773 ++it ) {
774 NC = it.current();
775 // check if this profile handles the requested interface
776 if( NC->triggeredBy( Interface ) && // if different Intf.
777 NC->state() != Disabled && // if enabled
778 NC->state() != IsUp // if already used
779 ) {
780 Log( ( "Append %s for %s\n",
781 NC->name().latin1(), Interface.latin1() ));
782 PossibleTriggered.append( NC );
783 }
784 }
785 return PossibleTriggered;
786}
787
diff --git a/noncore/settings/networksettings2/nsdata.h b/noncore/settings/networksettings2/nsdata.h
index a0ae7d1..5791c1e 100644
--- a/noncore/settings/networksettings2/nsdata.h
+++ b/noncore/settings/networksettings2/nsdata.h
@@ -1,34 +1,38 @@
1#ifndef __NSDATA_H 1#ifndef __NSDATA_H
2#define __NSDATA_H 2#define __NSDATA_H
3 3
4#include <netnode.h> 4#include <netnode.h>
5 5
6class NetworkSettingsData { 6class NetworkSettingsData {
7 7
8public : 8public :
9 9
10 NetworkSettingsData( void ); 10 NetworkSettingsData( void );
11 ~NetworkSettingsData( void ); 11 ~NetworkSettingsData( void );
12 12
13 void loadSettings( void ); 13 void loadSettings( void );
14 QString saveSettings( void ); 14 QString saveSettings( void );
15 15
16 QString generateSettings( void ); 16 QString generateSettings( void );
17 17
18 bool isModified( void ); 18 bool isModified( void );
19 inline void setModified( bool M ) 19 inline void setModified( bool M )
20 { ForceModified = M; } 20 { ForceModified = M; }
21 21
22 QList<NodeCollection> collectPossible( const char * Interface ); 22 QList<NodeCollection> collectPossible( const QString & Interface );
23 // return TRUE if we need gui to decide 23 // return TRUE if we need gui to decide
24 bool canStart( const char * Interface ); 24 bool canStart( const QString & Interface );
25 // return TRUE if there are vpns that could be triggered
26 // by this interface
27 bool couldBeTriggered( const QString & Interface );
25 28
26private : 29private :
27 30
31 QList<NodeCollection> collectTriggered( const QString &Interface );
28 bool ForceModified; 32 bool ForceModified;
29 33
30 // collect strings in config file nobody wants 34 // collect strings in config file nobody wants
31 QStringList LeftOvers; 35 QStringList LeftOvers;
32}; 36};
33 37
34#endif 38#endif
diff --git a/noncore/settings/networksettings2/profile/profile_NNI.cpp b/noncore/settings/networksettings2/profile/profile_NNI.cpp
index a1e1254..fc2d809 100644
--- a/noncore/settings/networksettings2/profile/profile_NNI.cpp
+++ b/noncore/settings/networksettings2/profile/profile_NNI.cpp
@@ -1,76 +1,81 @@
1#include <qpe/qpeapplication.h>
1#include <opie2/odebug.h> 2#include <opie2/odebug.h>
2#include "profileedit.h" 3#include "profileedit.h"
3#include "profile_NNI.h" 4#include "profile_NNI.h"
4#include "profile_NN.h" 5#include "profile_NN.h"
5 6
6AProfile::AProfile( ProfileNetNode * PNN ) : ANetNodeInstance( PNN ) { 7AProfile::AProfile( ProfileNetNode * PNN ) : ANetNodeInstance( PNN ) {
7 Data.Automatic = 1; 8 Data.Automatic = 1;
8 Data.Confirm = 0; 9 Data.Confirm = 0;
9 Data.Description = ""; 10 Data.Description = "";
10 Data.Disabled = 0; 11 Data.Disabled = 0;
11 Data.TriggerVPN = 0; 12 Data.TriggerVPN = 0;
12 GUI = 0; 13 GUI = 0;
13 RT = 0; 14 RT = 0;
14} 15}
15 16
16void AProfile::setSpecificAttribute( QString & Attr, QString & Value ) { 17void AProfile::setSpecificAttribute( QString & Attr, QString & Value ) {
17 18
18 if ( Attr == "automatic" ) { 19 if ( Attr == "automatic" ) {
19 Data.Automatic = (Value=="yes"); 20 Data.Automatic = (Value=="yes");
20 } else if ( Attr == "preconfirm" ) { 21 } else if ( Attr == "preconfirm" ) {
21 Data.Confirm = (Value=="yes"); 22 Data.Confirm = (Value=="yes");
22 } else if ( Attr == "disabled" ) { 23 } else if ( Attr == "disabled" ) {
23 Data.Disabled = (Value=="yes"); 24 Data.Disabled = (Value=="yes");
24 } else if ( Attr == "triggervpn" ) { 25 } else if ( Attr == "triggervpn" ) {
25 Data.TriggerVPN = (Value=="yes"); 26 Data.TriggerVPN = (Value=="yes");
26 } else if ( Attr == "description" ) { 27 } else if ( Attr == "description" ) {
27 Data.Description = Value; 28 Data.Description = Value;
28 } 29 }
29} 30}
30 31
31void AProfile::saveSpecificAttribute( QTextStream & TS ) { 32void AProfile::saveSpecificAttribute( QTextStream & TS ) {
32 TS << "automatic=" << ((Data.Automatic) ? "yes" : "no") << endl; 33 TS << "automatic=" << ((Data.Automatic) ? "yes" : "no") << endl;
33 TS << "preconfirm=" << ((Data.Confirm) ? "yes" : "no") << endl; 34 TS << "preconfirm=" << ((Data.Confirm) ? "yes" : "no") << endl;
34 TS << "disabled=" << ((Data.Disabled) ? "yes" : "no") << endl; 35 TS << "disabled=" << ((Data.Disabled) ? "yes" : "no") << endl;
35 TS << "triggervpn=" << ((Data.TriggerVPN) ? "yes" : "no") << endl; 36 TS << "triggervpn=" << ((Data.TriggerVPN) ? "yes" : "no") << endl;
36 TS << "description=" << Data.Description << endl; 37 TS << "description=" << Data.Description << endl;
37} 38}
38 39
39QWidget * AProfile::edit( QWidget * parent ) { 40QWidget * AProfile::edit( QWidget * parent ) {
40 GUI = new ProfileEdit( parent, this ); 41 GUI = new ProfileEdit( parent, this );
41 GUI->showData( Data ); 42 GUI->showData( Data );
42 return GUI; 43 return GUI;
43} 44}
44 45
45QString AProfile::acceptable( void ) { 46QString AProfile::acceptable( void ) {
46 return ( GUI ) ? GUI->acceptable( ) : QString(); 47 return ( GUI ) ? GUI->acceptable( ) : QString();
47} 48}
48 49
49void AProfile::commit( void ) { 50void AProfile::commit( void ) {
50 if( GUI && GUI->commit( Data ) ) 51 if( GUI && GUI->commit( Data ) )
51 setModified( 1 ); 52 setModified( 1 );
52} 53}
53 54
54short AProfile::generateFileEmbedded( SystemFile & SF, 55short AProfile::generateFileEmbedded( SystemFile & SF,
55 long DevNr ) { 56 long DevNr ) {
56 57
57 short rvl, rvd; 58 short rvl, rvd;
58 59
59 rvl = 1; 60 rvl = 1;
60 61
61 if( SF.name() == "interfaces" ) { 62 if( SF.name() == "interfaces" ) {
62 Log(("Generate Profile for %s\n", SF.name().latin1() )); 63 Log(("Generate Profile for %s\n", SF.name().latin1() ));
63 if( Data.TriggerVPN ) { 64 if( Data.TriggerVPN ) {
64 // this profile triggers VPN -> insert trigger 65 // this profile triggers VPN -> insert trigger
65 SF << " up networksettings2 --triggervpn" 66 SF << " up "
67 << QPEApplication::qpeDir()
68 << "bin/networksettings2 --triggervpn "
69 << runtime()->device()->netNode()->nodeClass()->genNic( DevNr )
70 << " || true"
66 << endl; 71 << endl;
67 rvl = 0; 72 rvl = 0;
68 } 73 }
69 } 74 }
70 rvd = ANetNodeInstance::generateFileEmbedded( SF, DevNr ); 75 rvd = ANetNodeInstance::generateFileEmbedded( SF, DevNr );
71 return (rvd == 2 || rvl == 2 ) ? 2 : 76 return (rvd == 2 || rvl == 2 ) ? 2 :
72 (rvd == 0 || rvl == 0 ) ? 0 : 1; 77 (rvd == 0 || rvl == 0 ) ? 0 : 1;
73} 78}
74 79
75 80
76 81