Diffstat (limited to 'noncore/settings/networksettings2/nsdata.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/settings/networksettings2/nsdata.cpp | 206 |
1 files changed, 179 insertions, 27 deletions
diff --git a/noncore/settings/networksettings2/nsdata.cpp b/noncore/settings/networksettings2/nsdata.cpp index 3f5e958..6541596 100644 --- a/noncore/settings/networksettings2/nsdata.cpp +++ b/noncore/settings/networksettings2/nsdata.cpp @@ -167,197 +167,349 @@ QString NetworkSettingsData::saveSettings( void ) { // setModified( 0 ); return ErrS; } QString NetworkSettingsData::generateSettings( bool ForceReq ) { bool ForceIt; QString S = ""; // include own force flag ForceIt = (Force) ? 1 : ForceReq; if( ! ForceIt && ! isModified() ) return S; // regenerate system files printf( "Generating settings from %s\n", CfgFile.latin1() ); { Name2SystemFile_t & SFM = NSResources->systemFiles(); Name2Connection_t & M = NSResources->connections(); NodeCollection * NC; ANetNodeInstance * NNI; SystemFile * SF; + AsDevice * CurDev; bool needToRegenerate = ForceIt; // // check if we need to generate at least one of the system files // if( ! ForceIt ) { for( QDictIterator<SystemFile> sfit(SFM); sfit.current(); ++sfit ) { SF = sfit.current(); // check if there are nodes that are modified and require // data for this system file // for all connections for( QDictIterator<NodeCollection> ncit(M); ncit.current(); ++ncit ) { NC = ncit.current(); if( NC->isModified() ) { // does this connection 'touch' this system file ? for( QListIterator<ANetNodeInstance> cncit(*NC); cncit.current(); ++cncit ) { NNI = cncit.current(); - if( NNI->netNode()->hasDataFor( SF->name() ) && + if( ( NNI->netNode()->hasDataFor( SF->name(), 1 ) || + NNI->netNode()->hasDataFor( SF->name(), 0 ) + ) && NNI->isModified() ) { needToRegenerate = 1; break; } } } if( needToRegenerate ) break; } if( needToRegenerate ) break; } } // 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 // { Name2Instance_t & NNIs = NSResources->netNodeInstances(); - ANetNodeInstance * NNI; for( QDictIterator<ANetNodeInstance> NNIIt(NNIs); NNIIt.current(); ++NNIIt ){ // for all nodes find those that are modified NNI = NNIIt.current(); if( ForceIt || NNI->isModified() ) { if( ! NNI->netNode()->generateProperFilesFor( NNI ) ) { // problem generating S = qApp->translate( "NetworkSettings", "<p>Cannot generate files proper to %1</p>" ). arg(NNI->netNode()->nodeName()) ; return S; } } } } // - // generate system files + // generate all system files // for( QDictIterator<SystemFile> sfit(SFM); sfit.current(); ++sfit ) { SF = sfit.current(); - // - // regenerate current file - // printf( "Generating %s\n", SF->name().latin1() ); SF->open(); do { // so we can break; + // global presection for this system file if( SF->preSection() ) { S = qApp->translate( "NetworkSettings", "<p>Error in preSection for file %1</p>" ). arg( SF->name() ); return S; } - for( QDictIterator<NodeCollection> ncit(M); - ncit.current(); - ++ncit ) { - NC = ncit.current(); - - // get the netnode that serves as the device for this - // connection - AsDevice * Dev = NC->device(); + // find all netnodes and figure out if + // for that node there are instances + for( QDictIterator<NetNode_t> nnit( + NSResources->netNodes() ); + nnit.current(); + ++nnit ) { + ANetNode * NN; + + NN = nnit.current()->NetNode; + + // are there instances ? + NNI = 0; + for( QDictIterator<ANetNodeInstance> nniit( + NSResources->netNodeInstances() ); + nniit.current(); + ++nniit ) { + if( nniit.current()->netNode() == NN ) { + NNI = nniit.current(); + break; + } + } - // generate 'entry' for every possible device this profile handles + if( ! NNI ) + // no instances + continue; + + // has this node data for this system file ? + if( (CurDev = NNI->runtime()->asDevice() ) ) { + // generate start for this nodetype for all possible devices of this type + for( int i = 0; i < CurDev->count(); i ++ ) { + if( SF->preDeviceSection( NNI, i ) ) { + S = qApp->translate( "NetworkSettings", + "<p>Error in preDeviceSection for file %1 and node %2</p>" ). + arg( SF->name() ). + arg( NN->nodeName() ); + return S; + } - for( QListIterator<ANetNodeInstance> cncit(*NC); - cncit.current(); - ++cncit ) { - NNI = cncit.current(); - for( int i = 0; i < Dev->count(); i ++ ) { - if( NNI->netNode()->hasDataFor( SF->name() ) ) { - if( SF->preNodeSection( NNI, i ) ) { + if( ! NN->hasDataFor( SF->name(), 1 ) ) { + if( NN->generateDeviceDataForCommonFile( *SF, i, NNI ) ) { S = qApp->translate( "NetworkSettings", - "<p>Error in preNodeSection for file %1 and node %2</p>" ). + "<p>Error in node part for file %1 and node %2</p>" ). arg( SF->name() ). - arg( NNI->netNode()->nodeName() ); + arg( NN->nodeName() ); return S; } + } + } + } else { + // just request this once + if( SF->preDeviceSection( NNI, -1 ) ) { + S = qApp->translate( "NetworkSettings", + "<p>Error in preDeviceSection for file %1 and node %2</p>" ). + arg( SF->name() ). + arg( NN->nodeName() ); + return S; + } + + if( ! NN->hasDataFor( SF->name(), 1 ) ) { + if( NN->generateDeviceDataForCommonFile( *SF, -1, NNI ) ) { + S = qApp->translate( "NetworkSettings", + "<p>Error in node part for file %1 and node %2</p>" ). + arg( SF->name() ). + arg( NN->nodeName() ); + return S; + } + } + } + + // now generate profile specific data for all + // connections working on a device of the current + // netnode type + for( QDictIterator<NodeCollection> ncit(M); + ncit.current(); + ++ncit ) { + NC = ncit.current(); - if( NNI->netNode()->generateDataForCommonFile(*SF,i,NNI) ) { + NNI = NC->getToplevel(); + + // no output needed + if( ! NNI->netNode()->hasDataFor( SF->name(), 0 ) ) + continue; + + // get the netnode that serves as the device for this + // connection + AsDevice * Dev = NC->device(); + + if( CurDev ) { + if( CurDev != Dev ) { + // other device -> later + continue; + } + + // generate 'entry' for every combination of device and profile + // each node delegates to deeper level + for( int i = 0; i < CurDev->count(); i ++ ) { + if( SF->preNodeSection( NNI, i ) ) { S = qApp->translate( "NetworkSettings", - "<p>Error in node part for file %1 and node %2</p>" ). + "<p>Error in preNodeSection for file %1 and node %2</p>" ). arg( SF->name() ). arg( NNI->netNode()->nodeName() ); return S; } + // ask all nodes in connection + + for( QListIterator<ANetNodeInstance> cncit(*NC); + cncit.current(); + ++cncit ) { + NNI = cncit.current(); + + if( NNI->netNode()->hasDataFor( SF->name(), 0 ) ) { + if( NNI->netNode()->generateDataForCommonFile(*SF,i,NNI) ) { + S = qApp->translate( "NetworkSettings", + "<p>Error in node part for file %1 and node %2</p>" ). + arg( SF->name() ). + arg( NNI->netNode()->nodeName() ); + return S; + } + } + } + if( SF->postNodeSection( NNI, i ) ) { S = qApp->translate( "NetworkSettings", "<p>Error in postNodeSection for file %1 and node %2</p>" ). arg( SF->name() ). arg( NNI->netNode()->nodeName() ); return S; } } + + } else { + if( Dev ) { + // other + continue; + } + + // one entry to generate + if( SF->preNodeSection( NNI, -1 ) ) { + S = qApp->translate( "NetworkSettings", + "<p>Error in preNodeSection for file %1 and node %2</p>" ). + arg( SF->name() ). + arg( NNI->netNode()->nodeName() ); + return S; + } + + if( NNI->netNode()->generateDataForCommonFile(*SF,-1,NNI) ) { + S = qApp->translate( "NetworkSettings", + "<p>Error in node part for file %1 and node %2</p>" ). + arg( SF->name() ). + arg( NNI->netNode()->nodeName() ); + return S; + } + + if( SF->postNodeSection( NNI, -1 ) ) { + S = qApp->translate( "NetworkSettings", + "<p>Error in postNodeSection for file %1 and node %2</p>" ). + arg( SF->name() ). + arg( NNI->netNode()->nodeName() ); + return S; + } + } + + // generated some data + if( SF->postNodeSection( NNI, -1 ) ) { + S = qApp->translate( "NetworkSettings", + "<p>Error in postNodeSection for file %1 and node %2</p>" ). + arg( SF->name() ). + arg( NNI->netNode()->nodeName() ); + return S; + } + *SF << endl; + } + + if( CurDev ) { + // generate 'entry' for every combination of device and profile + // each node delegates to deeper level + for( int i = 0; i < CurDev->count(); i ++ ) { + if( SF->postDeviceSection( NNI, i ) ) { + S = qApp->translate( "NetworkSettings", + "<p>Error in postDeviceSection for file %1 and node %2</p>" ). + arg( SF->name() ). + arg( NNI->netNode()->nodeName() ); + return S; + } + } + } else { + if( SF->postDeviceSection( NNI, -1 ) ) { + S = qApp->translate( "NetworkSettings", + "<p>Error in postDeviceSection for file %1 and node %2</p>" ). + arg( SF->name() ). + arg( NNI->netNode()->nodeName() ); + return S; } } - *SF << endl; } if( SF->postSection() ) { S = qApp->translate( "NetworkSettings", "<p>Error in postSection for file %1</p>" ). arg( SF->name() ); return S; } + } while( 0 ); SF->close(); } } Force = 0; return S; } QList<NodeCollection> NetworkSettingsData::collectPossible( const char * Interface ) { // collect connections that can work on top of this interface NodeCollection * NC; QList<NodeCollection> PossibleConnections; Name2Connection_t & M = NSResources->connections(); // for all connections for( QDictIterator<NodeCollection> it(M); it.current(); ++it ) { NC = it.current(); // check if this profile handles the requested interface if( NC->handlesInterface( Interface ) && // if different Intf. NC->state() != Disabled && // if not enabled NC->state() != IsUp // if already used ) { |