Fix two issues reported by Christoph Bartoschek ('Suspicious code in revision 867140...
[kdenetwork.git] / kppp / edit.cpp
blob03a3d4d5aceee58e2a798833d5a04391fba74e0d
1 /*
2 * kPPP: A pppd Front End for the KDE project
4 * $Id$
5 * Copyright (C) 1997 Bernd Johannes Wuebben
6 * wuebben@math.cornell.edu
8 * based on EzPPP:
9 * Copyright (C) 1997 Jay Painter
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Library General Public
13 * License as published by the Free Software Foundation; either
14 * version 2 of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Library General Public License for more details.
21 * You should have received a copy of the GNU Library General Public
22 * License along with this program; if not, write to the Free
23 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26 #include <string.h>
27 #include <termios.h>
28 #include <qlayout.h>
29 //Added by qt3to4:
30 #include <QGridLayout>
31 #include <QHBoxLayout>
32 #include <QLabel>
33 #include <QVBoxLayout>
34 #include <QApplication>
35 #include <kmessagebox.h>
37 #include <qregexp.h>
38 #include <kiconloader.h>
39 #include <kdialogbuttonbox.h>
40 #include <klocale.h>
41 #include <kdialog.h>
42 #include <kwindowsystem.h>
44 #include "edit.h"
45 #include "pppdata.h"
46 #include "newwidget.h"
47 #include "iplined.h"
48 #include "auth.h"
50 DialWidget::DialWidget( QWidget *parent, bool isnewaccount )
51 : QWidget(parent)
53 QVBoxLayout *topLayout = new QVBoxLayout(parent);
54 topLayout->setSpacing(KDialog::spacingHint());
55 topLayout->addWidget(this);
57 QGridLayout *tl = new QGridLayout(this );
58 tl->setSpacing( KDialog::spacingHint() );
60 connect_label = new QLabel(i18n("Connection &name:"), this);
61 tl->addWidget(connect_label, 0, 0);
63 connectname_l = new QLineEdit(this);
64 connectname_l->setMaxLength(ACCNAME_SIZE);
65 connect_label->setBuddy(connectname_l);
67 tl->addWidget(connectname_l, 0, 1);
68 QString tmp = i18n("Type in a unique name for this connection");
70 connect_label->setWhatsThis(tmp);
71 connectname_l->setWhatsThis(tmp);
74 number_label = new QLabel(i18n("P&hone number:"), this);
75 number_label->setAlignment(Qt::AlignTop|Qt::AlignLeft);
76 tl->addWidget(number_label, 1, 0);
78 QHBoxLayout *lpn = new QHBoxLayout();
79 lpn->setSpacing( 5 );
80 tl->addLayout(lpn, 1, 1);
81 numbers = new Q3ListBox(this);
82 number_label->setBuddy(numbers);
83 numbers->setMinimumSize(120, 70);
84 lpn->addWidget(numbers);
85 QVBoxLayout *lpn1 = new QVBoxLayout;
86 lpn->addLayout(lpn1);
87 add = new QPushButton(i18n("&Add..."), this);
88 del = new QPushButton(i18n("&Remove"), this);
90 up = new QPushButton(this);
91 up->setIcon(KIcon("go-up"));
92 down = new QPushButton(this);
93 down->setIcon(KIcon("go-down"));
94 lpn1->addWidget(add);
95 lpn1->addWidget(del);
96 lpn1->addStretch(1);
97 lpn1->addWidget(up);
98 lpn1->addWidget(down);
99 connect(add, SIGNAL(clicked()),
100 this, SLOT(addNumber()));
101 connect(del, SIGNAL(clicked()),
102 this, SLOT(delNumber()));
103 connect(up, SIGNAL(clicked()),
104 this, SLOT(upNumber()));
105 connect(down, SIGNAL(clicked()),
106 this, SLOT(downNumber()));
107 connect(numbers, SIGNAL(highlighted(int)),
108 this, SLOT(selectionChanged(int)));
109 numbersChanged();
111 tmp = i18n("<p>Specifies the phone numbers to dial. You\n"
112 "can supply multiple numbers here, simply\n"
113 "click on \"Add\". You can arrange the\n"
114 "order the numbers are tried by using the\n"
115 "arrow buttons.\n\n"
116 "When a number is busy or fails, <i>kppp</i> will \n"
117 "try the next number and so on");
119 number_label->setWhatsThis(tmp);
120 numbers->setWhatsThis(tmp);
122 auth_l = new QLabel(i18n("A&uthentication:"), this);
123 tl->addWidget(auth_l, 3, 0);
125 auth = new QComboBox(this);
126 auth_l->setBuddy(auth);
127 auth->addItem(i18n("Script-based"));
128 auth->addItem(i18n("PAP"));
129 auth->addItem(i18n("Terminal-based"));
130 auth->addItem(i18n("CHAP"));
131 auth->addItem(i18n("PAP/CHAP"));
132 tl->addWidget(auth, 3, 1);
133 tmp = i18n("<p>Specifies the method used to identify yourself to\n"
134 "the PPP server. Most universities still use\n"
135 "<b>Terminal</b>- or <b>Script</b>-based authentication,\n"
136 "while most ISP use <b>PAP</b> and/or <b>CHAP</b>. If\n"
137 "unsure, contact your ISP.\n"
138 "\n"
139 "If you can choose between PAP and CHAP,\n"
140 "choose CHAP, because it's much safer. If you don't know\n"
141 "whether PAP or CHAP is right, choose PAP/CHAP.");
143 auth_l->setWhatsThis(tmp);
144 auth->setWhatsThis(tmp);
146 store_password = new QCheckBox(i18n("Store &password"), this);
147 store_password->setChecked(true);
148 tl->addWidget(store_password, 4, 0, 1, 2, Qt::AlignRight);
149 store_password->setWhatsThis(
150 i18n("<p>When this is turned on, your ISP password\n"
151 "will be saved in <i>kppp</i>'s config file, so\n"
152 "you do not need to type it in every time.\n"
153 "\n"
154 "<b><font color=\"red\">Warning:</font> your password will be stored as\n"
155 "plain text in the config file, which is\n"
156 "readable only to you. Make sure nobody\n"
157 "gains access to this file!"));
159 cbtype_l = new QLabel(i18n("&Callback type:"), this);
160 tl->addWidget(cbtype_l, 5, 0);
162 cbtype = new QComboBox(this);
163 cbtype_l->setBuddy(cbtype);
164 cbtype->addItem(i18n("None"));
165 cbtype->addItem(i18n("Administrator-defined"));
166 cbtype->addItem(i18n("User-defined"));
167 connect(cbtype, SIGNAL(highlighted(int)),
168 this, SLOT(cbtypeChanged(int)));
169 tl->addWidget(cbtype, 5, 1);
170 tmp = i18n("Callback type");
172 cbtype_l->setWhatsThis(tmp);
173 cbtype->setWhatsThis(tmp);
175 cbphone_l = new QLabel(i18n("Call&back number:"), this);
176 tl->addWidget(cbphone_l, 6, 0);
178 cbphone = new QLineEdit(this);
179 cbphone_l->setBuddy(cbphone);
180 cbphone->setMaxLength(140);
181 tl->addWidget(cbphone, 6, 1);
182 tmp = i18n("Callback phone number");
184 cbphone_l->setWhatsThis(tmp);
185 cbphone->setWhatsThis(tmp);
187 pppdargs = new QPushButton(i18n("Customize &pppd Arguments..."), this);
188 connect(pppdargs, SIGNAL(clicked()), SLOT(pppdargsbutton()));
189 tl->addWidget(pppdargs, 7, 0, 1, 2, Qt::AlignCenter);
191 // Set defaults if editing an existing connection
192 if(!isnewaccount) {
193 connectname_l->setText(gpppdata.accname());
195 // insert the phone numbers into the listbox
196 QString n = gpppdata.phonenumber();
197 QString tmp = "";
198 int idx = 0;
199 while(idx != n.length()) {
200 if(n[idx] == ':') {
201 if(tmp.length() > 0)
202 numbers->insertItem(tmp);
203 tmp = "";
204 } else
205 tmp += n[idx];
206 idx++;
208 if(tmp.length() > 0)
209 numbers->insertItem(tmp);
211 auth->setCurrentIndex(gpppdata.authMethod());
212 store_password->setChecked(gpppdata.storePassword());
213 cbtype->setCurrentIndex(gpppdata.callbackType());
214 cbphone->setText(gpppdata.callbackPhone());
215 } else {
216 // select PAP/CHAP as default
217 auth->setCurrentIndex(AUTH_PAPCHAP);
218 // select NONE as default
219 cbtype->setCurrentIndex(CBTYPE_NONE);
222 emit cbtypeChanged(cbtype->currentIndex());
223 numbersChanged();
224 tl->activate();
228 bool DialWidget::save() {
229 //first check to make sure that the account name is unique!
230 if(connectname_l->text().isEmpty() ||
231 !gpppdata.isUniqueAccname(connectname_l->text())) {
232 return false;
233 } else {
234 gpppdata.setAccname(connectname_l->text());
236 QString number = "";
237 for(uint i = 0; i < numbers->count(); i++) {
238 if(i != 0)
239 number += ':';
240 number += numbers->text(i);
243 gpppdata.setPhonenumber(number);
244 gpppdata.setAuthMethod(auth->currentIndex());
245 gpppdata.setStorePassword(store_password->isChecked());
246 gpppdata.setCallbackType(cbtype->currentIndex());
247 gpppdata.setCallbackPhone(cbphone->text());
248 return true;
253 void DialWidget::numbersChanged() {
254 int sel = numbers->currentItem();
256 del->setEnabled(sel != -1);
257 up->setEnabled(sel != -1 && sel != 0);
258 down->setEnabled(sel != -1 && sel != (int)numbers->count()-1);
261 void DialWidget::cbtypeChanged(int value) {
262 cbphone_l->setEnabled(value == CBTYPE_USER);
263 cbphone->setEnabled(value == CBTYPE_USER);
266 void DialWidget::selectionChanged(int) {
267 numbersChanged();
271 void DialWidget::addNumber() {
272 PhoneNumberDialog dlg(this);
273 if(dlg.exec()) {
274 numbers->insertItem(dlg.phoneNumber());
275 numbersChanged();
280 void DialWidget::delNumber() {
281 if(numbers->currentItem() != -1) {
282 numbers->removeItem(numbers->currentItem());
283 numbersChanged();
288 void DialWidget::upNumber() {
289 int idx = numbers->currentItem();
290 if(idx != -1) {
291 QString item = numbers->text(idx);
292 numbers->removeItem(idx);
293 numbers->insertItem(item, idx-1);
294 numbers->setCurrentItem(idx-1);
295 numbersChanged();
300 void DialWidget::downNumber() {
301 int idx = numbers->currentItem();
302 if(idx != -1) {
303 QString item = numbers->text(idx);
304 numbers->removeItem(idx);
305 numbers->insertItem(item, idx+1);
306 numbers->setCurrentItem(idx+1);
307 numbersChanged();
312 void DialWidget::pppdargsbutton() {
313 PPPdArguments pa(this);
314 pa.exec();
319 /////////////////////////////////////////////////////////////////////////////
320 // ExecWidget
321 /////////////////////////////////////////////////////////////////////////////
322 ExecWidget::ExecWidget(QWidget *parent, bool isnewaccount) :
323 QWidget(parent)
325 QVBoxLayout *tl = new QVBoxLayout(parent);
326 tl->setSpacing(KDialog::spacingHint());
327 tl->setMargin(0);
329 QLabel *l = new QLabel(\
330 i18n("Here you can select commands to run at certain stages of the\n"
331 "connection. The commands are run with your real user id, so\n"
332 "you cannot run any commands here requiring root permissions\n"
333 "(unless, of course, you are root).\n\n"
334 "Be sure to supply the whole path to the program otherwise\n"
335 "kppp might be unable to find it."), parent);
336 l->setMinimumHeight(l->sizeHint().height());
337 tl->addWidget(l);
338 tl->addStretch(1);
340 QGridLayout *l1 = new QGridLayout( );
341 l1->setMargin( 10 );
342 tl->addLayout(l1);
343 l1->setColumnStretch(0, 0);
344 l1->setColumnStretch(1, 1);
346 before_connect_l = new QLabel(i18n("&Before connect:"), parent);
347 before_connect_l->setAlignment(Qt::AlignVCenter);
348 l1->addWidget(before_connect_l, 0, 0);
349 before_connect = new QLineEdit(parent);
350 before_connect_l->setBuddy(before_connect);
351 before_connect->setMaxLength(COMMAND_SIZE);
352 l1->addWidget(before_connect, 0, 1);
353 QString tmp = i18n("Allows you to run a program <b>before</b> a connection\n"
354 "is established. It is called immediately before\n"
355 "dialing has begun.\n\n"
356 "This might be useful, e.g. to stop HylaFAX blocking the\n"
357 "modem.");
359 before_connect_l->setWhatsThis(tmp);
360 before_connect->setWhatsThis(tmp);
362 command_label = new QLabel(i18n("&Upon connect:"), parent);
363 command_label->setAlignment(Qt::AlignVCenter);
364 l1->addWidget(command_label, 1, 0);
365 command = new QLineEdit(parent);
366 command_label->setBuddy(command);
367 command->setMaxLength(COMMAND_SIZE);
368 l1->addWidget(command, 1, 1);
369 tmp = i18n("Allows you to run a program <b>after</b> a connection\n"
370 "is established. When your program is called, all\n"
371 "preparations for an Internet connection are finished.\n"
372 "\n"
373 "Very useful for fetching mail and news");
375 command_label->setWhatsThis(tmp);
376 command->setWhatsThis(tmp);
378 predisconnect_label = new QLabel(i18n("Before &disconnect:"),
379 parent);
380 predisconnect_label->setAlignment(Qt::AlignVCenter);
381 l1->addWidget(predisconnect_label, 2, 0);
382 predisconnect = new QLineEdit(parent);
383 predisconnect_label->setBuddy(predisconnect);
384 predisconnect->setMaxLength(COMMAND_SIZE);
385 l1->addWidget(predisconnect, 2, 1);
386 tmp = i18n("Allows you to run a program <b>before</b> a connection\n"
387 "is closed. The connection will stay open until\n"
388 "the program exits.");
390 predisconnect_label->setWhatsThis(tmp);
391 predisconnect->setWhatsThis(tmp);
393 discommand_label = new QLabel(i18n("U&pon disconnect:"),
394 parent);
395 discommand_label->setAlignment(Qt::AlignVCenter);
396 l1->addWidget(discommand_label, 3, 0);
398 discommand = new QLineEdit(parent);
399 discommand_label->setBuddy(discommand);
400 discommand->setMaxLength(COMMAND_SIZE);
401 l1->addWidget(discommand, 3, 1);
402 tmp = i18n("Allows you to run a program <b>after</b> a connection\n"
403 "has been closed.");
405 discommand_label->setWhatsThis(tmp);
406 discommand->setWhatsThis(tmp);
408 // extra space between entries
409 l1->addItem(new QSpacerItem(0, 5), 1, 0);
410 l1->addItem(new QSpacerItem(0, 5), 3, 0);
412 tl->addStretch(1);
413 tl->activate();
415 // Set defaults if editing an existing connection
416 if(!isnewaccount) {
417 before_connect->setText(gpppdata.command_before_connect());
418 command->setText(gpppdata.command_on_connect());
419 discommand->setText(gpppdata.command_on_disconnect());
420 predisconnect->setText(gpppdata.command_before_disconnect());
425 bool ExecWidget::save() {
426 gpppdata.setCommand_before_connect(before_connect->text());
427 gpppdata.setCommand_on_connect(command->text());
428 gpppdata.setCommand_before_disconnect(predisconnect->text());
429 gpppdata.setCommand_on_disconnect(discommand->text());
430 return true;
435 /////////////////////////////////////////////////////////////////////////////
437 // IPWidget
439 /////////////////////////////////////////////////////////////////////////////
440 IPWidget::IPWidget( QWidget *parent, bool isnewaccount, const char *name )
441 : QWidget(parent)
443 setObjectName(name);
444 QVBoxLayout *topLayout = new QVBoxLayout(parent);
445 topLayout->setSpacing(KDialog::spacingHint());
447 box = new Q3GroupBox(1, Qt::Horizontal,i18n("C&onfiguration"), parent);
448 box->setInsideSpacing(KDialog::spacingHint());
450 rb = new Q3ButtonGroup(parent);
451 rb->hide();
452 connect(rb, SIGNAL(clicked(int)),
453 SLOT(hitIPSelect(int)));
455 dynamicadd_rb = new QRadioButton(box);
456 dynamicadd_rb->setText(i18n("Dynamic IP address"));
457 dynamicadd_rb->setWhatsThis(
458 i18n("Select this option when your computer gets an\n"
459 "internet address (IP) every time a\n"
460 "connection is made.\n"
461 "\n"
462 "Almost every Internet Service Provider uses\n"
463 "this method, so this should be turned on."));
465 staticadd_rb = new QRadioButton(box);
466 staticadd_rb->setText(i18n("Static IP address"));
467 rb->insert(dynamicadd_rb, 0);
468 rb->insert(staticadd_rb, 1);
469 staticadd_rb->setWhatsThis(
470 i18n("Select this option when your computer has a\n"
471 "fixed internet address (IP). Most computers\n"
472 "don't have this, so you should probably select\n"
473 "dynamic IP addressing unless you know what you\n"
474 "are doing."));
476 QWidget *ipWidget = new QWidget(box);
477 QGridLayout *ipLayout = new QGridLayout(ipWidget);
478 ipLayout->setSpacing(KDialog::spacingHint());
480 ipaddress_label = new QLabel(i18n("&IP address:"), ipWidget);
481 QString tmp = i18n("If your computer has a permanent internet\n"
482 "address, you must supply your IP address here.");
483 ipLayout->addWidget(ipaddress_label, 0, 0);
485 ipaddress_l = new IPLineEdit(ipWidget);
486 ipaddress_label->setBuddy(ipaddress_l);
487 ipLayout->addWidget(ipaddress_l, 0, 1);
489 ipaddress_label->setWhatsThis(tmp);
490 ipaddress_l->setWhatsThis(tmp);
492 sub_label = new QLabel(i18n("&Subnet mask:"), ipWidget);
493 tmp = i18n("<p>If your computer has a static Internet address,\n"
494 "you must supply a network mask here. In almost\n"
495 "all cases this netmask will be <b>255.255.255.0</b>,\n"
496 "but your mileage may vary.\n"
497 "\n"
498 "If unsure, contact your Internet Service Provider");
499 ipLayout->addWidget(sub_label, 1, 0);
501 subnetmask_l = new IPLineEdit(ipWidget);
502 sub_label->setBuddy(subnetmask_l);
503 ipLayout->addWidget(subnetmask_l, 1, 1);
505 sub_label->setWhatsThis(tmp);
506 subnetmask_l->setWhatsThis(tmp);
508 autoname = new QCheckBox(i18n("&Auto-configure hostname from this IP"), parent);
509 autoname->setChecked(gpppdata.autoname());
510 connect(autoname,SIGNAL(toggled(bool)),
511 this,SLOT(autoname_t(bool)));
513 autoname->setWhatsThis(
514 i18n("<p>Whenever you connect, this reconfigures\n"
515 "your hostname to match the IP address you\n"
516 "got from the PPP server. This may be useful\n"
517 "if you need to use a protocol which depends\n"
518 "on this information, but it can also cause several\n"
519 "<a href=\"kppp-7.html#autohostname\">problems</a>.\n"
520 "\n"
521 "Do not enable this unless you really need it."));
523 topLayout->addWidget(box);
524 topLayout->addWidget(autoname);
525 topLayout->addStretch();
527 //load info from gpppdata
528 if(!isnewaccount) {
529 if(gpppdata.ipaddr() == "0.0.0.0" &&
530 gpppdata.subnetmask() == "0.0.0.0") {
531 dynamicadd_rb->setChecked(true);
532 hitIPSelect(0);
533 autoname->setChecked(gpppdata.autoname());
535 else {
536 ipaddress_l->setText(gpppdata.ipaddr());
537 subnetmask_l->setText(gpppdata.subnetmask());
538 staticadd_rb->setChecked(true);
539 autoname->setChecked(false);
542 else {
543 dynamicadd_rb->setChecked(true);
544 hitIPSelect(0);
549 void IPWidget::autoname_t(bool on) {
550 static bool was_warned = false;
552 // big-fat warning when selecting the auto configure hostname option
553 if(on && !was_warned) {
554 KMessageBox::information(this,
555 i18n("Selecting this option might cause some weird "
556 "problems with the X-server and applications "
557 "while kppp is connected. Don't use it until "
558 "you know what you are doing!\n"
559 "For more information take a look at the "
560 "handbook (or help) in the section \"Frequently "
561 "asked questions\"."),
562 i18n("Warning"));
563 was_warned = true;
568 void IPWidget::save() {
569 if(dynamicadd_rb->isChecked()) {
570 gpppdata.setIpaddr("0.0.0.0");
571 gpppdata.setSubnetmask("0.0.0.0");
572 } else {
573 gpppdata.setIpaddr(ipaddress_l->text());
574 gpppdata.setSubnetmask(subnetmask_l->text());
576 gpppdata.setAutoname(autoname->isChecked());
580 void IPWidget::hitIPSelect( int i ) {
581 if(i == 0) {
582 ipaddress_label->setEnabled(false);
583 sub_label->setEnabled(false);
584 ipaddress_l->setEnabled(false);
585 subnetmask_l->setEnabled(false);
587 else {
588 ipaddress_label->setEnabled(true);
589 sub_label->setEnabled(true);
590 ipaddress_l->setEnabled(true);
591 subnetmask_l->setEnabled(true);
597 DNSWidget::DNSWidget( QWidget *parent, bool isnewaccount )
598 : QWidget(parent)
600 QVBoxLayout *topLayout = new QVBoxLayout(parent);
601 topLayout->setSpacing(KDialog::spacingHint());
602 topLayout->addWidget(this);
604 // box = new QGroupBox(this);
605 QGridLayout *tl = new QGridLayout(this );
606 tl->setSpacing( KDialog::spacingHint() );
608 dnsdomain_label = new QLabel(i18n("Domain &name:"), this);
609 tl->addWidget(dnsdomain_label, 0, 0);
611 dnsdomain = new QLineEdit(this);
612 dnsdomain_label->setBuddy(dnsdomain);
613 dnsdomain->setMaxLength(DOMAIN_SIZE);
614 tl->addWidget(dnsdomain, 0, 1);
615 QString tmp = i18n("If you enter a domain name here, this domain\n"
616 "name is used for your computer while you are\n"
617 "connected. When the connection is closed, the\n"
618 "original domain name of your computer is\n"
619 "restored.\n"
620 "\n"
621 "If you leave this field blank, no changes are\n"
622 "made to the domain name.");
624 dnsdomain_label->setWhatsThis(tmp);
625 dnsdomain->setWhatsThis(tmp);
627 conf_label = new QLabel(i18n("C&onfiguration:"), this);
628 tl->addWidget(conf_label, 1, 0);
630 bg = new Q3ButtonGroup("Group", this);
631 conf_label->setBuddy(bg);
632 connect(bg, SIGNAL(clicked(int)), SLOT(DNS_Mode_Selected(int)));
633 bg->hide();
635 autodns = new QRadioButton(i18n("Automatic"), this);
636 bg->insert(autodns, 0);
637 tl->addWidget(autodns, 1, 1);
638 // no automatic DNS detection for pppd < 2.3.7
639 if(!gpppdata.pppdVersionMin(2, 3, 7))
640 autodns->setEnabled(false);
642 mandns = new QRadioButton(i18n("Manual"), this);
643 bg->insert(mandns, 1);
644 tl->addWidget(mandns, 2, 1);
646 dns_label = new QLabel(i18n("DNS &IP address:"), this);
647 tl->addWidget(dns_label, 3, 0);
649 QHBoxLayout *l2 = new QHBoxLayout;
650 tl->addLayout(l2, 3, 1);
651 dnsipaddr = new IPLineEdit(this);
652 dns_label->setBuddy(dnsipaddr);
653 connect(dnsipaddr, SIGNAL(returnPressed()),
654 SLOT(adddns()));
655 connect(dnsipaddr, SIGNAL(textChanged(const QString &)),
656 SLOT(DNS_Edit_Changed(const QString &)));
657 l2->addWidget(dnsipaddr, 1);
658 l2->addStretch(1);
659 tmp = i18n("<p>Allows you to specify a new DNS server to be\n"
660 "used while you are connected. When the\n"
661 "connection is closed, this DNS entry will be\n"
662 "removed again.\n"
663 "\n"
664 "To add a DNS server, type in the IP address of\n"
665 "the DNS server here and click on <b>Add</b>");
667 dns_label->setWhatsThis( tmp);
668 dnsipaddr->setWhatsThis( tmp);
670 QHBoxLayout *l1 = new QHBoxLayout;
671 tl->addLayout(l1, 4, 1);
672 add = new QPushButton(i18n("&Add"), this);
673 connect(add, SIGNAL(clicked()), SLOT(adddns()));
674 int width = add->sizeHint().width();
675 width = qMax(width,60);
676 add->setMinimumWidth(width);
677 l1->addWidget(add);
678 l1->addStretch(1);
679 add->setWhatsThis(
680 i18n("Click this button to add the DNS server\n"
681 "specified in the field above. The entry\n"
682 "will then be added to the list below"));
684 remove = new QPushButton(i18n("&Remove"), this);
685 connect(remove, SIGNAL(clicked()), SLOT(removedns()));
686 width = remove->sizeHint().width();
687 width = qMax(width,60);
688 remove->setMinimumWidth(width);
689 l1->addWidget(remove);
690 remove->setWhatsThis(
691 i18n("Click this button to remove the selected DNS\n"
692 "server entry from the list below"));
694 servers_label = new QLabel(i18n("DNS address &list:"), this);
695 servers_label->setAlignment(Qt::AlignTop|Qt::AlignLeft);
696 tl->addWidget(servers_label, 5, 0);
698 dnsservers = new Q3ListBox(this);
699 servers_label->setBuddy(dnsservers);
700 dnsservers->setMinimumSize(150, 80);
701 connect(dnsservers, SIGNAL(highlighted(int)),
702 SLOT(DNS_Entry_Selected(int)));
703 tl->addWidget(dnsservers, 5, 1);
704 tmp = i18n("<p>This shows all defined DNS servers to use\n"
705 "while you are connected. Use the <b>Add</b> and\n"
706 "<b>Remove</b> buttons to modify the list");
708 servers_label->setWhatsThis(tmp);
709 dnsservers->setWhatsThis(tmp);
711 exdnsdisabled_toggle = new QCheckBox(i18n( \
712 "&Disable existing DNS servers during connection"),
713 this);
714 exdnsdisabled_toggle->setChecked(gpppdata.exDNSDisabled());
715 tl->addWidget(exdnsdisabled_toggle, 6, 0, 1, 2, Qt::AlignCenter);
716 exdnsdisabled_toggle->setWhatsThis(
717 i18n("<p>When this option is selected, all DNS\n"
718 "servers specified in <tt>/etc/resolv.conf</tt> are\n"
719 "temporary disabled while the dialup connection\n"
720 "is established. After the connection is\n"
721 "closed, the servers will be re-enabled\n"
722 "\n"
723 "Typically, there is no reason to use this\n"
724 "option, but it may become useful under \n"
725 "some circumstances."));
728 // restore data if editing
729 if(!isnewaccount) {
730 dnsservers->insertStringList(gpppdata.dns());
731 dnsdomain->setText(gpppdata.domain());
734 int mode = gpppdata.autoDNS() ? 0 : 1;
735 bg->setButton(mode);
736 DNS_Mode_Selected(mode);
738 tl->activate();
741 void DNSWidget::DNS_Edit_Changed(const QString &text) {
742 QRegExp r("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+");
743 add->setEnabled(text.contains(r));
746 void DNSWidget::DNS_Entry_Selected(int) {
747 remove->setEnabled(true);
750 void DNSWidget::DNS_Mode_Selected(int mode) {
751 bool on = (mode == 1);
752 dns_label->setEnabled(on);
753 servers_label->setEnabled(on);
754 dnsipaddr->setText("");
755 dnsipaddr->setEnabled(on);
756 add->setEnabled(false);
757 remove->setEnabled(dnsservers->count()>0 && on);
758 dnsservers->clearSelection();
759 dnsservers->setEnabled(on);
760 dnsservers->triggerUpdate(false);
763 void DNSWidget::save() {
764 gpppdata.setAutoDNS(bg->id(bg->selected()) == 0);
765 QStringList serverlist;
766 for(uint i=0; i < dnsservers->count(); i++)
767 serverlist.append(dnsservers->text(i));
768 gpppdata.setDns(serverlist);
770 // strip leading dot
771 QString s(dnsdomain->text());
772 if(s.left(1) == ".")
773 gpppdata.setDomain(s.mid(1));
774 else
775 gpppdata.setDomain(dnsdomain->text());
777 gpppdata.setExDNSDisabled(exdnsdisabled_toggle->isChecked());
781 void DNSWidget::adddns() {
782 if(dnsservers->count() < MAX_DNS_ENTRIES) {
783 dnsservers->insertItem(dnsipaddr->text());
784 dnsipaddr->setText("");
789 void DNSWidget::removedns() {
790 int i;
791 i = dnsservers->currentItem();
792 if(i != -1)
793 dnsservers->removeItem(i);
794 remove->setEnabled(dnsservers->count()>0);
799 // GatewayWidget
801 GatewayWidget::GatewayWidget( QWidget *parent, bool isnewaccount )
802 : QWidget(parent)
804 QVBoxLayout *topLayout = new QVBoxLayout(parent);
805 topLayout->setSpacing(KDialog::spacingHint());
807 box = new Q3GroupBox (1, Qt::Horizontal,i18n("C&onfiguration"), parent);
808 box->setInsideSpacing(KDialog::spacingHint());
810 rb = new Q3ButtonGroup(parent);
811 rb->hide();
812 connect(rb, SIGNAL(clicked(int)), SLOT(hitGatewaySelect(int)));
814 defaultgateway = new QRadioButton(box);
815 defaultgateway->setText(i18n("Default gateway"));
816 rb->insert(defaultgateway, 0);
817 defaultgateway->setWhatsThis(
818 i18n("This makes the PPP peer computer (the computer\n"
819 "you are connected to with your modem) to act as\n"
820 "a gateway. Your computer will send all packets not\n"
821 "going to a computer inside your local net to this\n"
822 "computer, which will route these packets.\n"
823 "\n"
824 "This is the default for most ISPs, so you should\n"
825 "probably leave this option on."));
828 staticgateway = new QRadioButton(box);
829 staticgateway->setText(i18n("Static gateway"));
830 rb->insert(staticgateway, 1);
831 staticgateway->setWhatsThis(
832 i18n("<p>Allows you to specify which computer you want\n"
833 "to use as gateway (see <i>Default Gateway</i> above)"));
835 QWidget *gateBox = new QWidget(box);
836 QHBoxLayout *hboxLayout1 = new QHBoxLayout(gateBox);
837 gate_label = new QLabel(i18n("Gateway &IP address:"), gateBox);
838 hboxLayout1->addWidget(gate_label);
839 gatewayaddr = new IPLineEdit(gateBox);
840 hboxLayout1->addWidget(gatewayaddr);
841 gate_label->setBuddy(gatewayaddr);
843 defaultroute = new QCheckBox(i18n("&Assign the default route to this gateway"),
844 parent);
845 defaultroute->setWhatsThis(
846 i18n("If this option is enabled, all packets not\n"
847 "going to the local net are routed through\n"
848 "the PPP connection.\n"
849 "\n"
850 "Normally, you should turn this on"));
852 topLayout->addWidget(box);
853 topLayout->addWidget(defaultroute);
854 topLayout->addStretch();
856 //load info from gpppdata
857 if(!isnewaccount) {
858 if(gpppdata.gateway() == "0.0.0.0") {
859 defaultgateway->setChecked(true);
860 hitGatewaySelect(0);
862 else {
863 gatewayaddr->setText(gpppdata.gateway());
864 staticgateway->setChecked(true);
866 defaultroute->setChecked(gpppdata.defaultroute());
868 else {
869 defaultgateway->setChecked(true);
870 hitGatewaySelect(0);
871 defaultroute->setChecked(true);
875 void GatewayWidget::save() {
876 gpppdata.setGateway(gatewayaddr->text());
877 gpppdata.setDefaultroute(defaultroute->isChecked());
881 void GatewayWidget::hitGatewaySelect( int i ) {
882 if(i == 0) {
883 gatewayaddr->setText("0.0.0.0");
884 gatewayaddr->setEnabled(false);
885 gate_label->setEnabled(false);
887 else {
888 gatewayaddr->setEnabled(true);
889 gatewayaddr->setText("");
890 gate_label->setEnabled(true);
896 ScriptWidget::ScriptWidget( QWidget *parent, bool isnewaccount, const char *name )
897 : QWidget(parent)
899 setObjectName(name);
900 QVBoxLayout *tl = new QVBoxLayout(parent);
901 tl->setSpacing(KDialog::spacingHint());
902 tl->setMargin(0);
903 se = new ScriptEdit(parent);
904 connect(se, SIGNAL(returnPressed()), SLOT(addButton()));
905 tl->addWidget(se);
907 // insert equal-sized buttons
908 KDialogButtonBox *bbox = new KDialogButtonBox(parent);
909 add = bbox->addButton(i18n("&Add"),QDialogButtonBox::ActionRole);
910 connect(add, SIGNAL(clicked()), SLOT(addButton()));
911 insert = bbox->addButton(i18n("&Insert"),QDialogButtonBox::ActionRole);
912 connect(insert, SIGNAL(clicked()), SLOT(insertButton()));
913 remove = bbox->addButton(i18n("&Remove"),QDialogButtonBox::ActionRole);
914 connect(remove, SIGNAL(clicked()), SLOT(removeButton()));
915 tl->addWidget(bbox);
917 QHBoxLayout *l12 = new QHBoxLayout;
918 tl->addLayout(l12);
919 stl = new Q3ListBox(parent);
920 stl->setVScrollBarMode( Q3ScrollView::AlwaysOff );
921 connect(stl, SIGNAL(highlighted(int)), SLOT(stlhighlighted(int)));
922 stl->setMinimumSize(QSize(70, 140));
924 sl = new Q3ListBox(parent);
925 sl->setVScrollBarMode( Q3ScrollView::AlwaysOff );
926 connect(sl, SIGNAL(highlighted(int)), SLOT(slhighlighted(int)));
927 sl->setMinimumSize(QSize(150, 140));
929 slb = new QScrollBar(parent);
930 slb->setFixedWidth(slb->sizeHint().width());
931 connect(slb, SIGNAL(valueChanged(int)), SLOT(scrolling(int)));
933 l12->addWidget(stl, 1);
934 l12->addWidget(sl, 3);
935 l12->addWidget(slb, 0);
937 //load data from gpppdata
938 if(!isnewaccount) {
939 QStringList &comlist = gpppdata.scriptType();
940 QStringList &arglist = gpppdata.script();
941 QStringList::Iterator itcom = comlist.begin();
942 QStringList::Iterator itarg = arglist.begin();
944 for ( ;
945 itcom != comlist.end() && itarg != arglist.end();
946 ++itcom, ++itarg )
948 stl->insertItem(*itcom);
949 sl->insertItem(*itarg);
953 insert->setEnabled(false);
954 remove->setEnabled(false);
955 adjustScrollBar();
956 tl->activate();
959 bool ScriptWidget::check() {
960 uint lstart = 0;
961 uint lend = 0;
962 uint errcnt = 0;
964 if(sl->count() > 0) {
965 for( uint i=0; i <= sl->count()-1; i++) {
966 if(stl->text(i) == "LoopStart") {
967 lstart++;
969 if (stl->text(i) == "LoopEnd") {
970 lend++;
972 if ( lend > lstart ) errcnt++;
974 return ( (errcnt == 0 ) && (lstart == lend) );
976 return true;
980 void ScriptWidget::save() {
981 QStringList typelist, arglist;
982 for(uint i=0; i < sl->count(); i++) {
983 typelist.append(stl->text(i));
984 arglist.append(sl->text(i));
986 gpppdata.setScriptType(typelist);
987 gpppdata.setScript(arglist);
992 void ScriptWidget::adjustScrollBar() {
993 if((int)sl->count() <= sl->numItemsVisible())
994 slb->setRange(0, 0);
995 else
996 slb->setRange(0, (sl->count() - sl->numItemsVisible())+1);
1000 void ScriptWidget::scrolling(int i) {
1001 sl->setTopItem(i);
1002 stl->setTopItem(i);
1006 void ScriptWidget::slhighlighted(int i) {
1007 insert->setEnabled(true);
1008 remove->setEnabled(true);
1009 stl->setCurrentItem(i);
1013 void ScriptWidget::stlhighlighted(int i) {
1014 insert->setEnabled(true);
1015 remove->setEnabled(true);
1016 sl->setCurrentItem(i);
1020 void ScriptWidget::addButton() {
1021 //don't allow more than the maximum script entries
1022 if(sl->count() == MAX_SCRIPT_ENTRIES-1)
1023 return;
1025 switch(se->type()) {
1026 case ScriptEdit::Expect:
1027 stl->insertItem("Expect");
1028 sl->insertItem(se->text());
1029 break;
1031 case ScriptEdit::Send:
1032 stl->insertItem("Send");
1033 sl->insertItem(se->text());
1034 break;
1036 case ScriptEdit::SendNoEcho:
1037 stl->insertItem("SendNoEcho");
1038 sl->insertItem(se->text());
1039 break;
1041 case ScriptEdit::Pause:
1042 stl->insertItem("Pause");
1043 sl->insertItem(se->text());
1044 break;
1046 case ScriptEdit::Hangup:
1047 stl->insertItem("Hangup");
1048 sl->insertItem("");
1049 break;
1051 case ScriptEdit::Answer:
1052 stl->insertItem("Answer");
1053 sl->insertItem("");
1054 break;
1056 case ScriptEdit::Timeout:
1057 stl->insertItem("Timeout");
1058 sl->insertItem(se->text());
1059 break;
1061 case ScriptEdit::Password:
1062 stl->insertItem("Password");
1063 sl->insertItem(se->text());
1064 break;
1066 case ScriptEdit::ID:
1067 stl->insertItem("ID");
1068 sl->insertItem(se->text());
1069 break;
1071 case ScriptEdit::Prompt:
1072 stl->insertItem("Prompt");
1073 sl->insertItem(se->text());
1074 break;
1076 case ScriptEdit::PWPrompt:
1077 stl->insertItem("PWPrompt");
1078 sl->insertItem(se->text());
1079 break;
1081 case ScriptEdit::LoopStart:
1082 stl->insertItem("LoopStart");
1083 sl->insertItem(se->text());
1084 break;
1086 case ScriptEdit::LoopEnd:
1087 stl->insertItem("LoopEnd");
1088 sl->insertItem(se->text());
1089 break;
1091 case ScriptEdit::Scan:
1092 stl->insertItem("Scan");
1093 sl->insertItem(se->text());
1094 break;
1096 case ScriptEdit::Save:
1097 stl->insertItem("Save");
1098 sl->insertItem(se->text());
1099 break;
1101 default:
1102 break;
1105 //get the scrollbar adjusted, and scroll the list so we can see what
1106 //we're adding to
1107 adjustScrollBar();
1108 slb->setValue(slb->maximum());
1110 //clear the text in the entry box
1111 se->setText("");
1115 void ScriptWidget::insertButton() {
1116 //exit if there is no highlighted item, or we've reached the
1117 //maximum entries in the script list
1118 if(sl->currentItem() < 0 || (sl->count() == MAX_SCRIPT_ENTRIES-1))
1119 return;
1121 switch(se->type()) {
1122 case ScriptEdit::Expect:
1123 stl->insertItem("Expect", stl->currentItem());
1124 sl->insertItem(se->text(), sl->currentItem());
1125 break;
1127 case ScriptEdit::Send:
1128 stl->insertItem("Send", stl->currentItem());
1129 sl->insertItem(se->text(), sl->currentItem());
1130 break;
1132 case ScriptEdit::SendNoEcho:
1133 stl->insertItem("SendNoEcho", stl->currentItem());
1134 sl->insertItem(se->text(), sl->currentItem());
1135 break;
1137 case ScriptEdit::Pause:
1138 stl->insertItem("Pause", stl->currentItem());
1139 sl->insertItem(se->text(), sl->currentItem());
1140 break;
1142 case ScriptEdit::Hangup:
1143 stl->insertItem("Hangup", stl->currentItem());
1144 sl->insertItem("", sl->currentItem());
1145 break;
1147 case ScriptEdit::Answer:
1148 stl->insertItem("Answer", stl->currentItem());
1149 sl->insertItem("", sl->currentItem());
1150 break;
1152 case ScriptEdit::Timeout:
1153 stl->insertItem("Timeout", stl->currentItem());
1154 sl->insertItem(se->text(), sl->currentItem());
1155 break;
1157 case ScriptEdit::Password:
1158 stl->insertItem("Password", stl->currentItem());
1159 sl->insertItem(se->text(), sl->currentItem());
1160 break;
1162 case ScriptEdit::ID:
1163 stl->insertItem("ID", stl->currentItem());
1164 sl->insertItem(se->text(), sl->currentItem());
1165 break;
1167 case ScriptEdit::Prompt:
1168 stl->insertItem("Prompt", stl->currentItem());
1169 sl->insertItem(se->text(), sl->currentItem());
1170 break;
1172 case ScriptEdit::PWPrompt:
1173 stl->insertItem("PWPrompt", stl->currentItem());
1174 sl->insertItem(se->text(), sl->currentItem());
1175 break;
1177 case ScriptEdit::LoopStart:
1178 stl->insertItem("LoopStart", stl->currentItem());
1179 sl->insertItem(se->text(), sl->currentItem());
1180 break;
1182 case ScriptEdit::LoopEnd:
1183 stl->insertItem("LoopEnd", stl->currentItem());
1184 sl->insertItem(se->text(), sl->currentItem());
1185 break;
1187 case ScriptEdit::Scan:
1188 stl->insertItem("Scan", stl->currentItem());
1189 sl->insertItem(se->text(), sl->currentItem());
1190 break;
1192 case ScriptEdit::Save:
1193 stl->insertItem("Save", stl->currentItem());
1194 sl->insertItem(se->text(), sl->currentItem());
1195 break;
1197 default:
1198 break;
1200 adjustScrollBar();
1201 se->setText("");
1205 void ScriptWidget::removeButton() {
1206 if(sl->currentItem() >= 0) {
1207 int stlc = stl->currentItem();
1208 sl->removeItem(sl->currentItem());
1209 stl->removeItem(stlc);
1210 adjustScrollBar();
1211 insert->setEnabled(sl->currentItem() != -1);
1212 remove->setEnabled(sl->currentItem() != -1);
1218 /////////////////////////////////////////////////////////////////////////////
1220 // Used to specify a new phone number
1222 /////////////////////////////////////////////////////////////////////////////
1223 PhoneNumberDialog::PhoneNumberDialog(QWidget *parent)
1224 : KDialog(parent) {
1225 setCaption( i18n("Add Phone Number") );
1226 setButtons( Ok|Cancel );
1227 setDefaultButton( Ok );
1228 setModal( true );
1229 KWindowSystem::setIcons(winId(), qApp->windowIcon().pixmap(IconSize(KIconLoader::Desktop),IconSize(KIconLoader::Desktop)), qApp->windowIcon().pixmap(IconSize(KIconLoader::Small),IconSize(KIconLoader::Small)));
1231 QWidget *hbox = new QWidget(this);
1232 QHBoxLayout *hboxLayout2 = new QHBoxLayout(hbox);
1233 hbox->setLayout(hboxLayout2);
1234 setMainWidget(hbox);
1236 hboxLayout2->setSpacing(KDialog::spacingHint());
1238 new QLabel(i18n("Enter a phone number:"), hbox);
1240 le = newLineEdit(14, hbox);
1241 le->setMinimumWidth(125);
1243 connect(le, SIGNAL(textChanged(const QString &)),
1244 this, SLOT(textChanged(const QString &)));
1246 le->setFocus();
1247 textChanged("");
1249 showButtonSeparator(true);
1253 QString PhoneNumberDialog::phoneNumber() {
1254 QString s = le->text();
1256 return s;
1260 void PhoneNumberDialog::textChanged(const QString &s) {
1261 enableButtonOk(s.length() > 0);
1265 #include "edit.moc"