diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp index fc557935d3d1a9595b2d35b8fedcde81869ef337..24670147e5fb13c832e4a87b7a1904f0244f1f9f 100644 --- a/daemon/src/managerimpl.cpp +++ b/daemon/src/managerimpl.cpp @@ -247,13 +247,10 @@ bool ManagerImpl::answerCall(const std::string& call_id) // store the current call id std::string current_call_id(getCurrentCallId()); - // Retreive call coresponding to this id - std::string account_id = getAccountFromCall(call_id); - Call *call = getAccountLink(account_id)->getCall(call_id); + Call *call = getCallFromCallID(call_id); - if (call == NULL) { + if (call == NULL) ERROR("Call is NULL"); - } // in any cases we have to detach from current communication if (hasCurrentCall()) { @@ -271,6 +268,7 @@ bool ManagerImpl::answerCall(const std::string& call_id) } try { + const std::string account_id = getAccountFromCall(call_id); getAccountLink(account_id)->answer(call); } catch (const std::runtime_error &e) { ERROR("%s", e.what()); @@ -351,9 +349,9 @@ void ManagerImpl::hangupCall(const std::string& callId) } } else { std::string accountId(getAccountFromCall(callId)); - VoIPLink *link = getAccountLink(accountId); - Call * call = link->getCall(callId); + Call * call = getCallFromCallID(callId); history_.addCall(call, preferences.getHistoryLimit()); + VoIPLink *link = getAccountLink(accountId); link->hangup(callId); removeCallAccount(callId); saveHistory(); @@ -402,13 +400,13 @@ void ManagerImpl::onHoldCall(const std::string& callId) try { if (isIPToIP(callId)) { - SIPVoIPLink::instance()-> onhold(callId); + SIPVoIPLink::instance()->onhold(callId); } else { /* Classic call, attached to an account */ std::string account_id(getAccountFromCall(callId)); if (account_id.empty()) { - DEBUG("Account ID %s or callid %s doesn't exists in call onHold", account_id.c_str(), callId.c_str()); + DEBUG("Account ID %s or callid %s doesn't exist in call onHold", account_id.c_str(), callId.c_str()); return; } @@ -437,7 +435,6 @@ void ManagerImpl::onHoldCall(const std::string& callId) //THREAD=Main void ManagerImpl::offHoldCall(const std::string& callId) { - std::string accountId; std::string codecName; DEBUG("Put call %s off hold", callId.c_str()); @@ -463,10 +460,8 @@ void ManagerImpl::offHoldCall(const std::string& callId) SIPVoIPLink::instance()->offhold(callId); else { /* Classic call, attached to an account */ - accountId = getAccountFromCall(callId); - + const std::string accountId(getAccountFromCall(callId)); DEBUG("Setting offhold, Account %s, callid %s", accountId.c_str(), callId.c_str()); - Call * call = getAccountLink(accountId)->getCall(callId); if (call) { @@ -478,9 +473,7 @@ void ManagerImpl::offHoldCall(const std::string& callId) dbus_.getCallManager()->callStateChanged(callId, isRec ? "UNHOLD_RECORD" : "UNHOLD_CURRENT"); if (isConferenceParticipant(callId)) { - std::string currentAccountId(getAccountFromCall(callId)); - Call *call = getAccountLink(currentAccountId)->getCall(callId); - + Call *call = getCallFromCallID(callId); if (call) switchCall(call->getConfId()); @@ -645,8 +638,9 @@ void ManagerImpl::removeConference(const std::string& conference_id) Conference* ManagerImpl::getConferenceFromCallID(const std::string& call_id) { - std::string account_id(getAccountFromCall(call_id)); - Call *call = getAccountLink(account_id)->getCall(call_id); + Call *call = getCallFromCallID(call_id); + if (!call) + return NULL; ConferenceMap::const_iterator iter(conferenceMap_.find(call->getConfId())); @@ -695,12 +689,12 @@ void ManagerImpl::unHoldConference(const std::string& id) ParticipantSet participants(conf->getParticipantList()); for (ParticipantSet::const_iterator iter = participants.begin(); iter!= participants.end(); ++iter) { - Call *call = getAccountLink(getAccountFromCall(*iter))->getCall(*iter); - - // if one call is currently recording, the conference is in state recording - isRec |= call->isRecording(); - - offHoldCall(*iter); + Call *call = getCallFromCallID(*iter); + if (call) { + // if one call is currently recording, the conference is in state recording + isRec |= call->isRecording(); + offHoldCall(*iter); + } } conf->setState(isRec ? Conference::ACTIVE_ATTACHED_REC : Conference::ACTIVE_ATTACHED); @@ -840,6 +834,14 @@ void ManagerImpl::addMainParticipant(const std::string& conference_id) switchCall(conference_id); } +Call * +ManagerImpl::getCallFromCallID(const std::string &callID) +{ + const std::string accountID(getAccountFromCall(callID)); + Call *call = getAccountLink(accountID)->getCall(callID); + return call; +} + void ManagerImpl::joinParticipant(const std::string& callId1, const std::string& callId2) { DEBUG("Join participants %s, %s", callId1.c_str(), callId2.c_str()); @@ -848,6 +850,22 @@ void ManagerImpl::joinParticipant(const std::string& callId1, const std::string& return; } + // Set corresponding conference ids for call 1 + Call *call1 = getCallFromCallID(callId1); + + if (call1 == NULL) { + ERROR("Could not find call %s", callId1.c_str()); + return; + } + + // Set corresponding conderence details + Call *call2 = getCallFromCallID(callId2); + + if (call2 == NULL) { + ERROR("Could not find call %s", callId2.c_str()); + return; + } + std::map<std::string, std::string> call1Details(getCallDetails(callId1)); std::map<std::string, std::string> call2Details(getCallDetails(callId2)); @@ -863,29 +881,12 @@ void ManagerImpl::joinParticipant(const std::string& callId1, const std::string& onHoldCall(current_call_id); // currently in a call } - Conference *conf = createConference(callId1, callId2); - // Set corresponding conference ids for call 1 - std::string currentAccountId1 = getAccountFromCall(callId1); - Call *call1 = getAccountLink(currentAccountId1)->getCall(callId1); - - if (call1 == NULL) { - ERROR("Could not find call %s", callId1.c_str()); - return; - } + Conference *conf = createConference(callId1, callId2); call1->setConfId(conf->getConfID()); getMainBuffer()->unBindAll(callId1); - // Set corresponding conderence details - std::string currentAccountId2(getAccountFromCall(callId2)); - Call *call2 = getAccountLink(currentAccountId2)->getCall(callId2); - - if (call2 == NULL) { - ERROR("Could not find call %s", callId2.c_str()); - return; - } - call2->setConfId(conf->getConfID()); getMainBuffer()->unBindAll(callId2); diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h index e762892a6acb8b57650162156ab89064e0a0c1ff..65273cf8542fa2b544f7611b0f88215652c9468e 100644 --- a/daemon/src/managerimpl.h +++ b/daemon/src/managerimpl.h @@ -841,6 +841,12 @@ class ManagerImpl { const AudioCodecFactory audioCodecFactory; private: + + /** + * Get the Call referred to by callID. If the Call does not exist, return NULL + */ + Call *getCallFromCallID(const std::string &callID); + /** * Play the dtmf-associated sound * @param code The pressed key @@ -1070,7 +1076,7 @@ class ManagerImpl { * @param accountID Account ID to get * @return VoIPLink* The voip link from the account pointer or 0 */ - VoIPLink* getAccountLink(const std::string& accountID=""); + VoIPLink* getAccountLink(const std::string& accountID); std::string getAccountIdFromNameAndServer(const std::string& userName, const std::string& server) const;