Skip to content

Commit

Permalink
Ofono plugin: wait for the ofonoVoiceCall to be valid before adding it
Browse files Browse the repository at this point in the history
Signed-off-by: Christophe Chapuis <chris.chapuis@gmail.com>
  • Loading branch information
Tofee committed Apr 23, 2016
1 parent b2c2b0a commit 215713b
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 6 deletions.
19 changes: 17 additions & 2 deletions plugins/providers/ofono/src/ofonovoicecallhandler.cpp
Expand Up @@ -60,15 +60,17 @@ OfonoVoiceCallHandler::OfonoVoiceCallHandler(const QString &handlerId, const QSt
Q_D(OfonoVoiceCallHandler);
d->ofonoVoiceCall = new QOfonoVoiceCall(this);
d->ofonoVoiceCall->setVoiceCallPath(path);
d->isIncoming = d->ofonoVoiceCall->state() == QLatin1String("incoming");

QObject::connect(d->ofonoVoiceCall, SIGNAL(lineIdentificationChanged(QString)), SIGNAL(lineIdChanged(QString)));
QObject::connect(d->ofonoVoiceCall, SIGNAL(emergencyChanged(bool)), SIGNAL(emergencyChanged(bool)));
QObject::connect(d->ofonoVoiceCall, SIGNAL(multipartyChanged(bool)), SIGNAL(multipartyChanged(bool)));

QObject::connect(d->ofonoVoiceCall, SIGNAL(stateChanged(QString)), SLOT(onStatusChanged()));

onStatusChanged();
QObject::connect(d->ofonoVoiceCall, SIGNAL(validChanged(bool)), SLOT(onValidChanged(bool)));
if(d->ofonoVoiceCall->isValid()) {
onValidChanged(true);
}
}

OfonoVoiceCallHandler::~OfonoVoiceCallHandler()
Expand All @@ -78,6 +80,19 @@ OfonoVoiceCallHandler::~OfonoVoiceCallHandler()
delete d;
}

void OfonoVoiceCallHandler::onValidChanged(bool isValid)
{
Q_D(OfonoVoiceCallHandler);

if (isValid)
{
// Properties are now ready
d->isIncoming = d->ofonoVoiceCall->state() == QLatin1String("incoming");
}

emit validChanged(isValid);
}

QString OfonoVoiceCallHandler::path() const
{
TRACE
Expand Down
4 changes: 4 additions & 0 deletions plugins/providers/ofono/src/ofonovoicecallhandler.h
Expand Up @@ -52,6 +52,9 @@ class OfonoVoiceCallHandler : public AbstractVoiceCallHandler

VoiceCallStatus status() const;

Q_SIGNALS:
void validChanged(bool valid);

public Q_SLOTS:
void answer();
void hangup();
Expand All @@ -61,6 +64,7 @@ public Q_SLOTS:

protected Q_SLOTS:
void onStatusChanged();
void onValidChanged(bool);

protected:
void timerEvent(QTimerEvent *event);
Expand Down
30 changes: 26 additions & 4 deletions plugins/providers/ofono/src/ofonovoicecallprovider.cpp
Expand Up @@ -43,6 +43,7 @@ class OfonoVoiceCallProviderPrivate
QString modemPath;

QHash<QString,OfonoVoiceCallHandler*> voiceCalls;
QHash<QString,OfonoVoiceCallHandler*> invalidVoiceCalls;

QString errorString;
void setError(const QString &errorString)
Expand Down Expand Up @@ -182,17 +183,38 @@ void OfonoVoiceCallProvider::onCallAdded(const QString &call)

qDebug() << "Adding call handler " << call;
OfonoVoiceCallHandler *handler = new OfonoVoiceCallHandler(d->manager->generateHandlerId(), call, this, d->ofonoManager);
d->voiceCalls.insert(call, handler);
d->invalidVoiceCalls.insert(call, handler);
QObject::connect(handler, SIGNAL(validChanged(bool)), SLOT(onVoiceCallHandlerValidChanged(bool)));
}

emit this->voiceCallAdded(handler);
emit this->voiceCallsChanged();
void OfonoVoiceCallProvider::onVoiceCallHandlerValidChanged(bool isValid)
{
TRACE
Q_D(OfonoVoiceCallProvider);

OfonoVoiceCallHandler *handler = static_cast<OfonoVoiceCallHandler *>(QObject::sender());
if(handler)
{
QString call = handler->path();

if(isValid && !d->voiceCalls.contains(call))
{
d->voiceCalls.insert(call, handler);
d->invalidVoiceCalls.remove(call);
emit this->voiceCallAdded(handler);
emit this->voiceCallsChanged();
}
}
}

void OfonoVoiceCallProvider::onCallRemoved(const QString &call)
{
TRACE
Q_D(OfonoVoiceCallProvider);
if(!d->voiceCalls.contains(call)) return;
if(!d->voiceCalls.contains(call)) {
delete d->invalidVoiceCalls.take(call);
return;
}

OfonoVoiceCallHandler *handler = d->voiceCalls.value(call);
QString handlerId = handler->handlerId();
Expand Down
2 changes: 2 additions & 0 deletions plugins/providers/ofono/src/ofonovoicecallprovider.h
Expand Up @@ -55,6 +55,8 @@ protected Q_SLOTS:

void onDialComplete(const bool status);

void onVoiceCallHandlerValidChanged(bool isValid);

private:
void initialize();
class OfonoVoiceCallProviderPrivate *d_ptr;
Expand Down

0 comments on commit 215713b

Please sign in to comment.