summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-console/dialer.cpp41
1 files changed, 27 insertions, 14 deletions
diff --git a/noncore/apps/opie-console/dialer.cpp b/noncore/apps/opie-console/dialer.cpp
index 10c16ef..bd6b50f 100644
--- a/noncore/apps/opie-console/dialer.cpp
+++ b/noncore/apps/opie-console/dialer.cpp
@@ -74,203 +74,216 @@ Dialer::Dialer(const Profile& profile, int fd, QWidget *parent, const char *name
vbox->add(cancel);
connect(cancel, SIGNAL(clicked()), SLOT(slotCancel()));
show();
QTimer::singleShot(500, this, SLOT(slotAutostart()));
}
Dialer::~Dialer()
{
}
void Dialer::slotCancel()
{
if(state != state_online)
{
usercancel = 1;
reset();
}
else accept();
}
void Dialer::reset()
{
switchState(state_cancel);
}
void Dialer::slotAutostart()
{
//state = state_preinit;
dial(m_profile.readEntry("Number"));
}
void Dialer::dial(const QString& number)
{
while(state != state_online)
{
if(!usercancel)
{
state = state_preinit;
trydial(number);
}
else break;
}
if(usercancel)
{
+ // modem hangup
+ trydial(QString::null);
reject();
}
}
void Dialer::trydial(const QString& number)
{
- if(state != state_cancel)
- {
- switchState(state_preinit);
+ //if(state != state_cancel)
+ //{
+ if(state != state_cancel) switchState(state_preinit);
send("+++ATH");
send("");
//QString response = receive();
- }
+ //}
if(state != state_cancel)
{
switchState(state_init);
send("ATZ");
//send(m_profile.readEntry("InitString"));
QString response2 = receive();
if(!response2.contains("\nOK\r"))
reset();
}
if(state != state_cancel)
{
switchState(state_options);
- send("ATM0L0");
+ send("ATM3L3");
QString response3 = receive();
if(!response3.contains("\nOK\r"))
reset();
}
if(state != state_cancel)
{
switchState(state_dialtone);
send("ATX1");
QString response4 = receive();
if(!response4.contains("\nOK\r"))
reset();
}
if(state != state_cancel)
{
switchState(state_dialing);
send(QString("ATDT %1").arg(number));
//send(QString("%1 %2").arg(m_profile.readEntry("DialPrefix1")).arg(number));
QString response5 = receive();
- if(!response5.contains("\nOK\r"))
+ if(!response5.contains("\nCONNECT"))
{
- QMessageBox::warning(this,
- QObject::tr("Failure"),
- QObject::tr("Dialing the number failed."));
- slotCancel();
+ if(response5.contains("BUSY"))
+ switchState(state_dialing);
+ else
+ {
+ QMessageBox::warning(this,
+ QObject::tr("Failure"),
+ QObject::tr("Dialing the number failed."));
+ slotCancel();
+ }
}
}
if(state != state_cancel)
{
switchState(state_online);
}
}
void Dialer::send(const QString& msg)
{
QString m = msg;
int bytes;
QString termination;
qWarning("Sending: '%s'", m.latin1());
termination = "\r";
//termination = m_profile.readEntry("Termination");
if(termination == "\n") m = m + "\n";
else if(termination == "\r") m = m + "\r";
else m = m + "\r\n";
bytes = ::write(m_fd, m.local8Bit(), strlen(m.local8Bit()));
if(bytes < 0)
{
reset();
}
}
QString Dialer::receive()
{
+ QString buf;
char buffer[1024];
int ret;
+ qApp->processEvents();
+
while(1)
{
ret = ::read(m_fd, buffer, sizeof(buffer));
if(ret > 0)
{
for(int i = 0; i < ret; i++)
buffer[i] = buffer[i] & 0x7F;
buffer[ret] = 0;
- qWarning("Receiving: '%s'", buffer);
- return QString(buffer);
+qWarning("Got: '%s'", buffer);
+ buf.append(QString(buffer));
+ if(buf.contains("OK") || buf.contains("ERROR") || buf.contains("CONNECT") || (buf.contains("BUSY")))
+{
+qWarning("Receiving: '%s'", buf.latin1());
+ return buf;
+}
}
else if(ret < 0)
{
if(errno != EAGAIN) reset();
}
}
- //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(20);
break;
case state_options:
status->setText(QObject::tr("Reset speakers"));
progress->setProgress(30);
break;
case state_dialtone:
status->setText(QObject::tr("Turning off dialtone"));
progress->setProgress(40);
break;
case state_dialing:
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);
cancel->setText(QObject::tr("Dismiss"));
break;
}
}