diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp index 1464d8ae5996e0947cd0ccb934ba6bc6fe3eafa5..4c3a128d934745a4cc73880f91faa160d635bf57 100644 --- a/daemon/src/managerimpl.cpp +++ b/daemon/src/managerimpl.cpp @@ -197,14 +197,6 @@ bool ManagerImpl::outgoingCall(const std::string& account_id, std::string to_cleaned(NumberCleaner::clean(to, prefix)); - static const char * const SIP_SCHEME = "sip:"; - static const char * const SIPS_SCHEME = "sips:"; - - bool IPToIP = to_cleaned.find(SIP_SCHEME) == 0 or - to_cleaned.find(SIPS_SCHEME) == 0; - - setIPToIPForCall(call_id, IPToIP); - // in any cases we have to detach from current communication if (hasCurrentCall()) { DEBUG("Manager: Has current call (%s) put it onhold", current_call_id.c_str()); @@ -216,29 +208,21 @@ bool ManagerImpl::outgoingCall(const std::string& account_id, detachParticipant(MainBuffer::DEFAULT_ID, current_call_id); } - if (IPToIP) { - DEBUG("Manager: Start IP2IP call"); - - /* We need to retrieve the sip voiplink instance */ - if (SIPVoIPLink::instance()->SIPNewIpToIpCall(call_id, to_cleaned)) { - switchCall(call_id); - return true; - } else - callFailure(call_id); - - return false; - } - DEBUG("Manager: Selecting account %s", account_id.c_str()); - // Is this account exist + // fallback using the default sip account if the specied doesn't exist + std::string use_account_id = ""; if (!accountExists(account_id)) { - ERROR("Manager: Error: Account doesn't exist in new outgoing call"); - return false; + WARN("Manager: Account does not exist, trying with default SIP account"); + use_account_id = SIPAccount::IP2IP_PROFILE; + } + else { + use_account_id = account_id; } - if (!associateCallToAccount(call_id, account_id)) - WARN("Manager: Warning: Could not associate call id %s to account id %s", call_id.c_str(), account_id.c_str()); + // Is this account exist + if (!associateCallToAccount(call_id, use_account_id)) + WARN("Manager: Warning: Could not associate call id %s to account id %s", call_id.c_str(), use_account_id.c_str()); try { Call *call = getAccountLink(account_id)->newOutgoingCall(call_id, to_cleaned); @@ -2491,6 +2475,8 @@ void ManagerImpl::removeAccount(const std::string& accountID) bool ManagerImpl::associateCallToAccount(const std::string& callID, const std::string& accountID) { + std::string useAccountID = accountID; + if (getAccountFromCall(callID).empty() and accountExists(accountID)) { // account id exist in AccountMap ost::MutexLock m(callAccountMapMutex_); @@ -2684,8 +2670,8 @@ ManagerImpl::getAccount(const std::string& accountID) AccountMap::const_iterator iter = accountMap_.find(accountID); if (iter != accountMap_.end()) return iter->second; - else - return accountMap_[SIPAccount::IP2IP_PROFILE]; + + return accountMap_[SIPAccount::IP2IP_PROFILE]; } std::string ManagerImpl::getAccountIdFromNameAndServer(const std::string& userName, const std::string& server) const diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h index 159d8f9c0d21b45604575a687d762f4b44c1f9e5..eafec01c49410e0afcaffedde8f17154d22e5caf 100644 --- a/daemon/src/managerimpl.h +++ b/daemon/src/managerimpl.h @@ -961,7 +961,6 @@ class ManagerImpl { std::map<std::string, bool> IPToIPMap_; - void setIPToIPForCall(const std::string& callID, bool IPToIP); bool isIPToIP(const std::string& callID) const; @@ -999,6 +998,8 @@ class ManagerImpl { public: + 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 diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp index 4d70a1f4cf4c8e6ddf3b8a267a68211a661871fb..469bb24f7fb59753a6d02f8d4fbd0c25c8e946ec 100644 --- a/daemon/src/sip/sipvoiplink.cpp +++ b/daemon/src/sip/sipvoiplink.cpp @@ -617,6 +617,78 @@ void SIPVoIPLink::cancelKeepAliveTimer(pj_timer_entry& timer) Call *SIPVoIPLink::newOutgoingCall(const std::string& id, const std::string& toUrl) { + static const char * const SIP_SCHEME = "sip:"; + static const char * const SIPS_SCHEME = "sips:"; + + DEBUG("UserAgent: New outgoing call"); + + bool IPToIP = toUrl.find(SIP_SCHEME) == 0 or + toUrl.find(SIPS_SCHEME) == 0; + + Manager::instance().setIPToIPForCall(id, IPToIP); + + try { + if (IPToIP) { + return SIPNewIpToIpCall(id, toUrl); + } + else { + return newRegisteredAccountCall(id, toUrl); + } + } + catch(...) { + throw; + } +} + +Call *SIPVoIPLink::SIPNewIpToIpCall(const std::string& id, const std::string& to) +{ + DEBUG("UserAgent: New IP to IP call to %s", to.c_str()); + + SIPAccount *account = Manager::instance().getIP2IPAccount(); + + if (!account) + throw VoipLinkException("Could not retrieve default account for IP2IP call"); + + SIPCall *call = new SIPCall(id, Call::OUTGOING, cp_); + + call->setIPToIP(true); + call->initRecFilename(to); + + std::string localAddress(SipTransport::getInterfaceAddrFromName(account->getLocalInterface())); + + if (localAddress == "0.0.0.0") + localAddress = SipTransport::getSIPLocalIP(); + + setCallMediaLocal(call, localAddress); + + std::string toUri = account->getToUri(to); + call->setPeerNumber(toUri); + + sfl::Codec* audiocodec = Manager::instance().audioCodecFactory.instantiateCodec(PAYLOAD_CODEC_ULAW); + + // Audio Rtp Session must be initialized before creating initial offer in SDP session + // since SDES require crypto attribute. + call->getAudioRtp().initConfig(); + call->getAudioRtp().initSession(); + call->getAudioRtp().initLocalCryptoInfo(); + call->getAudioRtp().start(static_cast<sfl::AudioCodec *>(audiocodec)); + + // Building the local SDP offer + call->getLocalSDP()->setLocalIP(localAddress); + call->getLocalSDP()->createOffer(account->getActiveCodecs()); + + if (!SIPStartCall(call)) { + delete call; + throw VoipLinkException("Could not create new call"); + } + + return call; +} + +Call *SIPVoIPLink::newRegisteredAccountCall(const std::string& id, const std::string& toUrl) +{ + DEBUG("UserAgent: New registered account call to %s", toUrl.c_str()); + SIPAccount *account = dynamic_cast<SIPAccount *>(Manager::instance().getAccount(Manager::instance().getAccountFromCall(id))); if (account == NULL) // TODO: We should investigate how we could get rid of this error and create a IP2IP call instead @@ -1115,51 +1187,6 @@ SIPVoIPLink::getSIPCall(const std::string& id) return result; } -bool SIPVoIPLink::SIPNewIpToIpCall(const std::string& id, const std::string& to) -{ - SIPAccount *account = Manager::instance().getIP2IPAccount(); - - if (!account) { - ERROR("Error could not retrieve default account for IP2IP call"); - return false; - } - - SIPCall *call = new SIPCall(id, Call::OUTGOING, cp_); - call->setIPToIP(true); - call->initRecFilename(to); - - std::string localAddress(SipTransport::getInterfaceAddrFromName(account->getLocalInterface())); - - if (localAddress == "0.0.0.0") - localAddress = SipTransport::getSIPLocalIP(); - - setCallMediaLocal(call, localAddress); - - std::string toUri = account->getToUri(to); - call->setPeerNumber(toUri); - - sfl::Codec* audiocodec = Manager::instance().audioCodecFactory.instantiateCodec(PAYLOAD_CODEC_ULAW); - - // Audio Rtp Session must be initialized before creating initial offer in SDP session - // since SDES require crypto attribute. - call->getAudioRtp().initConfig(); - call->getAudioRtp().initSession(); - call->getAudioRtp().initLocalCryptoInfo(); - call->getAudioRtp().start(static_cast<sfl::AudioCodec *>(audiocodec)); - - // Building the local SDP offer - call->getLocalSDP()->setLocalIP(localAddress); - call->getLocalSDP()->createOffer(account->getActiveCodecs()); - - if (!SIPStartCall(call)) { - delete call; - return false; - } - - return true; -} - - /////////////////////////////////////////////////////////////////////////////// // Private functions /////////////////////////////////////////////////////////////////////////////// diff --git a/daemon/src/sip/sipvoiplink.h b/daemon/src/sip/sipvoiplink.h index 433001153dca61356c0f56ffa59950963e758df2..01ea3c1ffd77087ba6d2cc094099d4f4bcdd4e04 100644 --- a/daemon/src/sip/sipvoiplink.h +++ b/daemon/src/sip/sipvoiplink.h @@ -107,6 +107,20 @@ class SIPVoIPLink : public VoIPLink { */ virtual Call* newOutgoingCall(const std::string& id, const std::string& toUrl); + /** + * Start a new SIP call using the IP2IP profile + * @param The call id + * @param The target sip uri + */ + Call *SIPNewIpToIpCall(const std::string& id, const std::string& to); + + /** + * Place a call using the currently selected account + * @param The call id + * @param The target sip uri + */ + Call *newRegisteredAccountCall(const std::string& id, const std::string& toUrl); + /** * Answer the call * @param c The call @@ -169,13 +183,6 @@ class SIPVoIPLink : public VoIPLink { */ virtual void carryingDTMFdigits(const std::string& id, char code); - /** - * Start a new SIP call using the IP2IP profile - * @param The call id - * @param The target sip uri - */ - bool SIPNewIpToIpCall(const std::string& id, const std::string& to); - /** * Tell the user that the call was answered * @param diff --git a/gnome/src/actions.c b/gnome/src/actions.c index d74a3987709ab3454eba7e42acdbe1798c7ae472..b14c0e4aeb5771eba42255f481f4d578d4ac15f0 100644 --- a/gnome/src/actions.c +++ b/gnome/src/actions.c @@ -816,7 +816,9 @@ void sflphone_place_call(callable_obj_t * c) { DEBUG("Actions: Placing call with %s @ %s and accountid %s", c->_display_name, c->_peer_number, c->_accountID); - + if (place_registered_call(c) < 0) + DEBUG("An error occured while placing registered call in %s at %d", __FILE__, __LINE__); +/* if (is_direct_call(c)) { gchar *msg = g_markup_printf_escaped(_("Direct SIP call")); statusbar_pop_message(__MSG_ACCOUNT_DEFAULT); @@ -826,6 +828,7 @@ sflphone_place_call(callable_obj_t * c) place_direct_call(c); } else if (place_registered_call(c) < 0) DEBUG("An error occured while placing registered call in %s at %d", __FILE__, __LINE__); +*/ }