summaryrefslogtreecommitdiffstats
path: root/kppp/accounts.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commitbcb704366cb5e333a626c18c308c7e0448a8e69f (patch)
treef0d6ab7d78ecdd9207cf46536376b44b91a1ca71 /kppp/accounts.cpp
downloadtdenetwork-bcb704366cb5e333a626c18c308c7e0448a8e69f.tar.gz
tdenetwork-bcb704366cb5e333a626c18c308c7e0448a8e69f.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdenetwork@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kppp/accounts.cpp')
-rw-r--r--kppp/accounts.cpp484
1 files changed, 484 insertions, 0 deletions
diff --git a/kppp/accounts.cpp b/kppp/accounts.cpp
new file mode 100644
index 00000000..be5a5996
--- /dev/null
+++ b/kppp/accounts.cpp
@@ -0,0 +1,484 @@
+/*
+ * kPPP: A pppd front end for the KDE project
+ *
+ * $Id$
+ *
+ * Copyright (C) 1997 Bernd Johannes Wuebben
+ *
+ * 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 <qdir.h>
+#include <stdlib.h>
+#include <qlayout.h>
+#include <qtabdialog.h>
+#include <qwhatsthis.h>
+#include <qmessagebox.h>
+
+#include <kapplication.h>
+#include <kbuttonbox.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kwin.h>
+#include <kdialogbase.h>
+#include <kstdguiitem.h>
+#include <qvgroupbox.h>
+
+#include <errno.h>
+
+#include "pppdata.h"
+#include "accounts.h"
+#include "accounting.h"
+#include "providerdb.h"
+#include "edit.h"
+
+void parseargs(char* buf, char** args);
+
+AccountWidget::AccountWidget( QWidget *parent, const char *name )
+ : QWidget( parent, name )
+{
+ int min = 0;
+ QVBoxLayout *l1 = new QVBoxLayout(parent, 10, 10);
+
+ // add a hbox
+ QHBoxLayout *l11 = new QHBoxLayout;
+ l1->addLayout(l11);
+
+ accountlist_l = new QListBox(parent);
+ accountlist_l->setMinimumSize(160, 128);
+ connect(accountlist_l, SIGNAL(highlighted(int)),
+ this, SLOT(slotListBoxSelect(int)));
+ connect(accountlist_l, SIGNAL(selected(int)),
+ this, SLOT(editaccount()));
+ l11->addWidget(accountlist_l, 10);
+
+ QVBoxLayout *l111 = new QVBoxLayout;
+ l11->addLayout(l111, 1);
+ edit_b = new QPushButton(i18n("&Edit..."), parent);
+ connect(edit_b, SIGNAL(clicked()), SLOT(editaccount()));
+ QWhatsThis::add(edit_b, i18n("Allows you to modify the selected account"));
+
+ min = edit_b->sizeHint().width();
+ min = QMAX(70,min);
+ edit_b->setMinimumWidth(min);
+
+ l111->addWidget(edit_b);
+
+ new_b = new QPushButton(i18n("&New..."), parent);
+ connect(new_b, SIGNAL(clicked()), SLOT(newaccount()));
+ l111->addWidget(new_b);
+ QWhatsThis::add(new_b, i18n("Create a new dialup connection\n"
+ "to the Internet"));
+
+ copy_b = new QPushButton(i18n("Co&py"), parent);
+ connect(copy_b, SIGNAL(clicked()), SLOT(copyaccount()));
+ l111->addWidget(copy_b);
+ QWhatsThis::add(copy_b,
+ i18n("Makes a copy of the selected account. All\n"
+ "settings of the selected account are copied\n"
+ "to a new account that you can modify to fit your\n"
+ "needs"));
+
+ delete_b = new QPushButton(i18n("De&lete"), parent);
+ connect(delete_b, SIGNAL(clicked()), SLOT(deleteaccount()));
+ l111->addWidget(delete_b);
+ QWhatsThis::add(delete_b,
+ i18n("<p>Deletes the selected account\n\n"
+ "<font color=\"red\"><b>Use with care!</b></font>"));
+
+ QHBoxLayout *l12 = new QHBoxLayout;
+ l1->addStretch(1);
+ l1->addLayout(l12);
+
+ QVBoxLayout *l121 = new QVBoxLayout;
+ l12->addLayout(l121);
+ l121->addStretch(1);
+ costlabel = new QLabel(i18n("Phone costs:"), parent);
+ costlabel->setEnabled(FALSE);
+ l121->addWidget(costlabel);
+
+ costedit = new QLineEdit(parent);
+ costedit->setFocusPolicy(QWidget::NoFocus);
+ costedit->setFixedHeight(costedit->sizeHint().height());
+ costedit->setEnabled(FALSE);
+ l121->addWidget(costedit);
+ l121->addStretch(1);
+ QString tmp = i18n("<p>This shows the accumulated phone costs\n"
+ "for the selected account.\n"
+ "\n"
+ "<b>Important</b>: If you have more than one \n"
+ "account - beware, this is <b>NOT</b> the sum \n"
+ "of the phone costs of all your accounts!");
+ QWhatsThis::add(costlabel, tmp);
+ QWhatsThis::add(costedit, tmp);
+
+ vollabel = new QLabel(i18n("Volume:"), parent);
+ vollabel->setEnabled(FALSE);
+ l121->addWidget(vollabel);
+
+ voledit = new QLineEdit(parent,"voledit");
+ voledit->setFocusPolicy(QWidget::NoFocus);
+ voledit->setFixedHeight(voledit->sizeHint().height());
+ voledit->setEnabled(FALSE);
+ l121->addWidget(voledit);
+ tmp = i18n("<p>This shows the number of bytes transferred\n"
+ "for the selected account (not for all of your\n"
+ "accounts. You can select what to display in\n"
+ "the accounting dialog.\n"
+ "\n"
+ "<a href=\"#volaccounting\">More on volume accounting</a>");
+
+ QWhatsThis::add(vollabel,tmp);
+ QWhatsThis::add(voledit, tmp);
+
+ QVBoxLayout *l122 = new QVBoxLayout;
+ l12->addStretch(1);
+ l12->addLayout(l122);
+
+ l122->addStretch(1);
+ reset = new QPushButton(i18n("&Reset..."), parent);
+ reset->setEnabled(FALSE);
+ connect(reset, SIGNAL(clicked()),
+ this, SLOT(resetClicked()));
+ l122->addWidget(reset);
+
+ log = new QPushButton(i18n("&View Logs"), parent);
+ connect(log, SIGNAL(clicked()),
+ this, SLOT(viewLogClicked()));
+ l122->addWidget(log);
+ l122->addStretch(1);
+
+ //load up account list from gppdata to the list box
+ if(gpppdata.accountCount() > 0) {
+ for(int i=0; i <= gpppdata.accountCount()-1; i++) {
+ gpppdata.setAccountByIndex(i);
+ accountlist_l->insertItem(gpppdata.accname());
+ }
+ }
+
+ slotListBoxSelect(accountlist_l->currentItem());
+
+ l1->activate();
+}
+
+
+
+void AccountWidget::slotListBoxSelect(int idx) {
+ delete_b->setEnabled((bool)(idx != -1));
+ edit_b->setEnabled((bool)(idx != -1));
+ copy_b->setEnabled((bool)(idx != -1));
+ if(idx!=-1) {
+ QString account = gpppdata.accname();
+ gpppdata.setAccountByIndex(accountlist_l->currentItem());
+ reset->setEnabled(TRUE);
+ costlabel->setEnabled(TRUE);
+ costedit->setEnabled(TRUE);
+ costedit->setText(AccountingBase::getCosts(accountlist_l->text(accountlist_l->currentItem())));
+
+ vollabel->setEnabled(TRUE);
+ voledit->setEnabled(TRUE);
+ int bytes = gpppdata.totalBytes();
+ voledit->setText(prettyPrintVolume(bytes));
+ gpppdata.setAccount(account);
+ } else{
+ reset->setEnabled(FALSE);
+ costlabel->setEnabled(FALSE);
+ costedit->setText("");
+ costedit->setEnabled(FALSE);
+ vollabel->setEnabled(FALSE);
+ voledit->setText("");
+ voledit->setEnabled(FALSE);
+ }
+}
+
+
+void AccountWidget::viewLogClicked(){
+
+ QApplication::flushX();
+ if(fork() == 0) {
+ if (setgid(getgid()) < 0 && errno != EPERM)
+ _exit(2);
+ setuid(getuid());
+ if( geteuid() != getuid() )
+ _exit(1);
+ // TODO: use execvp
+ system("kppplogview -kppp");
+ _exit(0);
+ }
+}
+
+
+void AccountWidget::resetClicked(){
+ if(accountlist_l->currentItem() == -1)
+ return;
+
+ QueryReset dlg(this);
+ int what = dlg.exec();
+
+ if((what & QueryReset::COSTS)) {
+ emit resetCosts(accountlist_l->text(accountlist_l->currentItem()));
+ costedit->setText("0");
+ }
+
+ if((what & QueryReset::VOLUME)) {
+ emit resetVolume(accountlist_l->text(accountlist_l->currentItem()));
+ voledit->setText(prettyPrintVolume(0));
+ }
+}
+
+
+void AccountWidget::editaccount() {
+ gpppdata.setAccount(accountlist_l->text(accountlist_l->currentItem()));
+
+ int result = doTab();
+
+ if(result == QDialog::Accepted) {
+ accountlist_l->changeItem(gpppdata.accname(),accountlist_l->currentItem());
+ emit resetaccounts();
+ gpppdata.save();
+ }
+}
+
+
+void AccountWidget::newaccount() {
+ if(accountlist_l->count() == MAX_ACCOUNTS) {
+ KMessageBox::sorry(this, i18n("Maximum number of accounts reached."));
+ return;
+ }
+
+ int result;
+ int query = KMessageBox::questionYesNoCancel(this,
+ i18n("Do you want to use the wizard to create the new account or the "
+ "standard, dialog-based setup?\n"
+ "The wizard is easier and sufficient in most cases. If you need "
+ "very special settings, you might want to try the standard, "
+ "dialog-based setup."),
+ i18n("Create New Account"),
+ i18n("&Wizard"), i18n("&Manual Setup"));
+
+ switch(query) {
+ case KMessageBox::Yes:
+ {
+ if (gpppdata.newaccount() == -1)
+ return;
+ ProviderDB pdb(this);
+ result = pdb.exec();
+ break;
+ }
+ case KMessageBox::No:
+ if (gpppdata.newaccount() == -1)
+ return;
+ result = doTab();
+ break;
+ default:
+ return;
+ }
+
+ if(result == QDialog::Accepted) {
+ accountlist_l->insertItem(gpppdata.accname());
+ accountlist_l->setSelected(accountlist_l->findItem(gpppdata.accname()),
+ true);
+ emit resetaccounts();
+ gpppdata.save();
+ } else
+ gpppdata.deleteAccount();
+}
+
+
+void AccountWidget::copyaccount() {
+ if(accountlist_l->count() == MAX_ACCOUNTS) {
+ KMessageBox::sorry(this, i18n("Maximum number of accounts reached."));
+ return;
+ }
+
+ if(accountlist_l->currentItem()<0) {
+ KMessageBox::sorry(this, i18n("No account selected."));
+ return;
+ }
+
+ gpppdata.copyaccount(accountlist_l->currentItem());
+
+ accountlist_l->insertItem(gpppdata.accname());
+ emit resetaccounts();
+ gpppdata.save();
+}
+
+
+void AccountWidget::deleteaccount() {
+
+ QString s = i18n("Are you sure you want to delete\nthe account \"%1\"?")
+ .arg(accountlist_l->text(accountlist_l->currentItem()));
+
+ if(KMessageBox::warningYesNo(this, s, i18n("Confirm"), KGuiItem(i18n("Delete"), "editdelete"), KStdGuiItem::cancel()) != KMessageBox::Yes)
+ return;
+
+ if(gpppdata.deleteAccount(accountlist_l->text(accountlist_l->currentItem())))
+ accountlist_l->removeItem(accountlist_l->currentItem());
+
+ emit resetaccounts();
+ gpppdata.save();
+
+ slotListBoxSelect(accountlist_l->currentItem());
+
+}
+
+
+int AccountWidget::doTab(){
+ tabWindow = new KDialogBase( KDialogBase::Tabbed, QString::null,
+ KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok,
+ 0, 0, true);
+ KWin::setIcons(tabWindow->winId(), kapp->icon(), kapp->miniIcon());
+ bool isnewaccount;
+
+ if(gpppdata.accname().isEmpty()) {
+ tabWindow->setCaption(i18n("New Account"));
+ isnewaccount = true;
+ } else {
+ QString tit = i18n("Edit Account: ");
+ tit += gpppdata.accname();
+ tabWindow->setCaption(tit);
+ isnewaccount = false;
+ }
+
+ dial_w = new DialWidget(tabWindow->addPage(i18n("Dial"), i18n("Dial Setup")), isnewaccount);
+ ip_w = new IPWidget(tabWindow->addPage(i18n("IP"), i18n("IP Setup")), isnewaccount);
+ gateway_w = new GatewayWidget(tabWindow->addPage(i18n("Gateway"), i18n("Gateway Setup")), isnewaccount);
+ dns_w = new DNSWidget(tabWindow->addPage(i18n("DNS"), i18n("DNS Servers")), isnewaccount);
+ script_w = new ScriptWidget(tabWindow->addPage(i18n("Login Script"), i18n("Edit Login Script")), isnewaccount);
+ ExecWidget *exec_w = new ExecWidget(tabWindow->addPage(i18n("Execute"), i18n("Execute Programs")), isnewaccount);
+ acct = new AccountingSelector(tabWindow->addPage(i18n("Accounting")), isnewaccount);
+
+ int result = 0;
+ bool ok = false;
+ while (!ok){
+
+ result = tabWindow->exec();
+ ok = true;
+
+ if(result == QDialog::Accepted) {
+ if (script_w->check()) {
+ if(dial_w->save()) {
+ ip_w->save();
+ dns_w->save();
+ gateway_w->save();
+ script_w->save();
+ exec_w->save();
+ acct->save();
+ } else {
+ // ### add: "and valid"
+ KMessageBox::error(this, i18n( "You must enter a unique\n"
+ "account name"));
+ ok = false;
+ }
+ } else {
+ KMessageBox::error(this, i18n("Login script has unbalanced "
+ "loop Start/End"));
+ ok = false;
+ }
+ }
+ }
+
+ delete tabWindow;
+ return result;
+}
+
+
+QString AccountWidget::prettyPrintVolume(unsigned int n) {
+ int idx = 0;
+ const QString quant[] = {i18n("Byte"), i18n("KB"),
+ i18n("MB"), i18n("GB"), QString::null};
+
+ float n1 = n;
+ while(n >= 1024 && !quant[idx].isNull()) {
+ idx++;
+ n /= 1024;
+ }
+
+ int i = idx;
+ while(i--)
+ n1 = n1 / 1024.0;
+
+ QString s = KGlobal::locale()->formatNumber( n1, idx==0 ? 0 : 1 );
+ s += " " + quant[idx];
+ return s;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Queries the user what to reset: costs, volume or both
+//
+/////////////////////////////////////////////////////////////////////////////
+QueryReset::QueryReset(QWidget *parent) : QDialog(parent, 0, true) {
+ KWin::setIcons(winId(), kapp->icon(), kapp->miniIcon());
+ setCaption(i18n("Reset Accounting"));
+
+ QVBoxLayout *tl = new QVBoxLayout(this, 10, 10);
+ QVGroupBox *f = new QVGroupBox(i18n("What to Reset"), this);
+
+ QVBoxLayout *l1 = new QVBoxLayout(parent, 10, 10);
+ costs = new QCheckBox(i18n("Reset the accumulated p&hone costs"), f);
+ costs->setChecked(true);
+ l1->addWidget(costs);
+ QWhatsThis::add(costs, i18n("Check this to set the phone costs\n"
+ "to zero. Typically you will want to\n"
+ "do this once a month."));
+
+ volume = new QCheckBox(i18n("Reset &volume accounting"), f);
+ volume->setChecked(true);
+ l1->addWidget(volume);
+ QWhatsThis::add(volume, i18n("Check this to set the volume accounting\n"
+ "to zero. Typically you will want to do this\n"
+ "once a month."));
+
+ l1->activate();
+
+ // this activates the f-layout and sets minimumSize()
+ f->show();
+
+ tl->addWidget(f);
+
+ KButtonBox *bbox = new KButtonBox(this);
+ bbox->addStretch(1);
+ QPushButton *ok = bbox->addButton(KStdGuiItem::ok());
+ ok->setDefault(true);
+ QPushButton *cancel = bbox->addButton(KStdGuiItem::cancel());
+
+ connect(ok, SIGNAL(clicked()),
+ this, SLOT(accepted()));
+ connect(cancel, SIGNAL(clicked()),
+ this, SLOT(reject()));
+
+ bbox->layout();
+ tl->addWidget(bbox);
+
+ // TODO: activate if KGroupBox is fixed
+ // setFixedSize(sizeHint());
+}
+
+
+void QueryReset::accepted() {
+ int result = costs->isChecked() ? COSTS : 0;
+ result += volume->isChecked() ? VOLUME : 0;
+
+ done(result);
+}
+
+#include "accounts.moc"