1/*
2 * kPPP: A front end for pppd for the KDE project
3 *
4 * $Id$
5 *
6 * Copyright (C) 1997 Bernd Johannes Wuebben
7 * wuebben@math.cornell.edu
8 *
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Library General Public
12 * License as published by the Free Software Foundation; either
13 * version 2 of the License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Library General Public License for more details.
19 *
20 * You should have received a copy of the GNU Library General Public
21 * License along with this program; if not, write to the Free
22 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 */
24
25#include <unistd.h>
26#include <sys/ioctl.h>
27#include <termios.h>
28#include <sys/types.h>
29#include <kwindowsystem.h>
30#include <khelpmenu.h>
31#include <kiconloader.h>
32#include "pppdata.h"
33#include "modem.h"
34#include "miniterm.h"
35#include <klocale.h>
36#include <kmenu.h>
37#include <kglobalsettings.h>
38#include <kmenubar.h>
39#include <kicon.h>
40#include <KStandardGuiItem>
41#include <kapplication.h>
42#include <kguiitem.h>
43#include <qlayout.h>
44#include <qlabel.h>
45#include <qtimer.h>
46#include <QMenu>
47//Added by qt3to4:
48#include <QVBoxLayout>
49#include <QFrame>
50#include <QKeyEvent>
51#include <QCloseEvent>
52#include <ktoolinvocation.h>
53
54
55extern PPPData gpppdata;
56
57MiniTerm::MiniTerm(QWidget *parent, const char *name)
58 : QDialog(parent)
59{
60 setObjectName(name);
61 setModal(true);
62 setWindowTitle(i18n("Kppp Mini-Terminal"));
63 KWindowSystem::setIcons(winId(), qApp->windowIcon().pixmap(IconSize(KIconLoader::Desktop),IconSize(KIconLoader::Desktop)), qApp->windowIcon().pixmap(IconSize(KIconLoader::Small),IconSize(KIconLoader::Small)));
64
65 m_file = new QMenu(this);
66 m_file->addAction( SmallIcon("window-close"), i18n("&Close"), this, SLOT(cancelbutton()) );
67 m_options = new QMenu(this);
68 m_options->addAction(i18n("&Reset Modem"),this,SLOT(resetModem()));
69 m_help =
70 new KHelpMenu(this,
71 i18n("MiniTerm - A terminal emulation for KPPP\n\n"
72 "(c) 1997 Bernd Johannes Wuebben <wuebben@kde.org>\n"
73 "(c) 1998 Harri Porten <porten@kde.org>\n"
74 "(c) 1998 Mario Weilguni <mweilguni@kde.org>\n\n"
75 "This program is published under the GNU GPL\n"
76 "(GNU General Public License)"
77 ));
78
79 menubar = new KMenuBar(this);
80 m_file->setTitle(i18n("&File"));
81 menubar->addMenu( m_file );
82 m_options->setTitle(i18n("&Modem"));
83 menubar->addMenu( m_options );
84 m_help->menu()->setTitle(KStandardGuiItem::help().text());
85 menubar->addMenu( m_help->menu());
86
87 statusbar = new QLabel(this);
88 statusbar->setFrameStyle(QFrame::Panel | QFrame::Sunken);
89
90 terminal = new MyTerm(this, "term");
91
92 setupToolbar();
93
94 QVBoxLayout *layout=new QVBoxLayout(this);
95 layout->addWidget(menubar);
96 layout->addWidget(toolbar);
97 layout->addWidget(terminal);
98 layout->addWidget(statusbar);
99
100 inittimer = new QTimer(this);
101 connect(inittimer,SIGNAL(timeout()),this,SLOT(init()));
102 inittimer->start(500);
103
104 resize(550,400);
105}
106
107
108MiniTerm::~MiniTerm() {
109 delete toolbar;
110 delete statusbar;
111}
112
113
114void MiniTerm::setupToolbar() {
115 toolbar = new KToolBar( this );
116
117 toolbar->addAction( KIcon("application-exit"), i18n("Close MiniTerm"), this, SLOT(cancelbutton()));
118 toolbar->addAction( KIcon("go-previous"), i18n("Reset Modem"), this, SLOT(resetModem()));
119 toolbar->addAction( KIcon("help-contents"), i18n("Help"), this, SLOT(help()));
120
121 toolbar->setMovable(false);
122}
123
124
125void MiniTerm::init() {
126 inittimer->stop();
127 statusbar->setText(i18n("Initializing Modem"));
128 qApp->processEvents();
129
130 int lock = Modem::modem->lockdevice();
131 if (lock == 1) {
132 statusbar->setText(i18n("Modem device is locked."));
133 return;
134 }
135
136 if (lock == -1) {
137 statusbar->setText(i18n("Unable to create modem lock file."));
138 return;
139 }
140
141 if(Modem::modem->opentty()) {
142 if(Modem::modem->hangup()) {
143 // send a carriage return and then wait a bit so that the modem will
144 // let us issue commands.
145 if(gpppdata.modemPreInitDelay() > 0) {
146 usleep(gpppdata.modemPreInitDelay() * 5000);
147 Modem::modem->writeLine("");
148 usleep(gpppdata.modemPreInitDelay() * 5000);
149 }
150 Modem::modem->writeLine(gpppdata.modemInitStr(0).toLocal8Bit());
151 usleep(gpppdata.modemInitDelay() * 10000);
152
153 statusbar->setText(i18n("Modem Ready"));
154 terminal->setFocus();
155
156 qApp->processEvents();
157 qApp->processEvents();
158
159 Modem::modem->notify(this, SLOT(readChar(unsigned char)));
160 return;
161 }
162 }
163
164 // opentty() or hangup() failed
165 statusbar->setText(Modem::modem->modemMessage());
166 Modem::modem->unlockdevice();
167}
168
169
170void MiniTerm::readChar(unsigned char c) {
171
172 switch((int)c) {
173 case 8:
174 terminal->backspace();
175 break;
176 case 10:
177 terminal->mynewline();
178 break;
179 case 13:
180 terminal->myreturn();
181 break;
182 case 127:
183 terminal->backspace();
184 break;
185 default:
186 terminal->insertChar(c);
187 }
188}
189
190
191void MiniTerm::cancelbutton() {
192 Modem::modem->stop();
193
194 statusbar->setText(i18n("Hanging up..."));
195 qApp->processEvents();
196 KApplication::flush();
197
198 Modem::modem->hangup();
199
200 Modem::modem->closetty();
201 Modem::modem->unlockdevice();
202
203 reject();
204}
205
206
207void MiniTerm::resetModem() {
208 statusbar->setText(i18n("Resetting Modem"));
209 terminal->newLine();
210 qApp->processEvents();
211 KApplication::flush();
212
213 Modem::modem->hangup();
214
215 statusbar->setText(i18n("Modem Ready"));
216}
217
218
219void MiniTerm::closeEvent( QCloseEvent *e ) {
220 cancelbutton();
221 e->accept();
222}
223
224
225void MiniTerm::help() {
226 KToolInvocation::invokeHelp();
227}
228
229
230MyTerm::MyTerm(QWidget *parent, const char* name)
231 : Q3MultiLineEdit(parent, name)
232{
233 setFont(KGlobalSettings::fixedFont());
234}
235
236void MyTerm::keyPressEvent(QKeyEvent *k) {
237 // ignore meta keys
238 if (k->key() == 0 || k->key() == Qt::Key_unknown)
239 return;
240
241 if(k->key() == Qt::Key_Enter || k->key() == Qt::Key_Return)
242 myreturn();
243
244 QByteArray ascii = k->text().toAscii();
245 if (ascii.size() > 0)
246 Modem::modem->writeChar((unsigned char) ascii[0]);
247}
248
249
250void MyTerm::insertChar(unsigned char c) {
251 Q3MultiLineEdit::insert(QString(c));
252}
253
254
255void MyTerm::newLine() {
256 Q3MultiLineEdit::newLine();
257}
258
259
260void MyTerm::del() {
261 Q3MultiLineEdit::del();
262}
263
264
265void MyTerm::backspace() {
266 Q3MultiLineEdit::backspace();
267}
268
269
270void MyTerm::myreturn() {
271 int column;
272 int line;
273
274 getCursorPosition(&line,&column);
275 for (int i = 0; i < column;i++)
276 Q3MultiLineEdit::cursorLeft();
277}
278
279
280void MyTerm::mynewline() {
281 Q3MultiLineEdit::end(false);
282 Q3MultiLineEdit::newLine();
283}
284
285#include "miniterm.moc"
286