diff --git a/src/manager.cpp b/src/manager.cpp index c47e1641d340c0ee487d4da88b77ef879040ca47..5ec1faa85ac3265c0f100f01b36f947842b38948 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -500,7 +500,7 @@ Manager::ManagerPimpl::getCurrentDeviceIndex(DeviceType type) } void -Manager::ManagerPimpl::processRemainingParticipants(Conference &conf) +Manager::ManagerPimpl::processRemainingParticipants(Conference& conf) { const std::string current_call_id(base_.getCurrentCallId()); ParticipantSet participants(conf.getParticipantList()); @@ -517,8 +517,7 @@ Manager::ManagerPimpl::processRemainingParticipants(Conference &conf) } else if (n == 1) { // this call is the last participant, hence // the conference is over - ParticipantSet::iterator p = participants.begin(); - + auto p = participants.begin(); if (auto call = base_.getCallFromCallID(*p)) { call->setConfId(""); // if we are not listening to this conference @@ -1032,26 +1031,15 @@ bool Manager::hangupConference(const std::string& id) { JAMI_DBG("Hangup conference %s", id.c_str()); - - ConferenceMap::iterator iter_conf = pimpl_->conferenceMap_.find(id); - - if (iter_conf != pimpl_->conferenceMap_.end()) { - auto conf = iter_conf->second; - - if (conf) { - ParticipantSet participants(conf->getParticipantList()); - - for (const auto &item : participants) - hangupCall(item); - } else { - JAMI_ERR("No such conference %s", id.c_str()); - return false; - } + if (auto conf = getConferenceFromID(id)) { + ParticipantSet participants(conf->getParticipantList()); + for (const auto &item : participants) + hangupCall(item); + pimpl_->unsetCurrentCall(); + return true; } - - pimpl_->unsetCurrentCall(); - - return true; + JAMI_ERR("No such conference %s", id.c_str()); + return false; } //THREAD=Main @@ -1202,16 +1190,9 @@ Manager::refuseCall(const std::string& id) void Manager::removeConference(const std::string& conference_id) { - JAMI_DBG("Remove conference %s", conference_id.c_str()); - JAMI_DBG("number of participants: %zu", pimpl_->conferenceMap_.size()); - ConferenceMap::iterator iter = pimpl_->conferenceMap_.find(conference_id); - - std::shared_ptr<Conference> conf; - - if (iter != pimpl_->conferenceMap_.end()) - conf = iter->second; - - if (not conf) { + JAMI_DBG("Remove conference %s with %zu participants", conference_id.c_str(), pimpl_->conferenceMap_.size()); + auto iter = pimpl_->conferenceMap_.find(conference_id); + if (iter == pimpl_->conferenceMap_.end()) { JAMI_ERR("Conference not found"); return; } @@ -1219,57 +1200,47 @@ Manager::removeConference(const std::string& conference_id) emitSignal<DRing::CallSignal::ConferenceRemoved>(conference_id); // We now need to bind the audio to the remain participant - // Unbind main participant audio from conference getRingBufferPool().unBindAll(RingBufferPool::DEFAULT_ID); - ParticipantSet participants(conf->getParticipantList()); - // bind main participant audio to remaining conference call - ParticipantSet::iterator iter_p = participants.begin(); - + ParticipantSet participants(iter->second->getParticipantList()); + auto iter_p = participants.begin(); if (iter_p != participants.end()) getRingBufferPool().bindCallID(*iter_p, RingBufferPool::DEFAULT_ID); // Then remove the conference from the conference map - if (pimpl_->conferenceMap_.erase(conference_id)) - JAMI_DBG("Conference %s removed successfully", conference_id.c_str()); - else - JAMI_ERR("Cannot remove conference: %s", conference_id.c_str()); + pimpl_->conferenceMap_.erase(iter); + JAMI_DBG("Conference %s removed successfully", conference_id.c_str()); } std::shared_ptr<Conference> -Manager::getConferenceFromCallID(const std::string& call_id) +Manager::getConferenceFromCallID(const std::string& call_id) const { - auto call = getCallFromCallID(call_id); - if (!call) - return nullptr; - - ConferenceMap::const_iterator iter(pimpl_->conferenceMap_.find(call->getConfId())); + if (auto call = getCallFromCallID(call_id)) + return getConferenceFromID(call->getConfId()); + return nullptr; +} - if (iter != pimpl_->conferenceMap_.end()) - return iter->second; - else - return nullptr; +std::shared_ptr<Conference> +Manager::getConferenceFromID(const std::string& confID) const +{ + auto iter = pimpl_->conferenceMap_.find(confID); + return iter == pimpl_->conferenceMap_.end() ? nullptr : iter->second; } bool Manager::holdConference(const std::string& id) { - ConferenceMap::iterator iter_conf = pimpl_->conferenceMap_.find(id); - - if (iter_conf == pimpl_->conferenceMap_.end()) + auto conf = getConferenceFromID(id); + if (not conf) return false; - auto conf = iter_conf->second; - bool isRec = conf->getState() == Conference::ACTIVE_ATTACHED_REC or conf->getState() == Conference::ACTIVE_DETACHED_REC or conf->getState() == Conference::HOLD_REC; - ParticipantSet participants(conf->getParticipantList()); - - for (const auto &item : participants) { + for (const auto &item : conf->getParticipantList()) { pimpl_->switchCall(getCallFromCallID(item)); onHoldCall(item); } @@ -1284,20 +1255,15 @@ Manager::holdConference(const std::string& id) bool Manager::unHoldConference(const std::string& id) { - ConferenceMap::iterator iter_conf = pimpl_->conferenceMap_.find(id); - - if (iter_conf == pimpl_->conferenceMap_.end() or iter_conf->second == 0) + auto conf = getConferenceFromID(id); + if (not conf) return false; - auto conf = iter_conf->second; - bool isRec = conf->getState() == Conference::ACTIVE_ATTACHED_REC or conf->getState() == Conference::ACTIVE_DETACHED_REC or conf->getState() == Conference::HOLD_REC; - ParticipantSet participants(conf->getParticipantList()); - - for (const auto &item : participants) { + for (const auto &item : conf->getParticipantList()) { if (auto call = getCallFromCallID(item)) { // if one call is currently recording, the conference is in state recording isRec |= call->isRecording(); @@ -1331,8 +1297,8 @@ bool Manager::addParticipant(const std::string& callId, const std::string& conferenceId) { - auto iter = pimpl_->conferenceMap_.find(conferenceId); - if (iter == pimpl_->conferenceMap_.end() or iter->second == nullptr) { + auto conf = getConferenceFromID(conferenceId); + if (not conf) { JAMI_ERR("Conference id is not valid"); return false; } @@ -1354,7 +1320,7 @@ Manager::addParticipant(const std::string& callId, // store the current call id (it will change in offHoldCall or in answerCall) auto current_call_id = getCurrentCallId(); - pimpl_->bindCallToConference(*call, *iter->second); + pimpl_->bindCallToConference(*call, *conf); // TODO: remove this ugly hack => There should be different calls when double clicking // a conference to add main participant to it, or (in this case) adding a participant @@ -1374,17 +1340,11 @@ Manager::addMainParticipant(const std::string& conference_id) { std::lock_guard<std::mutex> lock(pimpl_->audioLayerMutex_); - - ConferenceMap::const_iterator iter = pimpl_->conferenceMap_.find(conference_id); - - if (iter == pimpl_->conferenceMap_.end() or iter->second == 0) + auto conf = getConferenceFromID(conference_id); + if (not conf) return false; - auto conf = iter->second; - - ParticipantSet participants(conf->getParticipantList()); - - for (const auto &item_p : participants) { + for (const auto &item_p : conf->getParticipantList()) { getRingBufferPool().bindCallID(item_p, RingBufferPool::DEFAULT_ID); // Reset ringbuffer's readpointers getRingBufferPool().flush(item_p); @@ -1498,15 +1458,14 @@ Manager::detachLocalParticipant() return false; } - auto iter = pimpl_->conferenceMap_.find(current_call_id); - if (iter == pimpl_->conferenceMap_.end() or iter->second == nullptr) { + auto conf = getConferenceFromID(current_call_id); + if (not conf) { JAMI_ERR("Conference is NULL"); return false; } getRingBufferPool().unBindAll(RingBufferPool::DEFAULT_ID); - auto conf = iter->second; switch (conf->getState()) { case Conference::ACTIVE_ATTACHED: conf->setState(Conference::ACTIVE_DETACHED); @@ -1561,10 +1520,8 @@ Manager::removeParticipant(const std::string& call_id) return; } - ConferenceMap::const_iterator iter = pimpl_->conferenceMap_.find(call->getConfId()); - - auto conf = iter->second; - if (iter == pimpl_->conferenceMap_.end() or conf == 0) { + auto conf = getConferenceFromID(call->getConfId()); + if (not conf) { JAMI_ERR("No conference with id %s, cannot remove participant", call->getConfId().c_str()); return; } @@ -1583,7 +1540,8 @@ bool Manager::joinConference(const std::string& conf_id1, const std::string& conf_id2) { - if (pimpl_->conferenceMap_.find(conf_id1) == pimpl_->conferenceMap_.end()) { + auto conf = getConferenceFromID(conf_id1); + if (not conf) { JAMI_ERR("Not a valid conference ID: %s", conf_id1.c_str()); return false; } @@ -1593,7 +1551,6 @@ Manager::joinConference(const std::string& conf_id1, return false; } - auto conf = pimpl_->conferenceMap_.find(conf_id1)->second; ParticipantSet participants(conf->getParticipantList()); // Detach and remove all participant from conf1 before add @@ -1927,15 +1884,9 @@ Manager::sendCallTextMessage(const std::string& callID, const std::string& from, bool /*isMixed TODO: use it */) { - if (isConference(callID)) { - const auto& it = pimpl_->conferenceMap_.find(callID); - if (it == pimpl_->conferenceMap_.cend() or not it->second) { - JAMI_ERR("no conference associated to ID %s", callID.c_str()); - return; - } - + if (auto conf = getConferenceFromID(callID)) { JAMI_DBG("Is a conference, send instant message to everyone"); - pimpl_->sendTextMessageToConference(*it->second, messages, from); + pimpl_->sendTextMessageToConference(*conf, messages, from); } else if (isConferenceParticipant(callID)) { auto conf = getConferenceFromCallID(callID); diff --git a/src/manager.h b/src/manager.h index eeee273015e3863f7a27b62f1d7dff48a351547e..74a7de5e0119809ee616980a9380f652e7c45024 100644 --- a/src/manager.h +++ b/src/manager.h @@ -226,8 +226,9 @@ class Manager { * Return the conference id for which this call is attached * @ param the call id */ - std::shared_ptr<Conference> - getConferenceFromCallID(const std::string& call_id); + std::shared_ptr<Conference> getConferenceFromCallID(const std::string& call_id) const; + + std::shared_ptr<Conference> getConferenceFromID(const std::string &confID) const; /** * Hold every participant to a conference