29 files changed, 818 insertions, 300 deletions
diff --git a/noncore/settings/networksettings2/bluetooth/bluetooth.pro b/noncore/settings/networksettings2/bluetooth/bluetooth.pro index 180bda9..2e1e138 100644 --- a/noncore/settings/networksettings2/bluetooth/bluetooth.pro +++ b/noncore/settings/networksettings2/bluetooth/bluetooth.pro @@ -11,4 +11,5 @@ SOURCES = bluetooth_NN.cpp \ bluetoothRFCOMM_NNI.cpp \ bluetoothBNEPedit.cpp \ + bluetoothBNEPrun.cpp \ bluetoothRFCOMMedit.cpp INCLUDEPATH += $(OPIEDIR)/include ../ ../networksettings2 diff --git a/noncore/settings/networksettings2/bluetooth/bluetoothBNEP_NNI.cpp b/noncore/settings/networksettings2/bluetooth/bluetoothBNEP_NNI.cpp index 73312c6..d8420b9 100644 --- a/noncore/settings/networksettings2/bluetooth/bluetoothBNEP_NNI.cpp +++ b/noncore/settings/networksettings2/bluetooth/bluetoothBNEP_NNI.cpp @@ -3,19 +3,32 @@ #include "bluetooth_NN.h" -ABluetoothBNEP::ABluetoothBNEP( BluetoothBNEPNetNode * PNN ) : ANetNodeInstance( PNN ) { +ABluetoothBNEP::ABluetoothBNEP( BluetoothBNEPNetNode * PNN ) : + ANetNodeInstance( PNN ), Data() { GUI = 0; RT = 0; + Data.AllowAll = 1; } -void ABluetoothBNEP::setSpecificAttribute( QString & , QString & ) { +void ABluetoothBNEP::setSpecificAttribute( QString & S, QString & A ) { + if( S == "bdaddress" ) { + Data.BDAddress << A; + } else if ( S == "allowall" ) { + Data.AllowAll = 1; + } } -void ABluetoothBNEP::saveSpecificAttribute( QTextStream & ) { +void ABluetoothBNEP::saveSpecificAttribute( QTextStream & TS ) { + TS << "allowall=" << Data.AllowAll << endl; + for ( QStringList::Iterator it = Data.BDAddress.begin(); + it != Data.BDAddress.end(); + ++it ) { + TS << "bdaddress=" << (*it) << endl; + } } QWidget * ABluetoothBNEP::edit( QWidget * parent ) { - GUI = new BluetoothBNEPEdit( parent ); - GUI->showData( Data ); - return GUI; + GUI = new BluetoothBNEPEdit( parent ); + GUI->showData( Data ); + return GUI; } diff --git a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPdata.h b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPdata.h index 037b7b1..03c6903 100644 --- a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPdata.h +++ b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPdata.h @@ -2,6 +2,9 @@ #define BLUETOOTHBNEP_DATA_H +#include <qstringlist.h> + typedef struct BluetoothBNEPData { - long x; + bool AllowAll; + QStringList BDAddress; } BluetoothBNEPData_t; diff --git a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPedit.cpp b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPedit.cpp index 9a3156b..195dbae 100644 --- a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPedit.cpp +++ b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPedit.cpp @@ -1,3 +1,5 @@ #include <qtopia/qcopenvelope_qws.h> +#include <qlistview.h> +#include <qcheckbox.h> #include <GUIUtils.h> @@ -10,12 +12,32 @@ BluetoothBNEPEdit::BluetoothBNEPEdit( QWidget * Parent ) : BluetoothBNEPGUI( Par QString BluetoothBNEPEdit::acceptable( void ) { + if( ( ! AnyPAN_CB->isChecked() ) && + BTPANServers_LV->firstChild() == 0 ) { + return tr("<p>No bluetooth device addresses specified</p>"); + } + return QString(); } -bool BluetoothBNEPEdit::commit( BluetoothBNEPData & ) { - return 0; +bool BluetoothBNEPEdit::commit( BluetoothBNEPData & Data ) { + QListViewItem * it = BTPANServers_LV->firstChild(); + Data.BDAddress.clear(); + while( it ) { + Data.BDAddress << it->text(0); + it = it->nextSibling(); + } + return 0; } -void BluetoothBNEPEdit::showData( BluetoothBNEPData & ) { +void BluetoothBNEPEdit::showData( BluetoothBNEPData & Data ) { + QListViewItem * lvit; + BTPANServers_LV->clear(); + + for ( QStringList::Iterator it = Data.BDAddress.begin(); + it != Data.BDAddress.end(); + ++it ) { + lvit = new QListViewItem(BTPANServers_LV); + lvit->setText( 0, (*it) ); + } } diff --git a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.cpp b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.cpp new file mode 100644 index 0000000..24e4b7b --- a/dev/null +++ b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.cpp @@ -0,0 +1,249 @@ +#include <qfile.h> +#include <qfileinfo.h> +#include <qtextstream.h> +#include <resources.h> +#include "bluetoothBNEPrun.h" + +QDict<QString> * BluetoothBNEPRun::PANConnections = 0; + +void BluetoothBNEPRun::detectState( NodeCollection * NC ) { + // unavailable : no card found + // available : card found and assigned to us or free + // up : card found and assigned to us and up + QString S = QString( "/tmp/profile-%1.up" ).arg(NC->number()); + System & Sys = NSResources->system(); + InterfaceInfo * Run; + QFile F( S ); + + Log(("Detecting for %s\n", NC->name().latin1() )); + + if( F.open( IO_ReadOnly ) ) { + // could open file -> read interface and assign + QString X; + bool accepted = 0; + QTextStream TS(&F); + X = TS.readLine(); + Log(("%s exists : %s\n", S.latin1(), X.latin1() )); + // find interface + if( handlesInterface( X ) ) { + + Log(("Handles interface %s, PANC %p\n", X.latin1(), PANConnections )); + if( PANConnections == 0 ) { + // load connections that are active + // format : bnep0 00:60:57:02:71:A2 PANU + FILE * OutputOfCmd = popen( "pand --show", "r" ) ; + + PANConnections = new QDict<QString>; + + if( OutputOfCmd ) { + char ch; + // could fork + // read all data + QString Line = ""; + while( 1 ) { + if( fread( &ch, 1, 1, OutputOfCmd ) < 1 ) { + // eof + break; + } + if( ch == '\n' || ch == '\r' ) { + if( ! Line.isEmpty() ) { + if( Line.startsWith( "bnep" ) ) { + QStringList SL = QStringList::split( " ", Line ); + Log(("Detected PAN %s %s\n", + SL[0].latin1(), SL[1].latin1() )); + PANConnections->insert( SL[0], new QString(SL[1])); + } + Line=""; + } + } else { + Line += ch; + } + } + } + + pclose( OutputOfCmd ); + } + + // check if this runtime allows connection to node + if( ! Data.AllowAll ) { + // has addresses + for ( QStringList::Iterator it = Data.BDAddress.begin(); + ! accepted && it != Data.BDAddress.end(); + ++ it ) { + for( QDictIterator<QString> it2( *(PANConnections) ); + it2.current(); + ++ it2 ) { + if( X == it2.currentKey() && + (*it) == *(it2.current()) + ) { + // found + Log(("%s accepts connections to %s\n", + NC->name().latin1(), + it2.current()->latin1() )); + accepted = 1; + break; + } + } + } + } else { + Log(("%s accepts any connection\n", NC->name().latin1() )); + // accept any + accepted = 1; + } + + if( accepted ) { + // matches and is allowed for this node + for( QDictIterator<InterfaceInfo> It(Sys.interfaces()); + It.current(); + ++It ) { + Run = It.current(); + if( X == Run->Name ) { + Log(("%s Assigned %p\n", NC->name().latin1(), Run )); + Run->assignNode( netNode() ); + assignInterface( Run ); + NC->setCurrentState( IsUp ); + return; + } + } + } + } + } + + Log(("Assigned %p\n", assignedInterface() )); + if( ( Run = assignedInterface() ) ) { + // we already have an interface assigned -> still present ? + if( ! Run->IsUp ) { + // usb is still free -> keep assignment + NC->setCurrentState( Available ); + return; + } // else interface is up but NOT us -> some other profile + } + + // nothing (valid) assigned to us + assignInterface( 0 ); + + // find possible interface + for( QDictIterator<InterfaceInfo> It(Sys.interfaces()); + It.current(); + ++It ) { + Run = It.current(); + + Log(("%s %d %d=%d %d\n", + Run->Name.latin1(), + handlesInterface( Run->Name ), + Run->CardType, ARPHRD_ETHER, + ! Run->IsUp )); + + if( handlesInterface( Run->Name ) && + Run->CardType == ARPHRD_ETHER && + ! Run->IsUp + ) { + Log(("Released(OFF)\n" )); + // proper type, and Not UP -> free + NC->setCurrentState( Off ); + return; + } + } + // no free found + Log(("None available\n" )); + + NC->setCurrentState( Unavailable ); +} + +bool BluetoothBNEPRun::setState( NodeCollection * NC, Action_t A, bool ) { + + // we only handle activate and deactivate + switch( A ) { + case Activate : + { + if( NC->currentState() != Off ) { + return 0; + } + InterfaceInfo * N = getInterface(); + if( ! N ) { + // no interface available + NC->setCurrentState( Unavailable ); + return 0; + } + // because we were OFF the interface + // we get back is NOT assigned + N->assignNode( netNode() ); + assignInterface( N ); + Log(("Assing %p\n", N )); + NC->setCurrentState( Available ); + return 1; + } + case Deactivate : + if( NC->currentState() == IsUp ) { + // bring down first + if( ! connection()->setState( Down ) ) + // could not ... + return 0; + } else if( NC->currentState() != Available ) { + return 1; + } + assignedInterface()->assignNode( 0 ); // release + assignInterface( 0 ); + NC->setCurrentState( Off ); + return 1; + default : + // FT + break; + } + return 0; +} + +bool BluetoothBNEPRun::canSetState( State_t Curr , Action_t A ) { + // we only handle up down activate and deactivate + switch( A ) { + case Activate : + { // at least available + if( Curr == Available ) { + return 1; + } + // or we can make one available + InterfaceInfo * N = getInterface(); + if( ! N || N->assignedNode() != 0 ) { + // non available or assigned + return 0; + } + return 1; + } + case Deactivate : + return ( Curr >= Available ); + default : + // FT + break; + } + return 0; +} + +// get interface that is free or assigned to us +InterfaceInfo * BluetoothBNEPRun::getInterface( void ) { + + System & S = NSResources->system(); + InterfaceInfo * best = 0, * Run; + + for( QDictIterator<InterfaceInfo> It(S.interfaces()); + It.current(); + ++It ) { + Run = It.current(); + if( handlesInterface( Run->Name ) && + Run->CardType == ARPHRD_ETHER + ) { + // this is a bluetooth card + if( Run->assignedNode() == netNode() ) { + // assigned to us + return Run; + } else if( Run->assignedNode() == 0 ) { + // free + best = Run; + } + } + } + return best; // can be 0 +} + +bool BluetoothBNEPRun::handlesInterface( const QString & S ) { + return Pat.match( S ) >= 0; +} diff --git a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.h b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.h index c168429..ce03cbb 100644 --- a/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.h +++ b/noncore/settings/networksettings2/bluetooth/bluetoothBNEPrun.h @@ -7,5 +7,8 @@ public : BluetoothBNEPRun( ANetNodeInstance * NNI, - BluetoothBNEPData & Data ) : AsDevice( NNI ) + BluetoothBNEPData & D ) : + AsDevice( NNI ), + Data( D), + Pat( "bnep[0-6]" ) { } @@ -18,14 +21,14 @@ public : protected : - void detectState( NodeCollection * ) - { } - - bool setState( NodeCollection * , Action_t, bool ) - { return 0; } + void detectState( NodeCollection * ); + bool setState( NodeCollection * , Action_t, bool ); + bool canSetState( State_t , Action_t ); + bool handlesInterface( const QString & ); - bool canSetState( State_t , Action_t ) - { return 0; } +private : - bool handlesInterface( const QString & ) - { return 0; } + InterfaceInfo * getInterface( void ); + BluetoothBNEPData & Data; + static QDict<QString> * PANConnections; + QRegExp Pat; }; diff --git a/noncore/settings/networksettings2/lancard/lancardedit.cpp b/noncore/settings/networksettings2/lancard/lancardedit.cpp index ffe9bf6..c00d7aa 100644 --- a/noncore/settings/networksettings2/lancard/lancardedit.cpp +++ b/noncore/settings/networksettings2/lancard/lancardedit.cpp @@ -115,7 +115,7 @@ void LanCardEdit::SLOT_ScanCards( void ) { It.current(); ++It ) { - fprintf( stderr, "TEST %s %s\n", + Log(( "TEST %s %s\n", It.current()->Name.latin1(), - It.current()->MACAddress.latin1() ); + It.current()->MACAddress.latin1() )); if( R.match( It.current()->Name ) >= 0 && ( It.current()->CardType == ARPHRD_ETHER diff --git a/noncore/settings/networksettings2/main.cpp b/noncore/settings/networksettings2/main.cpp index 30d1270..6c969fc 100644 --- a/noncore/settings/networksettings2/main.cpp +++ b/noncore/settings/networksettings2/main.cpp @@ -79,6 +79,8 @@ int main( int argc, char * argv[] ) { case ACT_REQUEST : { NetworkSettingsData NS; + Log(("ACT_REQUEST\n")); if( NS.canStart( argv[1] ) ) { QString S; + Log(("NEED FOR PROMPT\n" )); S.sprintf( QPEApplication::qpeDir()+ "/bin/networksettings2" ); @@ -96,4 +98,5 @@ int main( int argc, char * argv[] ) { case ACT_REGEN : { NetworkSettingsData NS; + Log(("REGEN\n" )); // regen returns 0 if OK rv = (NS.regenerate()) ? 1 : 0; @@ -102,4 +105,5 @@ int main( int argc, char * argv[] ) { case ACT_PROMPT : { ActivateProfile AP(argv[1]); + Log(("PROMPT\n" )); if( AP.exec() == QDialog::Accepted ) { printf( "%s-c%ld-allowed", argv[1], AP.selectedProfile() ); @@ -111,4 +115,5 @@ int main( int argc, char * argv[] ) { case ACT_GUI : { QWidget * W = new NetworkSettings(0); + Log(("GUI\n" )); TheApp->setMainWidget( W ); W->show(); @@ -124,4 +129,6 @@ int main( int argc, char * argv[] ) { } + LogClose(); + return rv; } diff --git a/noncore/settings/networksettings2/network/networkrun.cpp b/noncore/settings/networksettings2/network/networkrun.cpp index 41e1c53..3e24c5f 100644 --- a/noncore/settings/networksettings2/network/networkrun.cpp +++ b/noncore/settings/networksettings2/network/networkrun.cpp @@ -14,4 +14,5 @@ void NetworkRun::detectState( NodeCollection * NC ) { } + Log(( "%s not ! UP or ava\n", NC->name().latin1() )); // has no interface -> delegate RI->detectState( NC ); @@ -35,15 +36,26 @@ bool NetworkRun::setState( NodeCollection * NC, Action_t A, bool Force ) { return 1; } else if( A == Down ) { - if( NC->currentState() == IsUp || Force ) { - QString S; - S.sprintf( "ifdown %s=%s-c%d-allowed", - II->Name.latin1(), II->Name.latin1(), - connection()->number() ); - NSResources->system().runAsRoot( S ); + QString S; + if( Force ) { + Log(("Force mode %d\n", Force )); + for( int i = 0; + i < RI->netNode()->nodeClass()->instanceCount(); + i ++ ) { + S.sprintf( "ifdown %s", + RI->netNode()->nodeClass()->genNic( i ).latin1() ); + NSResources->system().runAsRoot( S ); + } + } else { + if( NC->currentState() == IsUp ) { + S.sprintf( "ifdown %s=%s-c%d-allowed", + II->Name.latin1(), II->Name.latin1(), + connection()->number() ); + NSResources->system().runAsRoot( S ); + } } return 1; } // delegate - return RI->setState( NC, A ); + return RI->setState( NC, A, Force ); } diff --git a/noncore/settings/networksettings2/networksettings.cpp b/noncore/settings/networksettings2/networksettings.cpp index b36c7a0..6ee4106 100644 --- a/noncore/settings/networksettings2/networksettings.cpp +++ b/noncore/settings/networksettings2/networksettings.cpp @@ -1,3 +1,4 @@ #include <stdio.h> +#include <unistd.h> #include <qpe/qpeapplication.h> @@ -62,4 +63,8 @@ NetworkSettings::NetworkSettings( QWidget *parent, } + connect( &(NSResources->system()), + SIGNAL( lineFromCommand(const QString &) ), + this, SLOT( SLOT_CmdMessage(const QString &) ) ); + UpdateTimer->start( 5000 ); connect( UpdateTimer, SIGNAL( timeout() ), @@ -92,4 +97,10 @@ NetworkSettings::~NetworkSettings() { } +void NetworkSettings::SLOT_CmdMessage( const QString & S ) { + Messages_LB->insertItem( S ); + Messages_LB->setCurrentItem( Messages_LB->count()-1 ); + Messages_LB->ensureCurrentVisible(); +} + void NetworkSettings::SLOT_RefreshStates( void ) { QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); // remember @@ -135,4 +146,7 @@ void NetworkSettings::SLOT_RefreshStates( void ) { } +void NetworkSettings::SLOT_NoLongerBusy( void ) { + NSResources->busy( FALSE ); +} void NetworkSettings::SLOT_AddNode( void ) { SLOT_EditNode( 0 ); @@ -173,4 +187,6 @@ void NetworkSettings::SLOT_EditNode( QListBoxItem * LBI ) { // disable refresh timer UpdateTimer->stop(); + NSResources->busy( TRUE ); + QTimer::singleShot( 1000, this, SLOT( SLOT_NoLongerBusy() )); // we need to retry while( 1 ) { @@ -207,5 +223,5 @@ void NetworkSettings::SLOT_EditNode( QListBoxItem * LBI ) { int ci = Profiles_LB->count(); NSResources->addConnection( NC ); - NC->setNumber( NC->maxConnectionNumber()+1 ); + NC->setNumber( NSResources->assignConnectionNumber() ); Profiles_LB->insertItem( NC->devicePixmap(), NC->name() ); Profiles_LB->setSelected( ci, TRUE ); @@ -258,12 +274,18 @@ void NetworkSettings::SLOT_ShowNode( QListBoxItem * LBI ) { case Available : OnOn = 1; + Connect_TB->setPixmap( NSResources->getPixmap( "disconnected" ) ); DisabledOn = 0; break; case IsUp : OnOn = ConnectOn = 1; + Connect_TB->setPixmap( NSResources->getPixmap( "connected" ) ); DisabledOn = 0; break; } + if( ! OnOn ) { + Connect_TB->setPixmap( NSResources->getPixmap( "disconnected" ) ); + } + // set button state Enable_TB->setEnabled( EnabledPossible ); @@ -276,11 +298,10 @@ void NetworkSettings::SLOT_ShowNode( QListBoxItem * LBI ) { if( NC->description().isEmpty() ) { - Description_LBL->setText( tr( "No description" ) ); + Description_LBL->setText( tr( "<<No description>>" ) ); } else { Description_LBL->setText( NC->description() ); } - Profile_GB->setTitle( LBI->text() ); - State_LBL->setText( NC->stateName() ); + Profile_GB->setTitle( LBI->text() + " : " + NC->stateName() ); } @@ -415,4 +436,5 @@ void NetworkSettings::SLOT_Connect( void ) { void NetworkSettings::SLOT_Disconnect( void ) { + QString S; QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); @@ -423,5 +445,9 @@ void NetworkSettings::SLOT_Disconnect( void ) { NSResources->findConnection( LBI->text() ); + Log(( "Force interface %s down\n", NC->name().latin1() )); NC->setState( Down, 1 ); + // remove 'up' file to make sure + S.sprintf( "/tmp/Profile-%d.up", NC->number() ); + unlink( S.latin1() ); } diff --git a/noncore/settings/networksettings2/networksettings.h b/noncore/settings/networksettings2/networksettings.h index 97852af..8ffde06 100644 --- a/noncore/settings/networksettings2/networksettings.h +++ b/noncore/settings/networksettings2/networksettings.h @@ -29,4 +29,5 @@ public : public slots : + void SLOT_NoLongerBusy( void ); void SLOT_AddNode( void ); void SLOT_DeleteNode( void ); @@ -43,4 +44,5 @@ public slots : void SLOT_ToProfile( void ); void SLOT_ToMessages( void ); + void SLOT_CmdMessage( const QString & S ); private : diff --git a/noncore/settings/networksettings2/networksettings2/Utils.h b/noncore/settings/networksettings2/networksettings2/Utils.h new file mode 100644 index 0000000..63ef51c --- a/dev/null +++ b/noncore/settings/networksettings2/networksettings2/Utils.h @@ -0,0 +1,8 @@ +#ifndef __UTILS_H +#define __UTILS_H + +#define Log(x) VLog x +extern void VLog( char * Format, ... ); +extern void LogClose( void ); + +#endif diff --git a/noncore/settings/networksettings2/networksettings2/asfullsetup.h b/noncore/settings/networksettings2/networksettings2/asfullsetup.h index e358a83..072de9a 100644 --- a/noncore/settings/networksettings2/networksettings2/asfullsetup.h +++ b/noncore/settings/networksettings2/networksettings2/asfullsetup.h @@ -15,4 +15,6 @@ public : virtual const QString & description( void ) = 0; + virtual bool triggersVPN( void ) + { return 0; } }; diff --git a/noncore/settings/networksettings2/networksettings2/netnode.cpp b/noncore/settings/networksettings2/networksettings2/netnode.cpp index 1182543..8c80e0b 100644 --- a/noncore/settings/networksettings2/networksettings2/netnode.cpp +++ b/noncore/settings/networksettings2/networksettings2/netnode.cpp @@ -104,6 +104,4 @@ ANetNodeInstance * ANetNodeInstance::nextNode( void ) { // -long NodeCollection::MaxNr = -1; - NodeCollection::NodeCollection( void ) : QList<ANetNodeInstance>() { IsModified = 0; @@ -147,4 +145,5 @@ NodeCollection::NodeCollection( QTextStream & TS ) : Name = N; } else if( A == "number" ) { + Log(( "read number %s\n", N.latin1() )); setNumber( N.toLong() ); } else if( A == "node" ) { @@ -296,4 +295,7 @@ void NodeCollection::reassign( void ) { } +bool NodeCollection::triggersVPN() { + return getToplevel()->runtime()->asFullSetup()->triggersVPN(); +} // // diff --git a/noncore/settings/networksettings2/networksettings2/netnode.h b/noncore/settings/networksettings2/networksettings2/netnode.h index 5e36062..ca35c27 100644 --- a/noncore/settings/networksettings2/networksettings2/netnode.h +++ b/noncore/settings/networksettings2/networksettings2/netnode.h @@ -9,4 +9,6 @@ #include <time.h> +#include <Utils.h> + // difference feature interfaces class AsDevice; @@ -284,5 +286,5 @@ public : { return Number; } void setNumber( int i ) - { Number = i; if( MaxNr < i ) MaxNr = i; } + { Number = i; } bool isNew( void ) { return IsNew; } @@ -306,6 +308,13 @@ public : } + bool triggersVPN(); + State_t state( bool Update = 0 ) - { if( CurrentState == Unchecked || Update ) { + { Log(( "%s state %d(=%d?)\n", Name.latin1(), CurrentState, + Unchecked )); + if( CurrentState == Unchecked || Update ) { + Log(( "TL %p TLR %p\n", + getToplevel(), + getToplevel()->runtime() )); // need to get current state getToplevel()->runtime()->detectState( this ); @@ -353,10 +362,4 @@ public : { CurrentState = S; } - long maxConnectionNumber( void ) - { return MaxNr; } - - static void resetMaxNr( void ) - { MaxNr = -1; } - private : @@ -364,5 +367,4 @@ private : QCollection::Item item2 ); - static long MaxNr; long Number; diff --git a/noncore/settings/networksettings2/networksettings2/networksettings2.pro b/noncore/settings/networksettings2/networksettings2/networksettings2.pro index f97c93b..16a946b 100644 --- a/noncore/settings/networksettings2/networksettings2/networksettings2.pro +++ b/noncore/settings/networksettings2/networksettings2/networksettings2.pro @@ -21,5 +21,5 @@ SOURCES = netnode.cpp \ INCLUDEPATH += $(OPIEDIR)/include ../networksettings2 DEPENDPATH += $(OPIEDIR)/include -LIBS += -lqpe -lopiecore2 +LIBS += -lqpe -lopiecore2 -lopieui2 INTERFACES = TARGET = networksettings2 diff --git a/noncore/settings/networksettings2/networksettings2/resources.cpp b/noncore/settings/networksettings2/networksettings2/resources.cpp index c95ac7f..71e84cd 100644 --- a/noncore/settings/networksettings2/networksettings2/resources.cpp +++ b/noncore/settings/networksettings2/networksettings2/resources.cpp @@ -24,4 +24,6 @@ TheNSResources::TheNSResources( void ) : NodeTypeNameMap(), _NSResources = this; + detectCurrentUser(); + // load available netnodes findAvailableNetNodes(QPEApplication::qpeDir() + PLUGINDIR ); @@ -81,5 +83,4 @@ TheNSResources::TheNSResources( void ) : NodeTypeNameMap(), TheSystem = new System(); - detectCurrentUser(); } @@ -88,4 +89,15 @@ TheNSResources::~TheNSResources( void ) { } +void TheNSResources::busy( bool B ) { +/* + if( B ) { + ShowWait->show(); + qApp->process + } else { + ShowWait->hide(); + } +*/ +} + /** * Load all modules that are found in the path @@ -95,4 +107,5 @@ TheNSResources::~TheNSResources( void ) { void TheNSResources::findAvailableNetNodes(const QString &path){ + Log(("Locate plugins in %s\n", path.latin1() )); QDir d(path); if(!d.exists()) @@ -128,4 +141,25 @@ void TheNSResources::findAvailableNetNodes(const QString &path){ } +// used to find unique connection number +int TheNSResources::assignConnectionNumber( void ) { + bool found = 1; + for( int trial = 0; ; trial ++ ) { + found = 1; + for( QDictIterator<NodeCollection> it(ConnectionsMap); + it.current(); + ++it ) { + if( it.current()->number() == trial ) { + found = 0; + break; + } + } + + if( found ) { + Log(("Assign profile number %d\n", trial )); + return trial; + } + } +} + /** * Attempt to load a function and resolve a function. @@ -168,5 +202,4 @@ bool TheNSResources::loadNetNode( // store mapping - printf( "Store %s\n", NN->NetNode->name() ); AllNodeTypes.insert( NN->NetNode->name(), NN ); } @@ -176,8 +209,10 @@ bool TheNSResources::loadNetNode( QPixmap TheNSResources::getPixmap( const QString & QS ) { + QPixmap P; QString S("networksettings2/"); S += QS; - fprintf( stderr, "%s\n", S.latin1() ); - return Resource::loadPixmap( S ); + Log(("%s\n", S.latin1() )); + P = Resource::loadPixmap( S ); + return ( P.isNull() ) ? QPixmap() : P; } @@ -226,4 +261,5 @@ NodeCollection * TheNSResources::findConnection( const QString & S ) { } +/* void TheNSResources::renumberConnections( void ) { Name2Connection_t & M = NSResources->connections(); @@ -240,4 +276,5 @@ void TheNSResources::renumberConnections( void ) { } } +*/ typedef struct EnvVars { @@ -264,107 +301,144 @@ void TheNSResources::detectCurrentUser( void ) { QString QPEEnvFile = ""; - // open proc dir and find all dirs in it - { QRegExp R("[0-9]+"); - QDir ProcDir( "/proc" ); - QString QPELoc = QPEApplication::qpeDir() + "bin/qpe"; - QFileInfo FI; - QStringList EL = ProcDir.entryList( QDir::Dirs ); - - // print it out - for ( QStringList::Iterator it = EL.begin(); - it != EL.end(); - ++it ) { - if( R.match( (*it) ) >= 0 ) { - QString S = ProcDir.path()+"/"+ (*it); - S.append( "/exe" ); - FI.setFile( S ); - // get the linke - S = FI.readLink(); - if( S == QPELoc ) { - // found running qpe - QPEEnvFile.sprintf( ProcDir.path()+ "/" + (*it) + "/environ" ); - break; + if( getenv( "OPIEDIR" ) == 0 ) { + // nothing known + { // open proc dir and find all dirs in it + QRegExp R("[0-9]+"); + QDir ProcDir( "/proc" ); + QFileInfo FI; + QStringList EL = ProcDir.entryList( QDir::Dirs ); + + // print it out + for ( QStringList::Iterator it = EL.begin(); + it != EL.end(); + ++it ) { + if( R.match( (*it) ) >= 0 ) { + QString S = ProcDir.path()+"/"+ (*it); + S.append( "/exe" ); + FI.setFile( S ); + // get the link + S = FI.readLink(); + if( S.right( 8 ) == "/bin/qpe" ) { + // found running qpe + QPEEnvFile.sprintf( ProcDir.path()+ "/" + (*it) + "/environ" ); + break; + } } } } - } - if( QPEEnvFile.isEmpty() ) { - // could not find qpe - fprintf( stderr, "Could not find qpe\n" ); - return; - } - - // FI now contains path ProcDir to the cmd dir - { char * Buf = 0; - char TB[1024]; - long BufSize = 0; - int fd; - int rd; - - fd = open( QPEEnvFile.latin1(), O_RDONLY ); - if( fd < 0 ) { - fprintf( stderr, "Could not open %s : %d\n", - QPEEnvFile.latin1(), errno ); + if( QPEEnvFile.isEmpty() ) { + // could not find qpe + Log(("Could not find qpe\n" )); return; } - while( (rd = read( fd, TB, sizeof(TB) ) ) > 0 ) { - Buf = (char *)realloc( Buf, BufSize+rd ); - memcpy( Buf+BufSize, TB, rd ); - BufSize += rd; - } + // FI now contains path ProcDir to the cmd dir + { char * Buf = 0; + char TB[1024]; + long BufSize = 0; + int fd; + int rd; + + fd = open( QPEEnvFile.latin1(), O_RDONLY ); + if( fd < 0 ) { + Log(("Could not open %s : %d\n", + QPEEnvFile.latin1(), errno )); + return; + } - char * Data = Buf; - char * DataEnd = Data+BufSize-1; - - // get env items out of list - while( Data < DataEnd ) { - if( strncmp( Data, "LOGNAME=", 8 ) == 0 ) { - CurrentUser.UserName = Data+8; - CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); - CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = - strdup( Data ); - } else if( strncmp( Data, "HOME=", 5 ) == 0 ) { - CurrentUser.HomeDir = Data+5; - CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); - CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = - strdup( Data ); - } else { - EnvVar_t * Run = EV; - while( Run->Name ) { - if( strncmp( Data, Run->Name, Run->Len ) == 0 ) { - CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); - CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = - strdup( Data ); - break; + while( (rd = read( fd, TB, sizeof(TB) ) ) > 0 ) { + Buf = (char *)realloc( Buf, BufSize+rd ); + memcpy( Buf+BufSize, TB, rd ); + BufSize += rd; + } + + char * Data = Buf; + char * DataEnd = Data+BufSize-1; + + // get env items out of list + while( Data < DataEnd ) { + if( strncmp( Data, "LOGNAME=", 8 ) == 0 ) { + CurrentUser.UserName = Data+8; + CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); + CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = + strdup( Data ); + } else if( strncmp( Data, "HOME=", 5 ) == 0 ) { + CurrentUser.HomeDir = Data+5; + CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); + CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = + strdup( Data ); + } else { + EnvVar_t * Run = EV; + while( Run->Name ) { + if( strncmp( Data, Run->Name, Run->Len ) == 0 ) { + CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); + CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = + strdup( Data ); + // put OPIEDIR in env + if( strcmp( Run->Name, "OPIEDIR=" ) == 0 ) { + putenv( CurrentUser.EnvList[CurrentUser.EnvList.size()-1] ); + + } + break; + } + Run ++; } - Run ++; } - } - Data += strlen( Data )+1; - } + Data += strlen( Data )+1; + } - free( Buf ); + free( Buf ); - if( ! CurrentUser.UserName.isEmpty() ) { - // find user info - struct passwd pwd; - struct passwd * pwdres; + if( ! CurrentUser.UserName.isEmpty() ) { + // find user info + struct passwd pwd; + struct passwd * pwdres; - if( getpwnam_r( CurrentUser.UserName.latin1(), - &pwd, TB, sizeof(TB), &pwdres ) || - pwdres == 0 ) { - fprintf( stderr, "Could not determine user %s : %d\n", - CurrentUser.UserName.latin1(), errno ); - return; + if( getpwnam_r( CurrentUser.UserName.latin1(), + &pwd, TB, sizeof(TB), &pwdres ) || + pwdres == 0 ) { + Log(("Could not determine user %s : %d\n", + CurrentUser.UserName.latin1(), errno )); + return; + } + CurrentUser.Uid = pwd.pw_uid; + CurrentUser.Gid = pwd.pw_gid; + } else{ + CurrentUser.Uid = + CurrentUser.Gid = -1; } - CurrentUser.Uid = pwd.pw_uid; - CurrentUser.Gid = pwd.pw_gid; - } else{ - CurrentUser.Uid = - CurrentUser.Gid = -1; } + + } else { + CurrentUser.UserName = getenv( "LOGNAME" ); + CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); + CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = + strdup( CurrentUser.UserName ); + + CurrentUser.HomeDir = getenv( "HOME" ); + CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); + CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = + strdup( CurrentUser.HomeDir ); + + CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); + CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = getenv("USER"); + CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); + CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = getenv("LD_LIBRARY_PATH"); + + CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); + CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = getenv("PATH"); + + CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); + CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = getenv("QTDIR"); + + CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); + CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = getenv("OPIEDIR"); + CurrentUser.EnvList.resize( CurrentUser.EnvList.size()+1 ); + CurrentUser.EnvList[CurrentUser.EnvList.size()-1] = getenv("SHELL"); + + CurrentUser.Uid = getuid(); + CurrentUser.Gid = getgid(); } } diff --git a/noncore/settings/networksettings2/networksettings2/resources.h b/noncore/settings/networksettings2/networksettings2/resources.h index 3d6a44f..55d2f29 100644 --- a/noncore/settings/networksettings2/networksettings2/resources.h +++ b/noncore/settings/networksettings2/networksettings2/resources.h @@ -47,7 +47,11 @@ public : ~TheNSResources( ); + // give busy feedback + void busy( bool B ); + System & system() { return *TheSystem; } + int assignConnectionNumber(void); QPixmap getPixmap( const QString & Name ); @@ -89,5 +93,4 @@ public : const QString & netNode2Description( const char * Type ); - void renumberConnections( void ); void addConnection( NodeCollection * NC ); void removeConnection( const QString & N ); @@ -120,5 +123,5 @@ private : Name2Instance_t AllNodes; - CurrentQPEUser CurrentUser; + CurrentQPEUser CurrentUser; }; diff --git a/noncore/settings/networksettings2/networksettings2/system.cpp b/noncore/settings/networksettings2/networksettings2/system.cpp index 2133d34..a579396 100644 --- a/noncore/settings/networksettings2/networksettings2/system.cpp +++ b/noncore/settings/networksettings2/networksettings2/system.cpp @@ -9,4 +9,5 @@ #include <sys/socket.h> #include <stdlib.h> +#include <stdio.h> #include <fcntl.h> #include <errno.h> @@ -18,4 +19,5 @@ #include <qfile.h> #include <qtextstream.h> +#include <qapplication.h> #include "resources.h" @@ -36,5 +38,5 @@ static char Dig2Hex[] = { #define LN(x) Dig2Hex[((x)&0x0f)] -System::System( void ) : ProbedInterfaces() { +System::System( void ) : QObject(), ProbedInterfaces() { probeInterfaces(); } @@ -48,5 +50,5 @@ int System::runAsRoot( const QString & S ) { QString MyS = S; char * usr = getenv("USER"); - int rv; + char ch; if( S.isEmpty() ) { @@ -59,20 +61,45 @@ int System::runAsRoot( const QString & S ) { } - fprintf( stderr, "Executing %s\n", MyS.latin1() ); - - rv = system( MyS.latin1() ) ; - switch( rv ) { - case -1 : - // cannot fork - return 1; - case 127 : - // cannot start shell - return 2; - default : - if( WEXITSTATUS(rv) != 0 ) { - // error in command - return 3; + Log(("Executing %s\n", MyS.latin1() )); + + emit lineFromCommand( tr("Command : ") + MyS ); + emit lineFromCommand( "---------------" ); + Log(( "Command : %s\n", MyS.latin1() ) ); + MyS += " 2>&1 "; + OutputOfCmd = popen( MyS.latin1(), "r" ) ; + if( ! OutputOfCmd ) { + // cannot fork + return 1; + } + + // read all data + QString Line = ""; + while( 1 ) { + if( fread( &ch, 1, 1, OutputOfCmd ) < 1 ) + // eof + break; + if( ch == '\n' || ch == '\r' ) { + if( ! Line.isEmpty() ) { + Log(( "read cmd output : **%s**\n", Line.latin1() ) ); + emit lineFromCommand( Line ); + Line = ""; + qApp->processEvents(); } + } else { + Line += ch; + } + } + + if( ! Line.isEmpty() ) { + emit lineFromCommand( Line ); + Log(( "read cmd output : **%s**\n", Line.latin1() ) ); + } + Log(( "End of command\n", Line.latin1() ) ); + + if( pclose( OutputOfCmd ) < 0 ) { + // error in command + return 3; } + // all is fine return 0; @@ -199,5 +226,5 @@ void System::probeInterfaces( void ) { if ( ! ( IFI = ProbedInterfaces.find( NicName ) ) ) { // new nic - fprintf( stderr, "NEWNIC %s\n", NicName.latin1()); + Log(("NEWNIC %s\n", NicName.latin1())); IFI = new InterfaceInfo; IFI->Name = line.left(loc); @@ -226,6 +253,6 @@ void System::probeInterfaces( void ) { if( ioctl(sockfd, SIOCGIFHWADDR, &ifrs) >= 0 ) { - fprintf( stderr, "%s = %d\n", IFI->Name.latin1(), - ifrs.ifr_hwaddr.sa_family ); + Log(("%s = %d\n", IFI->Name.latin1(), + ifrs.ifr_hwaddr.sa_family )); IFI->CardType = ifrs.ifr_hwaddr.sa_family; @@ -294,5 +321,5 @@ void System::probeInterfaces( void ) { } } else // else already probed before -> just update - fprintf( stderr, "OLDNIC %s\n", NicName.latin1()); + Log(("OLDNIC %s\n", NicName.latin1())); // get dynamic info @@ -324,5 +351,5 @@ void System::probeInterfaces( void ) { IFI->Netmask = ""; } - fprintf( stderr, "NIC %s UP %d\n", NicName.latin1(), IFI->IsUp ); + Log(("NIC %s UP %d\n", NicName.latin1(), IFI->IsUp )); } } @@ -333,5 +360,5 @@ void System::execAsUser( QString & Cmd, char * argv[] ) { if( CU.UserName.isEmpty() ) { // if we come here, the exec was not successfull - fprintf( stderr, "User not known \n" ); + Log(("User not known \n" )); return; } @@ -352,4 +379,39 @@ void System::execAsUser( QString & Cmd, char * argv[] ) { // if we come here, the exec was not successfull - fprintf( stderr, "Could not exec : %d\n", errno ); + Log(("Could not exec : %d\n", errno )); +} + +#include <stdarg.h> +static FILE * logf = 0; + +void VLog( char * Format, ... ) { + va_list l; + + va_start(l, Format ); + + if( logf == (FILE *)0 ) { + // logf = fopen( "/tmp/ns2log", "a" ); + logf = stderr; + if( ! logf ) { + fprintf( stderr, "Cannot open logfile /tmp/ns2log %d\n", + errno ); + logf = (FILE *)1; + } else { + fprintf( logf, "____ OPEN LOGFILE ____\n"); + } + } + + if( (long)logf > 1 ) { + vfprintf( logf, Format, l ); + } + va_end( l ); + +} + +void LogClose( void ) { + if( (long)logf > 1 ) { + fprintf( logf, "____ CLOSE LOGFILE ____\n"); + fclose( logf ); + logf = 0; + } } diff --git a/noncore/settings/networksettings2/networksettings2/system.h b/noncore/settings/networksettings2/networksettings2/system.h index 96ee9bd..33af391 100644 --- a/noncore/settings/networksettings2/networksettings2/system.h +++ b/noncore/settings/networksettings2/networksettings2/system.h @@ -5,4 +5,6 @@ #include <net/if_arp.h> #include <qdict.h> +#include <qobject.h> +#include <stdio.h> class ANetNodeInstance; @@ -48,5 +50,7 @@ public : }; -class System { +class System : public QObject { + + Q_OBJECT public : @@ -72,7 +76,12 @@ public : void probeInterfaces( void ); +signals : + + void lineFromCommand( const QString & S ); + private : QDict<InterfaceInfo> ProbedInterfaces; + FILE * OutputOfCmd; QFile * ProcDevNet; diff --git a/noncore/settings/networksettings2/networksettingsGUI.ui b/noncore/settings/networksettings2/networksettingsGUI.ui index 7ef2f64..6ed29f3 100644 --- a/noncore/settings/networksettings2/networksettingsGUI.ui +++ b/noncore/settings/networksettings2/networksettingsGUI.ui @@ -12,5 +12,5 @@ <x>0</x> <y>0</y> - <width>160</width> + <width>144</width> <height>260</height> </rect> @@ -29,5 +29,5 @@ <property stdset="1"> <name>margin</name> - <number>0</number> + <number>2</number> </property> <property stdset="1"> @@ -303,68 +303,4 @@ </property> <widget> - <class>QLayoutWidget</class> - <property stdset="1"> - <name>name</name> - <cstring>Layout3</cstring> - </property> - <hbox> - <property stdset="1"> - <name>margin</name> - <number>0</number> - </property> - <property stdset="1"> - <name>spacing</name> - <number>6</number> - </property> - <widget> - <class>QLabel</class> - <property stdset="1"> - <name>name</name> - <cstring>TextLabel2_2</cstring> - </property> - <property stdset="1"> - <name>text</name> - <string>State</string> - </property> - </widget> - <widget> - <class>QLabel</class> - <property stdset="1"> - <name>name</name> - <cstring>State_LBL</cstring> - </property> - <property stdset="1"> - <name>text</name> - <string>State</string> - </property> - <property stdset="1"> - <name>indent</name> - <number>0</number> - </property> - </widget> - <spacer> - <property> - <name>name</name> - <cstring>Spacer6_2</cstring> - </property> - <property stdset="1"> - <name>orientation</name> - <enum>Horizontal</enum> - </property> - <property stdset="1"> - <name>sizeType</name> - <enum>Expanding</enum> - </property> - <property> - <name>sizeHint</name> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <widget> <class>QLabel</class> <property stdset="1"> @@ -486,5 +422,5 @@ <property stdset="1"> <name>name</name> - <cstring>Mesages_LB</cstring> + <cstring>Messages_LB</cstring> </property> </widget> @@ -615,4 +551,10 @@ <slot>SLOT_ToMessages()</slot> </connection> + <connection> + <sender>Disconnect_TB</sender> + <signal>clicked()</signal> + <receiver>NetworkSettingsGUI</receiver> + <slot>SLOT_Disconnect()</slot> + </connection> <slot access="public">SLOT_AddNode()</slot> <slot access="public">SLOT_CheckState()</slot> diff --git a/noncore/settings/networksettings2/nsdata.cpp b/noncore/settings/networksettings2/nsdata.cpp index bb37f10..3b17548 100644 --- a/noncore/settings/networksettings2/nsdata.cpp +++ b/noncore/settings/networksettings2/nsdata.cpp @@ -18,5 +18,5 @@ NetworkSettingsData::NetworkSettingsData( void ) { CfgFile.sprintf( "%s/Settings/NS2.conf", NSResources->currentUser().HomeDir.latin1() ); - fprintf( stderr, "Cfg from %s\n", CfgFile.latin1() ); + Log(( "Cfg from %s\n", CfgFile.latin1() )); // load settings @@ -80,9 +80,9 @@ void NetworkSettingsData::loadSettings( void ) { // try to find netnode NN = NSResources->findNetNode( S ); - fprintf( stderr, "Node %s : %p\n", S.latin1(), NN ); + Log( ( "Node %s : %p\n", S.latin1(), NN ) ); } else { // try to find instance NNI = NSResources->createNodeInstance( S ); - fprintf( stderr, "NodeInstance %s : %p\n", S.latin1(), NNI ); + Log( ( "NodeInstance %s : %p\n", S.latin1(), NNI )); } @@ -152,5 +152,5 @@ QString NetworkSettingsData::saveSettings( void ) { QFile F( CfgFile + ".bup" ); - printf( "Saving settings to %s\n", CfgFile.latin1() ); + Log( ( "Saving settings to %s\n", CfgFile.latin1() )); if( ! F.open( IO_WriteOnly | IO_Truncate ) ) { ErrS = qApp->translate( "NetworkSettings", @@ -230,5 +230,5 @@ QString NetworkSettingsData::generateSettings( bool ForceReq ) { // regenerate system files - fprintf( stderr, "Generating settings from %s\n", CfgFile.latin1() ); + Log( ( "Generating settings from %s\n", CfgFile.latin1() )); { Name2SystemFile_t & SFM = NSResources->systemFiles(); @@ -282,12 +282,4 @@ QString NetworkSettingsData::generateSettings( bool ForceReq ) { } - // we cannot renumber with a FORCE request since - // we probably are NOT going to save the config - // e.g. when using --regen option - if( ! ForceReq && needToRegenerate ) { - NSResources->renumberConnections(); - setModified(1); - } - // // generate files proper to each netnodeinstance @@ -322,5 +314,5 @@ QString NetworkSettingsData::generateSettings( bool ForceReq ) { SF = sfit.current(); - fprintf( stderr, "Generating %s\n", SF->name().latin1() ); + Log( ( "Generating %s\n", SF->name().latin1() )); SF->open(); @@ -406,5 +398,5 @@ QList<NodeCollection> NetworkSettingsData::collectPossible( const char * Interfa NC->state() != IsUp // if already used ) { - fprintf( stderr, "Append %s for %s\n", NC->name().latin1(), Interface); + Log( ( "Append %s for %s\n", NC->name().latin1(), Interface)); PossibleConnections.append( NC ); } @@ -427,6 +419,5 @@ bool NetworkSettingsData::canStart( const char * Interface ) { PossibleConnections = collectPossible( Interface ); - fprintf( stderr, "Possiblilies %d\n", - PossibleConnections.count() ); + Log( ( "Possiblilies %d\n", PossibleConnections.count() )); switch( PossibleConnections.count() ) { case 0 : // no connections diff --git a/noncore/settings/networksettings2/profile/profileGUI.ui b/noncore/settings/networksettings2/profile/profileGUI.ui index 365704b..5bf9a9c 100644 --- a/noncore/settings/networksettings2/profile/profileGUI.ui +++ b/noncore/settings/networksettings2/profile/profileGUI.ui @@ -12,6 +12,6 @@ <x>0</x> <y>0</y> - <width>225</width> - <height>301</height> + <width>276</width> + <height>231</height> </rect> </property> @@ -60,56 +60,126 @@ <property stdset="1"> <name>margin</name> - <number>2</number> + <number>1</number> </property> <property stdset="1"> <name>spacing</name> - <number>0</number> + <number>2</number> </property> <widget> - <class>QCheckBox</class> - <property stdset="1"> - <name>name</name> - <cstring>Automatic_CB</cstring> - </property> - <property stdset="1"> - <name>text</name> - <string>Start automatically</string> - </property> - </widget> - <widget> - <class>QCheckBox</class> - <property stdset="1"> - <name>name</name> - <cstring>Confirm_CB</cstring> - </property> - <property stdset="1"> - <name>enabled</name> - <bool>true</bool> - </property> - <property stdset="1"> - <name>text</name> - <string>Confirm before start</string> - </property> - <property> - <name>layoutMargin</name> - </property> - </widget> - <widget> - <class>QCheckBox</class> + <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> - <cstring>Disabled_CB</cstring> - </property> - <property stdset="1"> - <name>enabled</name> - <bool>true</bool> - </property> - <property stdset="1"> - <name>text</name> - <string>Disabled</string> - </property> - <property> - <name>layoutMargin</name> + <cstring>Layout8</cstring> </property> + <grid> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget row="0" column="0" rowspan="2" colspan="1" > + <class>QGroupBox</class> + <property stdset="1"> + <name>name</name> + <cstring>GroupBox1</cstring> + </property> + <property stdset="1"> + <name>title</name> + <string>Start</string> + </property> + <vbox> + <property stdset="1"> + <name>margin</name> + <number>11</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>Automatic_CB</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Automatically</string> + </property> + </widget> + <widget> + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>Confirm_CB</cstring> + </property> + <property stdset="1"> + <name>enabled</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>text</name> + <string>Ask</string> + </property> + <property> + <name>layoutMargin</name> + </property> + </widget> + <widget> + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>Disabled_CB</cstring> + </property> + <property stdset="1"> + <name>enabled</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>text</name> + <string>Disabled</string> + </property> + <property> + <name>layoutMargin</name> + </property> + </widget> + </vbox> + </widget> + <widget row="0" column="1" > + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>TriggersVPN_CB</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Trigger VPN</string> + </property> + </widget> + <spacer row="1" column="1" > + <property> + <name>name</name> + <cstring>Spacer8</cstring> + </property> + <property stdset="1"> + <name>orientation</name> + <enum>Vertical</enum> + </property> + <property stdset="1"> + <name>sizeType</name> + <enum>Expanding</enum> + </property> + <property> + <name>sizeHint</name> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </grid> </widget> <widget> diff --git a/noncore/settings/networksettings2/profile/profile_NNI.cpp b/noncore/settings/networksettings2/profile/profile_NNI.cpp index 5b54aa4..cb52b2a 100644 --- a/noncore/settings/networksettings2/profile/profile_NNI.cpp +++ b/noncore/settings/networksettings2/profile/profile_NNI.cpp @@ -8,4 +8,5 @@ AProfile::AProfile( ProfileNetNode * PNN ) : ANetNodeInstance( PNN ) { Data.Description = ""; Data.Disabled = 0; + Data.TriggerVPN = 0; GUI = 0; RT = 0; @@ -20,4 +21,6 @@ void AProfile::setSpecificAttribute( QString & Attr, QString & Value ) { } else if ( Attr == "disabled" ) { Data.Disabled = (Value=="yes"); + } else if ( Attr == "triggervpn" ) { + Data.TriggerVPN = (Value=="yes"); } else if ( Attr == "description" ) { Data.Description = Value; @@ -29,4 +32,5 @@ void AProfile::saveSpecificAttribute( QTextStream & TS ) { TS << "preconfirm=" << ((Data.Confirm) ? "yes" : "no") << endl; TS << "disabled=" << ((Data.Disabled) ? "yes" : "no") << endl; + TS << "triggervpn=" << ((Data.TriggerVPN) ? "yes" : "no") << endl; TS << "description=" << Data.Description << endl; } diff --git a/noncore/settings/networksettings2/profile/profiledata.h b/noncore/settings/networksettings2/profile/profiledata.h index b4168e2..246d50c 100644 --- a/noncore/settings/networksettings2/profile/profiledata.h +++ b/noncore/settings/networksettings2/profile/profiledata.h @@ -11,4 +11,5 @@ typedef struct ProfileData { // Do not bring this connection up bool Disabled; + bool TriggerVPN; } ProfileData_t; diff --git a/noncore/settings/networksettings2/profile/profileedit.cpp b/noncore/settings/networksettings2/profile/profileedit.cpp index c9fb650..87e503e 100644 --- a/noncore/settings/networksettings2/profile/profileedit.cpp +++ b/noncore/settings/networksettings2/profile/profileedit.cpp @@ -59,4 +59,5 @@ void ProfileEdit::showData( ProfileData_t & Data ) { Description_LE->setText( Data.Description ); Automatic_CB->setChecked( Data.Automatic ); + TriggersVPN_CB->setChecked( Data.TriggerVPN ); Confirm_CB->setChecked( Data.Confirm ); Disabled_CB->setChecked( Data.Disabled ); @@ -69,4 +70,5 @@ bool ProfileEdit::commit( ProfileData_t & Data ) { CBM( Data.Automatic, Automatic_CB, SM ); + CBM( Data.TriggerVPN, TriggersVPN_CB, SM ); CBM( Data.Disabled, Disabled_CB, SM ); CBM( Data.Confirm, Confirm_CB, SM ); diff --git a/noncore/settings/networksettings2/profile/profilerun.cpp b/noncore/settings/networksettings2/profile/profilerun.cpp index 79bb93e..1a5b15b 100644 --- a/noncore/settings/networksettings2/profile/profilerun.cpp +++ b/noncore/settings/networksettings2/profile/profilerun.cpp @@ -5,6 +5,8 @@ void ProfileRun::detectState( NodeCollection * NC ) { if( Data->Disabled ) { + Log(( "%s disabled\n", NC->name().latin1() )); NC->setCurrentState( Disabled ); } else { + Log(( "%s not disabled\n", NC->name().latin1() )); // find next item in connection // convert to runtime and ask to detect the state @@ -13,5 +15,5 @@ void ProfileRun::detectState( NodeCollection * NC ) { } -bool ProfileRun::setState( NodeCollection * NC, Action_t A, bool ) { +bool ProfileRun::setState( NodeCollection * NC, Action_t A, bool F ) { ANetNodeInstance * NNNI; @@ -42,5 +44,5 @@ bool ProfileRun::setState( NodeCollection * NC, Action_t A, bool ) { break; } - return NNNI->runtime()->setState(NC, A); + return NNNI->runtime()->setState(NC, A, F ); } diff --git a/noncore/settings/networksettings2/profile/profilerun.h b/noncore/settings/networksettings2/profile/profilerun.h index c8ea063..400b56c 100644 --- a/noncore/settings/networksettings2/profile/profilerun.h +++ b/noncore/settings/networksettings2/profile/profilerun.h @@ -24,4 +24,8 @@ public : virtual AsFullSetup * asFullSetup( void ) { return (AsFullSetup *)this; } + + virtual bool triggersVPN( void ) + { return Data->TriggerVPN; } + private : diff --git a/noncore/settings/networksettings2/usb/usbrun.cpp b/noncore/settings/networksettings2/usb/usbrun.cpp index beacd7b..b8ac8a8 100644 --- a/noncore/settings/networksettings2/usb/usbrun.cpp +++ b/noncore/settings/networksettings2/usb/usbrun.cpp @@ -13,4 +13,5 @@ void USBRun::detectState( NodeCollection * NC ) { InterfaceInfo * Run; QFile F( S ); + Log(("Detecting for %s\n", NC->name().latin1() )); if( F.open( IO_ReadOnly ) ) { @@ -19,4 +20,5 @@ void USBRun::detectState( NodeCollection * NC ) { QTextStream TS(&F); X = TS.readLine(); + Log(("%s exists\n", S.latin1() )); // find interface if( handlesInterface( X ) ) { @@ -35,5 +37,5 @@ void USBRun::detectState( NodeCollection * NC ) { } - fprintf( stderr, "Assigned %p\n", assignedInterface() ); + Log(("Assigned %p\n", assignedInterface() )); if( ( Run = assignedInterface() ) ) { // we already have an interface assigned -> still present ? @@ -54,9 +56,9 @@ void USBRun::detectState( NodeCollection * NC ) { Run = It.current(); - fprintf( stderr, "%s %d %d=%d %d\n", + Log(("%s %d %d=%d %d\n", Run->Name.latin1(), handlesInterface( Run->Name ), Run->CardType, ARPHRD_ETHER, - ! Run->IsUp ); + ! Run->IsUp )); if( handlesInterface( Run->Name ) && @@ -64,5 +66,5 @@ void USBRun::detectState( NodeCollection * NC ) { ! Run->IsUp ) { - fprintf( stderr, "Released(OFF)\n" ); + Log(("Released(OFF)\n" )); // proper type, and Not UP -> free NC->setCurrentState( Off ); @@ -71,5 +73,5 @@ void USBRun::detectState( NodeCollection * NC ) { } // no free found - fprintf( stderr, "UNA\n" ); + Log(("UNA\n" )); NC->setCurrentState( Unavailable ); @@ -95,5 +97,5 @@ bool USBRun::setState( NodeCollection * NC, Action_t A, bool ) { N->assignNode( netNode() ); assignInterface( N ); - fprintf( stderr, "Assing %p\n", N ); + Log(("Assing %p\n", N )); NC->setCurrentState( Available ); return 1; |