📄 lan.cpp
字号:
if ( !tmpFile.open( IO_WriteOnly ) ) return FALSE; bool retval = TRUE; QTextStream in( &prevFile ); QTextStream out( &tmpFile ); config.setGroup("Info"); QString nm = config.readEntry( "Name" ); config.setGroup("Properties"); //For DHCP to work, we have to remove the TCP/IP fields bool dhcp = config.readEntry("DHCP","y") != "n"; QString line; bool found=FALSE; bool done=FALSE; while ( !in.atEnd() ) { QString line = in.readLine(); QString wline = line.simplifyWhiteSpace(); if ( !done ) { if ( found ) { if ( wline == ";;" ) { done = TRUE; } else { int eq=wline.find("="); QString k,s,v; if ( eq > 0 ) { k = wline.left(eq); s = "="; } else if ( wline.left(8) == "start_fn" ) { k = wline.left(8); s = " () "; } else if ( wline.left(7) == "stop_fn" ) { k = wline.left(7); s = " () "; } if ( !k.isNull() ) { QString v = config.readEntry(k); if ( eq > 0 ) { if ( dhcp && k.left(4) != "DHCP" ) v = ""; else v = Global::shellQuote(v); } else { if ( v.isEmpty() ) v = "{ return; }"; // No tr } line = " " + k + s + v; } } } else { if ( wline.left(scheme.length()+7) == scheme + ",*,*,*)" ) { found=TRUE; } else if ( wline == "esac" || wline == "*,*,*,*)" ) { // end - add new entry // Not all fields have a GUI, but all are supported // in the network configuration files. static const char* txtfields[] = { "IF_PORT", "DHCP_HOSTNAME", "NETWORK", "DOMAIN", "SEARCH", "MOUNTS", "MTU", "NO_CHECK", "NO_FUSER", "IPADDR", "NETMASK", "BROADCAST", "GATEWAY", "DNS_1", "DNS_2", "DNS_3", 0 }; out << scheme << ",*,*,*)" << "\n" << " INFO=" << Global::shellQuote(nm) << "\n" << " BOOTP=" << config.readEntry("BOOTP","n") << "\n" << " DHCP=" << config.readEntry("DHCP","y") << "\n" << " start_fn () " << config.readEntry("start_fn","{ return; }") << "\n" << " stop_fn () " << config.readEntry("stop_fn","{ return; }") << "\n" ; const char** f = txtfields; while (*f) { out << " " << *f << "=" << Global::shellQuote(dhcp ? QString("") : config.readEntry(*f,"")) << "\n"; ++f; } out << " ;;\n"; done = TRUE; } } } out << line << "\n"; } prevFile.close(); tmpFile.close(); QString prevng = wlanopts; QString tmpng = prevng + "-qpe-new"; QString prevwl = wirelessopts; QString tmpwl = prevwl + "-qpe-new"; for (int ng=0; ng<2; ng++) { prevFile.setName(ng ? prevng : prevwl); if ( !prevFile.open( IO_ReadOnly ) ) { if ( ng ) prevng = QString::null; else prevwl = QString::null; break; } tmpFile.setName(ng ? tmpng : tmpwl); if ( !tmpFile.open( IO_WriteOnly ) ) return FALSE; QTextStream win( &prevFile ); QTextStream wout( &tmpFile ); found=FALSE; done=FALSE; QString wep = config.readEntry("WEP"); while ( !win.atEnd() ) { QString line = win.readLine(); QString wline = line.simplifyWhiteSpace(); if ( !done ) { if ( found ) { if ( wline == ";;" ) { done = TRUE; } else { int eq=wline.find("="); QString k,v; if ( eq > 0 ) { k = wline.left(eq); } if ( !k.isNull() ) { QString v; if ( ng ) v = config.readEntry(k); else v = ngToWireless(config,k); line = " " + k + "=" + Global::shellQuote(v); } } } else { if ( wline.left(scheme.length()+7) == scheme + ",*,*,*)" ) { found=TRUE; } else if ( wline == "esac" || wline == "*,*,*,*)" ) { // end - add new entry wout << scheme << ",*,*,*)" << "\n"; const char** f; if ( ng ) { // Not all fields have a GUI, but all are supported // in the wlan configuration files. static const char* txtfields[] = { "WLAN_ENABLE", "USER_MIBS", "dot11ExcludeUnencrypted", "PRIV_GENERATOR", "PRIV_KEY128", "BCNINT", "BASICRATES", "OPRATES", "SSID", "IS_ADHOC", "CHANNEL", "PRIV_GENSTR", "dot11WEPDefaultKey0", "dot11WEPDefaultKey1", "dot11WEPDefaultKey2", "dot11WEPDefaultKey3", "AuthType", "dot11PrivacyInvoked", "dot11WEPDefaultKeyID", 0 }; f = txtfields; } else { static const char* txtfields[] = { "NWID", "CHANNEL", "FREQ", "SENS", "RATE", "RTS", "FRAG", "IWCONFIG", "IWSPY", "IWPRIV", // these need translation "ESSID", "INFO", "MODE", "KEY", 0 }; f = txtfields; } while (*f) { QString v; if ( ng ) v = config.readEntry(*f,""); else v = ngToWireless(config,*f); wout << " " << *f << "=" << Global::shellQuote(v) << "\n"; ++f; } wout << " ;;\n"; done = TRUE; } } } wout << line << "\n"; } prevFile.close(); tmpFile.close(); } //system("cardctl suspend"); system("cardctl eject"); if ( system( "mv " + tmp + " " + prev ) ) retval = FALSE; if ( !prevng.isNull() && system( "mv " + tmpng + " " + prevng ) ) retval = FALSE; if ( !prevwl.isNull() && system( "mv " + tmpwl + " " + prevwl ) ) retval = FALSE;#ifdef USE_SCHEMES if ( retval ) SchemeChanger::changeLanScheme(scheme);#endif //system("cardctl resume"); system("cardctl insert"); return retval;}void Lan::accept(){ if ( writeConfig() ) QDialog::accept();}static QStringList findLans(const QString& skip=QString::null){ QStringList srv = Network::choices(); QStringList lans; for (QStringList::ConstIterator it=srv.begin(); it!=srv.end(); ++it) { QString t = Network::serviceType(*it); if ( t == "lan" ) { Config cfg(*it,Config::File); cfg.setGroup("Info"); QString n = cfg.readEntry("Name"); if ( n != skip ) lans.append(n); } } return lans;}static QString findScheme(const QStringList& lans){ QString scheme; if ( lans.count() > 0 ) { { Config c("Network"); c.setGroup("Lan"); scheme = c.readEntry("Scheme"); } bool found=FALSE; for (QStringList::ConstIterator it=lans.begin(); !found && it!=lans.end(); ++it) { if ( toSchemeId(*it) == scheme ) found = TRUE; } if ( !found ) SchemeChanger::changeLanScheme( lans[0] ); } else { { Config c("Network"); c.setGroup("Lan"); c.writeEntry("Scheme","default"); // No tr } SchemeChanger::changeLanScheme( "default" ); // No tr } return scheme;}LanImpl::LanImpl(){}LanImpl::~LanImpl(){}QRESULT LanImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface ){ *iface = 0; if ( uuid == IID_QUnknown ) *iface = this; else if ( uuid == IID_Network ) *iface = this; else return QS_FALSE; (*iface)->addRef(); return QS_OK;}Q_EXPORT_INTERFACE(){ Q_CREATE_INSTANCE( LanImpl )}bool LanImpl::doProperties( QWidget *parent, Config& cfg ){ Lan dialog(cfg,parent); dialog.showMaximized(); return dialog.exec();}bool LanImpl::create( Config& cfg ){ QStringList lans = findLans(); QString nm = cfg.readEntry("Name"); int n=1; while ( lans.contains(nm) ) { nm = "LAN " + QString::number(++n); } cfg.writeEntry("Name",nm); return TRUE;}bool LanImpl::remove( Config& cfg ){#ifdef USE_SCHEMES // Switch to another cfg.setGroup("Info"); QStringList lans = findLans(cfg.readEntry("Name")); findScheme(lans);#endif return TRUE;}bool LanImpl::start( Config& cfg ){ cfg.setGroup("Info");#ifdef USE_SCHEMES QString scheme = toSchemeId(cfg.readEntry("Name")); system( "cardctl scheme " + scheme ); return TRUE;#else return Lan::writeNetworkOpts( cfg );#endif}bool LanImpl::stop( Config& cfg ){ // Not implemented return !isActive(cfg);}class LanStateImpl : public LanState { Q_OBJECTpublic: LanStateImpl(QWidget* parent, const QString &dev) : LanState(parent), device(dev) { QStringList lans = findLans(); QString scheme = findScheme(lans); if ( lans.count() > 1 ) { services->insertStringList(lans); for(QStringList::Iterator it=lans.begin(); it!=lans.end(); ++it) *it = toSchemeId(*it); services->setCurrentItem(lans.findIndex(scheme)); SchemeChanger* sc = new SchemeChanger(this); QObject::connect(services,SIGNAL(activated(const QString&)), sc,SLOT(changeLanSchemeSlot(const QString&))); } else { services->hide(); services_label->hide(); } if ( !device[(int)device.length()-1].isDigit() ) device += "0"; tid = startTimer(1000); updateDisplay(); } void timerEvent(QTimerEvent*) { updateDisplay(); if ( ipaddress->text()[0] != 'e' ) { // slow down killTimer(tid); tid = startTimer(5000); } } bool ok() const { return !ipaddress->text().isEmpty(); }private slots: void updateDisplay() { QString ipaddr; Process p(QStringList() << "ifconfig" << device); if ( p.exec( "", ipaddr ) ) { ipaddr.replace(QRegExp(".*inet addr:"),""); ipaddr.replace(QRegExp(" .*"),""); ipaddress->setText(ipaddr); } else { ipaddress->setText(""); } }private: int tid; QString device;};QWidget* LanImpl::addStateWidget( QWidget* parent, Config& cfg ) const{ if ( isActive(cfg) ) { cfg.setGroup( "Properties" ); QString dev = cfg.readEntry( "Device" ); LanStateImpl* state = new LanStateImpl(parent, dev); if ( state->ok() ) return state; delete state; } return 0;}bool LanImpl::isActive( Config& cfg ) const{ if ( NetworkInterface::isActive(cfg) ) { QString n,s; { cfg.setGroup("Info"); n = toSchemeId(cfg.readEntry("Name")); Config c("Network"); c.setGroup("Lan"); s = c.readEntry("Scheme"); } if ( s.isNull() ) { s=n; SchemeChanger::changeLanScheme( s ); } if ( s==n ) return TRUE; } return FALSE;}bool LanImpl::isAvailable( Config& cfg ) const{ return NetworkInterface::isAvailable(cfg);}#include "lan.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -