diff --git a/src/api/call.h b/src/api/call.h index 99d3bbc3d3848eb5bf2c471673925bc12c52b2ed..a8e51ca1b8b2301d0a8214165573ba8c0164c4d4 100644 --- a/src/api/call.h +++ b/src/api/call.h @@ -161,6 +161,29 @@ canSendSIPMessage(const Info& call) { } } +static inline bool +isTerminating(const Status& status) { + switch(status) + { + case call::Status::INVALID: + case call::Status::INACTIVE: + case call::Status::ENDED: + case call::Status::PEER_BUSY: + case call::Status::TIMEOUT: + case call::Status::TERMINATING: + return true; + case call::Status::PAUSED: + case call::Status::IN_PROGRESS: + case call::Status::INCOMING_RINGING: + case call::Status::OUTGOING_RINGING: + case call::Status::CONNECTED: + case call::Status::CONNECTING: + case call::Status::SEARCHING: + default: + return false; + } +} + } // namespace call } // namespace api } // namespace lrc diff --git a/src/newcallmodel.cpp b/src/newcallmodel.cpp index af9af13f240f10580148157aced68c4e1d90cce4..d37f91d564cee4dfd42c79d1f3438cf2af39ede0 100644 --- a/src/newcallmodel.cpp +++ b/src/newcallmodel.cpp @@ -492,6 +492,13 @@ NewCallModelPimpl::slotCallStateChanged(const std::string& callId, const std::st auto status = call::to_status(state); auto& call = calls[callId]; + + if (status == call::Status::ENDED && !call::isTerminating(call->status)) { + call->status = call::Status::TERMINATING; + emit linked.callStatusChanged(callId); + } + + // proper state transition auto previousStatus = call->status; call->status = status;