diff --git a/daemon/src/sip/sip_utils.cpp b/daemon/src/sip/sip_utils.cpp index 8b98f0c44967b399ef4b7c1cb985b5321fdea296..a412c550a39761736c2ec2fc68d453c223ba55a5 100644 --- a/daemon/src/sip/sip_utils.cpp +++ b/daemon/src/sip/sip_utils.cpp @@ -29,9 +29,20 @@ * as that of the covered work. */ +#include <pjsip.h> +#include <pjlib.h> +#include <pjsip_ua.h> +#include <pjlib-util.h> +#include <pjnath.h> +#include <pjnath/stun_config.h> +#include <pj/string.h> +#include <pjsip/sip_msg.h> +#include <pjsip/sip_types.h> +#include <pjsip/sip_uri.h> +#include <pj/list.h> + + #include "sip_utils.h" -#include "pj/string.h" -#include "pjsip/sip_msg.h" std::string sip_utils::fetchHeaderValue(pjsip_msg *msg, const std::string &field) @@ -51,3 +62,66 @@ sip_utils::fetchHeaderValue(pjsip_msg *msg, const std::string &field) else return ""; } + +pjsip_route_hdr * +sip_utils::createRouteSet(const std::string &route, pj_pool_t *hdr_pool) +{ + int port = 0; + std::string host; + + size_t found = route.find(":"); + + if (found != std::string::npos) { + host = route.substr(0, found); + port = atoi(route.substr(found + 1, route.length()).c_str()); + } else + host = route; + + pjsip_route_hdr *route_set = pjsip_route_hdr_create(hdr_pool); + pjsip_route_hdr *routing = pjsip_route_hdr_create(hdr_pool); + pjsip_sip_uri *url = pjsip_sip_uri_create(hdr_pool, 0); + routing->name_addr.uri = (pjsip_uri*) url; + pj_strdup2(hdr_pool, &url->host, host.c_str()); + url->port = port; + + pj_list_push_back(route_set, pjsip_hdr_clone(hdr_pool, routing)); + + return route_set; +} + + +std::string +sip_utils::parseDisplayName(const char * buffer) +{ + const char* from_header = strstr(buffer, "From: "); + + if (!from_header) + return ""; + + std::string temp(from_header); + size_t begin_displayName = temp.find("\"") + 1; + size_t end_displayName = temp.rfind("\""); + std::string displayName(temp.substr(begin_displayName, end_displayName - begin_displayName)); + + static const size_t MAX_DISPLAY_NAME_SIZE = 25; + if (displayName.size() > MAX_DISPLAY_NAME_SIZE) + return ""; + + return displayName; +} + +void +sip_utils::stripSipUriPrefix(std::string& sipUri) +{ + // Remove sip: prefix + static const char SIP_PREFIX[] = "sip:"; + size_t found = sipUri.find(SIP_PREFIX); + + if (found != std::string::npos) + sipUri.erase(found, found + (sizeof SIP_PREFIX) - 1); + + found = sipUri.find("@"); + + if (found != std::string::npos) + sipUri.erase(found); +} diff --git a/daemon/src/sip/sip_utils.h b/daemon/src/sip/sip_utils.h index 1a8d8bff4200e02312286fd8cad5e3dedfa01e84..4d430af97c99fd307eb7e67483cedba6ee128ef9 100644 --- a/daemon/src/sip/sip_utils.h +++ b/daemon/src/sip/sip_utils.h @@ -34,6 +34,8 @@ #include <string> +#include <pjsip/sip_msg.h> + class pjsip_msg; namespace sip_utils { @@ -42,6 +44,12 @@ namespace sip_utils { * @return Header from SIP message */ std::string fetchHeaderValue(pjsip_msg *msg, const std::string &field); + + pjsip_route_hdr *createRouteSet(const std::string &route, pj_pool_t *hdr_pool); + + void stripSipUriPrefix(std::string& sipUri); + + std::string parseDisplayName(const char * buffer); } #endif // SIP_UTILS_H_ diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp index b40c9190f65e0144672fe1ef2ea248c63e894d46..fcf77f5d1f61dd0e734134ae0f203e525c9dbce1 100644 --- a/daemon/src/sip/sipvoiplink.cpp +++ b/daemon/src/sip/sipvoiplink.cpp @@ -35,6 +35,8 @@ #include "config.h" #endif +#include "sip_utils.h" + #include "sipvoiplink.h" #include "manager.h" #include "logger.h" @@ -115,7 +117,7 @@ int SIPSessionReinvite(SIPCall *); * Helper function to process refer function on call transfer */ void onCallTransfered(pjsip_inv_session *inv, pjsip_rx_data *rdata); - +/* pjsip_route_hdr *createRouteSet(const std::string &route, pj_pool_t *hdr_pool) { int port = 0; @@ -140,6 +142,7 @@ pjsip_route_hdr *createRouteSet(const std::string &route, pj_pool_t *hdr_pool) return route_set; } +*/ void handleIncomingOptions(pjsip_rx_data *rdata) { @@ -192,6 +195,7 @@ pj_bool_t transaction_response_cb(pjsip_rx_data *rdata) return PJ_SUCCESS; } +/* std::string parseDisplayName(const char * buffer) { const char* from_header = strstr(buffer, "From: "); @@ -225,6 +229,7 @@ void stripSipUriPrefix(std::string& sipUri) if (found != std::string::npos) sipUri.erase(found); } +*/ pj_bool_t transaction_request_cb(pjsip_rx_data *rdata) { @@ -239,7 +244,7 @@ pj_bool_t transaction_request_cb(pjsip_rx_data *rdata) std::string server(sip_from_uri->host.ptr, sip_from_uri->host.slen); std::string account_id(Manager::instance().getAccountIdFromNameAndServer(userName, server)); - std::string displayName(parseDisplayName(rdata->msg_info.msg_buf)); + std::string displayName(sip_utils::parseDisplayName(rdata->msg_info.msg_buf)); if (method->id == PJSIP_OTHER_METHOD) { pj_str_t *str = &method->name; @@ -308,7 +313,7 @@ pj_bool_t transaction_request_cb(pjsip_rx_data *rdata) char tmp[PJSIP_MAX_URL_SIZE]; int length = pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, sip_from_uri, tmp, PJSIP_MAX_URL_SIZE); std::string peerNumber(tmp, length); - stripSipUriPrefix(peerNumber); + sip_utils::stripSipUriPrefix(peerNumber); call->setConnectionState(Call::PROGRESSING); call->setPeerNumber(peerNumber); @@ -568,7 +573,7 @@ void SIPVoIPLink::sendRegister(Account *a) throw VoipLinkException("Unable to initialize account registration structure"); if (!account->getServiceRoute().empty()) - pjsip_regc_set_route_set(regc, createRouteSet(account->getServiceRoute(), pool_)); + pjsip_regc_set_route_set(regc, sip_utils::createRouteSet(account->getServiceRoute(), pool_)); pjsip_regc_set_credentials(regc, account->getCredentialCount(), account->getCredInfo()); @@ -757,7 +762,7 @@ SIPVoIPLink::hangup(const std::string& id) // Looks for sip routes if (not account->getServiceRoute().empty()) { - pjsip_route_hdr *route_set = createRouteSet(account->getServiceRoute(), inv->pool); + pjsip_route_hdr *route_set = sip_utils::createRouteSet(account->getServiceRoute(), inv->pool); pjsip_dlg_set_route_set(inv->dlg, route_set); } @@ -1083,7 +1088,7 @@ SIPVoIPLink::SIPStartCall(SIPCall *call) return false; if (not account->getServiceRoute().empty()) - pjsip_dlg_set_route_set(dialog, createRouteSet(account->getServiceRoute(), call->inv->pool)); + pjsip_dlg_set_route_set(dialog, sip_utils::createRouteSet(account->getServiceRoute(), call->inv->pool)); pjsip_auth_clt_set_credentials(&dialog->auth_sess, account->getCredentialCount(), account->getCredInfo()); diff --git a/daemon/src/sip/sipvoiplink.h b/daemon/src/sip/sipvoiplink.h index 22e6f72dda3c27d25095f04dff24eb425f756e3e..51e443583e4dc63370c1be02b9b7bd194891162b 100644 --- a/daemon/src/sip/sipvoiplink.h +++ b/daemon/src/sip/sipvoiplink.h @@ -13,6 +13,7 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. *