Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

edit.cpp

Go to the documentation of this file.
00001 /*
00002  *              kPPP: A pppd Front End for the KDE project
00003  *
00004  * $Id: edit.cpp,v 1.13 2005/06/15 19:04:33 drw Exp $
00005  *              Copyright (C) 1997 Bernd Johannes Wuebben
00006  *                      wuebben@math.cornell.edu
00007  *
00008  * based on EzPPP:
00009  * Copyright (C) 1997  Jay Painter
00010  *
00011  * This program is free software; you can redistribute it and/or
00012  * modify it under the terms of the GNU Library General Public
00013  * License as published by the Free Software Foundation; either
00014  * version 2 of the License, or (at your option) any later version.
00015  *
00016  * This program is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00019  * Library General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU Library General Public
00022  * License along with this program; if not, write to the Free
00023  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00024  */
00025 
00026 #include "edit.h"
00027 #include "pppdata.h"
00028 #include "iplined.h"
00029 #include "auth.h"
00030 
00031 /* OPIE */
00032 #include <opie2/oresource.h>
00033 
00034 #include <qpe/applnk.h>
00035 #include <qpe/qpeapplication.h>
00036 
00037 /* QT */
00038 #include <qlayout.h>
00039 #include <qmessagebox.h>
00040 #include <qwhatsthis.h>
00041 #include <qregexp.h>
00042 #include <qapplication.h>
00043 #include <qbuttongroup.h>
00044 #include <qvgroupbox.h>
00045 #include <qhbox.h>
00046 #include <qdialog.h>
00047 
00048 /* STD */
00049 
00050 #include <string.h>
00051 #include <termios.h>
00052 
00053 DialWidget::DialWidget( PPPData *pd, QWidget *parent, bool isnewaccount
00054                         , const char *name )
00055         : QWidget(parent, name), _pppdata(pd)
00056 {
00057     const int GRIDROWS = 6;
00058 
00059     QGridLayout *tl = new QGridLayout(this, GRIDROWS, 2, 0 );
00060 
00061     connect_label = new QLabel(tr("Connection name:"), this);
00062     tl->addWidget(connect_label, 0, 0);
00063 
00064     connectname_l = new QLineEdit(this);
00065     //  connectname_l->setMaxLength(ACCNAME_SIZE);
00066     tl->addWidget(connectname_l, 0, 1);
00067     QString tmp = tr("Type in a unique name for this connection");
00068 
00069     QWhatsThis::add(connect_label,tmp);
00070     QWhatsThis::add(connectname_l,tmp);
00071 
00072 
00073     number_label = new QLabel(tr("Phone number:"), this);
00074     number_label->setAlignment(AlignTop|AlignLeft);
00075     tl->addWidget(number_label, 1, 0);
00076 
00077     QHBoxLayout *lpn = new QHBoxLayout(5);
00078     tl->addLayout(lpn, 1, 1);
00079     numbers = new QListBox(this);
00080     //  numbers->setMinimumSize(120, 70);
00081     lpn->addWidget(numbers);
00082     QVBoxLayout *lpn1 = new QVBoxLayout;
00083     lpn->addLayout(lpn1);
00084     add = new QPushButton(tr("&Add..."), this);
00085     del = new QPushButton(tr("&Remove"), this);
00086 
00087     up = new QPushButton(this);
00088     up->setPixmap( Opie::Core::OResource::loadPixmap("up", Opie::Core::OResource::SmallIcon) );
00089     up->setMinimumHeight( AppLnk::smallIconSize()+4 );
00090     down = new QPushButton(this);
00091     down->setPixmap( Opie::Core::OResource::loadPixmap("down", Opie::Core::OResource::SmallIcon) );
00092     down->setMinimumHeight( AppLnk::smallIconSize()+4 );
00093     lpn1->addWidget(add);
00094     lpn1->addWidget(del);
00095     lpn1->addStretch(1);
00096     lpn1->addWidget(up);
00097     lpn1->addWidget(down);
00098     connect(add, SIGNAL(clicked()),
00099             this, SLOT(addNumber()));
00100     connect(del, SIGNAL(clicked()),
00101             this, SLOT(delNumber()));
00102     connect(up, SIGNAL(clicked()),
00103             this, SLOT(upNumber()));
00104     connect(down, SIGNAL(clicked()),
00105             this, SLOT(downNumber()));
00106     connect(numbers, SIGNAL(highlighted(int)),
00107             this, SLOT(selectionChanged(int)));
00108     numbersChanged();
00109 
00110     tmp = tr("<p>Specifies the phone numbers to dial. You\n"
00111              "can supply multiple numbers here, simply\n"
00112              "click on \"Add\". You can arrange the\n"
00113              "order the numbers are tried by using the\n"
00114              "arrow buttons.\n\n"
00115              "When a number is busy or fails, <i>kppp</i> will \n"
00116              "try the next number and so on");
00117 
00118     QWhatsThis::add(number_label,tmp);
00119     QWhatsThis::add(numbers,tmp);
00120 
00121     pppdargs = new QPushButton(tr("Customize pppd Arguments..."), this);
00122     connect(pppdargs, SIGNAL(clicked()), SLOT(pppdargsbutton()));
00123     tl->addMultiCellWidget(pppdargs, 5, 5, 0, 1, AlignCenter);
00124 
00125     // Set defaults if editing an existing connection
00126     if(!isnewaccount)
00127     {
00128         connectname_l->setText(_pppdata->accname());
00129 
00130         // insert the phone numbers into the listbox
00131         QString n = _pppdata->phonenumber();
00132         QString tmp = "";
00133         uint idx = 0;
00134         while(idx != n.length())
00135         {
00136             if(n[idx] == ':')
00137             {
00138                 if(tmp.length() > 0)
00139                     numbers->insertItem(tmp);
00140                 tmp = "";
00141             }
00142             else
00143                 tmp += n[idx];
00144             idx++;
00145         }
00146         if(tmp.length() > 0)
00147             numbers->insertItem(tmp);
00148 
00149     }
00150 
00151     numbersChanged();
00152     tl->activate();
00153 }
00154 
00155 bool DialWidget::save()
00156 {
00157     //first check to make sure that the account name is unique!
00158     if(connectname_l->text().isEmpty() ||
00159             !_pppdata->isUniqueAccname(connectname_l->text()))
00160     {
00161         return false;
00162     }
00163     else
00164     {
00165         _pppdata->setAccname(connectname_l->text());
00166 
00167         QString number = "";
00168         for(uint i = 0; i < numbers->count(); i++)
00169         {
00170             if(i != 0)
00171                 number += ":";
00172             number += numbers->text(i);
00173         }
00174 
00175         _pppdata->setPhonenumber(number);
00176         return true;
00177     }
00178 }
00179 
00180 
00181 void DialWidget::numbersChanged()
00182 {
00183     int sel = numbers->currentItem();
00184 
00185     del->setEnabled(sel != -1);
00186     up->setEnabled(sel != -1 && sel != 0);
00187     down->setEnabled(sel != -1 && sel != (int)numbers->count()-1);
00188 }
00189 
00190 
00191 void DialWidget::selectionChanged(int)
00192 {
00193     numbersChanged();
00194 }
00195 
00196 
00197 void DialWidget::addNumber()
00198 {
00199     PhoneNumberDialog dlg(this);
00200     if(dlg.exec())
00201     {
00202         numbers->insertItem(dlg.phoneNumber());
00203         numbersChanged();
00204     }
00205 }
00206 
00207 
00208 void DialWidget::delNumber()
00209 {
00210     if(numbers->currentItem() != -1)
00211     {
00212         numbers->removeItem(numbers->currentItem());
00213         numbersChanged();
00214     }
00215 }
00216 
00217 
00218 void DialWidget::upNumber()
00219 {
00220     int idx = numbers->currentItem();
00221     if(idx != -1)
00222     {
00223         QString item = numbers->text(idx);
00224         numbers->removeItem(idx);
00225         numbers->insertItem(item, idx-1);
00226         numbers->setCurrentItem(idx-1);
00227         numbersChanged();
00228     }
00229 }
00230 
00231 
00232 void DialWidget::downNumber()
00233 {
00234     int idx = numbers->currentItem();
00235     if(idx != -1)
00236     {
00237         QString item = numbers->text(idx);
00238         numbers->removeItem(idx);
00239         numbers->insertItem(item, idx+1);
00240         numbers->setCurrentItem(idx+1);
00241         numbersChanged();
00242     }
00243 }
00244 
00245 
00246 void DialWidget::pppdargsbutton()
00247 {
00248     PPPdArguments pa(_pppdata, this);
00249     QPEApplication::execDialog( &pa );
00250 }
00251 
00252 
00253 
00255 // ExecWidget
00257 ExecWidget::ExecWidget(PPPData *pd, QWidget *parent, bool isnewaccount, const char *name) :
00258         QWidget(parent, name), _pppdata(pd)
00259 {
00260     QVBoxLayout *tl = new QVBoxLayout(this, 0 );//, KDialog::spacingHint());
00261 
00262     QLabel *l = new QLabel( tr("Here you can select commands to run at certain stages of the connection. The commands are run with your real user id, so you cannot run any commands here requiring root permissions (unless, of course, you are root).<br><br>Be sure to supply the whole path to the program otherwise we might be unable to find it."), this);
00263 
00264     tl->addWidget(l);
00265     tl->addStretch(1);
00266 
00267     QGridLayout *l1 = new QGridLayout(4, 2, 10);
00268     tl->addLayout(l1);
00269     l1->setColStretch(0, 0);
00270     l1->setColStretch(1, 1);
00271 
00272     before_connect_l = new QLabel(tr("Before connect:"), this);
00273     before_connect_l->setAlignment(AlignVCenter);
00274     l1->addWidget(before_connect_l, 0, 0);
00275     before_connect = new QLineEdit(this);
00276     //  before_connect->setMaxLength(COMMAND_SIZE);
00277     l1->addWidget(before_connect, 0, 1);
00278     QString tmp = tr("Allows you to run a program <b>before</b> a connection\n"
00279                      "is established. It is called immediately before\n"
00280                      "dialing has begun.\n\n"
00281                      "This might be useful, e.g. to stop HylaFAX blocking the\n"
00282                      "modem.");
00283 
00284     QWhatsThis::add(before_connect_l,tmp);
00285     QWhatsThis::add(before_connect,tmp);
00286 
00287     command_label = new QLabel(tr("Upon connect:"), this);
00288     command_label->setAlignment(AlignVCenter);
00289     l1->addWidget(command_label, 1, 0);
00290     command = new QLineEdit(this);
00291     //  command->setMaxLength(COMMAND_SIZE);
00292     l1->addWidget(command, 1, 1);
00293     tmp = tr("Allows you to run a program <b>after</b> a connection\n"
00294              "is established. When your program is called, all\n"
00295              "preparations for an Internet connection are finished.\n"
00296              "\n"
00297              "Very useful for fetching mail and news");
00298 
00299     QWhatsThis::add(command_label,tmp);
00300     QWhatsThis::add(command,tmp);
00301 
00302     predisconnect_label = new QLabel(tr("Before disconnect:"),
00303                                      this);
00304     predisconnect_label->setAlignment(AlignVCenter);
00305     l1->addWidget(predisconnect_label, 2, 0);
00306     predisconnect = new QLineEdit(this);
00307     //  predisconnect->setMaxLength(COMMAND_SIZE);
00308     l1->addWidget(predisconnect, 2, 1);
00309     tmp = tr("Allows you to run a program <b>before</b> a connection\n"
00310              "is closed. The connection will stay open until\n"
00311              "the program exits.");
00312 
00313     QWhatsThis::add(predisconnect_label,tmp);
00314     QWhatsThis::add(predisconnect,tmp);
00315 
00316     discommand_label = new QLabel(tr("Upon disconnect:"),
00317                                   this);
00318     discommand_label->setAlignment(AlignVCenter);
00319     l1->addWidget(discommand_label, 3, 0);
00320 
00321     discommand = new QLineEdit(this);
00322     //  discommand->setMaxLength(COMMAND_SIZE);
00323     l1->addWidget(discommand, 3, 1);
00324     tmp = tr("Allows you to run a program <b>after</b> a connection\n"
00325              "has been closed.");
00326 
00327     QWhatsThis::add(discommand_label,tmp);
00328     QWhatsThis::add(discommand,tmp);
00329 
00330     // extra space between entries
00331     l1->addRowSpacing(1, 5);
00332     l1->addRowSpacing(3, 5);
00333 
00334     tl->addStretch(1);
00335     tl->activate();
00336 
00337     // Set defaults if editing an existing connection
00338     if(!isnewaccount)
00339     {
00340         before_connect->setText(_pppdata->command_before_connect());
00341         command->setText(_pppdata->command_on_connect());
00342         discommand->setText(_pppdata->command_on_disconnect());
00343         predisconnect->setText(_pppdata->command_before_disconnect());
00344     }
00345 }
00346 
00347 
00348 bool ExecWidget::save()
00349 {
00350     _pppdata->setCommand_before_connect(before_connect->text());
00351     _pppdata->setCommand_on_connect(command->text());
00352     _pppdata->setCommand_before_disconnect(predisconnect->text());
00353     _pppdata->setCommand_on_disconnect(discommand->text());
00354     return true;
00355 }
00356 
00357 
00358 
00360 //
00361 // IPWidget
00362 //
00364 IPWidget::IPWidget( PPPData *pd, QWidget *parent, bool isnewaccount, const char *name )
00365         : QWidget(parent, name), _pppdata(pd)
00366 {
00367     QVBoxLayout *topLayout = new QVBoxLayout(this);
00368     topLayout->setSpacing( 3 );//KDialog::spacingHint());
00369 
00370     box = new QVGroupBox(tr("Configuration"), this);
00371     //  box->setInsideSpacing( 1 );//KDialog::spacingHint());
00372 
00373     rb = new QButtonGroup(this);
00374     rb->hide();
00375     connect(rb, SIGNAL(clicked(int)),
00376             SLOT(hitIPSelect(int)));
00377 
00378     dynamicadd_rb = new QRadioButton(box);
00379     dynamicadd_rb->setText(tr("Dynamic IP address"));
00380     QWhatsThis::add(dynamicadd_rb,
00381                         tr("Select this option when your computer gets an\n"
00382                            "internet address (IP) every time a\n"
00383                            "connection is made.\n"
00384                            "\n"
00385                            "Almost every Internet Service Provider uses\n"
00386                            "this method, so this should be turned on."));
00387 
00388     staticadd_rb = new QRadioButton(box);
00389     staticadd_rb->setText(tr("Static IP address"));
00390     rb->insert(dynamicadd_rb, 0);
00391     rb->insert(staticadd_rb, 1);
00392     QWhatsThis::add(staticadd_rb,
00393                         tr("Select this option when your computer has a\n"
00394                            "fixed internet address (IP). Most computers\n"
00395                            "don't have this, so you should probably select\n"
00396                            "dynamic IP addressing unless you know what you\n"
00397                            "are doing."));
00398 
00399     QWidget *ipWidget = new QWidget(box);
00400     QGridLayout *ipLayout = new QGridLayout(ipWidget, 2, 2);
00401     ipLayout->setSpacing( 2 );//KDialog::spacingHint());
00402 
00403     ipaddress_label = new QLabel(tr("IP address:"), ipWidget);
00404     QString tmp = tr("If your computer has a permanent internet\n"
00405                      "address, you must supply your IP address here.");
00406     ipLayout->addWidget(ipaddress_label, 0, 0);
00407 
00408     ipaddress_l = new IPLineEdit(ipWidget);
00409     ipLayout->addWidget(ipaddress_l, 0, 1);
00410 
00411     QWhatsThis::add(ipaddress_label,tmp);
00412     QWhatsThis::add(ipaddress_l,tmp);
00413 
00414     sub_label = new QLabel(tr("Subnet mask:"), ipWidget);
00415     tmp = tr("<p>If your computer has a static Internet address,\n"
00416              "you must supply a network mask here. In almost\n"
00417              "all cases this netmask will be <b>255.255.255.0</b>,\n"
00418              "but your mileage may vary.\n"
00419              "\n"
00420              "If unsure, contact your Internet Service Provider");
00421     ipLayout->addWidget(sub_label, 1, 0);
00422 
00423     subnetmask_l = new IPLineEdit(ipWidget);
00424     ipLayout->addWidget(subnetmask_l, 1, 1);
00425 
00426     QWhatsThis::add(sub_label,tmp);
00427     QWhatsThis::add(subnetmask_l,tmp);
00428 
00429     autoname = new QCheckBox(tr("Auto-configure hostname from this IP"), this);
00430     autoname->setChecked(_pppdata->autoname());
00431     connect(autoname,SIGNAL(toggled(bool)),
00432             this,SLOT(autoname_t(bool)));
00433 
00434     QWhatsThis::add(autoname,
00435                         tr("<p>Whenever you connect, this reconfigures\n"
00436                            "your hostname to match the IP address you\n"
00437                            "got from the PPP server. This may be useful\n"
00438                            "if you need to use a protocol which depends\n"
00439                            "on this information, but it can also cause several\n"
00440                            "<a href=\"kppp-7.html#autohostname\">problems</a>.\n"
00441                            "\n"
00442                            "Don't enable this unless you really need it."));
00443 
00444     topLayout->addWidget(box);
00445     topLayout->addWidget(autoname);
00446     topLayout->addStretch();
00447 
00448     //load info from gpppdata
00449     if(!isnewaccount)
00450     {
00451         if(_pppdata->ipaddr() == "0.0.0.0" &&
00452                 _pppdata->subnetmask() == "0.0.0.0")
00453         {
00454             dynamicadd_rb->setChecked(true);
00455             hitIPSelect(0);
00456             autoname->setChecked(_pppdata->autoname());
00457         }
00458         else
00459         {
00460             ipaddress_l->setText(_pppdata->ipaddr());
00461             subnetmask_l->setText(_pppdata->subnetmask());
00462             staticadd_rb->setChecked(true);
00463             autoname->setChecked(false);
00464         }
00465     }
00466     else
00467     {
00468         dynamicadd_rb->setChecked(true);
00469         hitIPSelect(0);
00470     }
00471 
00472 }
00473 
00474 void IPWidget::autoname_t(bool on)
00475 {
00476     static bool was_warned = false;
00477 
00478     // big-fat warning when selecting the auto configure hostname option
00479     if(on && !was_warned)
00480     {
00481         QMessageBox::information(this,
00482                                  tr("Selecting this option might cause some weird "
00483                                     "problems with the X-server and applications "
00484                                     "while kppp is connected. Don't use it until "
00485                                     "you know what you are doing!\n"
00486                                     "For more information take a look at the "
00487                                     "handbook (or help) in the section \"Frequently "
00488                                     "asked questions\"."),
00489                                  tr("Warning"));
00490         was_warned = true;
00491     }
00492 }
00493 
00494 
00495 void IPWidget::save()
00496 {
00497     if(dynamicadd_rb->isChecked())
00498     {
00499         _pppdata->setIpaddr("0.0.0.0");
00500         _pppdata->setSubnetmask("0.0.0.0");
00501     }
00502     else
00503     {
00504         _pppdata->setIpaddr(ipaddress_l->text());
00505         _pppdata->setSubnetmask(subnetmask_l->text());
00506     }
00507     _pppdata->setAutoname(autoname->isChecked());
00508 }
00509 
00510 
00511 void IPWidget::hitIPSelect( int i )
00512 {
00513     if(i == 0)
00514     {
00515         ipaddress_label->setEnabled(false);
00516         sub_label->setEnabled(false);
00517         ipaddress_l->setEnabled(false);
00518         subnetmask_l->setEnabled(false);
00519     }
00520     else
00521     {
00522         ipaddress_label->setEnabled(true);
00523         sub_label->setEnabled(true);
00524         ipaddress_l->setEnabled(true);
00525         subnetmask_l->setEnabled(true);
00526     }
00527 }
00528 
00529 
00530 
00531 DNSWidget::DNSWidget( PPPData *pd, QWidget *parent, bool isnewaccount, const char *name )
00532         : QWidget(parent, name), _pppdata(pd)
00533 {
00534     QGridLayout *tl = new QGridLayout(this, 7, 2, 0 );
00535 
00536     dnsdomain_label = new QLabel(tr("Domain name:"), this);
00537     tl->addWidget(dnsdomain_label, 0, 0);
00538 
00539     dnsdomain = new QLineEdit(this);
00540 
00541     tl->addWidget(dnsdomain, 0, 1);
00542     QString tmp = tr("If you enter a domain name here, this domain\n"
00543                      "name is used for your computer while you are\n"
00544                      "connected. When the connection is closed, the\n"
00545                      "original domain name of your computer is\n"
00546                      "restored.\n"
00547                      "\n"
00548                      "If you leave this field blank, no changes are\n"
00549                      "made to the domain name.");
00550 
00551     QWhatsThis::add(dnsdomain_label,tmp);
00552     QWhatsThis::add(dnsdomain,tmp);
00553 
00554     conf_label = new QLabel(tr("Configuration:"), this);
00555     tl->addWidget(conf_label, 1, 0);
00556 
00557     bg = new QButtonGroup("Group", this);
00558     connect(bg, SIGNAL(clicked(int)), SLOT(DNS_Mode_Selected(int)));
00559     bg->hide();
00560 
00561     autodns = new QRadioButton(tr("Automatic"), this);
00562     bg->insert(autodns, 0);
00563     tl->addWidget(autodns, 1, 1);
00564     if(!_pppdata->pppdVersionMin(2, 3, 7))
00565         autodns->setEnabled(false);
00566 
00567     mandns = new QRadioButton(tr("Manual"), this);
00568     bg->insert(mandns, 1);
00569     tl->addWidget(mandns, 2, 1);
00570 
00571     dns_label = new QLabel(tr("DNS IP address:"), this);
00572     tl->addWidget(dns_label, 3, 0);
00573 
00574     QHBoxLayout *l2 = new QHBoxLayout;
00575     tl->addLayout(l2, 3, 1);
00576     dnsipaddr = new IPLineEdit(this);
00577     connect(dnsipaddr, SIGNAL(returnPressed()),
00578             SLOT(adddns()));
00579     connect(dnsipaddr, SIGNAL(textChanged(const QString&)),
00580             SLOT(DNS_Edit_Changed(const QString&)));
00581     l2->addWidget(dnsipaddr, 1);
00582     l2->addStretch(1);
00583     tmp = tr("<p>Allows you to specify a new DNS server to be\n"
00584              "used while you are connected. When the\n"
00585              "connection is closed, this DNS entry will be\n"
00586              "removed again.\n"
00587              "\n"
00588              "To add a DNS server, type in the IP address of\n"
00589              "the DNS server here and click on <b>Add</b>");
00590 
00591     QWhatsThis::add(dns_label, tmp);
00592     QWhatsThis::add(dnsipaddr, tmp);
00593 
00594     QHBoxLayout *l1 = new QHBoxLayout;
00595     tl->addLayout(l1, 4, 1);
00596     add = new QPushButton(tr("Add"), this);
00597     connect(add, SIGNAL(clicked()), SLOT(adddns()));
00598     l1->addWidget(add);
00599     //  l1->addStretch(1);
00600     QWhatsThis::add(add,
00601                         tr("Click this button to add the DNS server\n"
00602                            "specified in the field above. The entry\n"
00603                            "will then be added to the list below"));
00604 
00605     remove = new QPushButton(tr("Remove"), this);
00606     connect(remove, SIGNAL(clicked()), SLOT(removedns()));
00607     l1->addWidget(remove);
00608     QWhatsThis::add(remove,
00609                         tr("Click this button to remove the selected DNS\n"
00610                            "server entry from the list below"));
00611 
00612     servers_label = new QLabel(tr("DNS address list:"), this);
00613     servers_label->setAlignment(AlignTop|AlignLeft);
00614     tl->addWidget(servers_label, 5, 0);
00615 
00616     dnsservers = new QListBox(this);
00617     dnsservers->setMinimumSize(150, 80);
00618     connect(dnsservers, SIGNAL(highlighted(int)),
00619             SLOT(DNS_Entry_Selected(int)));
00620     tl->addWidget(dnsservers, 5, 1);
00621     tmp = tr("<p>This shows all defined DNS servers to use\n"
00622              "while you are connected. Use the <b>Add</b> and\n"
00623              "<b>Remove</b> buttons to modify the list");
00624 
00625     QWhatsThis::add(servers_label,tmp);
00626     QWhatsThis::add(dnsservers,tmp);
00627 
00628     exdnsdisabled_toggle = new QCheckBox(tr("Disable DNS servers during connection"), this);
00629     // exdnsdisabled_toggle = new QCheckBox(tr("Disable existing DNS servers during connection"), this);
00630     exdnsdisabled_toggle->setChecked(_pppdata->exDNSDisabled());
00631     tl->addMultiCellWidget(exdnsdisabled_toggle, 6, 6, 0, 1, AlignCenter);
00632     QWhatsThis::add(exdnsdisabled_toggle,
00633                         tr("<p>When this option is selected, all DNS\n"
00634                            "servers specified in <tt>/etc/resolv.conf</tt> are\n"
00635                            "temporary disabled while the dialup connection\n"
00636                            "is established. After the connection is\n"
00637                            "closed, the servers will be re-enabled\n"
00638                            "\n"
00639                            "Typically, there is no reason to use this\n"
00640                            "option, but it may become useful under \n"
00641                            "some circumstances."));
00642 
00643 
00644     // restore data if editing
00645     if(!isnewaccount)
00646     {
00647         dnsservers->insertStringList(_pppdata->dns());
00648         dnsdomain->setText(_pppdata->domain());
00649     }
00650 
00651     int mode = _pppdata->autoDNS() ? 0 : 1;
00652     bg->setButton(mode);
00653     DNS_Mode_Selected(mode);
00654 
00655     tl->activate();
00656 }
00657 
00658 void DNSWidget::DNS_Edit_Changed(const QString &text)
00659 {
00660     QRegExp r("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+");
00661     add->setEnabled(text.find(r) != -1);
00662 }
00663 
00664 void DNSWidget::DNS_Entry_Selected(int)
00665 {
00666     remove->setEnabled(true);
00667 }
00668 
00669 void DNSWidget::DNS_Mode_Selected(int mode)
00670 {
00671     bool on = (mode == 1);
00672     dns_label->setEnabled(on);
00673     servers_label->setEnabled(on);
00674     dnsipaddr->setText("");
00675     dnsipaddr->setEnabled(on);
00676     add->setEnabled(false);
00677     remove->setEnabled(dnsservers->count()>0 && on);
00678     dnsservers->clearSelection();
00679     dnsservers->setEnabled(on);
00680     dnsservers->triggerUpdate(false);
00681 }
00682 
00683 void DNSWidget::save()
00684 {
00685     _pppdata->setAutoDNS(bg->id(bg->selected()) == 0);
00686     QStringList serverlist;
00687     for(uint i=0; i < dnsservers->count(); i++)
00688         serverlist.append(dnsservers->text(i));
00689     _pppdata->setDns(serverlist);
00690 
00691     // strip leading dot
00692     QString s(dnsdomain->text());
00693     if(s.left(1) == ".")
00694         _pppdata->setDomain(s.mid(1));
00695     else
00696         _pppdata->setDomain(dnsdomain->text());
00697 
00698     _pppdata->setExDNSDisabled(exdnsdisabled_toggle->isChecked());
00699 }
00700 
00701 
00702 void DNSWidget::adddns()
00703 {
00704     if(dnsservers->count() < MAX_DNS_ENTRIES)
00705     {
00706         dnsservers->insertItem(dnsipaddr->text());
00707         dnsipaddr->setText("");
00708     }
00709 }
00710 
00711 
00712 void DNSWidget::removedns()
00713 {
00714     int i;
00715     i = dnsservers->currentItem();
00716     if(i != -1)
00717         dnsservers->removeItem(i);
00718     remove->setEnabled(dnsservers->count()>0);
00719 }
00720 
00721 
00722 //
00723 // GatewayWidget
00724 //
00725 GatewayWidget::GatewayWidget( PPPData *pd, QWidget *parent, bool isnewaccount, const char *name )
00726         : QWidget(parent, name), _pppdata(pd)
00727 {
00728     QVBoxLayout *topLayout = new QVBoxLayout(this);
00729     topLayout->setSpacing( 2 );
00730     topLayout->setMargin( 0 );
00731 
00732     box = new QVGroupBox(tr("Configuration"), this);
00733 
00734     rb = new QButtonGroup(this);
00735     rb->hide();
00736     connect(rb, SIGNAL(clicked(int)), SLOT(hitGatewaySelect(int)));
00737 
00738     defaultgateway = new QRadioButton(box);
00739     defaultgateway->setText(tr("Default gateway"));
00740     rb->insert(defaultgateway, 0);
00741     QWhatsThis::add(defaultgateway,
00742                         tr("This makes the PPP peer computer (the computer\n"
00743                            "you are connected to with your modem) to act as\n"
00744                            "a gateway. Your computer will send all packets not\n"
00745                            "going to a computer inside your local net to this\n"
00746                            "computer, which will route these packets.\n"
00747                            "\n"
00748                            "This is the default for most ISPs, so you should\n"
00749                            "probably leave this option on."));
00750 
00751 
00752     staticgateway = new QRadioButton(box);
00753     staticgateway->setText(tr("Static gateway"));
00754     rb->insert(staticgateway, 1);
00755     QWhatsThis::add(staticgateway,
00756                         tr("<p>Allows you to specify which computer you want\n"
00757                            "to use as gateway (see <i>Default Gateway</i> above)"));
00758 
00759     QHBox *gateBox = new QHBox(box);
00760     gate_label = new QLabel(tr("Gateway IP address:"), gateBox);
00761     gatewayaddr = new IPLineEdit(gateBox);
00762 
00763     defaultroute = new QCheckBox(tr("Assign the default route to this gateway"),
00764                                  this);
00765     QWhatsThis::add(defaultroute,
00766                         tr("If this option is enabled, all packets not\n"
00767                            "going to the local net are routed through\n"
00768                            "the PPP connection.\n"
00769                            "\n"
00770                            "Normally, you should turn this on"));
00771 
00772     topLayout->addWidget(box);
00773     topLayout->addWidget(defaultroute);
00774     topLayout->addStretch();
00775 
00776     //load info from gpppdata
00777     if(!isnewaccount)
00778     {
00779         if(_pppdata->gateway() == "0.0.0.0")
00780         {
00781             defaultgateway->setChecked(true);
00782             hitGatewaySelect(0);
00783         }
00784         else
00785         {
00786             gatewayaddr->setText(_pppdata->gateway());
00787             staticgateway->setChecked(true);
00788         }
00789         defaultroute->setChecked(_pppdata->defaultroute());
00790     }
00791     else
00792     {
00793         defaultgateway->setChecked(true);
00794         hitGatewaySelect(0);
00795         defaultroute->setChecked(true);
00796     }
00797 }
00798 
00799 void GatewayWidget::save()
00800 {
00801     _pppdata->setGateway(gatewayaddr->text());
00802     _pppdata->setDefaultroute(defaultroute->isChecked());
00803 }
00804 
00805 
00806 void GatewayWidget::hitGatewaySelect( int i )
00807 {
00808     if(i == 0)
00809     {
00810         gatewayaddr->setText("0.0.0.0");
00811         gatewayaddr->setEnabled(false);
00812         gate_label->setEnabled(false);
00813     }
00814     else
00815     {
00816         gatewayaddr->setEnabled(true);
00817         gatewayaddr->setText("");
00818         gate_label->setEnabled(true);
00819     }
00820 }
00821 
00822 
00823 
00824 ScriptWidget::ScriptWidget( PPPData *pd, QWidget *parent, bool isnewaccount, const char *name )
00825         : QWidget(parent, name),_pppdata(pd)
00826 {
00827 
00828     QVBoxLayout *tl = new QVBoxLayout(this, 0 );
00829     se = new ScriptEdit(this);
00830     connect(se, SIGNAL(returnPressed()), SLOT(addButton()));
00831     tl->addWidget(se);
00832 
00833     // insert equal-sized buttons
00834     QHBoxLayout *hl = new QHBoxLayout( this );
00835     tl->addLayout( hl );
00836     add = new QPushButton( tr("Add"), this );
00837     hl->addWidget( add );
00838     connect(add, SIGNAL(clicked()), SLOT(addButton()));
00839     insert = new QPushButton( tr("Insert"), this );
00840     hl->addWidget( insert );
00841     connect(insert, SIGNAL(clicked()), SLOT(insertButton()));
00842     remove = new QPushButton( tr("Remove"), this );
00843     hl->addWidget( remove );
00844     connect(remove, SIGNAL(clicked()), SLOT(removeButton()));
00845 
00846     QHBoxLayout *l12 = new QHBoxLayout(0);
00847     tl->addLayout(l12);
00848     stl = new QListBox(this);
00849     //  stl->setVScrollBarMode( QScrollView::AlwaysOff );
00850     connect(stl, SIGNAL(highlighted(int)), SLOT(stlhighlighted(int)));
00851     //  stl->setMinimumSize(QSize(70, 140));
00852 
00853     sl = new QListBox(this);
00854     //  sl->setVScrollBarMode( QScrollView::AlwaysOff );
00855     connect(sl, SIGNAL(highlighted(int)), SLOT(slhighlighted(int)));
00856     //  sl->setMinimumSize(QSize(150, 140));
00857 
00858     slb = new QScrollBar(this);
00859     //  slb->setFixedWidth(slb->sizeHint().width());
00860     connect(slb, SIGNAL(valueChanged(int)), SLOT(scrolling(int)));
00861 
00862     l12->addWidget(stl, 1);
00863     l12->addWidget(sl, 3);
00864     l12->addWidget(slb, 0);
00865 
00866     //load data from gpppdata
00867     if(!isnewaccount)
00868     {
00869         QStringList &comlist = _pppdata->scriptType();
00870         QStringList &arglist = _pppdata->script();
00871         QStringList::Iterator itcom = comlist.begin();
00872         QStringList::Iterator itarg = arglist.begin();
00873 
00874         for ( ;
00875                 itcom != comlist.end() && itarg != arglist.end();
00876                 ++itcom, ++itarg )
00877         {
00878             stl->insertItem(*itcom);
00879             sl->insertItem(*itarg);
00880         }
00881     }
00882 
00883     insert->setEnabled(false);
00884     remove->setEnabled(false);
00885     adjustScrollBar();
00886     tl->activate();
00887 }
00888 
00889 bool ScriptWidget::check()
00890 {
00891     uint lstart = 0;
00892     uint lend  = 0;
00893     uint errcnt = 0;
00894 
00895     if(sl->count() > 0)
00896     {
00897         for( uint i=0; i <= sl->count()-1; i++)
00898         {
00899             if(stl->text(i) == "LoopStart")
00900             {
00901                 lstart++;
00902             }
00903             if (stl->text(i) == "LoopEnd")
00904             {
00905                 lend++;
00906             }
00907             if ( lend > lstart ) errcnt++;
00908         }
00909         return ( (errcnt == 0 ) && (lstart == lend) );
00910     }
00911     return true;
00912 }
00913 
00914 
00915 void ScriptWidget::save()
00916 {
00917     QStringList typelist, arglist;
00918     for(uint i=0; i < sl->count(); i++)
00919     {
00920         typelist.append(stl->text(i));
00921         arglist.append(sl->text(i));
00922     }
00923     _pppdata->setScriptType(typelist);
00924     _pppdata->setScript(arglist);
00925 }
00926 
00927 
00928 
00929 void ScriptWidget::adjustScrollBar()
00930 {
00931     if((int)sl->count() <= sl->numItemsVisible())
00932         slb->setRange(0, 0);
00933     else
00934         slb->setRange(0, (sl->count() - sl->numItemsVisible())+1);
00935 }
00936 
00937 
00938 void ScriptWidget::scrolling(int i)
00939 {
00940     sl->setTopItem(i);
00941     stl->setTopItem(i);
00942 }
00943 
00944 
00945 void ScriptWidget::slhighlighted(int i)
00946 {
00947     insert->setEnabled(true);
00948     remove->setEnabled(true);
00949     stl->setCurrentItem(i);
00950 }
00951 
00952 
00953 void ScriptWidget::stlhighlighted(int i)
00954 {
00955     insert->setEnabled(true);
00956     remove->setEnabled(true);
00957     sl->setCurrentItem(i);
00958 }
00959 
00960 
00961 void ScriptWidget::addButton()
00962 {
00963     //don't allow more than the maximum script entries
00964     if(sl->count() == MAX_SCRIPT_ENTRIES-1)
00965         return;
00966 
00967     switch(se->type())
00968     {
00969     case ScriptEdit::Expect:
00970         stl->insertItem("Expect");
00971         sl->insertItem(se->text());
00972         break;
00973 
00974     case ScriptEdit::Send:
00975         stl->insertItem("Send");
00976         sl->insertItem(se->text());
00977         break;
00978 
00979     case ScriptEdit::SendNoEcho:
00980         stl->insertItem("SendNoEcho");
00981         sl->insertItem(se->text());
00982         break;
00983 
00984     case ScriptEdit::Pause:
00985         stl->insertItem("Pause");
00986         sl->insertItem(se->text());
00987         break;
00988 
00989     case ScriptEdit::Hangup:
00990         stl->insertItem("Hangup");
00991         sl->insertItem("");
00992         break;
00993 
00994     case ScriptEdit::Answer:
00995         stl->insertItem("Answer");
00996         sl->insertItem("");
00997         break;
00998 
00999     case ScriptEdit::Timeout:
01000         stl->insertItem("Timeout");
01001         sl->insertItem(se->text());
01002         break;
01003 
01004     case ScriptEdit::Password:
01005         stl->insertItem("Password");
01006         sl->insertItem(se->text());
01007         break;
01008 
01009     case ScriptEdit::ID:
01010         stl->insertItem("ID");
01011         sl->insertItem(se->text());
01012         break;
01013 
01014     case ScriptEdit::Prompt:
01015         stl->insertItem("Prompt");
01016         sl->insertItem(se->text());
01017         break;
01018 
01019     case ScriptEdit::PWPrompt:
01020         stl->insertItem("PWPrompt");
01021         sl->insertItem(se->text());
01022         break;
01023 
01024     case ScriptEdit::LoopStart:
01025         stl->insertItem("LoopStart");
01026         sl->insertItem(se->text());
01027         break;
01028 
01029     case ScriptEdit::LoopEnd:
01030         stl->insertItem("LoopEnd");
01031         sl->insertItem(se->text());
01032         break;
01033 
01034     case ScriptEdit::Scan:
01035         stl->insertItem("Scan");
01036         sl->insertItem(se->text());
01037         break;
01038 
01039     case ScriptEdit::Save:
01040         stl->insertItem("Save");
01041         sl->insertItem(se->text());
01042         break;
01043 
01044     default:
01045         break;
01046     }
01047 
01048     //get the scrollbar adjusted, and scroll the list so we can see what
01049     //we're adding to
01050     adjustScrollBar();
01051     slb->setValue(slb->maxValue());
01052 
01053     //clear the text in the entry box
01054     se->setText("");
01055 }
01056 
01057 
01058 void ScriptWidget::insertButton()
01059 {
01060     //exit if there is no highlighted item, or we've reached the
01061     //maximum entries in the script list
01062     if(sl->currentItem() < 0 || (sl->count() == MAX_SCRIPT_ENTRIES-1))
01063         return;
01064 
01065     switch(se->type())
01066     {
01067     case ScriptEdit::Expect:
01068         stl->insertItem("Expect", stl->currentItem());
01069         sl->insertItem(se->text(), sl->currentItem());
01070         break;
01071 
01072     case ScriptEdit::Send:
01073         stl->insertItem("Send", stl->currentItem());
01074         sl->insertItem(se->text(), sl->currentItem());
01075         break;
01076 
01077     case ScriptEdit::SendNoEcho:
01078         stl->insertItem("SendNoEcho", stl->currentItem());
01079         sl->insertItem(se->text(), sl->currentItem());
01080         break;
01081 
01082     case ScriptEdit::Pause:
01083         stl->insertItem("Pause", stl->currentItem());
01084         sl->insertItem(se->text(), sl->currentItem());
01085         break;
01086 
01087     case ScriptEdit::Hangup:
01088         stl->insertItem("Hangup", stl->currentItem());
01089         sl->insertItem("", sl->currentItem());
01090         break;
01091 
01092     case ScriptEdit::Answer:
01093         stl->insertItem("Answer", stl->currentItem());
01094         sl->insertItem("", sl->currentItem());
01095         break;
01096 
01097     case ScriptEdit::Timeout:
01098         stl->insertItem("Timeout", stl->currentItem());
01099         sl->insertItem(se->text(), sl->currentItem());
01100         break;
01101 
01102     case ScriptEdit::Password:
01103         stl->insertItem("Password", stl->currentItem());
01104         sl->insertItem(se->text(), sl->currentItem());
01105         break;
01106 
01107     case ScriptEdit::ID:
01108         stl->insertItem("ID", stl->currentItem());
01109         sl->insertItem(se->text(), sl->currentItem());
01110         break;
01111 
01112     case ScriptEdit::Prompt:
01113         stl->insertItem("Prompt", stl->currentItem());
01114         sl->insertItem(se->text(), sl->currentItem());
01115         break;
01116 
01117     case ScriptEdit::PWPrompt:
01118         stl->insertItem("PWPrompt", stl->currentItem());
01119         sl->insertItem(se->text(), sl->currentItem());
01120         break;
01121 
01122     case ScriptEdit::LoopStart:
01123         stl->insertItem("LoopStart", stl->currentItem());
01124         sl->insertItem(se->text(), sl->currentItem());
01125         break;
01126 
01127     case ScriptEdit::LoopEnd:
01128         stl->insertItem("LoopEnd", stl->currentItem());
01129         sl->insertItem(se->text(), sl->currentItem());
01130         break;
01131 
01132     case ScriptEdit::Scan:
01133         stl->insertItem("Scan", stl->currentItem());
01134         sl->insertItem(se->text(), sl->currentItem());
01135         break;
01136 
01137     case ScriptEdit::Save:
01138         stl->insertItem("Save", stl->currentItem());
01139         sl->insertItem(se->text(), sl->currentItem());
01140         break;
01141 
01142     default:
01143         break;
01144     }
01145     adjustScrollBar();
01146     se->setText("");
01147 }
01148 
01149 
01150 void ScriptWidget::removeButton()
01151 {
01152     if(sl->currentItem() >= 0)
01153     {
01154         int stlc = stl->currentItem();
01155         sl->removeItem(sl->currentItem());
01156         stl->removeItem(stlc);
01157         adjustScrollBar();
01158         insert->setEnabled(sl->currentItem() != -1);
01159         remove->setEnabled(sl->currentItem() != -1);
01160     }
01161 }
01162 
01163 
01164 
01166 //
01167 // Used to specify a new phone number
01168 //
01170 PhoneNumberDialog::PhoneNumberDialog(QWidget *parent)
01171         : QDialog(parent,"PhoneNumberDialog",true)
01172 {
01173     setCaption( tr("Add Phone Number") );
01174 
01175 
01176     QVBoxLayout *layout = new QVBoxLayout( this );
01177     layout->setSpacing( 3 );
01178     layout->setMargin( 3 );
01179 
01180     //    QHBox *hbox = new QHBox(this);
01181     //  setMainWidget(hbox);
01182 
01183     //  hbox->setSpacing( 2 );//KDialog::spacingHint());
01184 
01185     QLabel *label = new QLabel(this, tr("Enter a phone number:"));
01186     layout->addWidget( label );
01187 
01188     le = new QLineEdit(this, "lineEdit");
01189     layout->addWidget( le );
01190 
01191     connect(le, SIGNAL(textChanged(const QString&)),
01192             this, SLOT(textChanged(const QString&)));
01193 
01194     le->setFocus();
01195     textChanged("");
01196 
01197 
01198 }
01199 
01200 
01201 QString PhoneNumberDialog::phoneNumber()
01202 {
01203     QString s = le->text();
01204 
01205     return s;
01206 }
01207 
01208 
01209 void PhoneNumberDialog::textChanged(const QString &)
01210 {
01211     //  enableButtonOK(s.length() > 0);
01212 }
01213 
01214 
01215 //#include "edit.moc"

Generated on Sat Nov 5 16:17:50 2005 for OPIE by  doxygen 1.4.2