diff --git a/sflphone-common/src/conference.cpp b/sflphone-common/src/conference.cpp index 8cf8435873a420a024a03a3ee9b99547c533397a..65e5a16625ce9694472fe0b4d42857056528c140 100644 --- a/sflphone-common/src/conference.cpp +++ b/sflphone-common/src/conference.cpp @@ -56,20 +56,6 @@ void Conference::add(CallID participant_id) _debug("---- Conference:: add participant %s\n", participant_id.c_str()); - /* - if(_nbParticipant >= 1) - { - ParticipantSet::iterator iter; - - for(iter = _participants.begin(); iter != _participants.end(); iter++) - { - _debug("---- Conference:: bind callid %s with %s in conference add\n", participant_id.c_str(), (*iter).c_str()); - Manager::instance().getAudioDriver()->getMainBuffer()->bindCallID(participant_id, *iter); - } - } - - Manager::instance().getAudioDriver()->getMainBuffer()->bindCallID(participant_id); - */ _participants.insert(participant_id); _nbParticipant++; @@ -81,19 +67,6 @@ void Conference::remove(CallID participant_id) _debug("---- Conference:: remove participant %s\n", participant_id.c_str()); - /* - if(_nbParticipant >= 1) - { - ParticipantSet::iterator iter = _participants.begin(); - - for(iter = _participants.begin(); iter != _participants.end(); iter++) - { - _debug("---- Conference:: unbind callid %s from %s in conference add\n", participant_id.c_str(), (*iter).c_str()); - Manager::instance().getAudioDriver()->getMainBuffer()->unBindCallID(participant_id, *iter); - } - } - */ - _participants.erase(participant_id); _nbParticipant--; @@ -146,3 +119,16 @@ std::string Conference::getStateStr() return state_str; } + + +CallID Conference::getLastParticipant() +{ + CallID call_id = ""; + + ParticipantSet::iterator iter = _participants.begin(); + if (iter != _participants.end()) + { + call_id = *iter; + return call_id; + } +} diff --git a/sflphone-common/src/conference.h b/sflphone-common/src/conference.h index 31b5036cb4d34a6cb122283495c569326fbab453..a615314aad0b225264c20ae6abe186df7bf331e5 100644 --- a/sflphone-common/src/conference.h +++ b/sflphone-common/src/conference.h @@ -54,6 +54,8 @@ class Conference{ void bindParticipant(CallID participant_id); + CallID getLastParticipant(); + private: /** Unique ID of the call */ diff --git a/sflphone-common/src/managerimpl.cpp b/sflphone-common/src/managerimpl.cpp index 2bc2bbbe27f73c7ef7d8303d2be80ccc071db56a..a3f90944c82abd4c9b914bfddf7fabd44659dba5 100644 --- a/sflphone-common/src/managerimpl.cpp +++ b/sflphone-common/src/managerimpl.cpp @@ -246,7 +246,7 @@ ManagerImpl::outgoingCall (const std::string& accountid, const CallID& id, const else { _debug ("ManagerImpl::outgoingCall() Put the current conference (ID=%s) on hold\n", getCurrentCallId().c_str()); - detachParticipant(); + // detachParticipant(); } } @@ -569,7 +569,7 @@ ManagerImpl::offHoldCall (const CallID& id) else { _debug ("Put the current conference (ID=%s) on hold\n", getCurrentCallId().c_str()); - detachParticipant(); + // detachParticipant(); } } @@ -708,7 +708,7 @@ ManagerImpl::refuseCall (const CallID& id) } -void +Conference* ManagerImpl::createConference(const CallID& id1, const CallID& id2) { _debug("ManagerImpl::createConference()\n"); @@ -724,7 +724,8 @@ ManagerImpl::createConference(const CallID& id1, const CallID& id2) // broadcast a signal over dbus _dbus->getCallManager()->conferenceCreated(default_conf); - + + return conf; } void @@ -981,8 +982,10 @@ ManagerImpl::joinParticipant(const CallID& call_id1, const CallID& call_id2) if(iter == _conferencemap.end()){ - _debug("NO CONFERENCE YET, CREATE ONE\n"); - createConference(call_id1, call_id2); + _debug("ManagerImpl::joinParticipant create a conference\n"); + Conference *conf = createConference(call_id1, call_id2); + + iter_details = call1_details.find("CALL_STATE"); _debug(" call %s state: %s\n", call_id1.c_str(), iter_details->second.c_str()); @@ -996,6 +999,11 @@ ManagerImpl::joinParticipant(const CallID& call_id1, const CallID& call_id2) _debug(" ANSWER %s\n", call_id1.c_str()); answerCall(call_id1); } + else if(iter_details->second == "CURRENT") + { + _debug(" CURRENT %s\n", call_id1.c_str()); + conf->bindParticipant(call_id1); + } iter_details = call2_details.find("CALL_STATE"); _debug(" call %s state: %s\n", call_id2.c_str(), iter_details->second.c_str()); @@ -1009,6 +1017,11 @@ ManagerImpl::joinParticipant(const CallID& call_id1, const CallID& call_id2) _debug(" ANSWER %s\n", call_id2.c_str()); answerCall(call_id2); } + else if(iter_details->second == "CURRENT") + { + _debug(" CURRENT %s\n", call_id2.c_str()); + conf->bindParticipant(call_id2); + } AccountID currentAccountId; @@ -1020,45 +1033,17 @@ ManagerImpl::joinParticipant(const CallID& call_id1, const CallID& call_id2) currentAccountId = getAccountFromCall (call_id2); call = getAccountLink (currentAccountId)->getCall (call_id2); - call->setConfId (default_conf); + call->setConfId (default_conf); + + switchCall(default_conf); } else { - _debug("ALREADY A CONFERENCE CREATED\n"); - /* - Conference* conf = iter->second; - conf->add(call_id1); - _conferencecall.insert(pair<CallID, Conference*>(call_id1, conf)); + _debug("ManagerImpl::joinParticipant already a conference created with this ID\n"); - iter_details = call1_details.find("CALL_STATE"); - if(iter_details->second == "HOLD") - { - _debug(" Add INCOMING call to conference\n"); - offHoldCall (call_id1); - } - else if(iter_details->second == "INCOMING") - { - _debug(" Add INCOMING call to conference\n"); - answerCall(call_id1); - } - */ - - /* - iter_details = call2_details.find("CALL_STATE"); - if(iter_details->second == "HOLD") - { - - } - else if(iter_details->second == "INCOMING") - { - - } - */ } - switchCall(default_conf); - } @@ -1072,11 +1057,8 @@ ManagerImpl::detachParticipant(const CallID& call_id) - if(iter == _conferencemap.end()) { - _debug("Error there is no conference, call is not conferencing\n"); + if(iter != _conferencemap.end()) { - } - else { _debug("ManagerImpl::detachParticipant detach participant %s\n", call_id.c_str()); if(call_id != default_id) @@ -1094,6 +1076,13 @@ ManagerImpl::detachParticipant(const CallID& call_id) } // _dbus->getCallManager()->conferenceChanged(conference_id); + + } + else { + + + _debug("Error there is no conference, call is not conferencing\n"); + } } @@ -1111,19 +1100,39 @@ ManagerImpl::removeParticipant(const CallID& call_id) ConferenceMap::iterator iter = conf_map.find(default_conf); if(iter == _conferencemap.end()) { - _debug("NO CONFERENCE CREATED, CANNOT REMOVE PARTICIPANT\n"); + _debug("ManagerImpl::removeParticipant no conference created, cannot remove participant \n"); } else { conf = iter->second; - _debug("REMOVE PARTICIPANT %s\n", call_id.c_str()); + _debug("ManagerImpl::removeParticipant %s\n", call_id.c_str()); conf->remove(call_id); _conferencecall.erase(iter->first); - if (conf->getNbParticipants() <= 1) + if(conf->getNbParticipants() > 1) + { + switchCall(default_conf); + } + else if (conf->getNbParticipants() == 1) + { + CallID last_participant = conf->getLastParticipant(); + + _debug("ManagerImpl::removeParticipant only one participant remaining %s\n", last_participant.c_str()); + removeConference(default_conf); + + switchCall(last_participant); + } + else + { + removeConference(default_conf); + + switchCall(""); + } + + } } diff --git a/sflphone-common/src/managerimpl.h b/sflphone-common/src/managerimpl.h index f8ddc8c60caf6b621d2ca1e0059c6de5318cfe4e..538f35785c255b75fcb22b5d9a41b3076a0849a7 100644 --- a/sflphone-common/src/managerimpl.h +++ b/sflphone-common/src/managerimpl.h @@ -195,7 +195,7 @@ class ManagerImpl { */ bool refuseCall(const CallID& id); - void createConference(const CallID& id1, const CallID& id2); + Conference* createConference(const CallID& id1, const CallID& id2); void removeConference(const CallID& conference_id);