00001 #include "interfacesetupimp.h"
00002 #include "interface.h"
00003
00004 #include <qcheckbox.h>
00005 #include <qlineedit.h>
00006 #include <qspinbox.h>
00007 #include <qgroupbox.h>
00008 #include <qlabel.h>
00009
00010 #include <qmessagebox.h>
00011
00012 #include <opie2/oprocess.h>
00013
00014 #ifdef QWS
00015 #include <opie2/owait.h>
00016 #include <opie2/odebug.h>
00017 #include <qpe/global.h>
00018 #include <qapplication.h>
00019 #endif
00020
00021 #define DNSSCRIPT "changedns"
00022
00026 using namespace Opie::Ui;
00027 using namespace Opie::Core;
00028 InterfaceSetupImp::InterfaceSetupImp(QWidget* parent, const char* name, Interface *i, Interfaces *j, WFlags fl) : InterfaceSetup(parent, name, fl), interfaces(j), interface(i), delInterfaces(false){
00029 if (j == 0) {
00030 delInterfaces = true;
00031 interfaces = new Interfaces;
00032 }
00033 }
00034
00038 InterfaceSetupImp::~InterfaceSetupImp(){
00039 if(delInterfaces) {
00040 delete interfaces;
00041 }
00042 }
00043
00047 bool InterfaceSetupImp::saveChanges(){
00048 bool error;
00049 QString iface = interfaces->getInterfaceName(error);
00050 odebug << "InterfaceSetupImp::saveChanges saves interface " << iface.latin1() << "" << oendl;
00051 if(!saveSettings())
00052 return false;
00053
00054 interfaces->write();
00055
00056 if (interface->getStatus()) {
00057 QString ifup;
00058 ifup += "ifdown ";
00059 ifup += iface;
00060 ifup += "; ifup ";
00061 ifup += iface;
00062 ifup += ";";
00063
00064 OProcess restart;
00065 restart << "sh";
00066 restart << "-c";
00067 restart << ifup;
00068
00069 OWait *owait = new OWait();
00070 Global::statusMessage( tr( "Restarting interface" ) );
00071
00072 owait->show();
00073 qApp->processEvents();
00074
00075 if (!restart.start(OProcess::Block, OProcess::NoCommunication) ) {
00076 owarn << "unstable to spawn ifdown/ifup" << oendl;
00077 }
00078
00079 owait->hide();
00080 delete owait;
00081
00082 interface->refresh();
00083 }
00084 return true;
00085 }
00086
00091 bool InterfaceSetupImp::saveSettings(){
00092
00093 if(!interfaces->isInterfaceSet())
00094 return true;
00095
00096 bool error = false;
00097
00098 if(interfaces->getInterfaceMethod(error) == INTERFACES_LOOPBACK){
00099 interfaces->setAuto(interface->getInterfaceName(), autoStart->isChecked());
00100 return true;
00101 }
00102
00103 if(!dhcpCheckBox->isChecked() && (ipAddressEdit->text().isEmpty() || subnetMaskEdit->text().isEmpty())){
00104 QMessageBox::information(this, "Not Saved.", "Please fill in the IP address and\n subnet entries.", QMessageBox::Ok);
00105 return false;
00106 }
00107
00108 if(dhcpCheckBox->isChecked()) {
00109 interfaces->setInterfaceMethod(INTERFACES_METHOD_DHCP);
00110 interfaces->removeInterfaceOption("address");
00111 interfaces->removeInterfaceOption("netmask");
00112 interfaces->removeInterfaceOption("gateway");
00113 interfaces->removeInterfaceOption("up "DNSSCRIPT" -a ");
00114 interfaces->removeInterfaceOption("down "DNSSCRIPT" -r ");
00115 } else{
00116 interfaces->setInterfaceMethod("static");
00117 interfaces->setInterfaceOption("address", ipAddressEdit->text());
00118 interfaces->setInterfaceOption("netmask", subnetMaskEdit->text());
00119 interfaces->setInterfaceOption("gateway", gatewayEdit->text());
00120 if(!firstDNSLineEdit->text().isEmpty() || !secondDNSLineEdit->text().isEmpty()){
00121 QString dns = firstDNSLineEdit->text() + " " + secondDNSLineEdit->text();
00122 interfaces->setInterfaceOption("up "DNSSCRIPT" -a ", dns);
00123 interfaces->setInterfaceOption("down "DNSSCRIPT" -r ", dns);
00124 }else{
00125 interfaces->removeInterfaceOption("up "DNSSCRIPT" -a ");
00126 interfaces->removeInterfaceOption("down "DNSSCRIPT" -r");
00127 }
00128 }
00129
00130
00131 interfaces->setAuto(interface->getInterfaceName(), autoStart->isChecked());
00132 return true;
00133 }
00134
00139 void InterfaceSetupImp::setProfile(const QString &profile){
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150 QString newInterfaceName = interface->getInterfaceName();
00151 if(profile.length() > 0)
00152 newInterfaceName += "_" + profile;
00153
00154 if(!interfaces->setInterface(newInterfaceName)){
00155
00156 if(profile != ""){
00157 interfaces->copyInterface(interface->getInterfaceName(), newInterfaceName);
00158 if(!interfaces->setMapping(interface->getInterfaceName())){
00159 interfaces->addMapping(interface->getInterfaceName());
00160 if(!interfaces->setMapping(interface->getInterfaceName())){
00161 odebug << "InterfaceSetupImp: Added Mapping, but still can't setInterface." << oendl;
00162 return;
00163 }
00164 }
00165 interfaces->setMap("map", newInterfaceName);
00166 interfaces->setScript("getprofile.sh");
00167 }
00168 else{
00169 interfaces->addInterface(newInterfaceName, INTERFACES_FAMILY_INET, INTERFACES_METHOD_DHCP);
00170 if(!interfaces->setInterface(newInterfaceName)){
00171 odebug << "InterfaceSetupImp: Added interface, but still can't setInterface." << oendl;
00172 return;
00173 }
00174 }
00175 }
00176
00177
00178
00179
00180 bool error = false;
00181 if(interfaces->getInterfaceMethod(error) == INTERFACES_METHOD_DHCP)
00182 dhcpCheckBox->setChecked(true);
00183 else
00184 dhcpCheckBox->setChecked(false);
00185
00186
00187 autoStart->setChecked(interfaces->isAuto(interface->getInterfaceName()));
00188 QString dns = interfaces->getInterfaceOption("up "DNSSCRIPT" -a", error);
00189 odebug << "dns >" << dns.latin1() << "<" << oendl;
00190 if(dns.contains(" ")){
00191 firstDNSLineEdit->setText(dns.mid(0, dns.find(" ")));
00192 secondDNSLineEdit->setText(dns.mid(dns.find(" ")+1, dns.length()));
00193 }else firstDNSLineEdit->setText(dns);
00194
00195 ipAddressEdit->setText(interfaces->getInterfaceOption("address", error));
00196 subnetMaskEdit->setText(interfaces->getInterfaceOption("netmask", error));
00197 if (subnetMaskEdit->text().isEmpty())
00198 subnetMaskEdit->setText( "255.255.255.0" );
00199 gatewayEdit->setText(interfaces->getInterfaceOption("gateway", error));
00200
00201
00202
00203 owarn << "InterfaceSetupImp::setProfile(" << profile.latin1() << ")\n" << oendl;
00204 owarn << "InterfaceSetupImp::setProfile: iface is " << interfaces->getInterfaceName(error).latin1() << "\n" << oendl;
00205
00206 }
00207
00208
00209