diff --git a/sflphone-common/src/sip/sipvoiplink.cpp b/sflphone-common/src/sip/sipvoiplink.cpp index e2c0fda5f1d72b4972c35cf944c56b5208df67ca..db38c7cb935571fc93d3c1799c7b29999cb360d7 100644 --- a/sflphone-common/src/sip/sipvoiplink.cpp +++ b/sflphone-common/src/sip/sipvoiplink.cpp @@ -599,28 +599,18 @@ int SIPVoIPLink::sendRegister (AccountID id) // Initializes registration status = pjsip_regc_init (regc, &pjSrv, &pjFrom, &pjFrom, 1, &pjContact, expire_value); - - if (! (account->getServiceRoute().empty())) { - - pjsip_route_hdr *route_set = pjsip_route_hdr_create (_pool); - pjsip_route_hdr *routing = pjsip_route_hdr_create (_pool); - pjsip_sip_uri *url = pjsip_sip_uri_create (_pool, 0); - routing->name_addr.uri = (pjsip_uri*) url; - // account->getServiceRoute().append(";lr"); - _error ("UserAgent: Set Service-Route with %s", account->getServiceRoute().c_str()); - pj_strdup2 (_pool, &url->host, account->getServiceRoute().c_str()); - - pj_list_push_back (&route_set, pjsip_hdr_clone (_pool, routing)); - - pjsip_regc_set_route_set (regc, route_set); - } - if (status != PJ_SUCCESS) { _debug ("UserAgent: Unable to initialize account %d in sendRegister", status); _mutexSIP.leaveMutex(); return false; } + // Fill route set + if (! (account->getServiceRoute().empty())) { + pjsip_route_hdr *route_set = createRouteSet(account); + pjsip_regc_set_route_set (regc, route_set); + } + pjsip_cred_info *cred = account->getCredInfo(); int credential_count = account->getCredentialCount(); _debug ("UserAgent: setting %d credentials in sendRegister", credential_count); @@ -636,9 +626,8 @@ int SIPVoIPLink::sendRegister (AccountID id) pj_list_push_back (&hdr_list, (pjsip_hdr*) h); pjsip_regc_add_headers (regc, &hdr_list); - status = pjsip_regc_register (regc, PJ_TRUE, &tdata); - if (status != PJ_SUCCESS) { + if ((status = pjsip_regc_register (regc, PJ_TRUE, &tdata)) != PJ_SUCCESS) { _debug ("UserAgent: Unable to register regc."); _mutexSIP.leaveMutex(); return false; @@ -871,15 +860,7 @@ SIPVoIPLink::answer (const CallID& id) // if (! (account->getServiceRoute().empty())) { // -// pjsip_route_hdr *route_set = pjsip_route_hdr_create (_pool); -// pjsip_route_hdr *routing = pjsip_route_hdr_create (_pool); -// pjsip_sip_uri *url = pjsip_sip_uri_create (_pool, 0); -// routing->name_addr.uri = (pjsip_uri*) url; -// _error ("UserAgent: Set Service-Route with %s", account->getServiceRoute().c_str()); -// pj_strdup2 (_pool, &url->host, account->getServiceRoute().c_str()); -// -// pj_list_push_back (&route_set, pjsip_hdr_clone (_pool, routing)); -// +// pjsip_route_hdr *route_set = createRouteSet(account); // pjsip_dlg_set_route_set (inv_session->dlg, route_set); // } @@ -938,17 +919,7 @@ SIPVoIPLink::hangup (const CallID& id) // _debug("Some tdata info: %",); if (! (account->getServiceRoute().empty())) { - - _error ("UserAgent: Set Service-Route with %s", account->getServiceRoute().c_str()); - - pjsip_route_hdr *route_set = pjsip_route_hdr_create (_pool); - pjsip_route_hdr *routing = pjsip_route_hdr_create (_pool); - pjsip_sip_uri *url = pjsip_sip_uri_create (_pool, 0); - routing->name_addr.uri = (pjsip_uri*) url; - pj_strdup2 (_pool, &url->host, account->getServiceRoute().c_str()); - - pj_list_push_back (&route_set, pjsip_hdr_clone (_pool, routing)); - + pjsip_route_hdr *route_set = createRouteSet(account); pjsip_dlg_set_route_set (inv->dlg, route_set); } @@ -1658,17 +1629,7 @@ SIPVoIPLink::SIPStartCall (SIPCall* call, const std::string& subject UNUSED) if (! (account->getServiceRoute().empty())) { - - _error ("UserAgent: Set Service-Route with %s", account->getServiceRoute().c_str()); - - pjsip_route_hdr *route_set = pjsip_route_hdr_create (_pool); - pjsip_route_hdr *routing = pjsip_route_hdr_create (_pool); - pjsip_sip_uri *url = pjsip_sip_uri_create (_pool, 0); - routing->name_addr.uri = (pjsip_uri*) url; - pj_strdup2 (_pool, &url->host, account->getServiceRoute().c_str()); - - pj_list_push_back (&route_set, pjsip_hdr_clone (_pool, routing)); - + pjsip_route_hdr *route_set = createRouteSet(account); pjsip_dlg_set_route_set (dialog, route_set); } @@ -1947,17 +1908,7 @@ bool SIPVoIPLink::new_ip_to_ip_call (const CallID& id, const std::string& to) PJ_ASSERT_RETURN (status == PJ_SUCCESS, false); if (! (account->getServiceRoute().empty())) { - - _error ("UserAgent: Set Service-Route with %s", account->getServiceRoute().c_str()); - - pjsip_route_hdr *route_set = pjsip_route_hdr_create (_pool); - pjsip_route_hdr *routing = pjsip_route_hdr_create (_pool); - pjsip_sip_uri *url = pjsip_sip_uri_create (_pool, 0); - routing->name_addr.uri = (pjsip_uri*) url; - pj_strdup2 (_pool, &url->host, account->getServiceRoute().c_str()); - - pj_list_push_back (&route_set, pjsip_hdr_clone (_pool, routing)); - + pjsip_route_hdr *route_set = createRouteSet(account); pjsip_dlg_set_route_set (dialog, route_set); } @@ -3029,25 +2980,69 @@ bool SIPVoIPLink::loadSIPLocalIP (std::string *addr) return returnValue; } -bool SIPVoIPLink::dnsResolution(std::string& name) { +pjsip_route_hdr *SIPVoIPLink::createRouteSet(Account *account) +{ + size_t found; + std::string host = ""; + std::string port = ""; + pjsip_route_hdr *route_set; + + SIPAccount *sipaccount = dynamic_cast<SIPAccount *>(account); + std::string route = sipaccount->getServiceRoute(); + _error ("UserAgent: Set Service-Route with %s", route.c_str()); + + found = route.find(":"); + if(found != std::string::npos) { + host = route.substr(0, found); + port = route.substr(found + 1, route.length()); + } + else { + host = route; + port = "0"; + } + + std::cout << "Host: " << host << ", Port: " << port << std::endl; + + route_set = pjsip_route_hdr_create (_pool); + pjsip_route_hdr *routing = pjsip_route_hdr_create (_pool); + pjsip_sip_uri *url = pjsip_sip_uri_create (_pool, 0); + routing->name_addr.uri = (pjsip_uri*) url; + pj_strdup2 (_pool, &url->host, host.c_str()); + url->port = atoi(port.c_str()); + + pj_list_push_back (route_set, pjsip_hdr_clone (_pool, routing)); + + return route_set; + +} + +bool SIPVoIPLink::dnsResolution(pjsip_tx_data *tdata) { pj_addrinfo ai; unsigned count; - int af; - pjsip_server_addresses svr_addr; + // pjsip_server_addresses svr_addr; pj_status_t status; + pjsip_host_info dest_info; + + _debug("UserAgent: Dns Resolution"); - pjsip_host_info *target; + int af = pj_AF_INET(); - af = pj_AF_INET(); + status = pjsip_process_route_set(tdata, &dest_info); - pj_sockaddr_init(pj_AF_INET(), &svr_addr.entry[0].addr, NULL, 0); + pj_sockaddr_init(pj_AF_INET(), &tdata->dest_info.addr.entry[0].addr, NULL, 0); /* Resolve */ count = 1; - status = pj_getaddrinfo(af, &target->addr.host, &count, &ai); + if((status = pj_getaddrinfo(af, &dest_info.addr.host, &count, &ai)) != PJ_SUCCESS) { + _error("UserAgent: Unable to perform DNS resolution"); + } + + _debug("UserAgent: Found address %s", pj_inet_ntoa (ai.ai_addr.ipv4.sin_addr)); + + tdata->dest_info.addr.entry[0].addr.addr.sa_family = (pj_uint16_t)af; + pj_memcpy(&tdata->dest_info.addr.entry[0].addr, &ai.ai_addr, sizeof(pj_sockaddr)); - svr_addr.entry[0].addr.addr.sa_family = (pj_uint16_t)af; - pj_memcpy(&svr_addr.entry[0].addr, &ai.ai_addr, sizeof(pj_sockaddr)); + tdata->dest_info.addr.count = count; return true; } diff --git a/sflphone-common/src/sip/sipvoiplink.h b/sflphone-common/src/sip/sipvoiplink.h index 8efa336c64a2f9d3a2e7521e107bc6457dc0129d..3d3523b50ead8f0156044be9e3dcbd6158ffd722 100644 --- a/sflphone-common/src/sip/sipvoiplink.h +++ b/sflphone-common/src/sip/sipvoiplink.h @@ -377,10 +377,15 @@ class SIPVoIPLink : public VoIPLink */ bool loadSIPLocalIP (std::string *addr); + /** + * Helper function for creating a route set + */ + pjsip_route_hdr *createRouteSet(Account *account); + /** * Wrapper around getaddrinfo */ - bool dnsResolution(std::string& name); + bool dnsResolution(pjsip_tx_data *tdata); /** * This function unset the transport for a given account. It tests wether the