mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-01-29 09:49:20 +00:00
fix(src/components/calls/CallsListModel): handle getData exception and code refactoring
This commit is contained in:
parent
69f114e5b6
commit
fc9e8b6880
10 changed files with 126 additions and 115 deletions
|
|
@ -36,10 +36,10 @@ using namespace std;
|
|||
|
||||
// =============================================================================
|
||||
|
||||
CallModel::CallModel (shared_ptr<linphone::Call> linphoneCall) {
|
||||
Q_ASSERT(linphoneCall != nullptr);
|
||||
mLinphoneCall = linphoneCall;
|
||||
mLinphoneCall->setData("call-model", *this);
|
||||
CallModel::CallModel (shared_ptr<linphone::Call> call) {
|
||||
Q_ASSERT(call != nullptr);
|
||||
mCall = call;
|
||||
mCall->setData("call-model", *this);
|
||||
|
||||
// Deal with auto-answer.
|
||||
{
|
||||
|
|
@ -59,7 +59,7 @@ CallModel::CallModel (shared_ptr<linphone::Call> linphoneCall) {
|
|||
QObject::connect(
|
||||
&(*CoreManager::getInstance()->getHandlers()), &CoreHandlers::callStateChanged,
|
||||
this, [this](const shared_ptr<linphone::Call> &call, linphone::CallState state) {
|
||||
if (call != mLinphoneCall)
|
||||
if (call != mCall)
|
||||
return;
|
||||
|
||||
switch (state) {
|
||||
|
|
@ -90,10 +90,10 @@ CallModel::CallModel (shared_ptr<linphone::Call> linphoneCall) {
|
|||
|
||||
case linphone::CallStateUpdatedByRemote:
|
||||
if (
|
||||
!mLinphoneCall->getCurrentParams()->videoEnabled() &&
|
||||
mLinphoneCall->getRemoteParams()->videoEnabled()
|
||||
!mCall->getCurrentParams()->videoEnabled() &&
|
||||
mCall->getRemoteParams()->videoEnabled()
|
||||
) {
|
||||
mLinphoneCall->deferUpdate();
|
||||
mCall->deferUpdate();
|
||||
emit videoRequested();
|
||||
}
|
||||
|
||||
|
|
@ -109,7 +109,7 @@ CallModel::CallModel (shared_ptr<linphone::Call> linphoneCall) {
|
|||
}
|
||||
|
||||
CallModel::~CallModel () {
|
||||
mLinphoneCall->unsetData("call-model");
|
||||
mCall->unsetData("call-model");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
@ -123,13 +123,13 @@ void CallModel::setRecordFile (shared_ptr<linphone::CallParams> &callParams) {
|
|||
);
|
||||
}
|
||||
|
||||
void CallModel::updateStats (const shared_ptr<const linphone::CallStats> &stats) {
|
||||
switch (stats->getType()) {
|
||||
void CallModel::updateStats (const shared_ptr<const linphone::CallStats> &callStats) {
|
||||
switch (callStats->getType()) {
|
||||
case linphone::StreamTypeAudio:
|
||||
updateStats(stats, mAudioStats);
|
||||
updateStats(callStats, mAudioStats);
|
||||
break;
|
||||
case linphone::StreamTypeVideo:
|
||||
updateStats(stats, mVideoStats);
|
||||
updateStats(callStats, mVideoStats);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
@ -144,31 +144,31 @@ void CallModel::accept () {
|
|||
stopAutoAnswerTimer();
|
||||
|
||||
shared_ptr<linphone::Core> core = CoreManager::getInstance()->getCore();
|
||||
shared_ptr<linphone::CallParams> params = core->createCallParams(mLinphoneCall);
|
||||
shared_ptr<linphone::CallParams> params = core->createCallParams(mCall);
|
||||
params->enableVideo(false);
|
||||
setRecordFile(params);
|
||||
|
||||
App::smartShowWindow(App::getInstance()->getCallsWindow());
|
||||
mLinphoneCall->acceptWithParams(params);
|
||||
mCall->acceptWithParams(params);
|
||||
}
|
||||
|
||||
void CallModel::acceptWithVideo () {
|
||||
stopAutoAnswerTimer();
|
||||
|
||||
shared_ptr<linphone::Core> core = CoreManager::getInstance()->getCore();
|
||||
shared_ptr<linphone::CallParams> params = core->createCallParams(mLinphoneCall);
|
||||
shared_ptr<linphone::CallParams> params = core->createCallParams(mCall);
|
||||
params->enableVideo(true);
|
||||
setRecordFile(params);
|
||||
|
||||
App::smartShowWindow(App::getInstance()->getCallsWindow());
|
||||
mLinphoneCall->acceptWithParams(params);
|
||||
mCall->acceptWithParams(params);
|
||||
}
|
||||
|
||||
void CallModel::terminate () {
|
||||
CoreManager *core = CoreManager::getInstance();
|
||||
|
||||
core->lockVideoRender();
|
||||
mLinphoneCall->terminate();
|
||||
mCall->terminate();
|
||||
core->unlockVideoRender();
|
||||
}
|
||||
|
||||
|
|
@ -178,14 +178,14 @@ void CallModel::transfer () {
|
|||
|
||||
void CallModel::acceptVideoRequest () {
|
||||
shared_ptr<linphone::Core> core = CoreManager::getInstance()->getCore();
|
||||
shared_ptr<linphone::CallParams> params = core->createCallParams(mLinphoneCall);
|
||||
shared_ptr<linphone::CallParams> params = core->createCallParams(mCall);
|
||||
params->enableVideo(true);
|
||||
|
||||
mLinphoneCall->acceptUpdate(params);
|
||||
mCall->acceptUpdate(params);
|
||||
}
|
||||
|
||||
void CallModel::rejectVideoRequest () {
|
||||
mLinphoneCall->acceptUpdate(mLinphoneCall->getCurrentParams());
|
||||
mCall->acceptUpdate(mCall->getCurrentParams());
|
||||
}
|
||||
|
||||
void CallModel::takeSnapshot () {
|
||||
|
|
@ -199,9 +199,9 @@ void CallModel::takeSnapshot () {
|
|||
|
||||
oldName = newName;
|
||||
|
||||
qInfo() << "Take snapshot of call:" << &mLinphoneCall;
|
||||
qInfo() << "Take snapshot of call:" << &mCall;
|
||||
|
||||
mLinphoneCall->takeVideoSnapshot(
|
||||
mCall->takeVideoSnapshot(
|
||||
::Utils::qStringToLinphoneString(
|
||||
CoreManager::getInstance()->getSettingsModel()->getSavedScreenshotsFolder() + newName
|
||||
)
|
||||
|
|
@ -212,9 +212,9 @@ void CallModel::startRecording () {
|
|||
if (mRecording)
|
||||
return;
|
||||
|
||||
qInfo() << "Start recording call:" << &mLinphoneCall;
|
||||
qInfo() << "Start recording call:" << &mCall;
|
||||
|
||||
mLinphoneCall->startRecording();
|
||||
mCall->startRecording();
|
||||
mRecording = true;
|
||||
|
||||
emit recordingChanged(true);
|
||||
|
|
@ -222,10 +222,10 @@ void CallModel::startRecording () {
|
|||
|
||||
void CallModel::stopRecording () {
|
||||
if (mRecording) {
|
||||
qInfo() << "Stop recording call:" << &mLinphoneCall;
|
||||
qInfo() << "Stop recording call:" << &mCall;
|
||||
|
||||
mRecording = false;
|
||||
mLinphoneCall->stopRecording();
|
||||
mCall->stopRecording();
|
||||
|
||||
emit recordingChanged(false);
|
||||
}
|
||||
|
|
@ -242,11 +242,11 @@ void CallModel::stopAutoAnswerTimer () const {
|
|||
}
|
||||
|
||||
QString CallModel::getSipAddress () const {
|
||||
return ::Utils::linphoneStringToQString(mLinphoneCall->getRemoteAddress()->asStringUriOnly());
|
||||
return ::Utils::linphoneStringToQString(mCall->getRemoteAddress()->asStringUriOnly());
|
||||
}
|
||||
|
||||
CallModel::CallStatus CallModel::getStatus () const {
|
||||
switch (mLinphoneCall->getState()) {
|
||||
switch (mCall->getState()) {
|
||||
case linphone::CallStateConnected:
|
||||
case linphone::CallStateStreamsRunning:
|
||||
return CallStatusConnected;
|
||||
|
|
@ -279,17 +279,17 @@ CallModel::CallStatus CallModel::getStatus () const {
|
|||
break;
|
||||
}
|
||||
|
||||
return mLinphoneCall->getDir() == linphone::CallDirIncoming ? CallStatusIncoming : CallStatusOutgoing;
|
||||
return mCall->getDir() == linphone::CallDirIncoming ? CallStatusIncoming : CallStatusOutgoing;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
int CallModel::getDuration () const {
|
||||
return mLinphoneCall->getDuration();
|
||||
return mCall->getDuration();
|
||||
}
|
||||
|
||||
float CallModel::getQuality () const {
|
||||
return mLinphoneCall->getCurrentQuality();
|
||||
return mCall->getCurrentQuality();
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
@ -307,11 +307,11 @@ inline float computeVu (float volume) {
|
|||
}
|
||||
|
||||
float CallModel::getMicroVu () const {
|
||||
return computeVu(mLinphoneCall->getRecordVolume());
|
||||
return computeVu(mCall->getRecordVolume());
|
||||
}
|
||||
|
||||
float CallModel::getSpeakerVu () const {
|
||||
return computeVu(mLinphoneCall->getPlayVolume());
|
||||
return computeVu(mCall->getPlayVolume());
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
@ -336,7 +336,7 @@ bool CallModel::getPausedByUser () const {
|
|||
}
|
||||
|
||||
void CallModel::setPausedByUser (bool status) {
|
||||
switch (mLinphoneCall->getState()) {
|
||||
switch (mCall->getState()) {
|
||||
case linphone::CallStateConnected:
|
||||
case linphone::CallStateStreamsRunning:
|
||||
case linphone::CallStatePaused:
|
||||
|
|
@ -347,24 +347,24 @@ void CallModel::setPausedByUser (bool status) {
|
|||
|
||||
if (status) {
|
||||
if (!mPausedByUser)
|
||||
mLinphoneCall->pause();
|
||||
mCall->pause();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (mPausedByUser)
|
||||
mLinphoneCall->resume();
|
||||
mCall->resume();
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
bool CallModel::getVideoEnabled () const {
|
||||
shared_ptr<const linphone::CallParams> params = mLinphoneCall->getCurrentParams();
|
||||
shared_ptr<const linphone::CallParams> params = mCall->getCurrentParams();
|
||||
return params && params->videoEnabled() && getStatus() == CallStatusConnected;
|
||||
}
|
||||
|
||||
void CallModel::setVideoEnabled (bool status) {
|
||||
switch (mLinphoneCall->getState()) {
|
||||
switch (mCall->getState()) {
|
||||
case linphone::CallStateConnected:
|
||||
case linphone::CallStateStreamsRunning:
|
||||
break;
|
||||
|
|
@ -375,16 +375,16 @@ void CallModel::setVideoEnabled (bool status) {
|
|||
return;
|
||||
|
||||
shared_ptr<linphone::Core> core = CoreManager::getInstance()->getCore();
|
||||
shared_ptr<linphone::CallParams> params = core->createCallParams(mLinphoneCall);
|
||||
shared_ptr<linphone::CallParams> params = core->createCallParams(mCall);
|
||||
params->enableVideo(status);
|
||||
|
||||
mLinphoneCall->update(params);
|
||||
mCall->update(params);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
bool CallModel::getUpdating () const {
|
||||
switch (mLinphoneCall->getState()) {
|
||||
switch (mCall->getState()) {
|
||||
case linphone::CallStateConnected:
|
||||
case linphone::CallStateStreamsRunning:
|
||||
case linphone::CallStatePaused:
|
||||
|
|
@ -406,7 +406,7 @@ bool CallModel::getRecording () const {
|
|||
|
||||
void CallModel::sendDtmf (const QString &dtmf) {
|
||||
qInfo() << QStringLiteral("Send dtmf: `%1`.").arg(dtmf);
|
||||
mLinphoneCall->sendDtmf(dtmf.constData()[0].toLatin1());
|
||||
mCall->sendDtmf(dtmf.constData()[0].toLatin1());
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
@ -426,9 +426,9 @@ inline QVariantMap createStat (const QString &key, const QString &value) {
|
|||
return m;
|
||||
}
|
||||
|
||||
void CallModel::updateStats (const shared_ptr<const linphone::CallStats> &callStats, QVariantList &stats) {
|
||||
void CallModel::updateStats (const shared_ptr<const linphone::CallStats> &callStats, QVariantList &statsList) {
|
||||
QString family;
|
||||
shared_ptr<const linphone::CallParams> params = mLinphoneCall->getCurrentParams();
|
||||
shared_ptr<const linphone::CallParams> params = mCall->getCurrentParams();
|
||||
shared_ptr<const linphone::PayloadType> payloadType;
|
||||
|
||||
switch (callStats->getType()) {
|
||||
|
|
@ -454,21 +454,21 @@ void CallModel::updateStats (const shared_ptr<const linphone::CallStats> &callSt
|
|||
break;
|
||||
}
|
||||
|
||||
stats.clear();
|
||||
statsList.clear();
|
||||
|
||||
stats << createStat(tr("callStatsCodec"), payloadType
|
||||
statsList << createStat(tr("callStatsCodec"), payloadType
|
||||
? QString("%1 / %2kHz").arg(Utils::linphoneStringToQString(payloadType->getMimeType())).arg(payloadType->getClockRate() / 1000)
|
||||
: "");
|
||||
stats << createStat(tr("callStatsUploadBandwidth"), QString("%1 kbits/s").arg(int(callStats->getUploadBandwidth())));
|
||||
stats << createStat(tr("callStatsDownloadBandwidth"), QString("%1 kbits/s").arg(int(callStats->getDownloadBandwidth())));
|
||||
stats << createStat(tr("callStatsIceState"), iceStateToString(callStats->getIceState()));
|
||||
stats << createStat(tr("callStatsIpFamily"), family);
|
||||
stats << createStat(tr("callStatsSenderLossRate"), QString("%1 %").arg(callStats->getSenderLossRate()));
|
||||
stats << createStat(tr("callStatsReceiverLossRate"), QString("%1 %").arg(callStats->getReceiverLossRate()));
|
||||
statsList << createStat(tr("callStatsUploadBandwidth"), QString("%1 kbits/s").arg(int(callStats->getUploadBandwidth())));
|
||||
statsList << createStat(tr("callStatsDownloadBandwidth"), QString("%1 kbits/s").arg(int(callStats->getDownloadBandwidth())));
|
||||
statsList << createStat(tr("callStatsIceState"), iceStateToString(callStats->getIceState()));
|
||||
statsList << createStat(tr("callStatsIpFamily"), family);
|
||||
statsList << createStat(tr("callStatsSenderLossRate"), QString("%1 %").arg(callStats->getSenderLossRate()));
|
||||
statsList << createStat(tr("callStatsReceiverLossRate"), QString("%1 %").arg(callStats->getReceiverLossRate()));
|
||||
|
||||
switch (callStats->getType()) {
|
||||
case linphone::StreamTypeAudio:
|
||||
stats << createStat(tr("callStatsJitterBuffer"), QString("%1 ms").arg(callStats->getJitterBufferSizeMs()));
|
||||
statsList << createStat(tr("callStatsJitterBuffer"), QString("%1 ms").arg(callStats->getJitterBufferSizeMs()));
|
||||
break;
|
||||
case linphone::StreamTypeVideo: {
|
||||
QString sentVideoDefinitionName = Utils::linphoneStringToQString(params->getSentVideoDefinition()->getName());
|
||||
|
|
@ -476,7 +476,7 @@ void CallModel::updateStats (const shared_ptr<const linphone::CallStats> &callSt
|
|||
.arg(params->getSentVideoDefinition()->getWidth())
|
||||
.arg(params->getSentVideoDefinition()->getHeight());
|
||||
|
||||
stats << createStat(tr("callStatsSentVideoDefinition"), sentVideoDefinition == sentVideoDefinitionName
|
||||
statsList << createStat(tr("callStatsSentVideoDefinition"), sentVideoDefinition == sentVideoDefinitionName
|
||||
? sentVideoDefinition
|
||||
: QString("%1 (%2)").arg(sentVideoDefinition).arg(sentVideoDefinitionName));
|
||||
|
||||
|
|
@ -485,7 +485,7 @@ void CallModel::updateStats (const shared_ptr<const linphone::CallStats> &callSt
|
|||
.arg(params->getReceivedVideoDefinition()->getWidth())
|
||||
.arg(params->getReceivedVideoDefinition()->getHeight());
|
||||
|
||||
stats << createStat(tr("callStatsReceivedVideoDefinition"), receivedVideoDefinition == receivedVideoDefinitionName
|
||||
statsList << createStat(tr("callStatsReceivedVideoDefinition"), receivedVideoDefinition == receivedVideoDefinitionName
|
||||
? receivedVideoDefinition
|
||||
: QString("%1 (%2)").arg(receivedVideoDefinition).arg(receivedVideoDefinitionName));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,12 +67,12 @@ public:
|
|||
CallModel (std::shared_ptr<linphone::Call> linphoneCall);
|
||||
~CallModel ();
|
||||
|
||||
std::shared_ptr<linphone::Call> getLinphoneCall () const {
|
||||
return mLinphoneCall;
|
||||
std::shared_ptr<linphone::Call> getCall () const {
|
||||
return mCall;
|
||||
}
|
||||
|
||||
static void setRecordFile (std::shared_ptr<linphone::CallParams> &callParams);
|
||||
void updateStats (const std::shared_ptr<const linphone::CallStats> &stats);
|
||||
void updateStats (const std::shared_ptr<const linphone::CallStats> &callStats);
|
||||
|
||||
Q_INVOKABLE void accept ();
|
||||
Q_INVOKABLE void acceptWithVideo ();
|
||||
|
|
@ -103,7 +103,7 @@ private:
|
|||
|
||||
CallStatus getStatus () const;
|
||||
bool isOutgoing () const {
|
||||
return mLinphoneCall->getDir() == linphone::CallDirOutgoing;
|
||||
return mCall->getDir() == linphone::CallDirOutgoing;
|
||||
}
|
||||
|
||||
int getDuration () const;
|
||||
|
|
@ -126,7 +126,7 @@ private:
|
|||
|
||||
QVariantList getAudioStats () const;
|
||||
QVariantList getVideoStats () const;
|
||||
void updateStats (const std::shared_ptr<const linphone::CallStats> &callStats, QVariantList &stats);
|
||||
void updateStats (const std::shared_ptr<const linphone::CallStats> &callStats, QVariantList &statsList);
|
||||
|
||||
QString iceStateToString (linphone::IceState state) const;
|
||||
|
||||
|
|
@ -137,7 +137,7 @@ private:
|
|||
QVariantList mAudioStats;
|
||||
QVariantList mVideoStats;
|
||||
|
||||
std::shared_ptr<linphone::Call> mLinphoneCall;
|
||||
std::shared_ptr<linphone::Call> mCall;
|
||||
};
|
||||
|
||||
#endif // CALL_MODEL_H_
|
||||
|
|
|
|||
|
|
@ -36,13 +36,13 @@ using namespace std;
|
|||
|
||||
// =============================================================================
|
||||
|
||||
inline QList<CallModel *>::iterator findCall (
|
||||
inline QList<CallModel *>::iterator findCallModel (
|
||||
QList<CallModel *> &list,
|
||||
const shared_ptr<linphone::Call> &linphoneCall
|
||||
const shared_ptr<linphone::Call> &call
|
||||
) {
|
||||
return find_if(
|
||||
list.begin(), list.end(), [linphoneCall](CallModel *call) {
|
||||
return linphoneCall == call->getLinphoneCall();
|
||||
list.begin(), list.end(), [call](CallModel *callModel) {
|
||||
return call == callModel->getCall();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
|
@ -53,21 +53,21 @@ CallsListModel::CallsListModel (QObject *parent) : QAbstractListModel(parent) {
|
|||
mCoreHandlers = CoreManager::getInstance()->getHandlers();
|
||||
QObject::connect(
|
||||
&(*mCoreHandlers), &CoreHandlers::callStateChanged,
|
||||
this, [this](const shared_ptr<linphone::Call> &linphoneCall, linphone::CallState state) {
|
||||
this, [this](const shared_ptr<linphone::Call> &call, linphone::CallState state) {
|
||||
switch (state) {
|
||||
case linphone::CallStateIncomingReceived:
|
||||
case linphone::CallStateOutgoingInit:
|
||||
addCall(linphoneCall);
|
||||
addCall(call);
|
||||
break;
|
||||
|
||||
case linphone::CallStateEnd:
|
||||
case linphone::CallStateError:
|
||||
removeCall(linphoneCall);
|
||||
removeCall(call);
|
||||
break;
|
||||
|
||||
case linphone::CallStateStreamsRunning: {
|
||||
int index = static_cast<int>(distance(mList.begin(), findCall(mList, linphoneCall)));
|
||||
emit callRunning(index, &linphoneCall->getData<CallModel>("call-model"));
|
||||
int index = static_cast<int>(distance(mList.begin(), findCallModel(mList, call)));
|
||||
emit callRunning(index, &call->getData<CallModel>("call-model"));
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -100,8 +100,8 @@ QVariant CallsListModel::data (const QModelIndex &index, int role) const {
|
|||
return QVariant();
|
||||
}
|
||||
|
||||
CallModel *CallsListModel::getCall (const shared_ptr<linphone::Call> &linphoneCall) const {
|
||||
auto it = findCall(*(const_cast<QList<CallModel *> *>(&mList)), linphoneCall);
|
||||
CallModel *CallsListModel::getCallModel (const shared_ptr<linphone::Call> &call) const {
|
||||
auto it = findCallModel(*(const_cast<QList<CallModel *> *>(&mList)), call);
|
||||
return it != mList.end() ? *it : nullptr;
|
||||
}
|
||||
|
||||
|
|
@ -170,33 +170,42 @@ bool CallsListModel::removeRows (int row, int count, const QModelIndex &parent)
|
|||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
void CallsListModel::addCall (const shared_ptr<linphone::Call> &linphoneCall) {
|
||||
if (linphoneCall->getDir() == linphone::CallDirOutgoing)
|
||||
void CallsListModel::addCall (const shared_ptr<linphone::Call> &call) {
|
||||
if (call->getDir() == linphone::CallDirOutgoing)
|
||||
App::smartShowWindow(App::getInstance()->getCallsWindow());
|
||||
|
||||
CallModel *call = new CallModel(linphoneCall);
|
||||
CallModel *callModel = new CallModel(call);
|
||||
|
||||
qInfo() << QStringLiteral("Add call:") << call;
|
||||
qInfo() << QStringLiteral("Add call:") << callModel;
|
||||
|
||||
App::getInstance()->getEngine()->setObjectOwnership(call, QQmlEngine::CppOwnership);
|
||||
App::getInstance()->getEngine()->setObjectOwnership(callModel, QQmlEngine::CppOwnership);
|
||||
|
||||
int row = mList.count();
|
||||
|
||||
beginInsertRows(QModelIndex(), row, row);
|
||||
mList << call;
|
||||
mList << callModel;
|
||||
endInsertRows();
|
||||
}
|
||||
|
||||
void CallsListModel::removeCall (const shared_ptr<linphone::Call> &linphoneCall) {
|
||||
void CallsListModel::removeCall (const shared_ptr<linphone::Call> &call) {
|
||||
CallModel *callModel;
|
||||
|
||||
try {
|
||||
callModel = &call->getData<CallModel>("call-model");
|
||||
} catch (const out_of_range &) {
|
||||
// Can be a bug. Or the call model not exists because the linphone call state
|
||||
// `CallStateIncomingReceived`/`CallStateOutgoingInit` was not notified.
|
||||
qWarning() << QStringLiteral("Unable to found call in:") << callModel;
|
||||
return;
|
||||
}
|
||||
|
||||
QTimer::singleShot(
|
||||
DELAY_BEFORE_REMOVE_CALL, this, [this, linphoneCall]() {
|
||||
CallModel *call = &linphoneCall->getData<CallModel>("call-model");
|
||||
DELAY_BEFORE_REMOVE_CALL, this, [this, callModel]() {
|
||||
qInfo() << QStringLiteral("Removing call:") << callModel;
|
||||
|
||||
qInfo() << QStringLiteral("Removing call:") << call;
|
||||
|
||||
int index = mList.indexOf(call);
|
||||
int index = mList.indexOf(callModel);
|
||||
if (index == -1 || !removeRow(index))
|
||||
qWarning() << QStringLiteral("Unable to remove call:") << call;
|
||||
qWarning() << QStringLiteral("Unable to remove call:") << callModel;
|
||||
|
||||
if (mList.empty())
|
||||
App::getInstance()->getCallsWindow()->close();
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ public:
|
|||
QHash<int, QByteArray> roleNames () const override;
|
||||
QVariant data (const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
|
||||
CallModel *getCall (const std::shared_ptr<linphone::Call> &linphoneCall) const;
|
||||
CallModel *getCallModel (const std::shared_ptr<linphone::Call> &call) const;
|
||||
|
||||
Q_INVOKABLE void launchAudioCall (const QString &sipUri) const;
|
||||
Q_INVOKABLE void launchVideoCall (const QString &sipUri) const;
|
||||
|
|
@ -53,14 +53,14 @@ public:
|
|||
Q_INVOKABLE void terminateAllCalls () const;
|
||||
|
||||
signals:
|
||||
void callRunning (int index, CallModel *call);
|
||||
void callRunning (int index, CallModel *callModel);
|
||||
|
||||
private:
|
||||
bool removeRow (int row, const QModelIndex &parent = QModelIndex());
|
||||
bool removeRows (int row, int count, const QModelIndex &parent = QModelIndex()) override;
|
||||
|
||||
void addCall (const std::shared_ptr<linphone::Call> &linphoneCall);
|
||||
void removeCall (const std::shared_ptr<linphone::Call> &linphoneCall);
|
||||
void addCall (const std::shared_ptr<linphone::Call> &call);
|
||||
void removeCall (const std::shared_ptr<linphone::Call> &call);
|
||||
|
||||
QList<CallModel *> mList;
|
||||
|
||||
|
|
|
|||
|
|
@ -57,8 +57,8 @@ CameraRenderer::~CameraRenderer () {
|
|||
|
||||
if (mIsPreview)
|
||||
coreManager->getCore()->setNativePreviewWindowId(nullptr);
|
||||
else if (mLinphoneCall)
|
||||
mLinphoneCall->setNativeVideoWindowId(nullptr);
|
||||
else if (mCall)
|
||||
mCall->setNativeVideoWindowId(nullptr);
|
||||
|
||||
coreManager->unlockVideoRender();
|
||||
|
||||
|
|
@ -104,8 +104,8 @@ void CameraRenderer::render () {
|
|||
|
||||
if (mIsPreview)
|
||||
coreManager->getCore()->previewOglRender();
|
||||
else if (mLinphoneCall)
|
||||
mLinphoneCall->oglRender();
|
||||
else if (mCall)
|
||||
mCall->oglRender();
|
||||
|
||||
msFunctions->bind(nullptr);
|
||||
coreManager->unlockVideoRender();
|
||||
|
|
@ -124,8 +124,8 @@ void CameraRenderer::synchronize (QQuickFramebufferObject *item) {
|
|||
Camera *camera = qobject_cast<Camera *>(item);
|
||||
|
||||
{
|
||||
CallModel *model = camera->getCall();
|
||||
mLinphoneCall = model ? model->getLinphoneCall() : nullptr;
|
||||
CallModel *model = camera->getCallModel();
|
||||
mCall = model ? model->getCall() : nullptr;
|
||||
}
|
||||
|
||||
mIsPreview = camera->mIsPreview;
|
||||
|
|
@ -144,8 +144,8 @@ void CameraRenderer::updateWindowId () {
|
|||
|
||||
if (mIsPreview)
|
||||
CoreManager::getInstance()->getCore()->setNativePreviewWindowId(mContextInfo);
|
||||
else if (mLinphoneCall)
|
||||
mLinphoneCall->setNativeVideoWindowId(mContextInfo);
|
||||
else if (mCall)
|
||||
mCall->setNativeVideoWindowId(mContextInfo);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
@ -172,16 +172,16 @@ QQuickFramebufferObject::Renderer *Camera::createRenderer () const {
|
|||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
CallModel *Camera::getCall () const {
|
||||
return mCall;
|
||||
CallModel *Camera::getCallModel () const {
|
||||
return mCallModel;
|
||||
}
|
||||
|
||||
void Camera::setCall (CallModel *call) {
|
||||
if (mCall != call) {
|
||||
mCall = call;
|
||||
void Camera::setCallModel (CallModel *callModel) {
|
||||
if (mCallModel != callModel) {
|
||||
mCallModel = callModel;
|
||||
update();
|
||||
|
||||
emit callChanged(mCall);
|
||||
emit callChanged(mCallModel);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ private:
|
|||
bool mUpdateContextInfo = false;
|
||||
|
||||
bool mIsPreview = false;
|
||||
std::shared_ptr<linphone::Call> mLinphoneCall;
|
||||
std::shared_ptr<linphone::Call> mCall;
|
||||
|
||||
QQuickWindow *mWindow;
|
||||
};
|
||||
|
|
@ -69,7 +69,7 @@ class Camera : public QQuickFramebufferObject {
|
|||
|
||||
Q_OBJECT;
|
||||
|
||||
Q_PROPERTY(CallModel * call READ getCall WRITE setCall NOTIFY callChanged);
|
||||
Q_PROPERTY(CallModel * call READ getCallModel WRITE setCallModel NOTIFY callChanged);
|
||||
Q_PROPERTY(bool isPreview READ getIsPreview WRITE setIsPreview NOTIFY isPreviewChanged);
|
||||
|
||||
public:
|
||||
|
|
@ -79,18 +79,18 @@ public:
|
|||
QQuickFramebufferObject::Renderer *createRenderer () const override;
|
||||
|
||||
signals:
|
||||
void callChanged (CallModel *call);
|
||||
void callChanged (CallModel *callModel);
|
||||
void isPreviewChanged (bool isPreview);
|
||||
|
||||
private:
|
||||
CallModel *getCall () const;
|
||||
void setCall (CallModel *call);
|
||||
CallModel *getCallModel () const;
|
||||
void setCallModel (CallModel *callModel);
|
||||
|
||||
bool getIsPreview () const;
|
||||
void setIsPreview (bool status);
|
||||
|
||||
bool mIsPreview = false;
|
||||
CallModel *mCall = nullptr;
|
||||
CallModel *mCallModel = nullptr;
|
||||
|
||||
QTimer *mRefreshTimer;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -524,6 +524,7 @@ void ChatModel::insertCall (const shared_ptr<linphone::CallLog> &callLog) {
|
|||
case linphone::CallStatusAborted:
|
||||
case linphone::CallStatusEarlyAborted:
|
||||
return; // Ignore aborted calls.
|
||||
|
||||
case linphone::CallStatusSuccess:
|
||||
case linphone::CallStatusMissed:
|
||||
case linphone::CallStatusDeclined:
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@
|
|||
// =============================================================================
|
||||
|
||||
class VcardModel : public QObject {
|
||||
friend class ContactModel;
|
||||
|
||||
Q_OBJECT;
|
||||
|
||||
Q_PROPERTY(QString username READ getUsername WRITE setUsername NOTIFY vcardUpdated);
|
||||
|
|
@ -39,8 +41,6 @@ class VcardModel : public QObject {
|
|||
Q_PROPERTY(QVariantList emails READ getEmails NOTIFY vcardUpdated);
|
||||
Q_PROPERTY(QVariantList urls READ getUrls NOTIFY vcardUpdated);
|
||||
|
||||
friend class ContactModel;
|
||||
|
||||
public:
|
||||
VcardModel (std::shared_ptr<linphone::Vcard> vcard) : mVcard(vcard) {}
|
||||
|
||||
|
|
|
|||
|
|
@ -256,17 +256,17 @@ void Notifier::notifyReceivedCall (const shared_ptr<linphone::Call> &call) {
|
|||
if (!notification)
|
||||
return;
|
||||
|
||||
CallModel *model = CoreManager::getInstance()->getCallsListModel()->getCall(call);
|
||||
CallModel *callModel = CoreManager::getInstance()->getCallsListModel()->getCallModel(call);
|
||||
|
||||
QObject::connect(
|
||||
model, &CallModel::statusChanged, notification, [this, notification](CallModel::CallStatus status) {
|
||||
callModel, &CallModel::statusChanged, notification, [this, notification](CallModel::CallStatus status) {
|
||||
if (status == CallModel::CallStatusEnded || status == CallModel::CallStatusConnected)
|
||||
deleteNotification(QVariant::fromValue(notification));
|
||||
}
|
||||
);
|
||||
|
||||
QVariantMap map;
|
||||
map["call"].setValue(model);
|
||||
map["call"].setValue(callModel);
|
||||
|
||||
::setProperty(*notification, NOTIFICATION_PROPERTY_DATA, map);
|
||||
showNotification(notification, NOTIFICATION_TIMEOUT_RECEIVED_CALL);
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ function handleCreation () {
|
|||
|
||||
contactEdit._edition = true
|
||||
} else {
|
||||
|
||||
contactEdit._vcard = contact.vcard
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue