From 9adbe632ec54bf155b9882e4e0b51c293259cdf2 Mon Sep 17 00:00:00 2001 From: benmeyer Date: Fri, 25 Oct 2002 19:32:57 +0000 Subject: Initial --- (limited to 'noncore/settings') diff --git a/noncore/settings/networksettings/interfaces/interface.cpp b/noncore/settings/networksettings/interfaces/interface.cpp new file mode 100644 index 0000000..929b3a1 --- a/dev/null +++ b/noncore/settings/networksettings/interfaces/interface.cpp @@ -0,0 +1,287 @@ +#include "interface.h" +#include +#include +#include +#include +#include + +#define IFCONFIG "/sbin/ifconfig" +#define DHCP_INFO_DIR "/etc/dhcpc" + +#include +#include + +Interface::Interface(QObject * parent, const char * name, bool newSatus): QObject(parent, name), status(newSatus), attached(false), hardwareName("Unknown"), moduleOwner(NULL), macAddress(""), ip("0.0.0.0"), broadcast(""), subnetMask("0.0.0.0"), dhcp(false){ + refresh(); +} + +/** + * Set status + * @param newStatus - the new status + * emit updateInterface + */ +void Interface::setStatus(bool newStatus){ + if(status != newStatus){ + status = newStatus; + refresh(); + } +}; + +/** + * Set if attached or not (802.11 card pulled out for example) + * @param isAttached - if attached + * emit updateInterface + */ +void Interface::setAttached(bool isAttached){ + attached = isAttached; + emit(updateInterface(this)); +}; + +/** + * Set Hardware name + * @param name - the new name + * emit updateInterface + */ +void Interface::setHardwareName(QString name){ + hardwareName = name; + emit(updateInterface(this)); +}; + +/** + * Set Module owner + * @param owner - the new owner + * emit updateInterface + */ +void Interface::setModuleOwner(Module *owner){ + moduleOwner = owner; + emit(updateInterface(this)); +}; + + +/** + * Try to start the interface. + */ +void Interface::start(){ + // check to see if we are already running. + if(true == status) + return; + + int ret = system(QString("%1 %2 up").arg(IFCONFIG).arg(this->name()).latin1()); + // See if it was successfull... + if(ret != 0) + return; + + status = true; + refresh(); +} + +/** + * Try to stop the interface. + */ +void Interface::stop(){ + // check to see if we are already stopped. + if(false == status) + return; + + int ret = system(QString("%1 %2 down").arg(IFCONFIG).arg(this->name()).latin1()); + if(ret != 0) + return; + + status = true; + refresh(); +} + +/** + * Try to restart the interface. + */ +void Interface::restart(){ + stop(); + start(); +} + +/** + * Try to refresh the information about the interface. + * First call ifconfig, then check the dhcp-info file + * @return bool true if successfull. + */ +bool Interface::refresh(){ + // See if we are up. + if(status == false){ + macAddress = ""; + ip = "0.0.0.0"; + subnetMask = "0.0.0.0"; + broadcast = ""; + dhcp = false; + dhcpServerIp = ""; + leaseObtained = ""; + leaseExpires = ""; + emit(updateInterface(this)); + return true; + } + + QString fileName = QString("/tmp/%1_ifconfig_info").arg(this->name()); + int ret = system(QString("%1 %2 > %3").arg(IFCONFIG).arg(this->name()).arg(fileName).latin1()); + if(ret != 0){ + qDebug(QString("Interface: Ifconfig return value: %1, is not 0").arg(ret).latin1()); + return false; + } + + QFile file(fileName); + if (!file.open(IO_ReadOnly)){ + qDebug(QString("Interface: Can't open file: %1").arg(fileName).latin1()); + return false; + } + + // Set to the defaults + macAddress = ""; + ip = "0.0.0.0"; + subnetMask = "0.0.0.0"; + broadcast = ""; + + QTextStream stream( &file ); + QString line; + while ( !stream.eof() ) { + line = stream.readLine(); + if(line.contains("HWaddr")){ + int mac = line.find("HWaddr"); + macAddress = line.mid(mac+7, line.length()); + } + if(line.contains("inet addr")){ + int ipl = line.find("inet addr"); + int space = line.find(" ", ipl+10); + ip = line.mid(ipl+10, space-ipl-10); + } + if(line.contains("Mask")){ + int mask = line.find("Mask"); + subnetMask = line.mid(mask+5, line.length()); + } + if(line.contains("Bcast")){ + int mask = line.find("Bcast"); + int space = line.find(" ", mask+6); + broadcast = line.mid(mask+6, space-mask-6); + } + } + file.close(); + QFile::remove(fileName); + + // DHCP TESTING + // reset DHCP info + dhcpServerIp = ""; + leaseObtained = ""; + leaseExpires = ""; + dhcp = false; + + QString dhcpDirectory(DHCP_INFO_DIR); + QDir d(dhcpDirectory); + if(!d.exists(dhcpDirectory)) + dhcpDirectory = "/var/run"; + + // See if we have + QString dhcpFile(QString(dhcpDirectory+"/dhcpcd-%1.info").arg(this->name())); + // If there is no DHCP information then exit now with no errors. + if(!QFile::exists(dhcpFile)){ + emit(updateInterface(this)); + return true; + } + + file.setName(dhcpFile); + if (!file.open(IO_ReadOnly)){ + qDebug(QString("Interface: Can't open file: %1").arg(dhcpFile).latin1()); + return false; + } + + // leaseTime and renewalTime and used if pid and deamon exe can be accessed. + int leaseTime = 0; + int renewalTime = 0; + + stream.setDevice( &file ); + while ( !stream.eof() ) { + line = stream.readLine(); + if(line.contains("DHCPSIADDR=")) + dhcpServerIp = line.mid(11, line.length()); + if(line.contains("LEASETIME=")) + leaseTime = line.mid(10, line.length()).toInt(); + if(line.contains("RENEWALTIME=")) + renewalTime = line.mid(12, line.length()).toInt(); + } + file.close(); + //qDebug(QString("Interface: leaseTime: %1").arg(leaseTime).latin1()); + //qDebug(QString("Interface: renewalTime: %1").arg(renewalTime).latin1()); + + // Get the pid of the deamond + dhcpFile = (QString(dhcpDirectory+"/dhcpcd-%1.pid").arg(this->name())); + file.setName(dhcpFile); + if (!file.open(IO_ReadOnly)){ + qDebug(QString("Interface: Can't open file: %1").arg(dhcpFile).latin1()); + return false; + } + + int pid = -1; + stream.setDevice( &file ); + while ( !stream.eof() ) { + line = stream.readLine(); + pid = line.toInt(); + } + file.close(); + + if( pid == -1){ + qDebug("Interface: Could not get pid of dhcpc deamon."); + return false; + } + + // Get the start running time of the deamon + fileName = (QString("/proc/%1/stat").arg(pid)); + file.setName(fileName); + stream.setDevice( &file ); + if (!file.open(IO_ReadOnly)){ + qDebug(QString("Interface: Can't open file: %1").arg(fileName).latin1()); + return false; + } + while ( !stream.eof() ) { + line = stream.readLine(); + } + file.close(); + long time = 0; + // Grab the start time + // pid com state ppid pgrp session tty_nr tpgid flags + sscanf(line.latin1(), "%*d %*s %*c %*d %*d %*d %*d %*d %*u " + // minflt cminflt majflt cmajflt utime stime cutime cstime priority + "%*u %*u %*u %*u %*u %*u %*d %*d %*d " + // nice 0 itrealvalue starttime + "%*d %*d %*d %lu", (long*) &time); + time = time/100; + + QDateTime datetime(QDateTime::currentDateTime()); + + // Get the uptime of the computer. + QFile f("/proc/uptime"); + if ( f.open(IO_ReadOnly) ) { // file opened successfully + QTextStream t( &f ); // use a text stream + int sec = 0; + t >> sec; + datetime = datetime.addSecs((-1*sec)); + f.close(); + } + else{ + qDebug("Interface: Can't open /proc/uptime to retrive uptime."); + return false; + } + + datetime = datetime.addSecs(time); + //qDebug(QString("Interface: %1 %2").arg(datetime.toString()).arg(pid).latin1()); + + // Calculate the start and renew times + leaseObtained = datetime.toString(); + + // Calculate the start and renew times + datetime = datetime.addSecs(leaseTime); + leaseExpires = datetime.toString(); + + dhcp = true; + + emit(updateInterface(this)); + return true; +} + +// interface.cpp + diff --git a/noncore/settings/networksettings/interfaces/interface.h b/noncore/settings/networksettings/interfaces/interface.h new file mode 100644 index 0000000..dc9c6d3 --- a/dev/null +++ b/noncore/settings/networksettings/interfaces/interface.h @@ -0,0 +1,71 @@ +#ifndef INTERFACE_H +#define INTERFACE_H + +#include +#include + +class Module; + +class Interface : public QObject{ + Q_OBJECT + +signals: + void updateInterface(Interface *i); + +public: + Interface(QObject * parent=0, const char * name= "unknown", bool status = false); + virtual ~Interface(){}; + + virtual QString getInterfaceName(){ QString n(this->name()); return n; }; + + virtual bool getStatus(){ return status; }; + virtual void setStatus(bool newStatus); + + virtual bool isAttached(){ return attached; }; + virtual void setAttached(bool isAttached=false); + + virtual QString getHardwareName(){ return hardwareName; }; + virtual void setHardwareName(QString name="Unknown"); + + virtual Module* getModuleOwner(){ return moduleOwner; }; + virtual void setModuleOwner(Module *owner=NULL); + + // inet information. + QString getMacAddress(){ return macAddress; }; + QString getIp(){ return ip; }; + QString getSubnetMask(){ return subnetMask; }; + QString getBroadcast(){ return broadcast; }; + bool isDhcp(){ return dhcp; }; + QString getDhcpServerIp(){ return dhcpServerIp; }; + QString getLeaseObtained(){ return leaseObtained; }; + QString getLeaseExpires(){ return leaseExpires; }; + +public slots: + bool refresh(); + void start(); + void stop(); + void restart(); + +private: + // Interface information + bool status; + bool attached; + QString hardwareName; + Module *moduleOwner; + + // Network information + QString macAddress; + QString ip; + QString broadcast; + QString subnetMask; + bool dhcp; + QString dhcpServerIp; + QString leaseObtained; + QString leaseExpires; + +}; + +#endif + +// interface.h + diff --git a/noncore/settings/networksettings/interfaces/interfaceadvanced.ui b/noncore/settings/networksettings/interfaces/interfaceadvanced.ui new file mode 100644 index 0000000..0ec67c2 --- a/dev/null +++ b/noncore/settings/networksettings/interfaces/interfaceadvanced.ui @@ -0,0 +1,344 @@ + +InterfaceAdvanced + + QWidget + + name + InterfaceAdvanced + + + geometry + + 0 + 0 + 214 + 286 + + + + maximumSize + + 240 + 32767 + + + + caption + Advanced Interface Information + + + + margin + 11 + + + spacing + 6 + + + QLabel + + name + TextLabel1 + + + text + MAC Address + + + + QLabel + + name + interfaceName + + + frameShape + Panel + + + frameShadow + Sunken + + + text + eth0 + + + + QLabel + + name + TextLabel3 + + + text + IP Address + + + + QLabel + + name + macAddressLabel + + + frameShape + Panel + + + frameShadow + Sunken + + + text + 00:00:00:00:00:00 + + + + QLabel + + name + TextLabel7 + + + text + Interface + + + + QLabel + + name + TextLabel4 + + + enabled + true + + + text + Subnet Mask + + + + QLabel + + name + ipAddressLabel + + + frameShape + Panel + + + frameShadow + Sunken + + + text + 0.0.0.0 + + + + QLabel + + name + subnetMaskLabel + + + frameShape + Panel + + + frameShadow + Sunken + + + text + 0.0.0.0 + + + + QLabel + + name + TextLabel2 + + + text + Broadcast + + + + QLabel + + name + broadcastLabel + + + frameShape + Panel + + + frameShadow + Sunken + + + + QGroupBox + + name + dhcpInformation + + + title + DHCP Information + + + + margin + 11 + + + spacing + 6 + + + QLabel + + name + TextLabel6 + + + text + DHCP Server + + + + QLabel + + name + leaseExpiresLabel + + + frameShape + Panel + + + frameShadow + Sunken + + + text + + + + + QLabel + + name + leaseObtainedLabel + + + frameShape + Panel + + + frameShadow + Sunken + + + text + + + + + QLabel + + name + TextLabel9 + + + text + Lease Expires + + + + QLabel + + name + TextLabel8 + + + text + Lease Obtained + + + + QLabel + + name + dhcpServerLabel + + + frameShape + Panel + + + frameShadow + Sunken + + + text + + + + + + + + name + Spacer2 + + + orientation + Vertical + + + sizeType + Expanding + + + sizeHint + + 20 + 20 + + + + + + + + QWidget +
qwidget.h
+ + 100 + 100 + + 0 + + 7 + 7 + + image0 +
+
+ + + image0 + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
diff --git a/noncore/settings/networksettings/interfaces/interfaceinformation.ui b/noncore/settings/networksettings/interfaces/interfaceinformation.ui new file mode 100644 index 0000000..2838d19 --- a/dev/null +++ b/noncore/settings/networksettings/interfaces/interfaceinformation.ui @@ -0,0 +1,343 @@ + +InterfaceInformation + + QWidget + + name + InterfaceInformation + + + geometry + + 0 + 0 + 219 + 255 + + + + caption + Interface Information + + + + margin + 11 + + + spacing + 6 + + + QLayoutWidget + + name + Layout1 + + + + margin + 0 + + + spacing + 6 + + + QPushButton + + name + refreshButton + + + text + &Refresh + + + + QPushButton + + name + stopButton + + + text + S&top + + + + QPushButton + + name + restartButton + + + text + R&estart + + + + QPushButton + + name + startButton + + + text + &Start + + + + + + Line + + name + Line1 + + + orientation + Horizontal + + + + QLabel + + name + TextLabel22 + + + text + IP Address + + + + QLabel + + name + TextLabel23 + + + text + Subnet Mask + + + + QLabel + + name + TextLabel21 + + + text + MAC Address + + + + QLabel + + name + TextLabel24 + + + frameShape + MShape + + + frameShadow + MShadow + + + text + Broadcast + + + + QLabel + + name + subnetMaskLabel + + + frameShape + Panel + + + frameShadow + Sunken + + + text + 0.0.0.0 + + + + QLabel + + name + macAddressLabel + + + frameShape + Panel + + + frameShadow + Sunken + + + text + 00:00:00:00:00:00 + + + + QLabel + + name + broadcastLabel + + + frameShape + Panel + + + frameShadow + Sunken + + + text + + + + + QLabel + + name + ipAddressLabel + + + frameShape + Panel + + + frameShadow + Sunken + + + text + 0.0.0.0 + + + + + name + Spacer18 + + + orientation + Vertical + + + sizeType + Expanding + + + sizeHint + + 20 + 20 + + + + + QLayoutWidget + + name + Layout2 + + + + margin + 0 + + + spacing + 6 + + + + name + Spacer10 + + + orientation + Horizontal + + + sizeType + Expanding + + + sizeHint + + 20 + 20 + + + + + QPushButton + + name + advancedButton + + + text + View &Advanced Information + + + + + + Line + + name + Line5 + + + orientation + Horizontal + + + + + + + QWidget +
qwidget.h
+ + 100 + 100 + + 0 + + 7 + 7 + + image0 +
+
+ + + image0 + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + + + startButton + stopButton + refreshButton + restartButton + advancedButton + +
diff --git a/noncore/settings/networksettings/interfaces/interfaceinformationimp.cpp b/noncore/settings/networksettings/interfaces/interfaceinformationimp.cpp new file mode 100644 index 0000000..43483fb --- a/dev/null +++ b/noncore/settings/networksettings/interfaces/interfaceinformationimp.cpp @@ -0,0 +1,70 @@ +#include "interfaceinformationimp.h" +#include "interfaceadvanced.h" + +#include +#include +#include +#include + +/** + * Constructor for the InterfaceInformationImp class. This class pretty much + * just display's information about the interface that is passed to it. + */ +InterfaceInformationImp::InterfaceInformationImp(QWidget *parent, const char *name, Interface *i, WFlags f):InterfaceInformation(parent, name, f){ + assert(i); + + interface = i; + connect(i, SIGNAL(updateInterface(Interface *)), this, SLOT(updateInterface(Interface *))); + updateInterface(interface); + connect(startButton, SIGNAL(clicked()), interface, SLOT(start())); + connect(stopButton, SIGNAL(clicked()), interface, SLOT(stop())); + connect(restartButton, SIGNAL(clicked()), interface, SLOT(restart())); + connect(refreshButton, SIGNAL(clicked()), interface, SLOT(refresh())); + connect(advancedButton, SIGNAL(clicked()), this, SLOT(advanced())); + +} + +/** + * Update the interface information and buttons. + * @param Intarface *i the interface to update (should be the one we already + * know about). + */ +void InterfaceInformationImp::updateInterface(Interface *i){ + if(interface->getStatus()){ + startButton->setEnabled(false); + stopButton->setEnabled(true); + restartButton->setEnabled(true); + } + else{ + startButton->setEnabled(true); + stopButton->setEnabled(false); + restartButton->setEnabled(false); + } + macAddressLabel->setText(interface->getMacAddress()); + ipAddressLabel->setText(interface->getIp()); + subnetMaskLabel->setText(interface->getSubnetMask()); + broadcastLabel->setText(interface->getBroadcast()); +} + +/** + * Create the advanced widget. Fill it with the current interface's information. + * Display it. + */ +void InterfaceInformationImp::advanced(){ + InterfaceAdvanced *a = new InterfaceAdvanced(0, "InterfaceAdvanced"); + a->interfaceName->setText(interface->getInterfaceName()); + a->macAddressLabel->setText(interface->getMacAddress()); + a->ipAddressLabel->setText(interface->getIp()); + a->subnetMaskLabel->setText(interface->getSubnetMask()); + a->broadcastLabel->setText(interface->getBroadcast()); + a->dhcpServerLabel->setText(interface->getDhcpServerIp()); + a->leaseObtainedLabel->setText(interface->getLeaseObtained()); + a->leaseExpiresLabel->setText(interface->getLeaseExpires()); + a->dhcpInformation->setEnabled(interface->isDhcp()); + + a->showMaximized(); + a->show(); +} + +// infoimp.cpp + diff --git a/noncore/settings/networksettings/interfaces/interfaceinformationimp.h b/noncore/settings/networksettings/interfaces/interfaceinformationimp.h new file mode 100644 index 0000000..42213cc --- a/dev/null +++ b/noncore/settings/networksettings/interfaces/interfaceinformationimp.h @@ -0,0 +1,27 @@ +#ifndef INTERFACEINFORMATIONIMP_H +#define INTERFACEINFORMATIONIMP_H + +#include "interfaceinformation.h" +#include "interface.h" + +class InterfaceInformationImp : public InterfaceInformation { + +Q_OBJECT + +public: + InterfaceInformationImp(QWidget *parent=0, const char *name=0, Interface *i=0, WFlags f=0); + ~InterfaceInformationImp(){}; + +private slots: + void advanced(); + void updateInterface(Interface *i); + +private: + Interface *interface; + +}; + +#endif + +// addserviceimp.h + diff --git a/noncore/settings/networksettings/interfaces/interfaces.cpp b/noncore/settings/networksettings/interfaces/interfaces.cpp new file mode 100644 index 0000000..377a6db --- a/dev/null +++ b/noncore/settings/networksettings/interfaces/interfaces.cpp @@ -0,0 +1,638 @@ +#include "interfaces.h" + +#include +#include +#include + +#define AUTO "auto" +#define IFACE "iface" +#define MAPPING "mapping" + +/** + * Constructor. Reads in the interfaces file and then split the file up by + * the \n for interfaces variable. + * @param useInterfacesFile if an interface file other then the default is + * desired to be used it should be passed in. + */ +Interfaces::Interfaces(QString useInterfacesFile){ + acceptedFamily.append(INTERFACES_FAMILY_INET); + acceptedFamily.append(INTERFACES_FAMILY_IPX); + acceptedFamily.append(INTERFACES_FAMILY_INET6); + + interfacesFile = useInterfacesFile; + QFile file(interfacesFile); + if (!file.open(IO_ReadOnly)){ + qDebug(QString("Interfaces: Can't open file: %1 for reading.").arg(interfacesFile).latin1()); + currentIface = interfaces.end(); + currentMapping = interfaces.end(); + return; + } + QTextStream stream( &file ); + QString line; + while ( !stream.eof() ) { + line += stream.readLine(); + line += "\n"; + } + file.close(); + interfaces = QStringList::split("\n", line, true); + + currentIface = interfaces.end(); + currentMapping = interfaces.end(); +} + + +/** + * Get a list of all interfaces in the interface file. Usefull for + * hardware that is not currently connected such as an 802.11b card + * not plugged in, but configured for when it is plugged in. + * @return Return string list of interfaces. + **/ +QStringList Interfaces::getInterfaceList(){ + QStringList list; + for ( QStringList::Iterator it = interfaces.begin(); it != interfaces.end(); ++it ) { + QString line = (*it).simplifyWhiteSpace(); + if(line.contains(IFACE) && line.at(0) != '#'){ + line = line.mid(QString(IFACE).length() +1, line.length()); + line = line.simplifyWhiteSpace(); + int findSpace = line.find(" "); + if( findSpace >= 0){ + line = line.mid(0, findSpace); + list.append(line); + } + } + } + return list; +} + +/** + * Find out if interface is in an "auto" group or not. + * Report any duplicates such as eth0 being in two differnt auto's + * @param interface interface to check to see if it is on or not. + * @return true is interface is in auto + */ +bool Interfaces::isAuto(QString interface){ + QStringList autoLines = interfaces.grep(QRegExp(AUTO)); + QStringList awi = autoLines.grep(QRegExp(interface)); + if(awi.count() > 1) + qDebug(QString("Interfaces: Found more then auto group with interface: %1.").arg(interface).latin1()); + if(awi.count() < 1) + return false; + return true; +} + +/** + * Attempt to set the auto option for interface to setAuto. + * @param interface the interface to set + * @param setAuto the value to set interface to. + * @return false if already set to setAuto. + * */ +bool Interfaces::setAuto(QString interface, bool setAuto){ + // Don't need to set it if it is already set. + if(isAuto(interface) == setAuto) + return false; + + bool changed = false; + for ( QStringList::Iterator it = interfaces.begin(); it != interfaces.end(); ++it ) { + if((*it).contains(AUTO)){ + //We know that they are not in any group so let add to this auto. + if(setAuto){ + (*it) = (*it) += " " + interface; + // Don't care to have such thins as: auto eth0 lo usb0 + (*it) = (*it).simplifyWhiteSpace(); + changed = true; + break; + } + else{ + if((*it).contains(interface)){ + (*it) = (*it).replace(QRegExp(interface), ""); + // clean up + QString line = (*it).simplifyWhiteSpace(); + line = line.replace(QRegExp(" "),""); + if(line == AUTO) + (*it) = ""; + changed = true; + // Don't break because we want to make sure we remove all cases. + } + } + } + } + if(changed == false){ + if(setAuto == true) + interfaces.append(QString(AUTO" %1").arg(interface)); + else{ + qDebug(QString("Interfaces: Can't set interface %1 auto to false sense it is already false.").arg(interface).latin1()); + } + } + return true; +} + +/** + * Set the current interface to interface. This needs to be done before you + * can call getFamily(), getMethod, and get/setOption(). + * @param interface the name of the interface to set. All whitespace is + * removed from the interface name. + * @return bool true if it is successfull. + */ +bool Interfaces::setInterface(QString interface){ + interface = interface.simplifyWhiteSpace(); + interface = interface.replace(QRegExp(" "), ""); + return setStanza(IFACE, interface, currentIface); +} + +/** + * A quick helper funtion to see if the current interface is set. + * @return bool true if set, false otherwise. + */ +bool Interfaces::isInterfaceSet(){ + return (currentIface != interfaces.end()); +} + +/** + * Add a new interface of with the settings - family and method + * @param interface the name of the interface to set. All whitespace is + * removed from the interface name. + * @param family the family of this interface inet or inet, ipx or inet6 + * Must of one of the families defined in interfaces.h + * @param method for the family. see interfaces man page for family methods. + * @return true if successfull. + */ +bool Interfaces::addInterface(QString interface, QString family, QString method){ + if(acceptedFamily.contains(family)==0) + return false; + interface = interface.simplifyWhiteSpace(); + interface = interface.replace(QRegExp(" "), ""); + interfaces.append(""); + interfaces.append(QString(IFACE " %1 %2 %3").arg(interface).arg(family).arg(method)); + return true; +} + +/** + * Copies interface with name interface to name newInterface + * @param newInterface name of the new interface. + * @return bool true if successfull + */ +bool Interfaces::copyInterface(QString interface, QString newInterface){ + if(!setInterface(interface)) return false; + + QStringList::Iterator it = currentIface; + it++; + + bool error; + addInterface(newInterface, getInterfaceFamily(error), getInterfaceMethod(error)); + if(!setInterface(newInterface)) return false; + QStringList::Iterator newIface = currentIface; + newIface++; + + for ( it; it != interfaces.end(); ++it ){ + if(((*it).contains(IFACE) || (*it).contains(MAPPING) || (*it).contains(AUTO))) + break; + newIface = interfaces.insert(newIface, *it); + } + + return true; +} + +/** + * Remove the currently selected interface and all of its options. + * @return bool if successfull or not. + */ +bool Interfaces::removeInterface(){ + if(currentIface == interfaces.end()) + return false; + (*currentIface) = ""; + return removeAllInterfaceOptions(); +} + +/** + * Gets the hardware name of the interface that is currently selected. + * @return QString name of the hardware interface (eth0, usb2, wlan1...). + * @param error set to true if any error occurs, false otherwise. + */ +QString Interfaces::getInterfaceName(bool &error){ + if(currentIface == interfaces.end()){ + error = true; + return QString(); + } + QString line = (*currentIface); + line = line.mid(QString(IFACE).length() +1, line.length()); + line = line.simplifyWhiteSpace(); + int findSpace = line.find(" "); + if( findSpace < 0){ + error = true; + return QString(); + } + error = false; + return line.mid(0, findSpace); +} + +/** + * Gets the family name of the interface that is currently selected. + * @return QString name of the family (inet, inet6, ipx). + * @param error set to true if any error occurs, false otherwise. + */ +QString Interfaces::getInterfaceFamily(bool &error){ + QString name = getInterfaceName(error); + if(error){ + error = true; + return QString(); + } + QString line = (*currentIface); + line = line.mid(QString(IFACE).length() +1, line.length()); + line = line.mid(name.length()+1, line.length()); + line = line.simplifyWhiteSpace(); + int findSpace = line.find(" "); + if( findSpace < 0){ + error = true; + return QString(); + } + error = false; + return line.mid(0, findSpace); +} + +/** + * Gets the method of the interface that is currently selected. + * @return QString name of the method such as staic or dhcp. + * See the man page of interfaces for possible methods depending on the family. + * @param error set to true if any error occurs, false otherwise. + */ +QString Interfaces::getInterfaceMethod(bool &error){ + QString name = getInterfaceName(error); + if(error){ + error = true; + return QString(); + } + QString family = getInterfaceFamily(error); + if(error){ + error = true; + return QString(); + } + QString line = (*currentIface); + line = line.mid(QString(IFACE).length()+1, line.length()); + line = line.mid(name.length()+1, line.length()); + line = line.mid(family.length()+1, line.length()); + line = line.simplifyWhiteSpace(); + error = false; + return line; +} + +/** + * Sets the interface name to newName. + * @param newName the new name of the interface. All whitespace is removed. + * @return bool true if successfull. + */ +bool Interfaces::setInterfaceName(QString newName){ + if(currentIface == interfaces.end()) + return false; + newName = newName.simplifyWhiteSpace(); + newName = newName.replace(QRegExp(" "), ""); + bool returnValue = false; + (*currentIface) = QString("iface %1 %2 %3").arg(newName).arg(getInterfaceFamily(returnValue)).arg(getInterfaceMethod(returnValue)); + return !returnValue; +} + +/** + * Sets the interface family to newName. + * @param newName the new name of the interface. Must be one of the families + * defined in the interfaces.h file. + * @return bool true if successfull. + */ +bool Interfaces::setInterfaceFamily(QString newName){ + if(currentIface == interfaces.end()) + return false; + if(acceptedFamily.contains(newName)==0) + return false; + bool returnValue = false; + (*currentIface) = QString("iface %1 %2 %3").arg(getInterfaceName(returnValue)).arg(newName).arg(getInterfaceMethod(returnValue)); + return !returnValue; +} + +/** + * Sets the interface method to newName + * @param newName the new name of the interface + * @return bool true if successfull. + */ +bool Interfaces::setInterfaceMethod(QString newName){ + if(currentIface == interfaces.end()) + return false; + bool returnValue = false; + (*currentIface) = QString("iface %1 %2 %3").arg(getInterfaceName(returnValue)).arg(getInterfaceFamily(returnValue)).arg(newName); + return !returnValue; +} + +/** + * Get a value for an option in the currently selected interface. For example + * calling getInterfaceOption("address") on the following stanza would + * return 192.168.1.1. + * iface eth0 static + * address 192.168.1.1 + * @param option the options to get the value. + * @param error set to true if any error occurs, false otherwise. + * @return QString the options value. QString::null if error == true + */ +QString Interfaces::getInterfaceOption(QString option, bool &error){ + return getOption(currentIface, option, error); +} + +/** + * Set a value for an option in the currently selected interface. If option + * doesn't exist then it is added along with the value. + * @param option the options to set the value. + * @param value the value that option should be set to. + * @param error set to true if any error occurs, false otherwise. + * @return QString the options value. QString::null if error == true + */ +bool Interfaces::setInterfaceOption(QString option, QString value){ + return setOption(currentIface, option, value); +} + +/** + * Removes a value for an option in the currently selected interface. + * @param option the options to set the value. + * @param value the value that option should be set to. + * @param error set to true if any error occurs, false otherwise. + * @return QString the options value. QString::null if error == true + */ +bool Interfaces::removeInterfaceOption(QString option, QString value){ + return removeOption(currentIface, option, value); +} + +/** + * Removes all of the options from the currently selected interface. + * @return bool error if if successfull + */ +bool Interfaces::removeAllInterfaceOptions(){ + return removeAllOptions(currentIface); +} + +/** + * Set the current map to interface's map. This needs to be done before you + * can call addMapping(), set/getMap(), and get/setScript(). + * @param interface the name of the interface to set. All whitespace is + * removed from the interface name. + * @return bool true if it is successfull. + */ +bool Interfaces::setMapping(QString interface){ + interface = interface.simplifyWhiteSpace(); + interface = interface.replace(QRegExp(" "), ""); + return setStanza(MAPPING, interface, currentMapping); +} + +/** + * Adds a new Mapping to the interfaces file with interfaces. + * @param interface the name(s) of the interfaces to set to this mapping + */ +void Interfaces::addMapping(QString option){ + interfaces.append(""); + interfaces.append(QString(MAPPING " %1").arg(option)); +} + +/** + * Remove the currently selected map and all of its options. + * @return bool if successfull or not. + */ +bool Interfaces::removeMapping(){ + if(currentMapping == interfaces.end()) + return false; + (*currentMapping) = ""; + return removeAllOptions(currentMapping); +} + +/** + * Set a map option within a mapping. + * @param map map to use + * @param value value to go with map + * @return bool true if it is successfull. + */ +bool Interfaces::setMap(QString map, QString value){ + return setOption(currentMapping, map, value); +} + +/** + * Removes a map option within a mapping. + * @param map map to use + * @param value value to go with map + * @return bool true if it is successfull. + */ +bool Interfaces::removeMap(QString map, QString value){ + return removeOption(currentMapping, map, value); +} + +/** + * Get a map value within a mapping. + * @param map map to get value of + * @param bool true if it is successfull. + * @return value that goes to the map + */ +QString Interfaces::getMap(QString map, bool &error){ + return getOption(currentMapping, map, error); +} + +/** + * Sets a script value of the current mapping to argument. + * @param argument the script name. + * @return true if successfull. + */ +bool Interfaces::setScript(QString argument){ + return setOption(currentMapping, "script", argument); +} + +/** + * @param error true if could not retrieve the current script argument. + * @return QString the argument of the script for the current mapping. + */ +QString Interfaces::getScript(bool &error){ + return getOption(currentMapping, "script", error); +} + +/** + * Helper function used to parse through the QStringList and put pointers in + * the correct place. + * @param stanza The stanza (auto, iface, mapping) to look for. + * @param option string that must be in the stanza's main line. + * @param interator interator to place at location of stanza if successfull. + * @return bool true if the stanza is found. + */ +bool Interfaces::setStanza(QString stanza, QString option, QStringList::Iterator &iterator){ + bool found = false; + iterator = interfaces.end(); + for ( QStringList::Iterator it = interfaces.begin(); it != interfaces.end(); ++it ) { + QString line = (*it).simplifyWhiteSpace(); + if(line.contains(stanza) && line.contains(option) && line.at(0) != '#'){ + uint point = line.find(option); + bool valid = true; + if(point > 0){ + // There are more chars in the line. check +1 + if(line.at(point-1) != ' ') + valid = false; + } + point += option.length(); + if(point < line.length()-1){ + // There are more chars in the line. check -1 + if(line.at(point) != ' ') + valid = false; + } + if(valid){ + if(found == true){ + qDebug(QString("Interfaces: Found multiple stanza's for search: %1 %2").arg(stanza).arg(option).latin1()); + } + found = true; + iterator = it; + } + } + } + return found; +} + +/** + * Sets a value of an option in a stanza + * @param start the start of the stanza + * @param option the option to use when setting value. + * @return bool true if successfull, false otherwise. + */ +bool Interfaces::setOption(QStringList::Iterator start, QString option, QString value){ + if(start == interfaces.end()) + return false; + + bool found = false; + for ( QStringList::Iterator it = start; it != interfaces.end(); ++it ) { + if(((*it).contains(IFACE) || (*it).contains(MAPPING) || (*it).contains(AUTO)) && it != start){ + if(!found && value != ""){ + // Got to the end of the stanza without finding it, so append it. + interfaces.insert(--it, QString("\t%1 %2").arg(option).arg(value)); + } + found = true; + break; + } + if((*it).contains(option) && it != start && (*it).at(0) != '#'){ + // Found it in stanza so replace it. + if(found) + qDebug(QString("Interfaces: Set Options found more then one value for option: %1 in stanza: %1").arg(option).arg((*start)).latin1()); + found = true; + (*it) = QString("\t%1 %2").arg(option).arg(value); + } + } + if(!found){ + QStringList::Iterator p = start; + interfaces.insert(++p, QString("\t%1 %2").arg(option).arg(value)); + found = true; + } + return found; +} +/** + * Removes a option in a stanza + * @param start the start of the stanza + * @param option the option to use when setting value. + * @return bool true if successfull, false otherwise. + */ +bool Interfaces::removeOption(QStringList::Iterator start, QString option, QString value){ + if(start == interfaces.end()) + return false; + + bool found = false; + for ( QStringList::Iterator it = start; it != interfaces.end(); ++it ) { + if(((*it).contains(IFACE) || (*it).contains(MAPPING) || (*it).contains(AUTO)) && it != start){ + // got to the end without finding it + break; + } + if((*it).contains(option) && (*it).contains(value) && it != start && (*it).at(0) != '#'){ + // Found it in stanza so replace it. + if(found) + qDebug(QString("Interfaces: Set Options found more then one value for option: %1 in stanza: %1").arg(option).arg((*start)).latin1()); + found = true; + (*it) = ""; + } + } + return found; +} + +/** + * Removes all options in a stanza + * @param start the start of the stanza + * @return bool true if successfull, false otherwise. + */ +bool Interfaces::removeAllOptions(QStringList::Iterator start){ + if(start == interfaces.end()) + return false; + + QStringList::Iterator it = start; + it = ++it; + for (it; it != interfaces.end(); ++it ) { + if(((*it).contains(IFACE) || (*it).contains(MAPPING) || (*it).contains(AUTO)) && it != start){ + break; + } + it = interfaces.remove(it); + it = --it; + } + // Leave a space between this interface and the next. + interfaces.insert(it, QString("")); + return true; +} + +/** + * Gets a value of an option in a stanza + * @param start the start of the stanza + * @param option the option to use when getting the value. + * @param bool true if errors false otherwise. + * @return QString the value of option QString::null() if error == true. + */ +QString Interfaces::getOption(QStringList::Iterator start, QString option, bool &error){ + if(start == interfaces.end()){ + error = false; + return QString(); + } + + QString value; + bool found = false; + for ( QStringList::Iterator it = start; it != interfaces.end(); ++it ) { + if(((*it).contains(IFACE) || (*it).contains(MAPPING) || (*it).contains(AUTO)) && it != start){ + break; + } + if((*it).contains(option) && (*it).at(0) != '#'){ + if(found) + qDebug(QString("Interfaces: Get Options found more then one value: %1 for option: %2 in stanza %3").arg((*it)).arg(option).arg((*start)).latin1()); + found = true; + QString line = (*it).simplifyWhiteSpace(); + int space = line.find(" ", option.length()); + if(space != -1) + value = line.mid(space+1, line.length()); + else + qDebug(QString("Interfaces: Option %1 with no value").arg(option).latin1()); + } + } + error = !found; + return value; +} + +/** + * Write out the interfaces file to the file passed into the constructor. + * Removes any excess blank lines over 1 line long. + * @return bool true if successfull, false if not. + */ +bool Interfaces::write(){ + QFile::remove(interfacesFile); + QFile file(interfacesFile); + + if (!file.open(IO_ReadWrite)){ + qDebug(QString("Interfaces: Can't open file: %1 for writing.").arg(interfacesFile).latin1()); + return false; + } + QTextStream stream( &file ); + int whiteSpaceCount = 0; + for ( QStringList::Iterator it = interfaces.begin(); it != interfaces.end(); ++it ) { + QString line = (*it).simplifyWhiteSpace(); + line = line.replace(QRegExp(" "),""); + if(line.length() == 0) + whiteSpaceCount++; + else + whiteSpaceCount = 0; + if(whiteSpaceCount < 2){ + qDebug((*it).latin1()); + stream << (*it) << '\n'; + } + } + file.close(); + return true; +} + +// interfaces.cpp + diff --git a/noncore/settings/networksettings/interfaces/interfaces.h b/noncore/settings/networksettings/interfaces/interfaces.h new file mode 100644 index 0000000..e09ea71 --- a/dev/null +++ b/noncore/settings/networksettings/interfaces/interfaces.h @@ -0,0 +1,76 @@ +#ifndef INTERFACES_H +#define INTERFACES_H + +#include +#include + +#define INTERFACES_LOOPBACK "loopback" + +#define INTERFACES_FAMILY_INET "inet" +#define INTERFACES_FAMILY_IPX "ipx" +#define INTERFACES_FAMILY_INET6 "inet6" + +#define INTERFACES_METHOD_DHCP "dhcp" +#define INTERFACES_METHOD_STATIC "static" +#define INTERFACES_METHOD_PPP "ppp" + +/** + * This class provides a clean frontend for parsing the network interfaces file. + * It provides helper functions to minipulate the options within the file. + * See the interfaces man page for the syntax rules. + */ +class Interfaces { + +public: + Interfaces(QString useInterfacesFile = "/etc/network/interfaces"); + QStringList getInterfaceList(); + + bool isAuto(QString interface); + bool setAuto(QString interface, bool setAuto); + + bool removeInterface(); + bool addInterface(QString interface, QString family, QString method); + bool copyInterface(QString oldInterface, QString newInterface); + bool setInterface(QString interface); + bool isInterfaceSet(); + QString getInterfaceName(bool &error); + bool setInterfaceName(QString newName); + QString getInterfaceFamily(bool &error); + bool setInterfaceFamily(QString newName); + QString getInterfaceMethod(bool &error); + bool setInterfaceMethod(QString newName); + QString getInterfaceOption(QString option, bool &error); + bool setInterfaceOption(QString option, QString value); + bool removeInterfaceOption(QString option, QString value); + bool removeAllInterfaceOptions(); + + bool setMapping(QString interface); + bool removeMapping(); + void addMapping(QString options); + bool setMap(QString map, QString value); + bool removeMap(QString map, QString value); + QString getMap(QString map, bool &error); + bool setScript(QString); + QString getScript(bool &error); + + bool write(); + +private: + bool setStanza(QString stanza, QString option,QStringList::Iterator &iterator); + bool setOption(QStringList::Iterator start, QString option, QString value); + bool removeOption(QStringList::Iterator start, QString option, QString value); + QString getOption(QStringList::Iterator start, QString option, bool &error); + bool removeAllOptions(QStringList::Iterator start); + + QString interfacesFile; + QStringList interfaces; + QStringList::Iterator currentIface; + QStringList::Iterator currentMapping; + + QStringList acceptedFamily; +}; + +#endif + +// interfaces + diff --git a/noncore/settings/networksettings/interfaces/interfaces.pro b/noncore/settings/networksettings/interfaces/interfaces.pro new file mode 100644 index 0000000..fb13278 --- a/dev/null +++ b/noncore/settings/networksettings/interfaces/interfaces.pro @@ -0,0 +1,12 @@ +TEMPLATE = lib +CONFIG += qt warn_on release +#CONFIG += qt warn_on debug +DESTDIR = $(OPIEDIR)/plugins/networksetup +HEADERS = interface.h interfaceinformationimp.h interfaces.h interfacesetupimp.h +SOURCES = interface.cpp interfaces.cpp interfaceinformationimp.cpp interfacesetupimp.cpp +INCLUDEPATH += $(OPIEDIR)/include ../ +DEPENDPATH += $(OPIEDIR)/include +LIBS += -lqpe +INTERFACES = interfaceadvanced.ui interfaceinformation.ui interfacesetup.ui +TARGET = interfaces +VERSION = 1.0.0 diff --git a/noncore/settings/networksettings/interfaces/interfacesetup.ui b/noncore/settings/networksettings/interfaces/interfacesetup.ui new file mode 100644 index 0000000..ab8e413 --- a/dev/null +++ b/noncore/settings/networksettings/interfaces/interfacesetup.ui @@ -0,0 +1,284 @@ + +InterfaceSetup + + QWidget + + name + InterfaceSetup + + + geometry + + 0 + 0 + 290 + 280 + + + + caption + Interface Configuration + + + + margin + 11 + + + spacing + 6 + + + QCheckBox + + name + autoStart + + + text + Automatically bring up + + + + QLayoutWidget + + name + Layout9 + + + + margin + 0 + + + spacing + 6 + + + QCheckBox + + name + dhcpCheckBox + + + text + DHCP + + + checked + true + + + + QLabel + + name + leaseHoursLabel + + + text + Requested Lease + + + + QSpinBox + + name + leaseTime + + + suffix + hours + + + maxValue + 87600 + + + minValue + 1 + + + value + 168 + + + + + + QGroupBox + + name + staticGroupBox + + + enabled + false + + + frameShape + Box + + + frameShadow + Sunken + + + title + Static Ip Configuration + + + + margin + 11 + + + spacing + 6 + + + QLabel + + name + TextLabel5 + + + text + Subnet Mask + + + + QLineEdit + + name + gatewayEdit + + + + QLineEdit + + name + subnetMaskEdit + + + + QLineEdit + + name + ipAddressEdit + + + + QLabel + + name + TextLabel2 + + + text + First DNS + + + + QLabel + + name + TextLabel4 + + + text + IP Address + + + + QLabel + + name + TextLabel1_2 + + + text + Gateway + + + + QLabel + + name + TextLabel3 + + + text + Second DNS + + + + QLineEdit + + name + firstDNSLineEdit + + + + QLineEdit + + name + secondDNSLineEdit + + + + + + + name + Spacer9 + + + orientation + Vertical + + + sizeType + Expanding + + + sizeHint + + 20 + 20 + + + + + + + + dhcpCheckBox + toggled(bool) + leaseHoursLabel + setEnabled(bool) + + + dhcpCheckBox + toggled(bool) + leaseTime + setEnabled(bool) + + + dhcpCheckBox + toggled(bool) + staticGroupBox + setDisabled(bool) + + + + autoStart + dhcpCheckBox + leaseTime + ipAddressEdit + subnetMaskEdit + gatewayEdit + firstDNSLineEdit + secondDNSLineEdit + + diff --git a/noncore/settings/networksettings/interfaces/interfacesetupimp.cpp b/noncore/settings/networksettings/interfaces/interfacesetupimp.cpp new file mode 100644 index 0000000..e717d6f --- a/dev/null +++ b/noncore/settings/networksettings/interfaces/interfacesetupimp.cpp @@ -0,0 +1,148 @@ +#include "interfacesetupimp.h" +#include "interface.h" +#include "interfaces.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#define DNSSCRIPT "interfacednsscript" + +/** + * Constuctor. Set up the connection and load the first profile. + */ +InterfaceSetupImp::InterfaceSetupImp(QWidget* parent, const char* name, Interface *i, WFlags fl) : InterfaceSetup(parent, name, fl){ + assert(parent); + assert(i); + interface = i; + interfaces = new Interfaces(); + bool error = false; + if(interfaces->getInterfaceMethod(error) == INTERFACES_LOOPBACK){ + staticGroupBox->hide(); + dhcpCheckBox->hide(); + leaseTime->hide(); + leaseHoursLabel->hide(); + } +} + +/** + * Save the current settings, then write out the interfaces file and close. + */ +void InterfaceSetupImp::saveChanges(){ + if(!saveSettings()) + return; + interfaces->write(); +} + +/** + * Save the settings for the current Interface. + * @return bool true if successfull, false otherwise + */ +bool InterfaceSetupImp::saveSettings(){ + // eh can't really do anything about it other then return. :-D + if(!interfaces->isInterfaceSet()) + return true; + + bool error = false; + // Loopback case + if(interfaces->getInterfaceMethod(error) == INTERFACES_LOOPBACK){ + interfaces->setAuto(interface->getInterfaceName(), autoStart->isChecked()); + return true; + } + + if(!dhcpCheckBox->isChecked() && (ipAddressEdit->text().isEmpty() || subnetMaskEdit->text().isEmpty() || firstDNSLineEdit->text().isEmpty())){ + QMessageBox::information(this, "Empy Fields.", "Please fill in address, subnet,\n gateway and the first dns entries.", "Ok"); + return false; + } + interfaces->removeAllInterfaceOptions(); + + // DHCP + if(dhcpCheckBox->isChecked()){ + interfaces->setInterfaceMethod(INTERFACES_METHOD_DHCP); + interfaces->setInterfaceOption("leasehours", QString("%1").arg(leaseTime->value())); + interfaces->setInterfaceOption("leasetime", QString("%1").arg(leaseTime->value()*60*60)); + } + else{ + interfaces->setInterfaceMethod("static"); + interfaces->setInterfaceOption("address", ipAddressEdit->text()); + interfaces->setInterfaceOption("netmask", subnetMaskEdit->text()); + interfaces->setInterfaceOption("gateway", gatewayEdit->text()); + QString dns = firstDNSLineEdit->text() + " " + secondDNSLineEdit->text(); + interfaces->setInterfaceOption("up "DNSSCRIPT" add ", dns); + interfaces->setInterfaceOption("down "DNSSCRIPT" remove ", dns); + } + + // IP Information + interfaces->setAuto(interface->getInterfaceName(), autoStart->isChecked()); + return true; +} + +/** + * The Profile has changed. + * @profile the new profile. + */ +void InterfaceSetupImp::setProfile(const QString &profile){ + QString newInterfaceName = interface->getInterfaceName(); + if(profile.length() > 0) + newInterfaceName += "_" + profile; + // See if we have to make a interface. + if(!interfaces->setInterface(newInterfaceName)){ + // Add making for this new interface if need too + if(profile != ""){ + interfaces->copyInterface(interface->getInterfaceName(), newInterfaceName); + if(!interfaces->setMapping(interface->getInterfaceName())){ + interfaces->addMapping(interface->getInterfaceName()); + if(!interfaces->setMapping(interface->getInterfaceName())){ + qDebug("InterfaceSetupImp: Added Mapping, but still can't set."); + return; + } + } + interfaces->setMap("map", newInterfaceName); + interfaces->setScript("getprofile.sh"); + } + else{ + interfaces->addInterface(newInterfaceName, INTERFACES_FAMILY_INET, INTERFACES_METHOD_DHCP); + if(!interfaces->setInterface(newInterfaceName)){ + qDebug("InterfaceSetupImp: Added interface, but still can't set."); + return; + } + } + } + + // We must have a valid interface to get this far so read some settings. + + // DHCP + bool error = false; + if(interfaces->getInterfaceMethod(error) == INTERFACES_METHOD_DHCP) + dhcpCheckBox->setChecked(true); + else + dhcpCheckBox->setChecked(false); + leaseTime->setValue(interfaces->getInterfaceOption("leasehours", error).toInt()); + if(error) + leaseTime->setValue(interfaces->getInterfaceOption("leasetime", error).toInt()/60/60); + if(error) + leaseTime->setValue(24); + + // IP Information + autoStart->setChecked(interfaces->isAuto(interface->getInterfaceName())); + QString dns = interfaces->getInterfaceOption("up interfacednsscript add", error); + if(dns.contains(" ")){ + firstDNSLineEdit->setText(dns.mid(0, dns.find(" "))); + secondDNSLineEdit->setText(dns.mid(dns.find(" ")+1, dns.length())); + } + ipAddressEdit->setText(interfaces->getInterfaceOption("address", error)); + subnetMaskEdit->setText(interfaces->getInterfaceOption("netmask", error)); + gatewayEdit->setText(interfaces->getInterfaceOption("gateway", error)); +} + + +// interfacesetup.cpp + diff --git a/noncore/settings/networksettings/interfaces/interfacesetupimp.h b/noncore/settings/networksettings/interfaces/interfacesetupimp.h new file mode 100644 index 0000000..936f2be --- a/dev/null +++ b/noncore/settings/networksettings/interfaces/interfacesetupimp.h @@ -0,0 +1,49 @@ +#ifndef INTERFACESETUPIMP_H +#define INTERFACESETUPIMP_H + +#include "interfacesetup.h" +#include + +class Interface; +class Interfaces; + +class InterfaceSetupImp : public InterfaceSetup { + Q_OBJECT + +public: + InterfaceSetupImp( QWidget* parent = 0, const char* name = 0, Interface *i=0, WFlags fl = 0); + void saveChanges(); + +public slots: + void setProfile(const QString &profile); + bool saveSettings(); +private: + Interfaces *interfaces; + Interface *interface; + +}; + + +#include + +class InterfaceSetupImpDialog : public QDialog { +Q_OBJECT + + public: + InterfaceSetupImpDialog(QWidget* parent = 0, const char* name = 0, Interface *i=0, bool modal = false, WFlags fl = 0) : QDialog(parent, name, modal, fl){ + QVBoxLayout *InterfaceSetupLayout = new QVBoxLayout( this ); + setCaption("Interface Setup"); + interfaceSetup = new InterfaceSetupImp(this, "InterfaceSetup",i,fl); + InterfaceSetupLayout->addWidget( interfaceSetup ); + }; + + InterfaceSetupImp *interfaceSetup; + + protected slots: + void accept(){ interfaceSetup->saveChanges(); }; +}; + +#endif + +// interfacesetupimp.h + -- cgit v0.9.0.2