Diffstat (limited to 'noncore/settings/networksettings2/lancard') (more/less context) (ignore whitespace changes)
8 files changed, 290 insertions, 70 deletions
diff --git a/noncore/settings/networksettings2/lancard/lancardGUI.ui b/noncore/settings/networksettings2/lancard/lancardGUI.ui index 8d94816..c407175 100644 --- a/noncore/settings/networksettings2/lancard/lancardGUI.ui +++ b/noncore/settings/networksettings2/lancard/lancardGUI.ui @@ -2,25 +2,25 @@ <class>LanCardGUI</class> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>Lancard_FRM</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>0</y> - <width>362</width> + <width>354</width> <height>359</height> </rect> </property> <property stdset="1"> <name>caption</name> <string>LAN card</string> </property> <property> <name>layoutMargin</name> </property> <property> <name>layoutSpacing</name> @@ -60,70 +60,130 @@ <bool>false</bool> </property> <property stdset="1"> <name>title</name> <string>Select Card</string> </property> <property> <name>layoutMargin</name> </property> <vbox> <property stdset="1"> <name>margin</name> - <number>11</number> + <number>5</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QListView</class> <column> <property> <name>text</name> - <string>Name</string> - </property> - <property> - <name>clickable</name> - <bool>true</bool> - </property> - <property> - <name>resizeable</name> - <bool>true</bool> - </property> - </column> - <column> - <property> - <name>text</name> <string>MACAddress</string> </property> <property> <name>clickable</name> <bool>true</bool> </property> <property> <name>resizeable</name> <bool>true</bool> </property> </column> <property stdset="1"> <name>name</name> <cstring>LanCards_LV</cstring> </property> <property stdset="1"> <name>allColumnsShowFocus</name> <bool>true</bool> </property> </widget> + <widget> + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout2</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>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>RemoveUnknown_BUT</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Remove Unknown</string> + </property> + </widget> + <spacer> + <property> + <name>name</name> + <cstring>Spacer1</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> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>RescanCards_BUT</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Rescan</string> + </property> + </widget> + </hbox> + </widget> </vbox> </widget> </vbox> </widget> <connections> <connection> <sender>AnyCard_CB</sender> <signal>toggled(bool)</signal> <receiver>GroupBox1</receiver> <slot>setDisabled(bool)</slot> </connection> + <connection> + <sender>RescanCards_BUT</sender> + <signal>clicked()</signal> + <receiver>Lancard_FRM</receiver> + <slot>SLOT_ScanCards()</slot> + </connection> + <connection> + <sender>RemoveUnknown_BUT</sender> + <signal>clicked()</signal> + <receiver>Lancard_FRM</receiver> + <slot>SLOT_RemoveUnknown()</slot> + </connection> + <slot access="public">SLOT_ScanCards()</slot> + <slot access="public">SLOT_RemoveUnknown()</slot> </connections> </UI> diff --git a/noncore/settings/networksettings2/lancard/lancard_NN.cpp b/noncore/settings/networksettings2/lancard/lancard_NN.cpp index ba1c1f8..a4afab1 100644 --- a/noncore/settings/networksettings2/lancard/lancard_NN.cpp +++ b/noncore/settings/networksettings2/lancard/lancard_NN.cpp @@ -1,22 +1,22 @@ #include "lancard_NN.h" #include "lancard_NNI.h" static const char * LanCardNeeds[] = { 0 }; /** * Constructor, find all of the possible interfaces */ -LanCardNetNode::LanCardNetNode() : ANetNode() { +LanCardNetNode::LanCardNetNode() : ANetNode(tr("LAN card")), NICMACAddresses() { InstanceCount = 2; } /** * Delete any interfaces that we own. */ LanCardNetNode::~LanCardNetNode(){ } const QString LanCardNetNode::nodeDescription(){ return tr("\ <p>Sets up a wired regular LAN card.</p>\ @@ -60,26 +60,35 @@ bool LanCardNetNode::generateDeviceDataForCommonFile( } return 0; } QString LanCardNetNode::genNic( long nr ) { QString S; return S.sprintf( "eth%ld", nr ); } void LanCardNetNode::setSpecificAttribute( QString & A, QString & V ) { if( A == "interfacecount" ) { InstanceCount = V.toLong(); + } else if ( A == "macaddress" ) { + NICMACAddresses.append( V ); } } void LanCardNetNode::saveSpecificAttribute( QTextStream & TS) { TS << "interfacecount=" << InstanceCount << endl; + for( QStringList::Iterator it = NICMACAddresses.begin(); + it != NICMACAddresses.end(); + ++it ) { + TS << "macaddress=" + << (*it) + << endl; + } } extern "C" { void create_plugin( QList<ANetNode> & PNN ) { PNN.append( new LanCardNetNode() ); } } diff --git a/noncore/settings/networksettings2/lancard/lancard_NN.h b/noncore/settings/networksettings2/lancard/lancard_NN.h index 5f2b25d..d58823c 100644 --- a/noncore/settings/networksettings2/lancard/lancard_NN.h +++ b/noncore/settings/networksettings2/lancard/lancard_NN.h @@ -1,55 +1,57 @@ #ifndef LANCARD_NETNODE_H #define LANCARD_NETNODE_H +#include <qstringlist.h> #include "netnode.h" class ALanCard; class LanCardNetNode : public ANetNode{ Q_OBJECT public: LanCardNetNode(); virtual ~LanCardNetNode(); virtual const QString pixmapName() { return "Devices/card"; } - virtual const QString nodeName() - { return tr("LAN card"); } - virtual const QString nodeDescription() ; virtual ANetNodeInstance * createInstance( void ); virtual const char ** needs( void ); virtual const char * provides( void ); virtual bool generateProperFilesFor( ANetNodeInstance * NNI ); virtual bool hasDataFor( const QString & S ); virtual bool generateDeviceDataForCommonFile( SystemFile & SF, long DevNr ); virtual long instanceCount( void ) { return InstanceCount; } virtual QString genNic( long ); + virtual QStringList & addressesOfNIC( void ) + { return NICMACAddresses; } private: virtual void setSpecificAttribute( QString & Attr, QString & Value ); virtual void saveSpecificAttribute( QTextStream & TS ); // number of interfaces for this device long InstanceCount; + QStringList NICMACAddresses; + }; extern "C" { void create_plugin( QList<ANetNode> & PNN ); }; #endif diff --git a/noncore/settings/networksettings2/lancard/lancard_NNI.cpp b/noncore/settings/networksettings2/lancard/lancard_NNI.cpp index 5962d52..99c033e 100644 --- a/noncore/settings/networksettings2/lancard/lancard_NNI.cpp +++ b/noncore/settings/networksettings2/lancard/lancard_NNI.cpp @@ -21,25 +21,25 @@ void ALanCard::setSpecificAttribute( QString & A, QString & V ) { void ALanCard::saveSpecificAttribute( QTextStream & TS) { TS << "matchanycard=" << ((Data.AnyLanCard) ? "yes" : "no") << endl; for( QStringList::Iterator it = Data.HWAddresses.begin(); it != Data.HWAddresses.end(); ++it ) { TS << "match=" << quote( *it ) << endl; } } QWidget * ALanCard::edit( QWidget * parent ) { GUI = new LanCardEdit( parent ); - GUI->showData( Data ); + GUI->showData( this ); return GUI; } QString ALanCard::acceptable( void ) { return ( GUI ) ? GUI->acceptable( ) : QString(); } void ALanCard::commit( void ) { if( GUI && GUI->commit( Data ) ) setModified( 1 ); } diff --git a/noncore/settings/networksettings2/lancard/lancardedit.cpp b/noncore/settings/networksettings2/lancard/lancardedit.cpp index fa7f6dc..ffe9bf6 100644 --- a/noncore/settings/networksettings2/lancard/lancardedit.cpp +++ b/noncore/settings/networksettings2/lancard/lancardedit.cpp @@ -1,95 +1,208 @@ #include <GUIUtils.h> #include <resources.h> +#include <qarray.h> #include <qlistview.h> #include <qcheckbox.h> #include <qheader.h> #include <qregexp.h> + #include "lancardedit.h" +#include "lancard_NN.h" +#include "lancard_NNI.h" LanCardEdit::LanCardEdit( QWidget * Parent ) : LanCardGUI( Parent ){ - System & S = NSResources->system(); - QRegExp R( "eth[0-9]" ); - QCheckListItem * CLI; - LanCards_LV->header()->hide(); - // populate with all lancards in system - for( QDictIterator<InterfaceInfo> It(S.interfaces()); - It.current(); - ++It ) { - if( R.match( It.current()->Name ) >= 0 && - It.current()->CardType == ARPHRD_ETHER - ) { - CLI = new QCheckListItem( LanCards_LV, It.current()->Name, - QCheckListItem::CheckBox ); - CLI->setText( 1, It.current()->MACAddress ); - } - } } QString LanCardEdit::acceptable( void ) { return QString(); } - bool LanCardEdit::commit( LanCardData & Data ) { bool SM = 0; CBM( Data.AnyLanCard, AnyCard_CB, SM ); if( ! Data.AnyLanCard ) { - // collect set of lancards that match + // take copy for orig list + QStringList NewList( Data.HWAddresses ); + + // update HWAddresses to new state + // remove item also from NewList int idx; QCheckListItem * CLI = (QCheckListItem *)LanCards_LV->firstChild(); while( CLI ) { - idx = Data.HWAddresses.findIndex(CLI->text(1)); + idx = Data.HWAddresses.findIndex(CLI->text(0)); if( CLI->isOn() ) { if( idx < 0 ) { // should be in list - Data.HWAddresses.append( CLI->text(1) ); + Data.HWAddresses.append( CLI->text(0) ); SM = 1; } } else { // should not be in list if( idx >= 0 ) { - Data.HWAddresses.remove( Data.HWAddresses.at(idx) ); + NewList.remove( CLI->text(0) ); + Data.HWAddresses.remove( CLI->text(0) ); SM = 1; } } CLI = (QCheckListItem *)CLI->nextSibling(); } + + // if newlist still contains items. it were items + // that were checked but no longer are present in the system + SM |= ( NewList.count() > 0 ) ; } - return SM || ContainedObsoleteMAC ; + return SM; } -void LanCardEdit::showData( LanCardData & Data ) { +void LanCardEdit::showData( ALanCard * LC ) { + NNI = LC; + LanCardData & Data = *((LanCardData *)LC->data()); + AnyCard_CB->setChecked( Data.AnyLanCard ); + // load all cards + populateList(); + + // set checks QCheckListItem * CLI = (QCheckListItem *)LanCards_LV->firstChild(); + while( CLI ) { + CLI->setOn( Data.HWAddresses.findIndex(CLI->text(0)) >= 0 ); + CLI = (QCheckListItem *)CLI->nextSibling(); + } +} - ContainedObsoleteMAC = 0; - // remove obsolete address - for( QStringList::Iterator it=Data.HWAddresses.begin(); - it != Data.HWAddresses.end(); - ) { - CLI = (QCheckListItem *)LanCards_LV->firstChild(); - while( CLI ) { - if( CLI->text(1) == (*it) ) - // still valid +// load all known cards in list +void LanCardEdit::populateList( void ) { + LanCardNetNode *NN = (LanCardNetNode *)NNI->nodeClass(); + QCheckListItem * CLI; + bool Found; + + LanCards_LV->clear(); + + for( QStringList::Iterator it = NN->addressesOfNIC().begin(); + it != NN->addressesOfNIC().end(); + ++it ) { + CLI = new QCheckListItem( LanCards_LV, (*it), QCheckListItem::CheckBox ); + + // check interfaces and see if this card is present + Found = 0; + for( QDictIterator<InterfaceInfo> NIt(NSResources->system().interfaces()); + NIt.current(); + ++NIt ) { + if( NIt.current()->MACAddress == (*it) ) { + Found = 1; break; - CLI = (QCheckListItem *)CLI->nextSibling(); + } } - if( CLI == 0 ) { - // address not found -> remove - ContainedObsoleteMAC = 1; - Data.HWAddresses.remove( it ); - } else { - ++ it; + + CLI->setPixmap( 0, NSResources->getPixmap( + (Found) ? "add" : "remove" ) ); + } +} + +// rescan system for new cards +void LanCardEdit::SLOT_ScanCards( void ) { + LanCardNetNode *NN = (LanCardNetNode *)NNI->nodeClass(); + + // add any NIC that is new and matches our interfacename + System & S = NSResources->system(); + QRegExp R( "eth[0-9]" ); + // populate with all lancards in system + for( QDictIterator<InterfaceInfo> It(S.interfaces()); + It.current(); + ++It ) { + fprintf( stderr, "TEST %s %s\n", + It.current()->Name.latin1(), + It.current()->MACAddress.latin1() ); + if( R.match( It.current()->Name ) >= 0 && + ( It.current()->CardType == ARPHRD_ETHER +#ifdef ARPHRD_IEEE1394 + || It.current()->CardType == ARPHRD_IEEE1394 +#endif + ) + ) { + // old item ? + QCheckListItem * CLI = + (QCheckListItem *)LanCards_LV->firstChild(); + while( CLI ) { + if( CLI->text(0) == It.current()->MACAddress ) { + break; + } + CLI = (QCheckListItem *)CLI->nextSibling(); + } + + if( ! CLI ) { + // new item + CLI = new QCheckListItem( LanCards_LV, + It.current()->MACAddress, + QCheckListItem::CheckBox ); + } + + // mark present + CLI->setPixmap( 0, NSResources->getPixmap( + "add" ) ); + + if( NN->addressesOfNIC().findIndex( It.current()->MACAddress) < 0 ) { + // new + NN->addressesOfNIC().append( It.current()->MACAddress ); + } } } - // set checks +} + +// remove all cards that are not present -> flagged with 'remove' +// and unchecked +void LanCardEdit::SLOT_RemoveUnknown( void ) { + QArray<QCheckListItem *> AllItems; + + LanCardNetNode *NN = (LanCardNetNode *)NNI->nodeClass(); + + QCheckListItem * CLI = (QCheckListItem *)LanCards_LV->firstChild(); while( CLI ) { - CLI->setOn( Data.HWAddresses.findIndex(CLI->text(1)) >= 0 ); + AllItems.resize( AllItems.size()+1 ); + AllItems[ AllItems.size()-1 ] = CLI; CLI = (QCheckListItem *)CLI->nextSibling(); } + + // force update of system + System & S = NSResources->system(); + S.probeInterfaces(); + + // add any NIC that is new and matches our interfacename + QRegExp R( "eth[0-9]" ); + + + for( QDictIterator<InterfaceInfo> It(S.interfaces()); + It.current(); + ++It ) { + if( R.match( It.current()->Name ) >= 0 && + ( It.current()->CardType == ARPHRD_ETHER +#ifdef ARPHRD_IEEE1394 + || It.current()->CardType == ARPHRD_IEEE1394 +#endif + ) + ) { + + for ( unsigned i = 0; i< AllItems.size(); i++ ) { + if( AllItems[i] && + AllItems[i]->text(0) == It.current()->MACAddress ) { + AllItems[i] = 0; + break; + } + } + } + } + + // AllItems now contains all cards NOT present + // remove all items non null and not ON + for ( unsigned i = 0; i< AllItems.size(); i++ ) { + if( AllItems[i] && ! AllItems[i]->isOn() ) { + NN->addressesOfNIC().remove( AllItems[i]->text(0) ); + delete AllItems[i]; + } + } } diff --git a/noncore/settings/networksettings2/lancard/lancardedit.h b/noncore/settings/networksettings2/lancard/lancardedit.h index 8def789..282db1f 100644 --- a/noncore/settings/networksettings2/lancard/lancardedit.h +++ b/noncore/settings/networksettings2/lancard/lancardedit.h @@ -1,16 +1,24 @@ #include "lancarddata.h" #include "lancardGUI.h" +class ALanCard; + class LanCardEdit : public LanCardGUI { public : LanCardEdit( QWidget * parent ); QString acceptable( void ); bool commit( LanCardData & Data ); - void showData( LanCardData & Data ); + void showData( ALanCard * NNI ); + +public slots : + + void SLOT_ScanCards( void ); + void SLOT_RemoveUnknown( void ); private : - bool ContainedObsoleteMAC; + void populateList( void ); + ALanCard * NNI; }; diff --git a/noncore/settings/networksettings2/lancard/lancardrun.cpp b/noncore/settings/networksettings2/lancard/lancardrun.cpp index 951756d..2e4fc43 100644 --- a/noncore/settings/networksettings2/lancard/lancardrun.cpp +++ b/noncore/settings/networksettings2/lancard/lancardrun.cpp @@ -1,14 +1,15 @@ #include <qfile.h> #include <qtextstream.h> +#include <qstringlist.h> #include <resources.h> #include "lancardrun.h" void LanCardRun::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; @@ -44,26 +45,30 @@ void LanCardRun::detectState( NodeCollection * NC ) { 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(); - if( handlesInterface( Run->Name ) && - Run->CardType == ARPHRD_ETHER && + if( handlesInterface( *Run ) && + ( Run->CardType == ARPHRD_ETHER +#ifdef ARPHRD_IEEE1394 + || Run->CardType == ARPHRD_IEEE1394 +#endif + ) && ! Run->IsUp ) { // proper type, and Not UP -> free NC->setCurrentState( Off ); return; } } // no free found NC->setCurrentState( Unavailable ); } @@ -136,31 +141,52 @@ bool LanCardRun::canSetState( State_t Curr, Action_t A ) { } // get interface that is free or assigned to us InterfaceInfo * LanCardRun::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 + if( handlesInterface( *Run ) && + ( Run->CardType == ARPHRD_ETHER +#ifdef ARPHRD_IEEE1394 + || Run->CardType == ARPHRD_IEEE1394 +#endif + ) ) { // this is a LAN card if( Run->assignedNode() == netNode() ) { // assigned to us return Run; } else if( Run->assignedNode() == 0 ) { // free best = Run; } } } return best; // can be 0 } bool LanCardRun::handlesInterface( const QString & S ) { + InterfaceInfo * II; + II = NSResources->system().interface( S ); + if( ( II = NSResources->system().interface( S ) ) ) { + return handlesInterface( *II ); + } return Pat.match( S ) >= 0; } + +bool LanCardRun::handlesInterface( const InterfaceInfo & II ) { + if( Pat.match( II.Name ) < 0 ) + return 0; + + if( Data->AnyLanCard ) { + return 1; + } + + // must also match hardware address + return ( Data->HWAddresses.findIndex( II.MACAddress ) >= 0 ); +} diff --git a/noncore/settings/networksettings2/lancard/lancardrun.h b/noncore/settings/networksettings2/lancard/lancardrun.h index 499b417..e8a535a 100644 --- a/noncore/settings/networksettings2/lancard/lancardrun.h +++ b/noncore/settings/networksettings2/lancard/lancardrun.h @@ -1,37 +1,39 @@ #ifndef LANCARDRUN_H #define LANCARDRUN_H #include <asdevice.h> #include <qregexp.h> #include "lancarddata.h" class LanCardRun : public AsDevice { public : LanCardRun( ANetNodeInstance * NNI, - LanCardData & Data ) : AsDevice( NNI ), + LanCardData & D ) : AsDevice( NNI ), Pat( "eth[0-9]" ) - { } + { Data = &D; } virtual AsDevice * device( void ) { return (AsDevice *)this; } virtual AsDevice * asDevice( void ) { return (AsDevice *)this; } protected : void detectState( NodeCollection * NC ); bool setState( NodeCollection * NC, Action_t A ); bool canSetState( State_t Curr, Action_t A ); bool handlesInterface( const QString & I ); + bool handlesInterface( const InterfaceInfo & II ); private : InterfaceInfo * getInterface( void ); QRegExp Pat; + LanCardData * Data; }; #endif |