diff --git a/src/call.cpp b/src/call.cpp index 8d35d0d195d0fa2448bcd350aed9d641edffeef8..b8a7cff1a7d1fbdb55388bb15c792a63899a9e81 100644 --- a/src/call.cpp +++ b/src/call.cpp @@ -369,6 +369,13 @@ Call* CallPrivate::buildIncomingCall(const QString& callId) const QString from = details[ CallPrivate::DetailsMapFields::PEER_NUMBER ]; const QString account = details[ CallPrivate::DetailsMapFields::ACCOUNT_ID ]; const QString peerName = details[ CallPrivate::DetailsMapFields::PEER_NAME ]; + + //It may be possible that the call has already been invalidated + if (account.isEmpty()) { + qWarning() << "Building incoming call" << callId << "failed, it may already have been destroyed by the daemon"; + return nullptr; + } + Account* acc = AccountModel::instance()->getById(account.toLatin1()); ContactMethod* nb = PhoneDirectoryModel::instance()->getNumber(from,acc); Call* call = new Call(Call::State::INCOMING, peerName, nb, acc); @@ -395,6 +402,13 @@ Call* CallPrivate::buildRingingCall(const QString & callId) const QString from = details[ CallPrivate::DetailsMapFields::PEER_NUMBER ]; const QString account = details[ CallPrivate::DetailsMapFields::ACCOUNT_ID ]; const QString peerName = details[ CallPrivate::DetailsMapFields::PEER_NAME ]; + + //It may be possible that the call has already been invalidated + if (account.isEmpty()) { + qWarning() << "Building ringing call" << callId << "failed, it may already have been destroyed by the daemon"; + return nullptr; + } + Account* acc = AccountModel::instance()->getById(account.toLatin1()); ContactMethod* nb = PhoneDirectoryModel::instance()->getNumber(from,acc); Call* call = new Call(Call::State::RINGING, peerName, nb, acc); diff --git a/src/callmodel.cpp b/src/callmodel.cpp index c1c79297b67c1734ca8c33e58613fd0dff9d3fc3..1117d9e916742731a6ff17ac06b71fa5d292fd9b 100644 --- a/src/callmodel.cpp +++ b/src/callmodel.cpp @@ -443,6 +443,11 @@ Call* CallModel::dialingCall(const QString& peerName, Account* account) Call* CallModelPrivate::addIncomingCall(const QString& callId) { Call* call = addCall2(CallPrivate::buildIncomingCall(callId)); + + //The call can already have been invalidated by the daemon, then do nothing + if (!call) + return nullptr; + //Call without account is not possible if (call->account()) { if (call->account()->isAutoAnswer()) { @@ -459,7 +464,12 @@ Call* CallModelPrivate::addIncomingCall(const QString& callId) ///Create a ringing call Call* CallModelPrivate::addRingingCall(const QString& callId) { - return addCall2(CallPrivate::buildRingingCall(callId)); + Call* c = CallPrivate::buildRingingCall(callId); + + if (!c) + return nullptr; + + return addCall2(c); } ///Properly remove an internal from the Qt model @@ -1021,6 +1031,10 @@ void CallModelPrivate::slotCallStateChanged(const QString& callID, const QString qDebug() << "Call not found" << callID << "new state" << stateName; if(stateName == CallPrivate::StateChange::RINGING) { call = addRingingCall(callID); + + if (!call) + return; + } else { qDebug() << "Call doesn't exist in this client. Might have been initialized by another client instance before this one started."; @@ -1059,7 +1073,10 @@ void CallModelPrivate::slotIncomingCall(const QString& accountID, const QString& { Q_UNUSED(accountID) qDebug() << "Signal : Incoming Call ! ID = " << callID; - emit q_ptr->incomingCall(addIncomingCall(callID)); + Call* c = addIncomingCall(callID); + + if (c) + emit q_ptr->incomingCall(c); } ///When a new conference is incoming diff --git a/src/private/accountmodel_p.h b/src/private/accountmodel_p.h index dc192b9918b3bc5121f32781d082ecc378160149..a349298a6ccd2184d5b917e86843487ccba06d92 100644 --- a/src/private/accountmodel_p.h +++ b/src/private/accountmodel_p.h @@ -44,7 +44,7 @@ public: //Helpers static Account::RegistrationState fromDaemonName(const QString& st); - void enabledProtocol(Account::Protocol proto); + void enableProtocol(Account::Protocol proto); //Attributes AccountModel* q_ptr ;