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 | |
55 | extern PPPData gpppdata; |
56 | |
57 | MiniTerm::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 | |
108 | MiniTerm::~MiniTerm() { |
109 | delete toolbar; |
110 | delete statusbar; |
111 | } |
112 | |
113 | |
114 | void 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 | |
125 | void 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 | |
170 | void 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 | |
191 | void 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 | |
207 | void 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 | |
219 | void MiniTerm::closeEvent( QCloseEvent *e ) { |
220 | cancelbutton(); |
221 | e->accept(); |
222 | } |
223 | |
224 | |
225 | void MiniTerm::help() { |
226 | KToolInvocation::invokeHelp(); |
227 | } |
228 | |
229 | |
230 | MyTerm::MyTerm(QWidget *parent, const char* name) |
231 | : Q3MultiLineEdit(parent, name) |
232 | { |
233 | setFont(KGlobalSettings::fixedFont()); |
234 | } |
235 | |
236 | void 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 | |
250 | void MyTerm::insertChar(unsigned char c) { |
251 | Q3MultiLineEdit::insert(QString(c)); |
252 | } |
253 | |
254 | |
255 | void MyTerm::newLine() { |
256 | Q3MultiLineEdit::newLine(); |
257 | } |
258 | |
259 | |
260 | void MyTerm::del() { |
261 | Q3MultiLineEdit::del(); |
262 | } |
263 | |
264 | |
265 | void MyTerm::backspace() { |
266 | Q3MultiLineEdit::backspace(); |
267 | } |
268 | |
269 | |
270 | void 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 | |
280 | void MyTerm::mynewline() { |
281 | Q3MultiLineEdit::end(false); |
282 | Q3MultiLineEdit::newLine(); |
283 | } |
284 | |
285 | #include "miniterm.moc" |
286 | |