diff --git a/daemon/src/call.cpp b/daemon/src/call.cpp index bd0668da3ffed2740b020e2873abfcba3f0ce7f6..deb9ca0d6d75f312d45d017af3cd5f4ed4d0638a 100644 --- a/daemon/src/call.cpp +++ b/daemon/src/call.cpp @@ -34,7 +34,7 @@ #include "history/historyitem.h" #include "scoped_lock.h" -Call::Call(const std::string& id, Call::CallType type) +Call::Call(const std::string& id, Call::CallType type, const std::string &accountID) : callMutex_() , localIPAddress_("") , localAudioPort_(0) @@ -42,6 +42,7 @@ Call::Call(const std::string& id, Call::CallType type) , id_(id) , confID_() , type_(type) + , accountID_(accountID) , connectionState_(Call::DISCONNECTED) , callState_(Call::INACTIVE) , isIPToIP_(false) @@ -203,7 +204,7 @@ std::map<std::string, std::string> Call::createHistoryEntry() const using sfl::HistoryItem; std::map<std::string, std::string> result; - result[HistoryItem::ACCOUNT_ID_KEY] = Manager::instance().getAccountFromCall(id_); + result[HistoryItem::ACCOUNT_ID_KEY] = accountID_; result[HistoryItem::CONFID_KEY] = confID_; result[HistoryItem::CALLID_KEY] = id_; result[HistoryItem::DISPLAY_NAME_KEY] = displayName_; @@ -230,6 +231,7 @@ Call::getDetails() details["CALL_STATE"] = getStateStr(); details["CONF_ID"] = confID_; details["TIMESTAMP_START"] = timestamp_to_string(timestamp_start_); + details["ACCOUNTID"] = accountID_; return details; } diff --git a/daemon/src/call.h b/daemon/src/call.h index c637c311cd137f1d7d729f870e7e47a49a827286..eee2e15db73392976e7f3cfb169cedda50660ea8 100644 --- a/daemon/src/call.h +++ b/daemon/src/call.h @@ -72,7 +72,7 @@ class Call : public Recordable { * @param id Unique identifier of the call * @param type set definitely this call as incoming/outgoing */ - Call(const std::string& id, Call::CallType type); + Call(const std::string& id, Call::CallType type, const std::string &accountID); virtual ~Call(); /** @@ -95,6 +95,10 @@ class Call : public Recordable { confID_ = id; } + std::string getAccountId() const { + return accountID_; + } + CallType getCallType() const { return type_; } @@ -251,6 +255,9 @@ class Call : public Recordable { /** Type of the call */ CallType type_; + /** Associate account ID */ + std::string accountID_; + /** Disconnected/Progressing/Trying/Ringing/Connected */ ConnectionState connectionState_; diff --git a/daemon/src/iax/iaxcall.cpp b/daemon/src/iax/iaxcall.cpp index 1fcbffd762a0d53647059a135296ba49ac1de9c4..934ab02a92cb5bba7015e0eda6a97364a90883d0 100644 --- a/daemon/src/iax/iaxcall.cpp +++ b/daemon/src/iax/iaxcall.cpp @@ -60,7 +60,7 @@ int codecToASTFormat(int c) } } -IAXCall::IAXCall(const std::string& id, Call::CallType type) : Call(id, type), +IAXCall::IAXCall(const std::string& id, Call::CallType type, const std::string &account_id) : Call(id, type, account_id), format(0), session(NULL) {} diff --git a/daemon/src/iax/iaxcall.h b/daemon/src/iax/iaxcall.h index 739f7b90a743d0e81fe163262a68840b28e7cedd..5a68cde3533a8f7662440f97de89a870b1a0d8a5 100644 --- a/daemon/src/iax/iaxcall.h +++ b/daemon/src/iax/iaxcall.h @@ -47,7 +47,7 @@ class IAXCall : public Call { * @param id The unique ID of the call * @param type The type of the call */ - IAXCall(const std::string& id, Call::CallType type); + IAXCall(const std::string& id, Call::CallType type, const std::string &account_id); /** * @return int The bitwise list of supported formats diff --git a/daemon/src/iax/iaxvoiplink.cpp b/daemon/src/iax/iaxvoiplink.cpp index 8a416dd47b20475b2b048d08c3ef6c2e963efd3a..67fc6984fc3c6bef6134d64c3f415d0020409447 100644 --- a/daemon/src/iax/iaxvoiplink.cpp +++ b/daemon/src/iax/iaxvoiplink.cpp @@ -96,6 +96,13 @@ IAXVoIPLink::init() } } +bool +IAXVoIPLink::hasCalls() +{ + sfl::ScopedLock m(iaxCallMapMutex_); + return not iaxCallMap_.empty(); +} + void IAXVoIPLink::terminate() { @@ -271,9 +278,9 @@ IAXVoIPLink::sendUnregister(Account *a) } Call* -IAXVoIPLink::newOutgoingCall(const std::string& id, const std::string& toUrl) +IAXVoIPLink::newOutgoingCall(const std::string& id, const std::string& toUrl, const std::string &account_id) { - IAXCall* call = new IAXCall(id, Call::OUTGOING); + IAXCall* call = new IAXCall(id, Call::OUTGOING, account_id); call->setPeerNumber(toUrl); call->initRecFilename(toUrl); @@ -696,7 +703,7 @@ void IAXVoIPLink::iaxHandlePrecallEvent(iax_event* event) case IAX_EVENT_CONNECT: id = Manager::instance().getNewCallID(); - call = new IAXCall(id, Call::INCOMING); + call = new IAXCall(id, Call::INCOMING, accountID_); call->session = event->session; call->setConnectionState(Call::PROGRESSING); diff --git a/daemon/src/iax/iaxvoiplink.h b/daemon/src/iax/iaxvoiplink.h index f60df681e0b485c428ae99978eb5df6112624658..74e07f492df31980eafccb2ce8fcbfc910245374 100644 --- a/daemon/src/iax/iaxvoiplink.h +++ b/daemon/src/iax/iaxvoiplink.h @@ -72,6 +72,8 @@ class IAXVoIPLink : public VoIPLink { */ virtual bool getEvent(); + bool hasCalls(); + /** * Return the internal account map for all VOIP links */ @@ -110,7 +112,7 @@ class IAXVoIPLink : public VoIPLink { * @param toUrl The address to call * @return Call* A pointer on the call */ - virtual Call* newOutgoingCall(const std::string& id, const std::string& toUrl); + virtual Call* newOutgoingCall(const std::string& id, const std::string& toUrl, const std::string &account_id); /** * Answer a call diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp index 6430f0c31e749b782f23479dcd3951ca9a982aaf..646543eef32fe481cf74f14b091c6cb7c8ad198a 100644 --- a/daemon/src/managerimpl.cpp +++ b/daemon/src/managerimpl.cpp @@ -91,8 +91,7 @@ ManagerImpl::ManagerImpl() : currentCallId_(), currentCallMutex_(), audiodriver_(0), dtmfKey_(), toneMutex_(), telephoneTone_(), audiofile_(), audioLayerMutex_(), waitingCall_(), waitingCallMutex_(), nbIncomingWaitingCall_(0), path_(), - callAccountMap_(), callAccountMapMutex_(), IPToIPMap_(), - mainBuffer_(), conferenceMap_(), history_(), finished_(false) + IPToIPMap_(), mainBuffer_(), conferenceMap_(), history_(), finished_(false) { pthread_mutex_init(¤tCallMutex_, NULL); pthread_mutex_init(&toneMutex_, NULL); @@ -294,14 +293,12 @@ bool ManagerImpl::outgoingCall(const std::string& account_id, use_account_id = account_id; } - associateCallToAccount(call_id, use_account_id); - try { - Call *call = getAccountLink(account_id)->newOutgoingCall(call_id, to_cleaned); + Call *call = getAccountLink(account_id)->newOutgoingCall(call_id, to_cleaned, use_account_id); // try to reverse match the peer name using the cache if (call->getDisplayName().empty()) { - const std::string pseudo_contact_name(HistoryNameCache::getInstance().getNameFromHistory(call->getPeerNumber(), getAccountFromCall(call_id))); + const std::string pseudo_contact_name(HistoryNameCache::getInstance().getNameFromHistory(call->getPeerNumber(), call->getAccountId())); if (not pseudo_contact_name.empty()) call->setDisplayName(pseudo_contact_name); } @@ -359,8 +356,7 @@ bool ManagerImpl::answerCall(const std::string& call_id) } try { - const std::string account_id = getAccountFromCall(call_id); - VoIPLink *link = getAccountLink(account_id); + VoIPLink *link = getAccountLink(call->getAccountId()); if (link) link->answer(call); } catch (const std::runtime_error &e) { @@ -438,13 +434,11 @@ bool ManagerImpl::hangupCall(const std::string& callId) return false; } } else { - std::string accountId(getAccountFromCall(callId)); Call * call = getCallFromCallID(callId); if (call) { history_.addCall(call, preferences.getHistoryLimit()); - VoIPLink *link = getAccountLink(accountId); + VoIPLink *link = getAccountLink(call->getAccountId()); link->hangup(callId, 0); - removeCallAccount(callId); saveHistory(); } } @@ -551,12 +545,10 @@ bool ManagerImpl::offHoldCall(const std::string& callId) SIPVoIPLink::instance()->offhold(callId); else { /* Classic call, attached to an account */ - const std::string accountId(getAccountFromCall(callId)); - DEBUG("Setting offhold, Account %s, callid %s", accountId.c_str(), callId.c_str()); Call * call = getCallFromCallID(callId); if (call) - getAccountLink(accountId)->offhold(callId); + getAccountLink(call->getAccountId())->offhold(callId); else result = false; } @@ -656,8 +648,6 @@ bool ManagerImpl::refuseCall(const std::string& id) return false; getAccountLink(accountid)->refuse(id); - - removeCallAccount(id); } removeWaitingCall(id); @@ -1458,8 +1448,6 @@ void ManagerImpl::incomingCall(Call &call, const std::string& accountId) stopTone(); const std::string callID(call.getCallId()); - associateCallToAccount(callID, accountId); - if (accountId.empty()) setIPToIPForCall(callID, true); else { @@ -1673,7 +1661,6 @@ void ManagerImpl::peerHungupCall(const std::string& call_id) dbus_.getCallManager()->callStateChanged(call_id, "HUNGUP"); removeWaitingCall(call_id); - removeCallAccount(call_id); removeStream(call_id); if (getCallList().empty()) { @@ -1694,7 +1681,6 @@ void ManagerImpl::callBusy(const std::string& id) unsetCurrentCall(); } - removeCallAccount(id); removeWaitingCall(id); } @@ -1714,7 +1700,6 @@ void ManagerImpl::callFailure(const std::string& call_id) removeParticipant(call_id); } - removeCallAccount(call_id); removeWaitingCall(call_id); } @@ -2524,42 +2509,21 @@ void ManagerImpl::removeAccount(const std::string& accountID) dbus_.getConfigurationManager()->accountsChanged(); } -// ACCOUNT handling -void ManagerImpl::associateCallToAccount(const std::string& callID, - const std::string& accountID) -{ - sfl::ScopedLock m(callAccountMapMutex_); - callAccountMap_[callID] = accountID; - DEBUG("Associate Call %s with Account %s", callID.data(), accountID.data()); -} - std::string ManagerImpl::getAccountFromCall(const std::string& callID) { - sfl::ScopedLock m(callAccountMapMutex_); - CallAccountMap::iterator iter = callAccountMap_.find(callID); - - return (iter == callAccountMap_.end()) ? "" : iter->second; -} - -void ManagerImpl::removeCallAccount(const std::string& callID) -{ - sfl::ScopedLock m(callAccountMapMutex_); - callAccountMap_.erase(callID); - - // Stop audio layer if there is no call anymore - if (callAccountMap_.empty()) { - sfl::ScopedLock lock(audioLayerMutex_); - - if (audiodriver_) - audiodriver_->stopStream(); - } - + Call *call = getCallFromCallID(callID); + if (call) + return call->getAccountId(); + else + return ""; } +// FIXME: get rid of this, there's no guarantee that +// a Call will still exist after this has been called. bool ManagerImpl::isValidCall(const std::string& callID) { - sfl::ScopedLock m(callAccountMapMutex_); - return callAccountMap_.find(callID) != callAccountMap_.end(); + Call *call = getCallFromCallID(callID); + return call != 0; } std::string ManagerImpl::getNewCallID() @@ -2837,16 +2801,11 @@ std::map<std::string, std::string> ManagerImpl::getCallDetails(const std::string // To achieve that, we need to get the voip link attached to the call // But to achieve that, we need to get the account the call was made with - // So first we fetch the account - const std::string accountid(getAccountFromCall(callID)); - // Then the VoIP link this account is linked with (IAX2 or SIP) Call *call = getCallFromCallID(callID); if (call) { - std::map<std::string, std::string> details(call->getDetails()); - details["ACCOUNTID"] = accountid; - return details; + return call->getDetails(); } else { ERROR("Call is NULL"); // FIXME: is this even useful? @@ -2868,10 +2827,11 @@ void vectorFromMapKeys(const M &m, V &v) } } +// FIXME: get call ids from voiplinks std::vector<std::string> ManagerImpl::getCallList() const { std::vector<std::string> v; - vectorFromMapKeys(callAccountMap_, v); + // vectorFromMapKeys(callAccountMap_, v); return v; } diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h index b1d0ca2ff0d992e43cf008164e9134182bf6ab7d..b65468ffa8a7ba7be5fc2247b6b51ddd067a14d8 100644 --- a/daemon/src/managerimpl.h +++ b/daemon/src/managerimpl.h @@ -84,10 +84,6 @@ class Account; class SIPAccount; class IAXAccount; - -/** Define a type for a std::string to std::string Map inside ManagerImpl */ -typedef std::map<std::string, std::string> CallAccountMap; - /** To send multiple string */ typedef std::list<std::string> TokenList; @@ -359,8 +355,7 @@ class ManagerImpl { void stopTone(); /** - * When receiving a new incoming call, add it to the callaccount map - * and notify user + * Handle incoming call and notify user * @param call A call pointer * @param accountId an account id */ @@ -926,12 +921,6 @@ class ManagerImpl { DNSService *DNSService_; #endif - /** Map to associate a CallID to the good account */ - CallAccountMap callAccountMap_; - - /** Mutex to lock the call account map (main thread + voiplink thread) */ - pthread_mutex_t callAccountMapMutex_; - std::map<std::string, bool> IPToIPMap_; bool isIPToIP(const std::string& callID) const; @@ -958,14 +947,6 @@ class ManagerImpl { void setIPToIPForCall(const std::string& callID, bool IPToIP); - /** Associate a new std::string to a std::string - * Protected by mutex - * @param callID the new CallID not in the list yet - * @param accountID the known accountID present in accountMap - * @return bool True if the new association is create - */ - void associateCallToAccount(const std::string& callID, const std::string& accountID); - /** * Test if call is a valid call, i.e. have been created and stored in * call-account map diff --git a/daemon/src/sip/sipcall.cpp b/daemon/src/sip/sipcall.cpp index 7e26b67dd4581ba475d1d1176eb64e9342c68c99..904daadcf5ce32a9a7b7c9d4c41e2d8a23499bd8 100644 --- a/daemon/src/sip/sipcall.cpp +++ b/daemon/src/sip/sipcall.cpp @@ -45,7 +45,8 @@ namespace { } SIPCall::SIPCall(const std::string& id, Call::CallType type, - pj_caching_pool *caching_pool) : Call(id, type) + pj_caching_pool *caching_pool, const std::string &account_id) : + Call(id, type, account_id) , inv(NULL) , audiortp_(this) #ifdef SFL_VIDEO diff --git a/daemon/src/sip/sipcall.h b/daemon/src/sip/sipcall.h index aa5111821926148df8d234f514790a84f27ab5fa..e97b6851c2892e00beb81a9c0932ec28e40a1f00 100644 --- a/daemon/src/sip/sipcall.h +++ b/daemon/src/sip/sipcall.h @@ -63,7 +63,8 @@ class SIPCall : public Call { * @param type The type of the call. Could be Incoming * Outgoing */ - SIPCall(const std::string& id, Call::CallType type, pj_caching_pool *caching_pool); + SIPCall(const std::string& id, Call::CallType type, + pj_caching_pool *caching_pool, const std::string &account_id); /** * Destructor diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp index a40937da2e345cf7135f46059d032ef9af3f206b..c1fbb45fd3017db1df38a94cf0a788d777eaee80 100644 --- a/daemon/src/sip/sipvoiplink.cpp +++ b/daemon/src/sip/sipvoiplink.cpp @@ -271,8 +271,7 @@ pj_bool_t transaction_request_cb(pjsip_rx_data *rdata) Manager::instance().hookPreference.runHook(rdata->msg_info.msg); - SIPCall* call = new SIPCall(Manager::instance().getNewCallID(), Call::INCOMING, cp_); - Manager::instance().associateCallToAccount(call->getCallId(), account_id); + SIPCall* call = new SIPCall(Manager::instance().getNewCallID(), Call::INCOMING, cp_, account_id); // May use the published address as well std::string addrToUse = SipTransport::getInterfaceAddrFromName(account->getLocalInterface()); @@ -786,7 +785,7 @@ bool isValidIpAddress(const std::string &address) } -Call *SIPVoIPLink::newOutgoingCall(const std::string& id, const std::string& toUrl) +Call *SIPVoIPLink::newOutgoingCall(const std::string& id, const std::string& toUrl, const std::string &account_id) { DEBUG("New outgoing call to %s", toUrl.c_str()); std::string toCpy = toUrl; @@ -797,10 +796,9 @@ Call *SIPVoIPLink::newOutgoingCall(const std::string& id, const std::string& toU Manager::instance().setIPToIPForCall(id, IPToIP); if (IPToIP) { - Manager::instance().associateCallToAccount(id, SIPAccount::IP2IP_PROFILE); return SIPNewIpToIpCall(id, toUrl); } else { - return newRegisteredAccountCall(id, toUrl); + return newRegisteredAccountCall(id, toUrl, account_id); } } @@ -813,7 +811,7 @@ Call *SIPVoIPLink::SIPNewIpToIpCall(const std::string& id, const std::string& to if (!account) throw VoipLinkException("Could not retrieve default account for IP2IP call"); - SIPCall *call = new SIPCall(id, Call::OUTGOING, cp_); + SIPCall *call = new SIPCall(id, Call::OUTGOING, cp_, SIPAccount::IP2IP_PROFILE); call->setIPToIP(true); call->initRecFilename(to); @@ -854,16 +852,16 @@ Call *SIPVoIPLink::SIPNewIpToIpCall(const std::string& id, const std::string& to return call; } -Call *SIPVoIPLink::newRegisteredAccountCall(const std::string& id, const std::string& toUrl) +Call *SIPVoIPLink::newRegisteredAccountCall(const std::string& id, const std::string& toUrl, const std::string &account_id) { DEBUG("UserAgent: New registered account call to %s", toUrl.c_str()); - SIPAccount *account = Manager::instance().getSipAccount(Manager::instance().getAccountFromCall(id)); + SIPAccount *account = Manager::instance().getSipAccount(account_id); if (account == NULL) // TODO: We should investigate how we could get rid of this error and create a IP2IP call instead throw VoipLinkException("Could not get account for this call"); - SIPCall* call = new SIPCall(id, Call::OUTGOING, cp_); + SIPCall* call = new SIPCall(id, Call::OUTGOING, cp_, account->getAccountID()); // If toUri is not a well formatted sip URI, use account information to process it std::string toUri; @@ -954,7 +952,7 @@ SIPVoIPLink::hangup(const std::string& id, int reason) if (!call) return; - std::string account_id(Manager::instance().getAccountFromCall(id)); + std::string account_id(call->getAccountId()); SIPAccount *account = Manager::instance().getSipAccount(account_id); if (account == NULL) @@ -1176,6 +1174,13 @@ void SIPVoIPLink::removeSipCall(const std::string& id) sipCallMap_.erase(id); } +bool +SIPVoIPLink::hasCalls() +{ + sfl::ScopedLock m(sipCallMapMutex_); + return not sipCallMap_.empty(); +} + SIPCall* SIPVoIPLink::getSipCall(const std::string& id) { @@ -1257,7 +1262,7 @@ SIPVoIPLink::transfer(const std::string& id, const std::string& to) call->stopRecording(); - std::string account_id(Manager::instance().getAccountFromCall(id)); + std::string account_id(call->getAccountId()); SIPAccount *account = Manager::instance().getSipAccount(account_id); if (account == NULL) @@ -1449,14 +1454,15 @@ SIPVoIPLink::requestKeyframe(const std::string &callID) void SIPVoIPLink::carryingDTMFdigits(const std::string& id, char code) { - std::string accountID(Manager::instance().getAccountFromCall(id)); + SIPCall *call = getSipCall(id); + if (!call) + return; + + const std::string accountID(call->getAccountId()); SIPAccount *account = Manager::instance().getSipAccount(accountID); if (!account) return; - SIPCall *call = getSipCall(id); - if (!call) - return; dtmfSend(*call, code, account->getDtmfType()); } @@ -1464,8 +1470,8 @@ SIPVoIPLink::carryingDTMFdigits(const std::string& id, char code) bool SIPVoIPLink::SIPStartCall(SIPCall *call) { - std::string id(Manager::instance().getAccountFromCall(call->getCallId())); - SIPAccount *account = Manager::instance().getSipAccount(id); + std::string account_id(call->getAccountId()); + SIPAccount *account = Manager::instance().getSipAccount(account_id); if (account == NULL) { ERROR("Account is NULL in SIPStartCall"); @@ -1614,7 +1620,7 @@ void invite_session_state_changed_cb(pjsip_inv_session *inv, pjsip_event *ev) // After we sent or received a ACK - The connection is established link->SIPCallAnswered(call, ev->body.tsx_state.src.rdata); } else if (inv->state == PJSIP_INV_STATE_DISCONNECTED) { - std::string accId(Manager::instance().getAccountFromCall(call->getCallId())); + std::string accId(call->getAccountId()); switch (inv->cause) { // The call terminates normally - BYE / CANCEL @@ -1651,7 +1657,7 @@ void sdp_request_offer_cb(pjsip_inv_session *inv, const pjmedia_sdp_session *off if (!call) return; - std::string accId(Manager::instance().getAccountFromCall(call->getCallId())); + std::string accId(call->getAccountId()); SIPAccount *account = Manager::instance().getSipAccount(accId); if (!account) return; @@ -1669,7 +1675,7 @@ void sdp_create_offer_cb(pjsip_inv_session *inv, pjmedia_sdp_session **p_offer) SIPCall *call = static_cast<SIPCall*>(inv->mod_data[mod_ua_.id]); if (!call) return; - std::string accountid(Manager::instance().getAccountFromCall(call->getCallId())); + std::string accountid(call->getAccountId()); SIPAccount *account = Manager::instance().getSipAccount(accountid); if (!account) @@ -1813,7 +1819,7 @@ void sdp_media_update_cb(pjsip_inv_session *inv, pj_status_t status) call->getAudioRtp().stop(); call->getAudioRtp().setSrtpEnabled(false); - std::string accountID = Manager::instance().getAccountFromCall(call->getCallId()); + const std::string accountID = call->getAccountId(); SIPAccount *sipaccount = Manager::instance().getSipAccount(accountID); if (sipaccount and sipaccount->getSrtpFallback()) @@ -2141,7 +2147,8 @@ void onCallTransfered(pjsip_inv_session *inv, pjsip_rx_data *rdata) } try { - SIPVoIPLink::instance()->newOutgoingCall(Manager::instance().getNewCallID(), std::string(refer_to->hvalue.ptr, refer_to->hvalue.slen)); + SIPVoIPLink::instance()->newOutgoingCall(Manager::instance().getNewCallID(), + std::string(refer_to->hvalue.ptr, refer_to->hvalue.slen), currentCall->getAccountId()); Manager::instance().hangupCall(currentCall->getCallId()); } catch (const VoipLinkException &e) { ERROR("%s", e.what()); @@ -2230,7 +2237,7 @@ namespace { void setCallMediaLocal(SIPCall* call, const std::string &localIP) { - std::string account_id(Manager::instance().getAccountFromCall(call->getCallId())); + std::string account_id(call->getAccountId()); SIPAccount *account = Manager::instance().getSipAccount(account_id); if (!account) return; diff --git a/daemon/src/sip/sipvoiplink.h b/daemon/src/sip/sipvoiplink.h index bd6585f97a4129a201c8ef6636ced19fb44ad8c9..1664c182926933e49bf144ef29ba1357b12be891 100644 --- a/daemon/src/sip/sipvoiplink.h +++ b/daemon/src/sip/sipvoiplink.h @@ -128,7 +128,7 @@ class SIPVoIPLink : public VoIPLink { * @param toUrl The Sip address of the recipient of the call * @return Call* The current call */ - virtual Call* newOutgoingCall(const std::string& id, const std::string& toUrl); + virtual Call* newOutgoingCall(const std::string& id, const std::string& toUrl, const std::string &account_id); /** * Start a new SIP call using the IP2IP profile @@ -142,7 +142,7 @@ class SIPVoIPLink : public VoIPLink { * @param The call id * @param The target sip uri */ - Call *newRegisteredAccountCall(const std::string& id, const std::string& toUrl); + Call *newRegisteredAccountCall(const std::string& id, const std::string& toUrl, const std::string &account_id); /** * Answer the call @@ -268,6 +268,8 @@ class SIPVoIPLink : public VoIPLink { #endif void clearSipCallMap(); void addSipCall(SIPCall* call); + bool hasCalls(); + SIPCall* getSipCall(const std::string& id); SIPCall* tryGetSipCall(const std::string& id); void removeSipCall(const std::string &id); diff --git a/daemon/src/voiplink.h b/daemon/src/voiplink.h index 8f53edaec7f9ea8b9aa10b8168cb4ac0ca202fcb..4ec28a3c0cdd2b3f404052b6c4d8f8a1d77c3777 100644 --- a/daemon/src/voiplink.h +++ b/daemon/src/voiplink.h @@ -80,7 +80,8 @@ class VoIPLink { * @return Call* The current call */ virtual Call* newOutgoingCall(const std::string &id, - const std::string &toUrl) = 0; + const std::string &toUrl, + const std::string &account_id) = 0; /** * Answer the call @@ -149,6 +150,8 @@ class VoIPLink { virtual std::string getCurrentVideoCodecName(Call *call) const = 0; virtual std::string getCurrentAudioCodecNames(Call *call) const = 0; + virtual bool hasCalls() = 0; + /** * Send a message to a call identified by its callid *