summaryrefslogtreecommitdiffstats
path: root/kppp/modeminfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kppp/modeminfo.cpp')
-rw-r--r--kppp/modeminfo.cpp292
1 files changed, 292 insertions, 0 deletions
diff --git a/kppp/modeminfo.cpp b/kppp/modeminfo.cpp
new file mode 100644
index 00000000..a2338aac
--- /dev/null
+++ b/kppp/modeminfo.cpp
@@ -0,0 +1,292 @@
+/*
+ * kPPP: A front end for pppd for the KDE project
+ *
+ * $Id$
+ *
+ * Copyright (C) 1997 Bernd Johannes Wuebben
+ *
+ * This file contributed by: Markus Wuebben, [email protected]
+ *
+ *
+ * This library 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 library 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 <unistd.h>
+#include <qregexp.h>
+#include <qlayout.h>
+#include <kwin.h>
+#include <kmessagebox.h>
+#include <kapplication.h>
+#include <kpushbutton.h>
+#include "modeminfo.h"
+#include "modem.h"
+#include <klocale.h>
+
+ModemTransfer::ModemTransfer(QWidget *parent, const char *name)
+ : QDialog(parent, name,TRUE, WStyle_Customize|WStyle_NormalBorder)
+{
+ setCaption(i18n("ATI Query"));
+ KWin::setIcons(winId(), kapp->icon(), kapp->miniIcon());
+
+ QVBoxLayout *tl = new QVBoxLayout(this, 10, 10);
+
+ progressBar = new KProgress(this, "bar");
+ progressBar->setTotalSteps(8);
+
+ statusBar = new QLabel(this,"sBar");
+ statusBar->setFrameStyle(QFrame::Panel|QFrame::Sunken);
+ statusBar->setAlignment(AlignCenter);
+
+ // This is a rather complicated case. Since we do not know which
+ // message is the widest in the national language, we'd to
+ // search all these messages. This is a little overkill, so I take
+ // the longest english message, translate it and give it additional
+ // 20 percent space. Hope this is enough.
+ statusBar->setText(i18n("Unable to create modem lock file."));
+ statusBar->setFixedWidth((statusBar->sizeHint().width() * 12) / 10);
+ statusBar->setFixedHeight(statusBar->sizeHint().height() + 4);
+
+ // set original text
+ statusBar->setText(i18n("Looking for modem..."));
+ progressBar->setFixedHeight(statusBar->minimumSize().height());
+ tl->addWidget(progressBar);
+ tl->addWidget(statusBar);
+
+ cancel = new KPushButton(KStdGuiItem::cancel(), this);
+ cancel->setFocus();
+ connect(cancel, SIGNAL(clicked()), SLOT(cancelbutton()));
+
+ QHBoxLayout *l1 = new QHBoxLayout;
+ tl->addLayout(l1);
+ l1->addStretch(1);
+ l1->addWidget(cancel);
+
+ setFixedSize(sizeHint());
+
+ step = 0;
+
+ ////////////////////////////////////////////////
+
+ timeout_timer = new QTimer(this);
+ connect(timeout_timer, SIGNAL(timeout()), SLOT(time_out_slot()));
+
+ scripttimer = new QTimer(this);
+ connect(scripttimer, SIGNAL(timeout()), SLOT(do_script()));
+
+ timeout_timer->start(15000,TRUE); // 15 secs single shot
+ QTimer::singleShot(500, this, SLOT(init()));
+
+}
+
+
+void ModemTransfer::ati_done() {
+ scripttimer->stop();
+ timeout_timer->stop();
+ Modem::modem->closetty();
+ Modem::modem->unlockdevice();
+ hide();
+
+ // open the result window
+ ModemInfo *mi = new ModemInfo(this);
+ for(int i = 0; i < NUM_OF_ATI; i++)
+ mi->setAtiString(i, ati_query_strings[i]);
+ mi->exec();
+ delete mi;
+
+ accept();
+}
+
+
+void ModemTransfer::time_out_slot() {
+ timeout_timer->stop();
+ scripttimer->stop();
+
+ KMessageBox::error(this, i18n("Modem query timed out."));
+ reject();
+}
+
+
+void ModemTransfer::init() {
+
+ kapp->processEvents();
+
+ int lock = Modem::modem->lockdevice();
+ if (lock == 1) {
+
+ statusBar->setText(i18n("Modem device is locked."));
+ return;
+ }
+
+ if (lock == -1) {
+
+ statusBar->setText(i18n("Unable to create modem lock file."));
+ return;
+ }
+
+
+ if(Modem::modem->opentty()) {
+ if(Modem::modem->hangup()) {
+ usleep(100000); // wait 0.1 secs
+ Modem::modem->writeLine("ATE0Q1V1"); // E0 don't echo the commands I send ...
+
+ statusBar->setText(i18n("Modem Ready"));
+ kapp->processEvents();
+ usleep(100000); // wait 0.1 secs
+ kapp->processEvents();
+ scripttimer->start(1000); // this one does the ati query
+
+ // clear modem buffer
+ Modem::modem->flush();
+
+ Modem::modem->notify(this, SLOT(readChar(unsigned char)));
+ return;
+ }
+ }
+
+ // opentty() or hangup() failed
+ statusBar->setText(Modem::modem->modemMessage());
+ step = 99; // wait until cancel is pressed
+ Modem::modem->unlockdevice();
+}
+
+
+void ModemTransfer::do_script() {
+ QString msg;
+ QString query;
+
+ switch(step) {
+ case 0:
+ readtty();
+ statusBar->setText("ATI...");
+ progressBar->advance(1);
+ Modem::modem->writeLine("ATI\n");
+ break;
+
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ readtty();
+ msg.sprintf("ATI %d ...", step);
+ query.sprintf("ATI%d\n", step);
+ statusBar->setText(msg);
+ progressBar->advance(1);
+ Modem::modem->writeLine(query.local8Bit());
+ break;
+
+ default:
+ readtty();
+ ati_done();
+ }
+ step++;
+}
+
+void ModemTransfer::readChar(unsigned char c) {
+ if(readbuffer.length() < 255)
+ readbuffer += c;
+}
+
+void ModemTransfer::readtty() {
+
+ if (step == 0)
+ return;
+
+ readbuffer.replace(QRegExp("[\n\r]")," "); // remove stray \n and \r
+ readbuffer = readbuffer.stripWhiteSpace(); // strip of leading or trailing white
+ // space
+
+ if(step <= NUM_OF_ATI)
+ ati_query_strings[step-1] = readbuffer.copy();
+
+ readbuffer = "";
+}
+
+
+void ModemTransfer::cancelbutton() {
+ scripttimer->stop();
+ Modem::modem->stop();
+ timeout_timer->stop();
+
+ statusBar->setText(i18n("One moment please..."));
+ kapp->processEvents();
+
+ Modem::modem->hangup();
+
+ Modem::modem->closetty();
+ Modem::modem->unlockdevice();
+ reject();
+}
+
+
+void ModemTransfer::closeEvent( QCloseEvent *e ) {
+ cancelbutton();
+ e->accept();
+}
+
+
+ModemInfo::ModemInfo(QWidget *parent, const char* name)
+ : QDialog(parent, name, TRUE, WStyle_Customize|WStyle_NormalBorder)
+{
+ QString label_text;
+
+ setCaption(i18n("Modem Query Results"));
+ KWin::setIcons(winId(), kapp->icon(), kapp->miniIcon());
+
+ QVBoxLayout *tl = new QVBoxLayout(this, 10, 10);
+
+ QGridLayout *l1 = new QGridLayout(NUM_OF_ATI, 2, 5);
+ tl->addLayout(l1, 1);
+ for(int i = 0 ; i < NUM_OF_ATI ; i++) {
+
+ label_text = "";
+ if ( i == 0)
+ label_text.sprintf("ATI :");
+ else
+ label_text.sprintf("ATI %d:", i );
+
+ ati_label[i] = new QLabel(label_text, this);
+ l1->addWidget(ati_label[i], i, 0);
+
+ ati_label_result[i] = new QLineEdit(this);
+ ati_label_result[i]->setMinimumWidth(fontMetrics().width('H') * 24);
+ l1->addWidget(ati_label_result[i], i, 1);
+ }
+ //tl->addSpacing(1);
+
+ QHBoxLayout *l2 = new QHBoxLayout;
+ QPushButton *ok = new KPushButton(KStdGuiItem::close(), this);
+ ok->setDefault(TRUE);
+ ok->setFocus();
+
+ tl->addLayout(l2);
+ l2->addStretch(1);
+
+ connect(ok, SIGNAL(clicked()), SLOT(accept()));
+ l2->addWidget(ok);
+
+ setMinimumSize(sizeHint());
+}
+
+
+void ModemInfo::setAtiString(int i, QString s) {
+ if(i < NUM_OF_ATI)
+ ati_label_result[i]->setText(s);
+}
+
+#include "modeminfo.moc"