From dd5856e9cbe064c03566f2858e4074af11c63d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= <sebastien.blin@savoirfairelinux.com> Date: Tue, 19 Nov 2019 16:01:10 -0500 Subject: [PATCH] callmodel: expose setCurrentCall Change-Id: I1177d216bed15091642dec84bdef623b55e4d44b --- src/api/lrc.h | 6 +++++ src/api/newcallmodel.h | 8 ++++++- src/lrc.cpp | 3 +++ src/newcallmodel.cpp | 54 +++++++++++++++++++++++++++--------------- 4 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/api/lrc.h b/src/api/lrc.h index f11c94d8..fe57c119 100644 --- a/src/api/lrc.h +++ b/src/api/lrc.h @@ -22,6 +22,7 @@ #include <memory> #include <vector> #include <string> +#include <atomic> // Lrc #include "typedefs.h" @@ -110,6 +111,11 @@ public: */ static std::vector<std::string> getConferenceSubcalls(const std::string& id); + /** + * Preference + */ + static std::atomic_bool holdConferences; + private: std::unique_ptr<LrcPimpl> lrcPimpl_; }; diff --git a/src/api/newcallmodel.h b/src/api/newcallmodel.h index 349825b7..3f6f606c 100644 --- a/src/api/newcallmodel.h +++ b/src/api/newcallmodel.h @@ -148,7 +148,8 @@ public: void playDTMF(const std::string& callId, const std::string& value) const; /** - * Toggle pause on a call + * Toggle pause on a call. + * @warn only use this function for SIP calls * @param callId */ void togglePause(const std::string& callId) const; @@ -225,6 +226,11 @@ public: */ static std::string getSIPCallStatusString(const short& statusCode); + /** + * Set a call as the current call (hold other calls) + */ + void setCurrentCall(const std::string& callId) const; + Q_SIGNALS: /** * Emitted when a call state changes diff --git a/src/lrc.cpp b/src/lrc.cpp index 213093e9..1b6ce5dd 100644 --- a/src/lrc.cpp +++ b/src/lrc.cpp @@ -45,6 +45,8 @@ namespace lrc using namespace api; +std::atomic_bool lrc::api::Lrc::holdConferences; + // To judge whether the call is finished or not depending on callState bool isFinished(const QString& callState); @@ -65,6 +67,7 @@ public: Lrc::Lrc(MigrationCb willDoMigrationCb, MigrationCb didDoMigrationCb) { + lrc::api::Lrc::holdConferences.store(true); #ifndef ENABLE_LIBWRAP // Replace locale for timestamps std::locale::global(std::locale("")); diff --git a/src/newcallmodel.cpp b/src/newcallmodel.cpp index a4071bd2..84f81cdc 100644 --- a/src/newcallmodel.cpp +++ b/src/newcallmodel.cpp @@ -139,12 +139,8 @@ public: * Retrieve active conferences from the daemon and init the model */ void initConferencesFromDaemon(); - /** - * Set a call as the current call (hold other calls) - */ - void setCurrentCall(const std::string& callId); bool manageCurrentCall_ {true}; - bool dontHoldConferences_ {false}; + std::string currentCall_ {}; std::map<std::string, std::string> pendingConferences_; public Q_SLOTS: @@ -323,7 +319,7 @@ NewCallModel::togglePause(const std::string& callId) const if (call->status == call::Status::PAUSED) { if (call->type == call::Type::DIALOG) { CallManager::instance().unhold(callId.c_str()); - pimpl_->setCurrentCall(callId); + setCurrentCall(callId); } else { CallManager::instance().unholdConference(callId.c_str()); } @@ -582,19 +578,37 @@ NewCallModelPimpl::initConferencesFromDaemon() } void -NewCallModelPimpl::setCurrentCall(const std::string& callId) +NewCallModel::setCurrentCall(const std::string& callId) const { - if (!manageCurrentCall_) return; - auto it = pendingConferences_.find(callId); + if (!pimpl_->manageCurrentCall_) return; + auto it = pimpl_->pendingConferences_.find(callId); // Set current call only if not adding this call // to a current conference - if (it != pendingConferences_.end()) return; + if (it != pimpl_->pendingConferences_.end()) return; + if (!hasCall(callId)) return; + + + // The client should be able to set the current call multiple times + if (pimpl_->currentCall_ == callId) return; + pimpl_->currentCall_ = callId; + + // Unhold call + auto& call = pimpl_->calls[callId]; + if (call->status == call::Status::PAUSED) { + auto& call = pimpl_->calls[callId]; + if (call->type == call::Type::DIALOG) { + CallManager::instance().unhold(callId.c_str()); + } else { + CallManager::instance().unholdConference(callId.c_str()); + } + } + std::vector<std::string> filterCalls; QStringList conferences = CallManager::instance().getConferenceList(); for (const auto& confId : conferences) { QStringList callList = CallManager::instance().getParticipantList(confId); - foreach(const auto& callId, callList) { - filterCalls.emplace_back(callId.toStdString()); + foreach(const auto& cid, callList) { + filterCalls.emplace_back(cid.toStdString()); } } for (const auto& cid : Lrc::activeCalls()) { @@ -603,11 +617,12 @@ NewCallModelPimpl::setCurrentCall(const std::string& callId) CallManager::instance().hold(cid.c_str()); } } - if (dontHoldConferences_) { + if (!lrc::api::Lrc::holdConferences) { return; } for (const auto& confId : conferences) { - CallManager::instance().holdConference(confId); + if (callId != confId.toStdString()) + CallManager::instance().holdConference(confId); } } @@ -695,17 +710,18 @@ NewCallModelPimpl::slotCallStateChanged(const std::string& callId, const std::st // NOTE: signal emission order matters, always emit CallStatusChanged before CallEnded emit linked.callStatusChanged(callId, code); - if (call->status == call::Status::OUTGOING_RINGING) { - setCurrentCall(callId); + if (call->status == call::Status::OUTGOING_RINGING + && linked.owner.profileInfo.type != profile::Type::SIP) { + linked.setCurrentCall(callId); } else if (call->status == call::Status::ENDED) { emit linked.callEnded(callId); } else if (call->status == call::Status::IN_PROGRESS) { if (previousStatus == call::Status::INCOMING_RINGING || previousStatus == call::Status::OUTGOING_RINGING) { - if (previousStatus == call::Status::INCOMING_RINGING) - setCurrentCall(callId); - + if (previousStatus == call::Status::INCOMING_RINGING + && linked.owner.profileInfo.type != profile::Type::SIP) + linked.setCurrentCall(callId); call->startTime = std::chrono::steady_clock::now(); emit linked.callStarted(callId); sendProfile(callId); -- GitLab