-rw-r--r-- | noncore/apps/opie-console/dialer.cpp | 121 | ||||
-rw-r--r-- | noncore/apps/opie-console/dialer.h | 7 |
2 files changed, 109 insertions, 19 deletions
diff --git a/noncore/apps/opie-console/dialer.cpp b/noncore/apps/opie-console/dialer.cpp index f6758ed..8589d14 100644 --- a/noncore/apps/opie-console/dialer.cpp +++ b/noncore/apps/opie-console/dialer.cpp @@ -4,15 +4,34 @@ #include <qprogressbar.h> #include <qlabel.h> #include <qpushbutton.h> #include <qapp.h> +#include <qtimer.h> + +// State machine: | When an error occurs, we don't have to +// | reset everything. +// (init) <------+ | But if the user wants to reset, +// | | | we stop dialing immediately. +// v | | +// (options) ----+ | Following the state machine is necessary +// | \ | to get determinable results. +// v ^ | +// (dial) ----+ | +// | ^ | +// v | | +// (online) --+ | +// | | +// v | Dialer::Dialer(const QString& number, QWidget *parent, const char *name) : QDialog(parent, name, true) { QVBoxLayout *vbox; QLabel *desc; + usercancel = 0; + m_number = number; + desc = new QLabel(QObject::tr("Dialing number: %1").arg(number), this); progress = new QProgressBar(this); status = new QLabel("", this); status->setFrameStyle(QFrame::Panel | QFrame::Sunken); @@ -23,15 +42,13 @@ Dialer::Dialer(const QString& number, QWidget *parent, const char *name) vbox->add(progress); vbox->add(status); vbox->add(cancel); - reset(); - connect(cancel, SIGNAL(clicked()), SLOT(slotCancel())); show(); - dial(number); + QTimer::singleShot(500, this, SLOT(slotAutostart())); } Dialer::~Dialer() { @@ -39,32 +56,84 @@ Dialer::~Dialer() void Dialer::slotCancel() { if(state != state_online) reset(); - close(); + else accept(); } void Dialer::reset() { - switchState(state_init); + switchState(state_cancel); + usercancel = 1; +} + +void Dialer::slotAutostart() +{ + state = state_preinit; + dial(m_number); } void Dialer::dial(const QString& number) { - send("ATZ"); - QString response = receive(); + while(state != state_online) + { + if(!usercancel) + { + trydial(number); + } + else break; + } + + if(usercancel) + { + reject(); + } +} + +void Dialer::trydial(const QString& number) +{ + if(state != state_cancel) + { + switchState(state_preinit); + // ... + QString response = receive(); + } + + if(state != state_cancel) + { + switchState(state_init); + send("ATZ"); + QString response2 = receive(); + } - switchState(state_options); + if(state != state_cancel) + { + switchState(state_options); - send("ATM0L0"); - QString response2 = receive(); + send("ATM0L0"); + QString response3 = receive(); + } - switchState(state_dialing); + if(state != state_cancel) + { + switchState(state_dialtone); - send(QString("ATDT %1").arg(number)); - QString response3 = receive(); + send("ATX1"); + QString response4 = receive(); + } - switchState(state_online); + if(state != state_cancel) + { + switchState(state_dialing); + + send(QString("ATDT %1").arg(number)); + QString response5 = receive(); + } + + if(state != state_cancel) + { + switchState(state_online); + } } void Dialer::send(const QString& msg) { @@ -72,30 +141,44 @@ void Dialer::send(const QString& msg) } QString Dialer::receive() { - for(int i = 0; i < 200000; i++) + for(int i = 0; i < 200000;i++) qApp->processEvents(); return QString::null; } void Dialer::switchState(int newstate) { + int oldstate = state; state = newstate; switch(state) { + case state_cancel: + status->setText(QObject::tr("Cancelling...")); + progress->setProgress(0); + break; + case state_preinit: + status->setText(QObject::tr("Searching modem")); + progress->setProgress(10); + break; case state_init: status->setText(QObject::tr("Initializing...")); - progress->setProgress(10); + progress->setProgress(20); break; case state_options: status->setText(QObject::tr("Reset speakers")); - progress->setProgress(20); + progress->setProgress(30); + break; + case state_dialtone: + status->setText(QObject::tr("Turning off dialtone")); + progress->setProgress(40); break; case state_dialing: - status->setText(QObject::tr("Dial number")); - progress->setProgress(30); + if(oldstate != state_dialing) status->setText(QObject::tr("Dial number")); + else status->setText(QObject::tr("Line busy, redialing number")); + progress->setProgress(50); break; case state_online: status->setText(QObject::tr("Connection established")); progress->setProgress(100); diff --git a/noncore/apps/opie-console/dialer.h b/noncore/apps/opie-console/dialer.h index f07f110..20fb3c3 100644 --- a/noncore/apps/opie-console/dialer.h +++ b/noncore/apps/opie-console/dialer.h @@ -14,29 +14,36 @@ class Dialer : public QDialog ~Dialer(); public slots: void slotCancel(); + void slotAutostart(); private: void switchState(int newstate); void reset(); void dial(const QString& number); + void trydial(const QString& number); void send(const QString& msg); QString receive(); enum States { + state_cancel, + state_preinit, state_init, state_options, + state_dialtone, state_dialing, state_online }; QLabel *status; QProgressBar *progress; QPushButton *cancel; int state; + int usercancel; + QString m_number; }; #endif |