summaryrefslogtreecommitdiffstats
path: root/kppp/edit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kppp/edit.cpp')
-rw-r--r--kppp/edit.cpp1239
1 files changed, 1239 insertions, 0 deletions
diff --git a/kppp/edit.cpp b/kppp/edit.cpp
new file mode 100644
index 00000000..36df7c50
--- /dev/null
+++ b/kppp/edit.cpp
@@ -0,0 +1,1239 @@
+/*
+ * kPPP: A pppd Front End for the KDE project
+ *
+ * $Id$
+ * Copyright (C) 1997 Bernd Johannes Wuebben
+ * wuebben@math.cornell.edu
+ *
+ * based on EzPPP:
+ * Copyright (C) 1997 Jay Painter
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include <termios.h>
+#include <qlayout.h>
+#include <kmessagebox.h>
+#include <qwhatsthis.h>
+#include <qregexp.h>
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <kbuttonbox.h>
+#include <klocale.h>
+#include <qvgroupbox.h>
+#include <qhbox.h>
+#include <kdialog.h>
+#include <kwin.h>
+
+#include "edit.h"
+#include "pppdata.h"
+#include "newwidget.h"
+#include "iplined.h"
+#include "auth.h"
+
+DialWidget::DialWidget( QWidget *parent, bool isnewaccount, const char *name )
+ : QWidget(parent, name)
+{
+ const int GRIDROWS = 8;
+
+ QGridLayout *tl = new QGridLayout(parent, GRIDROWS, 2, 0, KDialog::spacingHint());
+
+ connect_label = new QLabel(i18n("Connection &name:"), parent);
+ tl->addWidget(connect_label, 0, 0);
+
+ connectname_l = new QLineEdit(parent);
+ connectname_l->setMaxLength(ACCNAME_SIZE);
+ connect_label->setBuddy(connectname_l);
+
+ tl->addWidget(connectname_l, 0, 1);
+ QString tmp = i18n("Type in a unique name for this connection");
+
+ QWhatsThis::add(connect_label,tmp);
+ QWhatsThis::add(connectname_l,tmp);
+
+
+ number_label = new QLabel(i18n("P&hone number:"), parent);
+ number_label->setAlignment(AlignTop|AlignLeft);
+ tl->addWidget(number_label, 1, 0);
+
+ QHBoxLayout *lpn = new QHBoxLayout(5);
+ tl->addLayout(lpn, 1, 1);
+ numbers = new QListBox(parent);
+ number_label->setBuddy(numbers);
+ numbers->setMinimumSize(120, 70);
+ lpn->addWidget(numbers);
+ QVBoxLayout *lpn1 = new QVBoxLayout;
+ lpn->addLayout(lpn1);
+ add = new QPushButton(i18n("&Add..."), parent);
+ del = new QPushButton(i18n("&Remove"), parent);
+
+ up = new QPushButton(parent);
+ up->setIconSet(BarIconSet("up"));
+ down = new QPushButton(parent);
+ down->setIconSet(BarIconSet("down"));
+ lpn1->addWidget(add);
+ lpn1->addWidget(del);
+ lpn1->addStretch(1);
+ lpn1->addWidget(up);
+ lpn1->addWidget(down);
+ connect(add, SIGNAL(clicked()),
+ this, SLOT(addNumber()));
+ connect(del, SIGNAL(clicked()),
+ this, SLOT(delNumber()));
+ connect(up, SIGNAL(clicked()),
+ this, SLOT(upNumber()));
+ connect(down, SIGNAL(clicked()),
+ this, SLOT(downNumber()));
+ connect(numbers, SIGNAL(highlighted(int)),
+ this, SLOT(selectionChanged(int)));
+ numbersChanged();
+
+ tmp = i18n("<p>Specifies the phone numbers to dial. You\n"
+ "can supply multiple numbers here, simply\n"
+ "click on \"Add\". You can arrange the\n"
+ "order the numbers are tried by using the\n"
+ "arrow buttons.\n\n"
+ "When a number is busy or fails, <i>kppp</i> will \n"
+ "try the next number and so on");
+
+ QWhatsThis::add(number_label,tmp);
+ QWhatsThis::add(numbers,tmp);
+
+ auth_l = new QLabel(i18n("A&uthentication:"), parent);
+ tl->addWidget(auth_l, 3, 0);
+
+ auth = new QComboBox(parent);
+ auth_l->setBuddy(auth);
+ auth->insertItem(i18n("Script-based"));
+ auth->insertItem(i18n("PAP"));
+ auth->insertItem(i18n("Terminal-based"));
+ auth->insertItem(i18n("CHAP"));
+ auth->insertItem(i18n("PAP/CHAP"));
+ tl->addWidget(auth, 3, 1);
+ tmp = i18n("<p>Specifies the method used to identify yourself to\n"
+ "the PPP server. Most universities still use\n"
+ "<b>Terminal</b>- or <b>Script</b>-based authentication,\n"
+ "while most ISP use <b>PAP</b> and/or <b>CHAP</b>. If\n"
+ "unsure, contact your ISP.\n"
+ "\n"
+ "If you can choose between PAP and CHAP,\n"
+ "choose CHAP, because it's much safer. If you don't know\n"
+ "whether PAP or CHAP is right, choose PAP/CHAP.");
+
+ QWhatsThis::add(auth_l,tmp);
+ QWhatsThis::add(auth,tmp);
+
+ store_password = new QCheckBox(i18n("Store &password"), parent);
+ store_password->setChecked(true);
+ tl->addMultiCellWidget(store_password, 4, 4, 0, 1, AlignRight);
+ QWhatsThis::add(store_password,
+ i18n("<p>When this is turned on, your ISP password\n"
+ "will be saved in <i>kppp</i>'s config file, so\n"
+ "you do not need to type it in every time.\n"
+ "\n"
+ "<b><font color=\"red\">Warning:</font> your password will be stored as\n"
+ "plain text in the config file, which is\n"
+ "readable only to you. Make sure nobody\n"
+ "gains access to this file!"));
+
+ cbtype_l = new QLabel(i18n("&Callback type:"), parent);
+ tl->addWidget(cbtype_l, 5, 0);
+
+ cbtype = new QComboBox(parent);
+ cbtype_l->setBuddy(cbtype);
+ cbtype->insertItem(i18n("None"));
+ cbtype->insertItem(i18n("Administrator-defined"));
+ cbtype->insertItem(i18n("User-defined"));
+ connect(cbtype, SIGNAL(highlighted(int)),
+ this, SLOT(cbtypeChanged(int)));
+ tl->addWidget(cbtype, 5, 1);
+ tmp = i18n("Callback type");
+
+ QWhatsThis::add(cbtype_l,tmp);
+ QWhatsThis::add(cbtype,tmp);
+
+ cbphone_l = new QLabel(i18n("Call&back number:"), parent);
+ tl->addWidget(cbphone_l, 6, 0);
+
+ cbphone = new QLineEdit(parent);
+ cbphone_l->setBuddy(cbphone);
+ cbphone->setMaxLength(140);
+ tl->addWidget(cbphone, 6, 1);
+ tmp = i18n("Callback phone number");
+
+ QWhatsThis::add(cbphone_l,tmp);
+ QWhatsThis::add(cbphone,tmp);
+
+ pppdargs = new QPushButton(i18n("Customize &pppd Arguments..."), parent);
+ connect(pppdargs, SIGNAL(clicked()), SLOT(pppdargsbutton()));
+ tl->addMultiCellWidget(pppdargs, 7, 7, 0, 1, AlignCenter);
+
+ // Set defaults if editing an existing connection
+ if(!isnewaccount) {
+ connectname_l->setText(gpppdata.accname());
+
+ // insert the phone numbers into the listbox
+ QString n = gpppdata.phonenumber();
+ QString tmp = "";
+ uint idx = 0;
+ while(idx != n.length()) {
+ if(n[idx] == ':') {
+ if(tmp.length() > 0)
+ numbers->insertItem(tmp);
+ tmp = "";
+ } else
+ tmp += n[idx];
+ idx++;
+ }
+ if(tmp.length() > 0)
+ numbers->insertItem(tmp);
+
+ auth->setCurrentItem(gpppdata.authMethod());
+ store_password->setChecked(gpppdata.storePassword());
+ cbtype->setCurrentItem(gpppdata.callbackType());
+ cbphone->setText(gpppdata.callbackPhone());
+ } else {
+ // select PAP/CHAP as default
+ auth->setCurrentItem(AUTH_PAPCHAP);
+ // select NONE as default
+ cbtype->setCurrentItem(CBTYPE_NONE);
+ }
+
+ emit cbtypeChanged(cbtype->currentItem());
+ numbersChanged();
+ tl->activate();
+}
+
+
+bool DialWidget::save() {
+ //first check to make sure that the account name is unique!
+ if(connectname_l->text().isEmpty() ||
+ !gpppdata.isUniqueAccname(connectname_l->text())) {
+ return false;
+ } else {
+ gpppdata.setAccname(connectname_l->text());
+
+ QString number = "";
+ for(uint i = 0; i < numbers->count(); i++) {
+ if(i != 0)
+ number += ":";
+ number += numbers->text(i);
+ }
+
+ gpppdata.setPhonenumber(number);
+ gpppdata.setAuthMethod(auth->currentItem());
+ gpppdata.setStorePassword(store_password->isChecked());
+ gpppdata.setCallbackType(cbtype->currentItem());
+ gpppdata.setCallbackPhone(cbphone->text());
+ return true;
+ }
+}
+
+
+void DialWidget::numbersChanged() {
+ int sel = numbers->currentItem();
+
+ del->setEnabled(sel != -1);
+ up->setEnabled(sel != -1 && sel != 0);
+ down->setEnabled(sel != -1 && sel != (int)numbers->count()-1);
+}
+
+void DialWidget::cbtypeChanged(int value) {
+ cbphone_l->setEnabled(value == CBTYPE_USER);
+ cbphone->setEnabled(value == CBTYPE_USER);
+}
+
+void DialWidget::selectionChanged(int) {
+ numbersChanged();
+}
+
+
+void DialWidget::addNumber() {
+ PhoneNumberDialog dlg(this);
+ if(dlg.exec()) {
+ numbers->insertItem(dlg.phoneNumber());
+ numbersChanged();
+ }
+}
+
+
+void DialWidget::delNumber() {
+ if(numbers->currentItem() != -1) {
+ numbers->removeItem(numbers->currentItem());
+ numbersChanged();
+ }
+}
+
+
+void DialWidget::upNumber() {
+ int idx = numbers->currentItem();
+ if(idx != -1) {
+ QString item = numbers->text(idx);
+ numbers->removeItem(idx);
+ numbers->insertItem(item, idx-1);
+ numbers->setCurrentItem(idx-1);
+ numbersChanged();
+ }
+}
+
+
+void DialWidget::downNumber() {
+ int idx = numbers->currentItem();
+ if(idx != -1) {
+ QString item = numbers->text(idx);
+ numbers->removeItem(idx);
+ numbers->insertItem(item, idx+1);
+ numbers->setCurrentItem(idx+1);
+ numbersChanged();
+ }
+}
+
+
+void DialWidget::pppdargsbutton() {
+ PPPdArguments pa(this);
+ pa.exec();
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////
+// ExecWidget
+/////////////////////////////////////////////////////////////////////////////
+ExecWidget::ExecWidget(QWidget *parent, bool isnewaccount, const char *name) :
+ QWidget(parent, name)
+{
+ QVBoxLayout *tl = new QVBoxLayout(parent, 0, KDialog::spacingHint());
+
+ QLabel *l = new QLabel(\
+i18n("Here you can select commands to run at certain stages of the\n"
+ "connection. The commands are run with your real user id, so\n"
+ "you cannot run any commands here requiring root permissions\n"
+ "(unless, of course, you are root).\n\n"
+ "Be sure to supply the whole path to the program otherwise\n"
+ "kppp might be unable to find it."), parent);
+ l->setMinimumHeight(l->sizeHint().height());
+ tl->addWidget(l);
+ tl->addStretch(1);
+
+ QGridLayout *l1 = new QGridLayout(4, 2, 10);
+ tl->addLayout(l1);
+ l1->setColStretch(0, 0);
+ l1->setColStretch(1, 1);
+
+ before_connect_l = new QLabel(i18n("&Before connect:"), parent);
+ before_connect_l->setAlignment(AlignVCenter);
+ l1->addWidget(before_connect_l, 0, 0);
+ before_connect = new QLineEdit(parent);
+ before_connect_l->setBuddy(before_connect);
+ before_connect->setMaxLength(COMMAND_SIZE);
+ l1->addWidget(before_connect, 0, 1);
+ QString tmp = i18n("Allows you to run a program <b>before</b> a connection\n"
+ "is established. It is called immediately before\n"
+ "dialing has begun.\n\n"
+ "This might be useful, e.g. to stop HylaFAX blocking the\n"
+ "modem.");
+
+ QWhatsThis::add(before_connect_l,tmp);
+ QWhatsThis::add(before_connect,tmp);
+
+ command_label = new QLabel(i18n("&Upon connect:"), parent);
+ command_label->setAlignment(AlignVCenter);
+ l1->addWidget(command_label, 1, 0);
+ command = new QLineEdit(parent);
+ command_label->setBuddy(command);
+ command->setMaxLength(COMMAND_SIZE);
+ l1->addWidget(command, 1, 1);
+ tmp = i18n("Allows you to run a program <b>after</b> a connection\n"
+ "is established. When your program is called, all\n"
+ "preparations for an Internet connection are finished.\n"
+ "\n"
+ "Very useful for fetching mail and news");
+
+ QWhatsThis::add(command_label,tmp);
+ QWhatsThis::add(command,tmp);
+
+ predisconnect_label = new QLabel(i18n("Before &disconnect:"),
+ parent);
+ predisconnect_label->setAlignment(AlignVCenter);
+ l1->addWidget(predisconnect_label, 2, 0);
+ predisconnect = new QLineEdit(parent);
+ predisconnect_label->setBuddy(predisconnect);
+ predisconnect->setMaxLength(COMMAND_SIZE);
+ l1->addWidget(predisconnect, 2, 1);
+ tmp = i18n("Allows you to run a program <b>before</b> a connection\n"
+ "is closed. The connection will stay open until\n"
+ "the program exits.");
+
+ QWhatsThis::add(predisconnect_label,tmp);
+ QWhatsThis::add(predisconnect,tmp);
+
+ discommand_label = new QLabel(i18n("U&pon disconnect:"),
+ parent);
+ discommand_label->setAlignment(AlignVCenter);
+ l1->addWidget(discommand_label, 3, 0);
+
+ discommand = new QLineEdit(parent);
+ discommand_label->setBuddy(discommand);
+ discommand->setMaxLength(COMMAND_SIZE);
+ l1->addWidget(discommand, 3, 1);
+ tmp = i18n("Allows you to run a program <b>after</b> a connection\n"
+ "has been closed.");
+
+ QWhatsThis::add(discommand_label,tmp);
+ QWhatsThis::add(discommand,tmp);
+
+ // extra space between entries
+ l1->addRowSpacing(1, 5);
+ l1->addRowSpacing(3, 5);
+
+ tl->addStretch(1);
+ tl->activate();
+
+ // Set defaults if editing an existing connection
+ if(!isnewaccount) {
+ before_connect->setText(gpppdata.command_before_connect());
+ command->setText(gpppdata.command_on_connect());
+ discommand->setText(gpppdata.command_on_disconnect());
+ predisconnect->setText(gpppdata.command_before_disconnect());
+ }
+}
+
+
+bool ExecWidget::save() {
+ gpppdata.setCommand_before_connect(before_connect->text());
+ gpppdata.setCommand_on_connect(command->text());
+ gpppdata.setCommand_before_disconnect(predisconnect->text());
+ gpppdata.setCommand_on_disconnect(discommand->text());
+ return true;
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// IPWidget
+//
+/////////////////////////////////////////////////////////////////////////////
+IPWidget::IPWidget( QWidget *parent, bool isnewaccount, const char *name )
+ : QWidget(parent, name)
+{
+ QVBoxLayout *topLayout = new QVBoxLayout(parent);
+ topLayout->setSpacing(KDialog::spacingHint());
+
+ box = new QVGroupBox(i18n("C&onfiguration"), parent);
+ box->setInsideSpacing(KDialog::spacingHint());
+
+ rb = new QButtonGroup(parent);
+ rb->hide();
+ connect(rb, SIGNAL(clicked(int)),
+ SLOT(hitIPSelect(int)));
+
+ dynamicadd_rb = new QRadioButton(box);
+ dynamicadd_rb->setText(i18n("Dynamic IP address"));
+ QWhatsThis::add(dynamicadd_rb,
+ i18n("Select this option when your computer gets an\n"
+ "internet address (IP) every time a\n"
+ "connection is made.\n"
+ "\n"
+ "Almost every Internet Service Provider uses\n"
+ "this method, so this should be turned on."));
+
+ staticadd_rb = new QRadioButton(box);
+ staticadd_rb->setText(i18n("Static IP address"));
+ rb->insert(dynamicadd_rb, 0);
+ rb->insert(staticadd_rb, 1);
+ QWhatsThis::add(staticadd_rb,
+ i18n("Select this option when your computer has a\n"
+ "fixed internet address (IP). Most computers\n"
+ "don't have this, so you should probably select\n"
+ "dynamic IP addressing unless you know what you\n"
+ "are doing."));
+
+ QWidget *ipWidget = new QWidget(box);
+ QGridLayout *ipLayout = new QGridLayout(ipWidget, 2, 2);
+ ipLayout->setSpacing(KDialog::spacingHint());
+
+ ipaddress_label = new QLabel(i18n("&IP address:"), ipWidget);
+ QString tmp = i18n("If your computer has a permanent internet\n"
+ "address, you must supply your IP address here.");
+ ipLayout->addWidget(ipaddress_label, 0, 0);
+
+ ipaddress_l = new IPLineEdit(ipWidget);
+ ipaddress_label->setBuddy(ipaddress_l);
+ ipLayout->addWidget(ipaddress_l, 0, 1);
+
+ QWhatsThis::add(ipaddress_label,tmp);
+ QWhatsThis::add(ipaddress_l,tmp);
+
+ sub_label = new QLabel(i18n("&Subnet mask:"), ipWidget);
+ tmp = i18n("<p>If your computer has a static Internet address,\n"
+ "you must supply a network mask here. In almost\n"
+ "all cases this netmask will be <b>255.255.255.0</b>,\n"
+ "but your mileage may vary.\n"
+ "\n"
+ "If unsure, contact your Internet Service Provider");
+ ipLayout->addWidget(sub_label, 1, 0);
+
+ subnetmask_l = new IPLineEdit(ipWidget);
+ sub_label->setBuddy(subnetmask_l);
+ ipLayout->addWidget(subnetmask_l, 1, 1);
+
+ QWhatsThis::add(sub_label,tmp);
+ QWhatsThis::add(subnetmask_l,tmp);
+
+ autoname = new QCheckBox(i18n("&Auto-configure hostname from this IP"), parent);
+ autoname->setChecked(gpppdata.autoname());
+ connect(autoname,SIGNAL(toggled(bool)),
+ this,SLOT(autoname_t(bool)));
+
+ QWhatsThis::add(autoname,
+ i18n("<p>Whenever you connect, this reconfigures\n"
+ "your hostname to match the IP address you\n"
+ "got from the PPP server. This may be useful\n"
+ "if you need to use a protocol which depends\n"
+ "on this information, but it can also cause several\n"
+ "<a href=\"kppp-7.html#autohostname\">problems</a>.\n"
+ "\n"
+ "Do not enable this unless you really need it."));
+
+ topLayout->addWidget(box);
+ topLayout->addWidget(autoname);
+ topLayout->addStretch();
+
+ //load info from gpppdata
+ if(!isnewaccount) {
+ if(gpppdata.ipaddr() == "0.0.0.0" &&
+ gpppdata.subnetmask() == "0.0.0.0") {
+ dynamicadd_rb->setChecked(true);
+ hitIPSelect(0);
+ autoname->setChecked(gpppdata.autoname());
+ }
+ else {
+ ipaddress_l->setText(gpppdata.ipaddr());
+ subnetmask_l->setText(gpppdata.subnetmask());
+ staticadd_rb->setChecked(true);
+ autoname->setChecked(false);
+ }
+ }
+ else {
+ dynamicadd_rb->setChecked(true);
+ hitIPSelect(0);
+ }
+
+}
+
+void IPWidget::autoname_t(bool on) {
+ static bool was_warned = false;
+
+ // big-fat warning when selecting the auto configure hostname option
+ if(on && !was_warned) {
+ KMessageBox::information(this,
+ i18n("Selecting this option might cause some weird "
+ "problems with the X-server and applications "
+ "while kppp is connected. Don't use it until "
+ "you know what you are doing!\n"
+ "For more information take a look at the "
+ "handbook (or help) in the section \"Frequently "
+ "asked questions\"."),
+ i18n("Warning"));
+ was_warned = true;
+ }
+}
+
+
+void IPWidget::save() {
+ if(dynamicadd_rb->isChecked()) {
+ gpppdata.setIpaddr("0.0.0.0");
+ gpppdata.setSubnetmask("0.0.0.0");
+ } else {
+ gpppdata.setIpaddr(ipaddress_l->text());
+ gpppdata.setSubnetmask(subnetmask_l->text());
+ }
+ gpppdata.setAutoname(autoname->isChecked());
+}
+
+
+void IPWidget::hitIPSelect( int i ) {
+ if(i == 0) {
+ ipaddress_label->setEnabled(false);
+ sub_label->setEnabled(false);
+ ipaddress_l->setEnabled(false);
+ subnetmask_l->setEnabled(false);
+ }
+ else {
+ ipaddress_label->setEnabled(true);
+ sub_label->setEnabled(true);
+ ipaddress_l->setEnabled(true);
+ subnetmask_l->setEnabled(true);
+ }
+}
+
+
+
+DNSWidget::DNSWidget( QWidget *parent, bool isnewaccount, const char *name )
+ : QWidget(parent, name)
+{
+ // box = new QGroupBox(parent);
+ QGridLayout *tl = new QGridLayout(parent, 7, 2, 0, KDialog::spacingHint());
+
+ dnsdomain_label = new QLabel(i18n("Domain &name:"), parent);
+ tl->addWidget(dnsdomain_label, 0, 0);
+
+ dnsdomain = new QLineEdit(parent);
+ dnsdomain_label->setBuddy(dnsdomain);
+ dnsdomain->setMaxLength(DOMAIN_SIZE);
+ tl->addWidget(dnsdomain, 0, 1);
+ QString tmp = i18n("If you enter a domain name here, this domain\n"
+ "name is used for your computer while you are\n"
+ "connected. When the connection is closed, the\n"
+ "original domain name of your computer is\n"
+ "restored.\n"
+ "\n"
+ "If you leave this field blank, no changes are\n"
+ "made to the domain name.");
+
+ QWhatsThis::add(dnsdomain_label,tmp);
+ QWhatsThis::add(dnsdomain,tmp);
+
+ conf_label = new QLabel(i18n("C&onfiguration:"), parent);
+ tl->addWidget(conf_label, 1, 0);
+
+ bg = new QButtonGroup("Group", this);
+ conf_label->setBuddy(bg);
+ connect(bg, SIGNAL(clicked(int)), SLOT(DNS_Mode_Selected(int)));
+ bg->hide();
+
+ autodns = new QRadioButton(i18n("Automatic"), parent);
+ bg->insert(autodns, 0);
+ tl->addWidget(autodns, 1, 1);
+ // no automatic DNS detection for pppd < 2.3.7
+ if(!gpppdata.pppdVersionMin(2, 3, 7))
+ autodns->setEnabled(false);
+
+ mandns = new QRadioButton(i18n("Manual"), parent);
+ bg->insert(mandns, 1);
+ tl->addWidget(mandns, 2, 1);
+
+ dns_label = new QLabel(i18n("DNS &IP address:"), parent);
+ tl->addWidget(dns_label, 3, 0);
+
+ QHBoxLayout *l2 = new QHBoxLayout;
+ tl->addLayout(l2, 3, 1);
+ dnsipaddr = new IPLineEdit(parent);
+ dns_label->setBuddy(dnsipaddr);
+ connect(dnsipaddr, SIGNAL(returnPressed()),
+ SLOT(adddns()));
+ connect(dnsipaddr, SIGNAL(textChanged(const QString &)),
+ SLOT(DNS_Edit_Changed(const QString &)));
+ l2->addWidget(dnsipaddr, 1);
+ l2->addStretch(1);
+ tmp = i18n("<p>Allows you to specify a new DNS server to be\n"
+ "used while you are connected. When the\n"
+ "connection is closed, this DNS entry will be\n"
+ "removed again.\n"
+ "\n"
+ "To add a DNS server, type in the IP address of\n"
+ "the DNS server here and click on <b>Add</b>");
+
+ QWhatsThis::add(dns_label, tmp);
+ QWhatsThis::add(dnsipaddr, tmp);
+
+ QHBoxLayout *l1 = new QHBoxLayout;
+ tl->addLayout(l1, 4, 1);
+ add = new QPushButton(i18n("&Add"), parent);
+ connect(add, SIGNAL(clicked()), SLOT(adddns()));
+ int width = add->sizeHint().width();
+ width = QMAX(width,60);
+ add->setMinimumWidth(width);
+ l1->addWidget(add);
+ l1->addStretch(1);
+ QWhatsThis::add(add,
+ i18n("Click this button to add the DNS server\n"
+ "specified in the field above. The entry\n"
+ "will then be added to the list below"));
+
+ remove = new QPushButton(i18n("&Remove"), parent);
+ connect(remove, SIGNAL(clicked()), SLOT(removedns()));
+ width = remove->sizeHint().width();
+ width = QMAX(width,60);
+ remove->setMinimumWidth(width);
+ l1->addWidget(remove);
+ QWhatsThis::add(remove,
+ i18n("Click this button to remove the selected DNS\n"
+ "server entry from the list below"));
+
+ servers_label = new QLabel(i18n("DNS address &list:"), parent);
+ servers_label->setAlignment(AlignTop|AlignLeft);
+ tl->addWidget(servers_label, 5, 0);
+
+ dnsservers = new QListBox(parent);
+ servers_label->setBuddy(dnsservers);
+ dnsservers->setMinimumSize(150, 80);
+ connect(dnsservers, SIGNAL(highlighted(int)),
+ SLOT(DNS_Entry_Selected(int)));
+ tl->addWidget(dnsservers, 5, 1);
+ tmp = i18n("<p>This shows all defined DNS servers to use\n"
+ "while you are connected. Use the <b>Add</b> and\n"
+ "<b>Remove</b> buttons to modify the list");
+
+ QWhatsThis::add(servers_label,tmp);
+ QWhatsThis::add(dnsservers,tmp);
+
+ exdnsdisabled_toggle = new QCheckBox(i18n( \
+"&Disable existing DNS servers during connection"),
+ parent);
+ exdnsdisabled_toggle->setChecked(gpppdata.exDNSDisabled());
+ tl->addMultiCellWidget(exdnsdisabled_toggle, 6, 6, 0, 1, AlignCenter);
+ QWhatsThis::add(exdnsdisabled_toggle,
+ i18n("<p>When this option is selected, all DNS\n"
+ "servers specified in <tt>/etc/resolv.conf</tt> are\n"
+ "temporary disabled while the dialup connection\n"
+ "is established. After the connection is\n"
+ "closed, the servers will be re-enabled\n"
+ "\n"
+ "Typically, there is no reason to use this\n"
+ "option, but it may become useful under \n"
+ "some circumstances."));
+
+
+ // restore data if editing
+ if(!isnewaccount) {
+ dnsservers->insertStringList(gpppdata.dns());
+ dnsdomain->setText(gpppdata.domain());
+ }
+
+ int mode = gpppdata.autoDNS() ? 0 : 1;
+ bg->setButton(mode);
+ DNS_Mode_Selected(mode);
+
+ tl->activate();
+}
+
+void DNSWidget::DNS_Edit_Changed(const QString &text) {
+ QRegExp r("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+");
+ add->setEnabled(text.find(r) != -1);
+}
+
+void DNSWidget::DNS_Entry_Selected(int) {
+ remove->setEnabled(true);
+}
+
+void DNSWidget::DNS_Mode_Selected(int mode) {
+ bool on = (mode == 1);
+ dns_label->setEnabled(on);
+ servers_label->setEnabled(on);
+ dnsipaddr->setText("");
+ dnsipaddr->setEnabled(on);
+ add->setEnabled(false);
+ remove->setEnabled(dnsservers->count()>0 && on);
+ dnsservers->clearSelection();
+ dnsservers->setEnabled(on);
+ dnsservers->triggerUpdate(false);
+}
+
+void DNSWidget::save() {
+ gpppdata.setAutoDNS(bg->id(bg->selected()) == 0);
+ QStringList serverlist;
+ for(uint i=0; i < dnsservers->count(); i++)
+ serverlist.append(dnsservers->text(i));
+ gpppdata.setDns(serverlist);
+
+ // strip leading dot
+ QString s(dnsdomain->text());
+ if(s.left(1) == ".")
+ gpppdata.setDomain(s.mid(1));
+ else
+ gpppdata.setDomain(dnsdomain->text());
+
+ gpppdata.setExDNSDisabled(exdnsdisabled_toggle->isChecked());
+}
+
+
+void DNSWidget::adddns() {
+ if(dnsservers->count() < MAX_DNS_ENTRIES) {
+ dnsservers->insertItem(dnsipaddr->text());
+ dnsipaddr->setText("");
+ }
+}
+
+
+void DNSWidget::removedns() {
+ int i;
+ i = dnsservers->currentItem();
+ if(i != -1)
+ dnsservers->removeItem(i);
+ remove->setEnabled(dnsservers->count()>0);
+}
+
+
+//
+// GatewayWidget
+//
+GatewayWidget::GatewayWidget( QWidget *parent, bool isnewaccount, const char *name )
+ : QWidget(parent, name)
+{
+ QVBoxLayout *topLayout = new QVBoxLayout(parent);
+ topLayout->setSpacing(KDialog::spacingHint());
+
+ box = new QVGroupBox(i18n("C&onfiguration"), parent);
+ box->setInsideSpacing(KDialog::spacingHint());
+
+ rb = new QButtonGroup(parent);
+ rb->hide();
+ connect(rb, SIGNAL(clicked(int)), SLOT(hitGatewaySelect(int)));
+
+ defaultgateway = new QRadioButton(box);
+ defaultgateway->setText(i18n("Default gateway"));
+ rb->insert(defaultgateway, 0);
+ QWhatsThis::add(defaultgateway,
+ i18n("This makes the PPP peer computer (the computer\n"
+ "you are connected to with your modem) to act as\n"
+ "a gateway. Your computer will send all packets not\n"
+ "going to a computer inside your local net to this\n"
+ "computer, which will route these packets.\n"
+ "\n"
+ "This is the default for most ISPs, so you should\n"
+ "probably leave this option on."));
+
+
+ staticgateway = new QRadioButton(box);
+ staticgateway->setText(i18n("Static gateway"));
+ rb->insert(staticgateway, 1);
+ QWhatsThis::add(staticgateway,
+ i18n("<p>Allows you to specify which computer you want\n"
+ "to use as gateway (see <i>Default Gateway</i> above)"));
+
+ QHBox *gateBox = new QHBox(box);
+ gate_label = new QLabel(i18n("Gateway &IP address:"), gateBox);
+ gatewayaddr = new IPLineEdit(gateBox);
+ gate_label->setBuddy(gatewayaddr);
+
+ defaultroute = new QCheckBox(i18n("&Assign the default route to this gateway"),
+ parent);
+ QWhatsThis::add(defaultroute,
+ i18n("If this option is enabled, all packets not\n"
+ "going to the local net are routed through\n"
+ "the PPP connection.\n"
+ "\n"
+ "Normally, you should turn this on"));
+
+ topLayout->addWidget(box);
+ topLayout->addWidget(defaultroute);
+ topLayout->addStretch();
+
+ //load info from gpppdata
+ if(!isnewaccount) {
+ if(gpppdata.gateway() == "0.0.0.0") {
+ defaultgateway->setChecked(true);
+ hitGatewaySelect(0);
+ }
+ else {
+ gatewayaddr->setText(gpppdata.gateway());
+ staticgateway->setChecked(true);
+ }
+ defaultroute->setChecked(gpppdata.defaultroute());
+ }
+ else {
+ defaultgateway->setChecked(true);
+ hitGatewaySelect(0);
+ defaultroute->setChecked(true);
+ }
+}
+
+void GatewayWidget::save() {
+ gpppdata.setGateway(gatewayaddr->text());
+ gpppdata.setDefaultroute(defaultroute->isChecked());
+}
+
+
+void GatewayWidget::hitGatewaySelect( int i ) {
+ if(i == 0) {
+ gatewayaddr->setText("0.0.0.0");
+ gatewayaddr->setEnabled(false);
+ gate_label->setEnabled(false);
+ }
+ else {
+ gatewayaddr->setEnabled(true);
+ gatewayaddr->setText("");
+ gate_label->setEnabled(true);
+ }
+}
+
+
+
+ScriptWidget::ScriptWidget( QWidget *parent, bool isnewaccount, const char *name )
+ : QWidget(parent, name)
+{
+ QVBoxLayout *tl = new QVBoxLayout(parent, 0, KDialog::spacingHint());
+ se = new ScriptEdit(parent);
+ connect(se, SIGNAL(returnPressed()), SLOT(addButton()));
+ tl->addWidget(se);
+
+ // insert equal-sized buttons
+ KButtonBox *bbox = new KButtonBox(parent);
+ add = bbox->addButton(i18n("&Add"));
+ connect(add, SIGNAL(clicked()), SLOT(addButton()));
+ bbox->addStretch(1);
+ insert = bbox->addButton(i18n("&Insert"));
+ connect(insert, SIGNAL(clicked()), SLOT(insertButton()));
+ bbox->addStretch(1);
+ remove = bbox->addButton(i18n("&Remove"));
+ connect(remove, SIGNAL(clicked()), SLOT(removeButton()));
+ bbox->layout();
+ tl->addWidget(bbox);
+
+ QHBoxLayout *l12 = new QHBoxLayout(0);
+ tl->addLayout(l12);
+ stl = new QListBox(parent);
+ stl->setVScrollBarMode( QScrollView::AlwaysOff );
+ connect(stl, SIGNAL(highlighted(int)), SLOT(stlhighlighted(int)));
+ stl->setMinimumSize(QSize(70, 140));
+
+ sl = new QListBox(parent);
+ sl->setVScrollBarMode( QScrollView::AlwaysOff );
+ connect(sl, SIGNAL(highlighted(int)), SLOT(slhighlighted(int)));
+ sl->setMinimumSize(QSize(150, 140));
+
+ slb = new QScrollBar(parent);
+ slb->setFixedWidth(slb->sizeHint().width());
+ connect(slb, SIGNAL(valueChanged(int)), SLOT(scrolling(int)));
+
+ l12->addWidget(stl, 1);
+ l12->addWidget(sl, 3);
+ l12->addWidget(slb, 0);
+
+ //load data from gpppdata
+ if(!isnewaccount) {
+ QStringList &comlist = gpppdata.scriptType();
+ QStringList &arglist = gpppdata.script();
+ QStringList::Iterator itcom = comlist.begin();
+ QStringList::Iterator itarg = arglist.begin();
+
+ for ( ;
+ itcom != comlist.end() && itarg != arglist.end();
+ ++itcom, ++itarg )
+ {
+ stl->insertItem(*itcom);
+ sl->insertItem(*itarg);
+ }
+ }
+
+ insert->setEnabled(false);
+ remove->setEnabled(false);
+ adjustScrollBar();
+ tl->activate();
+}
+
+bool ScriptWidget::check() {
+ uint lstart = 0;
+ uint lend = 0;
+ uint errcnt = 0;
+
+ if(sl->count() > 0) {
+ for( uint i=0; i <= sl->count()-1; i++) {
+ if(stl->text(i) == "LoopStart") {
+ lstart++;
+ }
+ if (stl->text(i) == "LoopEnd") {
+ lend++;
+ }
+ if ( lend > lstart ) errcnt++;
+ }
+ return ( (errcnt == 0 ) && (lstart == lend) );
+ }
+ return true;
+}
+
+
+void ScriptWidget::save() {
+ QStringList typelist, arglist;
+ for(uint i=0; i < sl->count(); i++) {
+ typelist.append(stl->text(i));
+ arglist.append(sl->text(i));
+ }
+ gpppdata.setScriptType(typelist);
+ gpppdata.setScript(arglist);
+}
+
+
+
+void ScriptWidget::adjustScrollBar() {
+ if((int)sl->count() <= sl->numItemsVisible())
+ slb->setRange(0, 0);
+ else
+ slb->setRange(0, (sl->count() - sl->numItemsVisible())+1);
+}
+
+
+void ScriptWidget::scrolling(int i) {
+ sl->setTopItem(i);
+ stl->setTopItem(i);
+}
+
+
+void ScriptWidget::slhighlighted(int i) {
+ insert->setEnabled(true);
+ remove->setEnabled(true);
+ stl->setCurrentItem(i);
+}
+
+
+void ScriptWidget::stlhighlighted(int i) {
+ insert->setEnabled(true);
+ remove->setEnabled(true);
+ sl->setCurrentItem(i);
+}
+
+
+void ScriptWidget::addButton() {
+ //don't allow more than the maximum script entries
+ if(sl->count() == MAX_SCRIPT_ENTRIES-1)
+ return;
+
+ switch(se->type()) {
+ case ScriptEdit::Expect:
+ stl->insertItem("Expect");
+ sl->insertItem(se->text());
+ break;
+
+ case ScriptEdit::Send:
+ stl->insertItem("Send");
+ sl->insertItem(se->text());
+ break;
+
+ case ScriptEdit::SendNoEcho:
+ stl->insertItem("SendNoEcho");
+ sl->insertItem(se->text());
+ break;
+
+ case ScriptEdit::Pause:
+ stl->insertItem("Pause");
+ sl->insertItem(se->text());
+ break;
+
+ case ScriptEdit::Hangup:
+ stl->insertItem("Hangup");
+ sl->insertItem("");
+ break;
+
+ case ScriptEdit::Answer:
+ stl->insertItem("Answer");
+ sl->insertItem("");
+ break;
+
+ case ScriptEdit::Timeout:
+ stl->insertItem("Timeout");
+ sl->insertItem(se->text());
+ break;
+
+ case ScriptEdit::Password:
+ stl->insertItem("Password");
+ sl->insertItem(se->text());
+ break;
+
+ case ScriptEdit::ID:
+ stl->insertItem("ID");
+ sl->insertItem(se->text());
+ break;
+
+ case ScriptEdit::Prompt:
+ stl->insertItem("Prompt");
+ sl->insertItem(se->text());
+ break;
+
+ case ScriptEdit::PWPrompt:
+ stl->insertItem("PWPrompt");
+ sl->insertItem(se->text());
+ break;
+
+ case ScriptEdit::LoopStart:
+ stl->insertItem("LoopStart");
+ sl->insertItem(se->text());
+ break;
+
+ case ScriptEdit::LoopEnd:
+ stl->insertItem("LoopEnd");
+ sl->insertItem(se->text());
+ break;
+
+ case ScriptEdit::Scan:
+ stl->insertItem("Scan");
+ sl->insertItem(se->text());
+ break;
+
+ case ScriptEdit::Save:
+ stl->insertItem("Save");
+ sl->insertItem(se->text());
+ break;
+
+ default:
+ break;
+ }
+
+ //get the scrollbar adjusted, and scroll the list so we can see what
+ //we're adding to
+ adjustScrollBar();
+ slb->setValue(slb->maxValue());
+
+ //clear the text in the entry box
+ se->setText("");
+}
+
+
+void ScriptWidget::insertButton() {
+ //exit if there is no highlighted item, or we've reached the
+ //maximum entries in the script list
+ if(sl->currentItem() < 0 || (sl->count() == MAX_SCRIPT_ENTRIES-1))
+ return;
+
+ switch(se->type()) {
+ case ScriptEdit::Expect:
+ stl->insertItem("Expect", stl->currentItem());
+ sl->insertItem(se->text(), sl->currentItem());
+ break;
+
+ case ScriptEdit::Send:
+ stl->insertItem("Send", stl->currentItem());
+ sl->insertItem(se->text(), sl->currentItem());
+ break;
+
+ case ScriptEdit::SendNoEcho:
+ stl->insertItem("SendNoEcho", stl->currentItem());
+ sl->insertItem(se->text(), sl->currentItem());
+ break;
+
+ case ScriptEdit::Pause:
+ stl->insertItem("Pause", stl->currentItem());
+ sl->insertItem(se->text(), sl->currentItem());
+ break;
+
+ case ScriptEdit::Hangup:
+ stl->insertItem("Hangup", stl->currentItem());
+ sl->insertItem("", sl->currentItem());
+ break;
+
+ case ScriptEdit::Answer:
+ stl->insertItem("Answer", stl->currentItem());
+ sl->insertItem("", sl->currentItem());
+ break;
+
+ case ScriptEdit::Timeout:
+ stl->insertItem("Timeout", stl->currentItem());
+ sl->insertItem(se->text(), sl->currentItem());
+ break;
+
+ case ScriptEdit::Password:
+ stl->insertItem("Password", stl->currentItem());
+ sl->insertItem(se->text(), sl->currentItem());
+ break;
+
+ case ScriptEdit::ID:
+ stl->insertItem("ID", stl->currentItem());
+ sl->insertItem(se->text(), sl->currentItem());
+ break;
+
+ case ScriptEdit::Prompt:
+ stl->insertItem("Prompt", stl->currentItem());
+ sl->insertItem(se->text(), sl->currentItem());
+ break;
+
+ case ScriptEdit::PWPrompt:
+ stl->insertItem("PWPrompt", stl->currentItem());
+ sl->insertItem(se->text(), sl->currentItem());
+ break;
+
+ case ScriptEdit::LoopStart:
+ stl->insertItem("LoopStart", stl->currentItem());
+ sl->insertItem(se->text(), sl->currentItem());
+ break;
+
+ case ScriptEdit::LoopEnd:
+ stl->insertItem("LoopEnd", stl->currentItem());
+ sl->insertItem(se->text(), sl->currentItem());
+ break;
+
+ case ScriptEdit::Scan:
+ stl->insertItem("Scan", stl->currentItem());
+ sl->insertItem(se->text(), sl->currentItem());
+ break;
+
+ case ScriptEdit::Save:
+ stl->insertItem("Save", stl->currentItem());
+ sl->insertItem(se->text(), sl->currentItem());
+ break;
+
+ default:
+ break;
+ }
+ adjustScrollBar();
+ se->setText("");
+}
+
+
+void ScriptWidget::removeButton() {
+ if(sl->currentItem() >= 0) {
+ int stlc = stl->currentItem();
+ sl->removeItem(sl->currentItem());
+ stl->removeItem(stlc);
+ adjustScrollBar();
+ insert->setEnabled(sl->currentItem() != -1);
+ remove->setEnabled(sl->currentItem() != -1);
+ }
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Used to specify a new phone number
+//
+/////////////////////////////////////////////////////////////////////////////
+PhoneNumberDialog::PhoneNumberDialog(QWidget *parent) : KDialogBase(parent, 0, true, i18n("Add Phone Number"), Ok|Cancel) {
+ KWin::setIcons(winId(), kapp->icon(), kapp->miniIcon());
+
+ QHBox *hbox = new QHBox(this);
+ setMainWidget(hbox);
+
+ hbox->setSpacing(KDialog::spacingHint());
+
+ new QLabel(i18n("Enter a phone number:"), hbox);
+
+ le = newLineEdit(14, hbox);
+ le->setMinimumWidth(125);
+
+ connect(le, SIGNAL(textChanged(const QString &)),
+ this, SLOT(textChanged(const QString &)));
+
+ le->setFocus();
+ textChanged("");
+
+ enableButtonSeparator(true);
+}
+
+
+QString PhoneNumberDialog::phoneNumber() {
+ QString s = le->text();
+
+ return s;
+}
+
+
+void PhoneNumberDialog::textChanged(const QString &s) {
+ enableButtonOK(s.length() > 0);
+}
+
+
+#include "edit.moc"