summaryrefslogtreecommitdiffstats
path: root/kppp/miniterm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kppp/miniterm.cpp')
-rw-r--r--kppp/miniterm.cpp281
1 files changed, 281 insertions, 0 deletions
diff --git a/kppp/miniterm.cpp b/kppp/miniterm.cpp
new file mode 100644
index 00000000..bd426be7
--- /dev/null
+++ b/kppp/miniterm.cpp
@@ -0,0 +1,281 @@
+/*
+ * kPPP: A front end for pppd for the KDE project
+ *
+ * $Id$
+ *
+ * Copyright (C) 1997 Bernd Johannes Wuebben
+ * wuebben@math.cornell.edu
+ *
+ *
+ * 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 <sys/ioctl.h>
+#include <termios.h>
+#include <sys/types.h>
+#include <kwin.h>
+#include <khelpmenu.h>
+#include <kiconloader.h>
+#include "pppdata.h"
+#include "modem.h"
+#include "miniterm.h"
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kglobalsettings.h>
+#include <kapplication.h>
+#include <kmenubar.h>
+#include <kstdguiitem.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qtimer.h>
+#include <qpopupmenu.h>
+
+
+extern PPPData gpppdata;
+
+MiniTerm::MiniTerm(QWidget *parent, const char *name)
+ : QDialog(parent, name, true)
+{
+ setCaption(i18n("Kppp Mini-Terminal"));
+ KWin::setIcons(winId(), kapp->icon(), kapp->miniIcon());
+
+ m_file = new QPopupMenu(this);
+ m_file->insertItem( SmallIcon("fileclose"), i18n("&Close"), this, SLOT(cancelbutton()) );
+ m_options = new QPopupMenu(this);
+ m_options->insertItem(i18n("&Reset Modem"),this,SLOT(resetModem()));
+ m_help =
+ new KHelpMenu(this,
+ i18n("MiniTerm - A terminal emulation for KPPP\n\n"
+ "(c) 1997 Bernd Johannes Wuebben <wuebben@kde.org>\n"
+ "(c) 1998 Harri Porten <porten@kde.org>\n"
+ "(c) 1998 Mario Weilguni <mweilguni@kde.org>\n\n"
+ "This program is published under the GNU GPL\n"
+ "(GNU General Public License)"
+ ));
+
+ menubar = new KMenuBar(this);
+ menubar->insertItem( i18n("&File"), m_file );
+ menubar->insertItem( i18n("&Modem"), m_options );
+ menubar->insertItem( KStdGuiItem::help().text(), m_help->menu());
+
+ statusbar = new QLabel(this);
+ statusbar->setFrameStyle(QFrame::Panel | QFrame::Sunken);
+
+ terminal = new MyTerm(this, "term");
+
+ setupToolbar();
+
+ QVBoxLayout *layout=new QVBoxLayout(this);
+ layout->addWidget(menubar);
+ layout->addWidget(toolbar);
+ layout->addWidget(terminal);
+ layout->addWidget(statusbar);
+
+ inittimer = new QTimer(this);
+ connect(inittimer,SIGNAL(timeout()),this,SLOT(init()));
+ inittimer->start(500);
+
+ resize(550,400);
+}
+
+
+MiniTerm::~MiniTerm() {
+ delete toolbar;
+ delete statusbar;
+}
+
+
+void MiniTerm::setupToolbar() {
+ toolbar = new KToolBar( this );
+
+ toolbar->insertButton("exit", 0,
+ SIGNAL(clicked()), this,
+ SLOT(cancelbutton()), TRUE, i18n("Close MiniTerm"));
+
+ toolbar->insertButton("back", 0,
+ SIGNAL(clicked()), this,
+ SLOT(resetModem()), TRUE, i18n("Reset Modem"));
+
+ toolbar->insertButton("help", 0,
+ SIGNAL(clicked()), this,
+ SLOT(help()), TRUE, i18n("Help"));
+
+ toolbar->setBarPos( KToolBar::Top );
+ toolbar->setMovingEnabled(false);
+ toolbar->updateRects(true);
+}
+
+
+void MiniTerm::init() {
+ inittimer->stop();
+ statusbar->setText(i18n("Initializing Modem"));
+ 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()) {
+ // send a carriage return and then wait a bit so that the modem will
+ // let us issue commands.
+ if(gpppdata.modemPreInitDelay() > 0) {
+ usleep(gpppdata.modemPreInitDelay() * 5000);
+ Modem::modem->writeLine("");
+ usleep(gpppdata.modemPreInitDelay() * 5000);
+ }
+ Modem::modem->writeLine(gpppdata.modemInitStr(0).local8Bit());
+ usleep(gpppdata.modemInitDelay() * 10000);
+
+ statusbar->setText(i18n("Modem Ready"));
+ terminal->setFocus();
+
+ kapp->processEvents();
+ kapp->processEvents();
+
+ Modem::modem->notify(this, SLOT(readChar(unsigned char)));
+ return;
+ }
+ }
+
+ // opentty() or hangup() failed
+ statusbar->setText(Modem::modem->modemMessage());
+ Modem::modem->unlockdevice();
+}
+
+
+void MiniTerm::readChar(unsigned char c) {
+
+ switch((int)c) {
+ case 8:
+ terminal->backspace();
+ break;
+ case 10:
+ terminal->mynewline();
+ break;
+ case 13:
+ terminal->myreturn();
+ break;
+ case 127:
+ terminal->backspace();
+ break;
+ default:
+ terminal->insertChar(c);
+ }
+}
+
+
+void MiniTerm::cancelbutton() {
+ Modem::modem->stop();
+
+ statusbar->setText(i18n("Hanging up..."));
+ kapp->processEvents();
+ KApplication::flushX();
+
+ Modem::modem->hangup();
+
+ Modem::modem->closetty();
+ Modem::modem->unlockdevice();
+
+ reject();
+}
+
+
+void MiniTerm::resetModem() {
+ statusbar->setText(i18n("Resetting Modem"));
+ terminal->newLine();
+ kapp->processEvents();
+ KApplication::flushX();
+
+ Modem::modem->hangup();
+
+ statusbar->setText(i18n("Modem Ready"));
+}
+
+
+void MiniTerm::closeEvent( QCloseEvent *e ) {
+ cancelbutton();
+ e->accept();
+}
+
+
+void MiniTerm::help() {
+ kapp->invokeHelp();
+}
+
+
+MyTerm::MyTerm(QWidget *parent, const char* name)
+ : QMultiLineEdit(parent, name)
+{
+ setFont(KGlobalSettings::fixedFont());
+}
+
+void MyTerm::keyPressEvent(QKeyEvent *k) {
+ // ignore meta keys
+ if (k->ascii() == 0)
+ return;
+
+ if(k->ascii() == 13)
+ myreturn();
+
+ Modem::modem->writeChar((unsigned char) k->ascii());
+}
+
+
+void MyTerm::insertChar(unsigned char c) {
+ QMultiLineEdit::insert(QChar(c));
+}
+
+
+void MyTerm::newLine() {
+ QMultiLineEdit::newLine();
+}
+
+
+void MyTerm::del() {
+ QMultiLineEdit::del();
+}
+
+
+void MyTerm::backspace() {
+ QMultiLineEdit::backspace();
+}
+
+
+void MyTerm::myreturn() {
+ int column;
+ int line;
+
+ getCursorPosition(&line,&column);
+ for (int i = 0; i < column;i++)
+ QMultiLineEdit::cursorLeft();
+}
+
+
+void MyTerm::mynewline() {
+ QMultiLineEdit::end(FALSE);
+ QMultiLineEdit::newLine();
+}
+
+#include "miniterm.moc"