163
163
return route_set;
166
void handleIncomingOptions(pjsip_rx_data *rdata)
168
pjsip_tx_data *tdata;
170
if (pjsip_endpt_create_response(endpt_, rdata, PJSIP_SC_OK, NULL, &tdata) != PJ_SUCCESS)
173
#define ADD_HDR(hdr) do { \
174
const pjsip_hdr *cap_hdr = hdr; \
176
pjsip_msg_add_hdr (tdata->msg, (pjsip_hdr*) pjsip_hdr_clone (tdata->pool, cap_hdr)); \
178
#define ADD_CAP(cap) ADD_HDR(pjsip_endpt_get_capability(endpt_, cap, NULL));
180
ADD_CAP(PJSIP_H_ALLOW);
181
ADD_CAP(PJSIP_H_ACCEPT);
182
ADD_CAP(PJSIP_H_SUPPORTED);
183
ADD_HDR(pjsip_evsub_get_allow_events_hdr(NULL));
185
pjsip_response_addr res_addr;
186
pjsip_get_response_addr(tdata->pool, rdata, &res_addr);
188
if (pjsip_endpt_send_response(endpt_, &res_addr, tdata, NULL, NULL) != PJ_SUCCESS)
189
pjsip_tx_data_dec_ref(tdata);
192
pj_bool_t transaction_response_cb(pjsip_rx_data *rdata)
194
pjsip_dialog *dlg = pjsip_rdata_get_dlg(rdata);
199
pjsip_transaction *tsx = pjsip_rdata_get_tsx(rdata);
201
if (!tsx or tsx->method.id != PJSIP_INVITE_METHOD)
204
if (tsx->status_code / 100 == 2) {
206
* Send an ACK message inside a transaction. PJSIP send automatically, non-2xx ACK response.
207
* ACK for a 2xx response must be send using this method.
209
pjsip_tx_data *tdata;
210
pjsip_dlg_create_request(dlg, &pjsip_ack_method, rdata->msg_info.cseq->cseq, &tdata);
211
pjsip_dlg_send_request(dlg, tdata, -1, NULL);
217
std::string parseDisplayName(const char * buffer)
219
const char* from_header = strstr(buffer, "From: ");
224
std::string temp(from_header);
225
size_t begin_displayName = temp.find("\"") + 1;
226
size_t end_displayName = temp.rfind("\"");
227
std::string displayName(temp.substr(begin_displayName, end_displayName - begin_displayName));
229
static const size_t MAX_DISPLAY_NAME_SIZE = 25;
230
if (displayName.size() > MAX_DISPLAY_NAME_SIZE)
236
void stripSipUriPrefix(std::string& sipUri)
238
// Remove sip: prefix
239
static const char SIP_PREFIX[] = "sip:";
240
size_t found = sipUri.find(SIP_PREFIX);
242
if (found != std::string::npos)
243
sipUri.erase(found, found + (sizeof SIP_PREFIX) - 1);
245
found = sipUri.find("@");
247
if (found != std::string::npos)
251
pj_bool_t transaction_request_cb(pjsip_rx_data *rdata)
253
pjsip_method *method = &rdata->msg_info.msg->line.req.method;
255
if (method->id == PJSIP_ACK_METHOD && pjsip_rdata_get_dlg(rdata))
258
pjsip_sip_uri *sip_to_uri = (pjsip_sip_uri *) pjsip_uri_get_uri(rdata->msg_info.to->uri);
259
pjsip_sip_uri *sip_from_uri = (pjsip_sip_uri *) pjsip_uri_get_uri(rdata->msg_info.from->uri);
260
std::string userName(sip_to_uri->user.ptr, sip_to_uri->user.slen);
261
std::string server(sip_from_uri->host.ptr, sip_from_uri->host.slen);
262
std::string account_id(Manager::instance().getAccountIdFromNameAndServer(userName, server));
264
std::string displayName(parseDisplayName(rdata->msg_info.msg_buf));
266
if (method->id == PJSIP_OTHER_METHOD) {
267
pj_str_t *str = &method->name;
268
std::string request(str->ptr, str->slen);
270
if (request.find("NOTIFY") != (size_t)-1) {
273
if (sscanf((const char*)rdata->msg_info.msg->body->data, "Voice-Message: %d/", &voicemail) == 1 && voicemail != 0)
274
Manager::instance().startVoiceMessageNotification(account_id, voicemail);
277
pjsip_endpt_respond_stateless(endpt_, rdata, PJSIP_SC_OK, NULL, NULL, NULL);
280
} else if (method->id == PJSIP_OPTIONS_METHOD) {
281
handleIncomingOptions(rdata);
283
} else if (method->id != PJSIP_INVITE_METHOD && method->id != PJSIP_ACK_METHOD) {
284
pjsip_endpt_respond_stateless(endpt_, rdata, PJSIP_SC_METHOD_NOT_ALLOWED, NULL, NULL, NULL);
288
SIPAccount *account = dynamic_cast<SIPAccount *>(Manager::instance().getAccount(account_id));
290
pjmedia_sdp_session *r_sdp;
291
pjsip_msg_body *body = rdata->msg_info.msg->body;
293
if (!body || pjmedia_sdp_parse(rdata->tp_info.pool, (char*) body->data, body->len, &r_sdp) != PJ_SUCCESS)
296
if (account->getActiveCodecs().empty()) {
297
pjsip_endpt_respond_stateless(endpt_, rdata,
298
PJSIP_SC_NOT_ACCEPTABLE_HERE, NULL, NULL,
303
// Verify that we can handle the request
304
unsigned options = 0;
306
if (pjsip_inv_verify_request(rdata, &options, NULL, NULL, endpt_, NULL) != PJ_SUCCESS) {
307
pjsip_endpt_respond_stateless(endpt_, rdata, PJSIP_SC_METHOD_NOT_ALLOWED, NULL, NULL, NULL);
311
if (Manager::instance().hookPreference.getSipEnabled()) {
312
std::string header_value(fetchHeaderValue(rdata->msg_info.msg, Manager::instance().hookPreference.getUrlSipField()));
313
UrlHook::runAction(Manager::instance().hookPreference.getUrlCommand(), header_value);
316
SIPCall* call = new SIPCall(Manager::instance().getNewCallID(), Call::INCOMING, cp_);
317
Manager::instance().associateCallToAccount(call->getCallId(), account_id);
319
// May use the published address as well
320
std::string addrToUse = SIPVoIPLink::instance()->getInterfaceAddrFromName(account->getLocalInterface());
321
std::string addrSdp = account->isStunEnabled()
322
? account->getPublishedAddress()
325
pjsip_tpselector *tp = SIPVoIPLink::instance()->initTransportSelector(account->transport_, call->getMemoryPool());
327
if (addrToUse == "0.0.0.0")
328
addrToUse = getSIPLocalIP();
330
if (addrSdp == "0.0.0.0")
333
char tmp[PJSIP_MAX_URL_SIZE];
334
int length = pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, sip_from_uri, tmp, PJSIP_MAX_URL_SIZE);
335
std::string peerNumber(tmp, length);
336
stripSipUriPrefix(peerNumber);
338
call->setConnectionState(Call::PROGRESSING);
339
call->setPeerNumber(peerNumber);
340
call->setDisplayName(displayName);
341
call->initRecFilename(peerNumber);
343
setCallMediaLocal(call, addrToUse);
345
call->getLocalSDP()->setLocalIP(addrSdp);
347
call->getAudioRtp().initAudioRtpConfig();
348
call->getAudioRtp().initAudioSymmetricRtpSession();
350
if (rdata->msg_info.msg->body) {
351
char sdpbuffer[1000];
352
int len = rdata->msg_info.msg->body->print_body(rdata->msg_info.msg->body, sdpbuffer, sizeof sdpbuffer);
354
if (len == -1) // error
357
std::string sdpoffer(sdpbuffer, len);
358
size_t start = sdpoffer.find("a=crypto:");
360
// Found crypto header in SDP
361
if (start != std::string::npos) {
362
CryptoOffer crypto_offer;
363
crypto_offer.push_back(std::string(sdpoffer.substr(start, (sdpoffer.size() - start) - 1)));
365
std::vector<sfl::CryptoSuiteDefinition>localCapabilities;
367
for (int i = 0; i < 3; i++)
368
localCapabilities.push_back(sfl::CryptoSuites[i]);
370
sfl::SdesNegotiator sdesnego(localCapabilities, crypto_offer);
372
if (sdesnego.negotiate()) {
373
call->getAudioRtp().setRemoteCryptoInfo(sdesnego);
374
call->getAudioRtp().initLocalCryptoInfo();
379
call->getLocalSDP()->receiveOffer(r_sdp, account->getActiveCodecs());
381
sfl::Codec* audiocodec = Manager::instance().audioCodecFactory.instantiateCodec(PAYLOAD_CODEC_ULAW);
382
call->getAudioRtp().start(static_cast<sfl::AudioCodec *>(audiocodec));
384
pjsip_dialog* dialog;
386
if (pjsip_dlg_create_uas(pjsip_ua_instance(), rdata, NULL, &dialog) != PJ_SUCCESS) {
388
pjsip_endpt_respond_stateless(endpt_, rdata, PJSIP_SC_INTERNAL_SERVER_ERROR, NULL, NULL, NULL);
392
pjsip_inv_create_uas(dialog, rdata, call->getLocalSDP()->getLocalSdpSession(), 0, &call->inv);
394
PJ_ASSERT_RETURN(pjsip_dlg_set_transport(dialog, tp) == PJ_SUCCESS, 1);
396
call->inv->mod_data[mod_ua_.id] = call;
398
// Check whether Replaces header is present in the request and process accordingly.
399
pjsip_dialog *replaced_dlg;
400
pjsip_tx_data *response;
402
if (pjsip_replaces_verify_request(rdata, &replaced_dlg, PJ_FALSE, &response) != PJ_SUCCESS) {
403
ERROR("Something wrong with Replaces request.");
404
pjsip_endpt_respond_stateless(endpt_, rdata, 500 /* internal server error */, NULL, NULL, NULL);
407
// Check if call has been transfered
408
pjsip_tx_data *tdata;
410
if (replaced_dlg) { // If Replace header present
411
// Always answer the new INVITE with 200, regardless whether
412
// the replaced call is in early or confirmed state.
413
if (pjsip_inv_answer(call->inv, 200, NULL, NULL, &response) == PJ_SUCCESS)
414
pjsip_inv_send_msg(call->inv, response);
416
// Get the INVITE session associated with the replaced dialog.
417
pjsip_inv_session *replaced_inv = pjsip_dlg_get_inv_session(replaced_dlg);
419
// Disconnect the "replaced" INVITE session.
420
if (pjsip_inv_end_session(replaced_inv, PJSIP_SC_GONE, NULL, &tdata) == PJ_SUCCESS && tdata)
421
pjsip_inv_send_msg(replaced_inv, tdata);
422
} else { // Prooceed with normal call flow
423
PJ_ASSERT_RETURN(pjsip_inv_initial_answer(call->inv, rdata, PJSIP_SC_RINGING, NULL, NULL, &tdata) == PJ_SUCCESS, 1);
424
PJ_ASSERT_RETURN(pjsip_inv_send_msg(call->inv, tdata) == PJ_SUCCESS, 1);
426
call->setConnectionState(Call::RINGING);
428
Manager::instance().incomingCall(call, account_id);
429
Manager::instance().getAccountLink(account_id)->addCall(call);
166
434
} // end anonymous namespace
168
436
/*************************************************************************************************/
1180
void SIPVoIPLink::findLocalAddressFromUri(const std::string& uri, pjsip_transport *transport, std::string& addr, std::string &port)
1481
void SIPVoIPLink::findLocalAddressFromTransport(pjsip_transport *transport, pjsip_transport_type_e transportType, std::string &addr, std::string &port) const
1483
// Initialize the sip port with the default SIP port
1182
1484
std::stringstream ss;
1183
1485
ss << DEFAULT_SIP_PORT;
1184
1486
port = ss.str();
1186
pjsip_uri *genericUri = pjsip_parse_uri(pool_, (char*)uri.data(), uri.size(), 0);
1488
// Initialize the sip address with the hostname
1188
1489
const pj_str_t *pjMachineName = pj_gethostname();
1189
1490
addr = std::string(pjMachineName->ptr, pjMachineName->slen);
1191
if (genericUri == NULL)
1194
pjsip_sip_uri *sip_uri = (pjsip_sip_uri*) pjsip_uri_get_uri(genericUri);
1196
if (sip_uri == NULL)
1199
pjsip_transport_type_e transportType;
1201
if (PJSIP_URI_SCHEME_IS_SIPS(sip_uri)) {
1202
transportType = PJSIP_TRANSPORT_TLS;
1204
ss << DEFAULT_SIP_TLS_PORT;
1207
if (transport == NULL)
1208
transport = localUDPTransport_;
1210
transportType = PJSIP_TRANSPORT_UDP;
1492
// Update address and port with active transport
1494
ERROR("SIPVoIPLink: Transport is NULL in findLocalAddress, using local address %s:%s", addr.c_str(), port.c_str());
1498
// get the transport manager associated with the SIP enpoint
1213
1499
pjsip_tpmgr *tpmgr = pjsip_endpt_get_tpmgr(endpt_);
1218
pjsip_tpselector *tp_sel = NULL;
1220
if (transportType == PJSIP_TRANSPORT_UDP and transport)
1221
tp_sel = initTransportSelector(transport, pool_);
1501
ERROR("SIPVoIPLink: Transport manager is NULL in findLocalAddress, using local address %s:%s", addr.c_str(), port.c_str());
1505
// initialize a transport selector
1506
// TODO Need to determine why we exclude TLS here...
1507
// if (transportType == PJSIP_TRANSPORT_UDP and transport_)
1508
pjsip_tpselector *tp_sel = initTransportSelector(transport, pool_);
1510
ERROR("SIPVoIPLink: Could not initialize transport selector, using local address %s:%s", addr.c_str(), port.c_str());
1223
1514
pj_str_t localAddress = {0,0};
1224
1515
int i_port = 0;
1226
if (pjsip_tpmgr_find_local_addr(tpmgr, pool_, transportType, tp_sel, &localAddress, &i_port) != PJ_SUCCESS)
1517
// Find the local address and port for this transport
1518
if (pjsip_tpmgr_find_local_addr(tpmgr, pool_, transportType, tp_sel, &localAddress, &i_port) != PJ_SUCCESS) {
1519
WARN("SIPVoIPLink: Could not retreive local address and port from transport, using %s:%s", addr.c_str(), port.c_str());
1523
// Update local address based on the transport type
1229
1524
addr = std::string(localAddress.ptr, localAddress.slen);
1526
// Fallback on local ip provided by pj_gethostip()
1231
1527
if (addr == "0.0.0.0")
1232
1528
addr = getSIPLocalIP();
1530
// Determine the local port based on transport information
1236
1533
port = ss.str();
1241
std::string parseDisplayName(const char * buffer)
1243
// Parse the display name from "From" header
1244
const char* from_header = strstr(buffer, "From: ");
1249
std::string temp(from_header);
1250
size_t begin_displayName = temp.find("\"") + 1;
1251
size_t end_displayName = temp.rfind("\"");
1252
std::string displayName(temp.substr(begin_displayName, end_displayName - begin_displayName));
1254
static const size_t MAX_DISPLAY_NAME_SIZE = 25;
1255
if (displayName.size() > MAX_DISPLAY_NAME_SIZE)
1261
void stripSipUriPrefix(std::string& sipUri)
1263
// Remove sip: prefix
1264
static const char SIP_PREFIX[] = "sip:";
1265
size_t found = sipUri.find(SIP_PREFIX);
1267
if (found != std::string::npos)
1268
sipUri.erase(found, found + (sizeof SIP_PREFIX) - 1);
1270
found = sipUri.find("@");
1272
if (found != std::string::npos)
1273
sipUri.erase(found);
1276
1537
int SIPSessionReinvite(SIPCall *call)
1278
1539
pjsip_tx_data *tdata;
1586
void registration_cb(struct pjsip_regc_cbparam *param)
1847
void update_contact_header(pjsip_regc_cbparam *param, SIPAccount *account)
1850
SIPVoIPLink *siplink = dynamic_cast<SIPVoIPLink *>(account->getVoIPLink());
1851
if(siplink == NULL) {
1852
ERROR("SIPVoIPLink: Could not find voip link from account");
1856
pj_pool_t *pool = pj_pool_create(&cp_->factory, "tmp", 512, 512, NULL);
1858
ERROR("SIPVoIPLink: Could not create temporary memory pool in transport header");
1862
if (param->contact_cnt == 0) {
1863
WARN("SIPVoIPLink: No contact header in registration callback");
1864
pj_pool_release(pool);
1868
pjsip_contact_hdr *contact_hdr = param->contact[0];
1870
pjsip_sip_uri *uri = (pjsip_sip_uri*) contact_hdr->uri;
1872
ERROR("SIPVoIPLink: Could not find uri in contact header");
1873
pj_pool_release(pool);
1877
// TODO: make this based on transport type
1878
// with pjsip_transport_get_default_port_for_type(tp_type);
1880
uri->port = DEFAULT_SIP_PORT;
1882
std::string recvContactHost(uri->host.ptr, uri->host.slen);
1883
std::stringstream ss;
1885
std::string recvContactPort = ss.str();
1887
std::string currentAddress, currentPort;
1888
siplink->findLocalAddressFromTransport(account->transport_, PJSIP_TRANSPORT_UDP, currentAddress, currentPort);
1890
bool updateContact = false;
1891
std::string currentContactHeader = account->getContactHeader();
1893
size_t foundHost = currentContactHeader.find(recvContactHost);
1894
if(foundHost == std::string::npos) {
1895
updateContact = true;
1898
size_t foundPort = currentContactHeader.find(recvContactPort);
1899
if(foundPort == std::string::npos) {
1900
updateContact = true;
1904
DEBUG("SIPVoIPLink: Update contact header: %s:%s\n", recvContactHost.c_str(), recvContactPort.c_str());
1905
account->setContactHeader(recvContactHost, recvContactPort);
1906
siplink->sendRegister(account);
1908
pj_pool_release(pool);
1911
void registration_cb(pjsip_regc_cbparam *param)
1588
1913
SIPAccount *account = static_cast<SIPAccount *>(param->token);
1590
if (account == NULL)
1915
if (account == NULL) {
1916
ERROR("SipVoipLink: account does'nt exist in registration callback");
1920
if (param == NULL) {
1921
ERROR("SipVoipLink: regsitration callback param is NULL");
1925
if(account->isContactUpdateEnabled()) {
1926
update_contact_header(param, account);
1593
1929
const pj_str_t *description = pjsip_get_status_text(param->code);
1654
static void handleIncomingOptions(pjsip_rx_data *rdata)
1656
pjsip_tx_data *tdata;
1658
if (pjsip_endpt_create_response(endpt_, rdata, PJSIP_SC_OK, NULL, &tdata) != PJ_SUCCESS)
1661
#define ADD_HDR(hdr) do { \
1662
const pjsip_hdr *cap_hdr = hdr; \
1664
pjsip_msg_add_hdr (tdata->msg, (pjsip_hdr*) pjsip_hdr_clone (tdata->pool, cap_hdr)); \
1666
#define ADD_CAP(cap) ADD_HDR(pjsip_endpt_get_capability(endpt_, cap, NULL));
1668
ADD_CAP(PJSIP_H_ALLOW);
1669
ADD_CAP(PJSIP_H_ACCEPT);
1670
ADD_CAP(PJSIP_H_SUPPORTED);
1671
ADD_HDR(pjsip_evsub_get_allow_events_hdr(NULL));
1673
pjsip_response_addr res_addr;
1674
pjsip_get_response_addr(tdata->pool, rdata, &res_addr);
1676
if (pjsip_endpt_send_response(endpt_, &res_addr, tdata, NULL, NULL) != PJ_SUCCESS)
1677
pjsip_tx_data_dec_ref(tdata);
1681
static pj_bool_t transaction_request_cb(pjsip_rx_data *rdata)
1683
pjsip_method *method = &rdata->msg_info.msg->line.req.method;
1685
if (method->id == PJSIP_ACK_METHOD && pjsip_rdata_get_dlg(rdata))
1688
pjsip_sip_uri *sip_to_uri = (pjsip_sip_uri *) pjsip_uri_get_uri(rdata->msg_info.to->uri);
1689
pjsip_sip_uri *sip_from_uri = (pjsip_sip_uri *) pjsip_uri_get_uri(rdata->msg_info.from->uri);
1690
std::string userName(sip_to_uri->user.ptr, sip_to_uri->user.slen);
1691
std::string server(sip_from_uri->host.ptr, sip_from_uri->host.slen);
1692
std::string account_id(Manager::instance().getAccountIdFromNameAndServer(userName, server));
1694
std::string displayName(parseDisplayName(rdata->msg_info.msg_buf));
1696
if (method->id == PJSIP_OTHER_METHOD) {
1697
pj_str_t *str = &method->name;
1698
std::string request(str->ptr, str->slen);
1700
if (request.find("NOTIFY") != (size_t)-1) {
1703
if (sscanf((const char*)rdata->msg_info.msg->body->data, "Voice-Message: %d/", &voicemail) == 1 && voicemail != 0)
1704
Manager::instance().startVoiceMessageNotification(account_id, voicemail);
1707
pjsip_endpt_respond_stateless(endpt_, rdata, PJSIP_SC_OK, NULL, NULL, NULL);
1710
} else if (method->id == PJSIP_OPTIONS_METHOD) {
1711
handleIncomingOptions(rdata);
1713
} else if (method->id != PJSIP_INVITE_METHOD && method->id != PJSIP_ACK_METHOD) {
1714
pjsip_endpt_respond_stateless(endpt_, rdata, PJSIP_SC_METHOD_NOT_ALLOWED, NULL, NULL, NULL);
1718
SIPAccount *account = dynamic_cast<SIPAccount *>(Manager::instance().getAccount(account_id));
1720
pjmedia_sdp_session *r_sdp;
1721
pjsip_msg_body *body = rdata->msg_info.msg->body;
1723
if (!body || pjmedia_sdp_parse(rdata->tp_info.pool, (char*) body->data, body->len, &r_sdp) != PJ_SUCCESS)
1726
if (account->getActiveCodecs().empty()) {
1727
pjsip_endpt_respond_stateless(endpt_, rdata,
1728
PJSIP_SC_NOT_ACCEPTABLE_HERE, NULL, NULL,
1733
// Verify that we can handle the request
1734
unsigned options = 0;
1736
if (pjsip_inv_verify_request(rdata, &options, NULL, NULL, endpt_, NULL) != PJ_SUCCESS) {
1737
pjsip_endpt_respond_stateless(endpt_, rdata, PJSIP_SC_METHOD_NOT_ALLOWED, NULL, NULL, NULL);
1741
if (Manager::instance().hookPreference.getSipEnabled()) {
1742
std::string header_value(fetchHeaderValue(rdata->msg_info.msg, Manager::instance().hookPreference.getUrlSipField()));
1743
UrlHook::runAction(Manager::instance().hookPreference.getUrlCommand(), header_value);
1746
SIPCall* call = new SIPCall(Manager::instance().getNewCallID(), Call::Incoming, cp_);
1747
Manager::instance().associateCallToAccount(call->getCallId(), account_id);
1749
// May use the published address as well
1750
std::string addrToUse = SIPVoIPLink::instance()->getInterfaceAddrFromName(account->getLocalInterface());
1751
std::string addrSdp = account->isStunEnabled()
1752
? account->getPublishedAddress()
1755
pjsip_tpselector *tp = SIPVoIPLink::instance()->initTransportSelector(account->transport_, call->getMemoryPool());
1757
if (addrToUse == "0.0.0.0")
1758
addrToUse = getSIPLocalIP();
1760
if (addrSdp == "0.0.0.0")
1761
addrSdp = addrToUse;
1763
char tmp[PJSIP_MAX_URL_SIZE];
1764
int length = pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, sip_from_uri, tmp, PJSIP_MAX_URL_SIZE);
1765
std::string peerNumber(tmp, length);
1766
stripSipUriPrefix(peerNumber);
1768
call->setConnectionState(Call::Progressing);
1769
call->setPeerNumber(peerNumber);
1770
call->setDisplayName(displayName);
1771
call->initRecFileName(peerNumber);
1773
setCallMediaLocal(call, addrToUse);
1775
call->getLocalSDP()->setLocalIP(addrSdp);
1777
call->getAudioRtp().initAudioRtpConfig();
1778
call->getAudioRtp().initAudioSymmetricRtpSession();
1780
if (rdata->msg_info.msg->body) {
1781
char sdpbuffer[1000];
1782
int len = rdata->msg_info.msg->body->print_body(rdata->msg_info.msg->body, sdpbuffer, sizeof sdpbuffer);
1784
if (len == -1) // error
1787
std::string sdpoffer(sdpbuffer, len);
1788
size_t start = sdpoffer.find("a=crypto:");
1790
// Found crypto header in SDP
1791
if (start != std::string::npos) {
1792
CryptoOffer crypto_offer;
1793
crypto_offer.push_back(std::string(sdpoffer.substr(start, (sdpoffer.size() - start) - 1)));
1795
std::vector<sfl::CryptoSuiteDefinition>localCapabilities;
1797
for (int i = 0; i < 3; i++)
1798
localCapabilities.push_back(sfl::CryptoSuites[i]);
1800
sfl::SdesNegotiator sdesnego(localCapabilities, crypto_offer);
1802
if (sdesnego.negotiate()) {
1803
call->getAudioRtp().setRemoteCryptoInfo(sdesnego);
1804
call->getAudioRtp().initLocalCryptoInfo();
1809
call->getLocalSDP()->receiveOffer(r_sdp, account->getActiveCodecs());
1811
sfl::Codec* audiocodec = Manager::instance().audioCodecFactory.instantiateCodec(PAYLOAD_CODEC_ULAW);
1812
call->getAudioRtp().start(static_cast<sfl::AudioCodec *>(audiocodec));
1814
pjsip_dialog* dialog;
1816
if (pjsip_dlg_create_uas(pjsip_ua_instance(), rdata, NULL, &dialog) != PJ_SUCCESS) {
1818
pjsip_endpt_respond_stateless(endpt_, rdata, PJSIP_SC_INTERNAL_SERVER_ERROR, NULL, NULL, NULL);
1822
pjsip_inv_create_uas(dialog, rdata, call->getLocalSDP()->getLocalSdpSession(), 0, &call->inv);
1824
PJ_ASSERT_RETURN(pjsip_dlg_set_transport(dialog, tp) == PJ_SUCCESS, 1);
1826
call->inv->mod_data[mod_ua_.id] = call;
1828
// Check whether Replaces header is present in the request and process accordingly.
1829
pjsip_dialog *replaced_dlg;
1830
pjsip_tx_data *response;
1832
if (pjsip_replaces_verify_request(rdata, &replaced_dlg, PJ_FALSE, &response) != PJ_SUCCESS) {
1833
ERROR("Something wrong with Replaces request.");
1834
pjsip_endpt_respond_stateless(endpt_, rdata, 500 /* internal server error */, NULL, NULL, NULL);
1837
// Check if call has been transfered
1838
pjsip_tx_data *tdata;
1840
if (replaced_dlg) { // If Replace header present
1841
// Always answer the new INVITE with 200, regardless whether
1842
// the replaced call is in early or confirmed state.
1843
if (pjsip_inv_answer(call->inv, 200, NULL, NULL, &response) == PJ_SUCCESS)
1844
pjsip_inv_send_msg(call->inv, response);
1846
// Get the INVITE session associated with the replaced dialog.
1847
pjsip_inv_session *replaced_inv = pjsip_dlg_get_inv_session(replaced_dlg);
1849
// Disconnect the "replaced" INVITE session.
1850
if (pjsip_inv_end_session(replaced_inv, PJSIP_SC_GONE, NULL, &tdata) == PJ_SUCCESS && tdata)
1851
pjsip_inv_send_msg(replaced_inv, tdata);
1852
} else { // Prooceed with normal call flow
1853
PJ_ASSERT_RETURN(pjsip_inv_initial_answer(call->inv, rdata, PJSIP_SC_RINGING, NULL, NULL, &tdata) == PJ_SUCCESS, 1);
1854
PJ_ASSERT_RETURN(pjsip_inv_send_msg(call->inv, tdata) == PJ_SUCCESS, 1);
1856
call->setConnectionState(Call::Ringing);
1858
Manager::instance().incomingCall(call, account_id);
1859
Manager::instance().getAccountLink(account_id)->addCall(call);
1865
static pj_bool_t transaction_response_cb(pjsip_rx_data *rdata)
1867
pjsip_dialog *dlg = pjsip_rdata_get_dlg(rdata);
1872
pjsip_transaction *tsx = pjsip_rdata_get_tsx(rdata);
1874
if (!tsx or tsx->method.id != PJSIP_INVITE_METHOD)
1877
if (tsx->status_code / 100 == 2) {
1879
* Send an ACK message inside a transaction. PJSIP send automatically, non-2xx ACK response.
1880
* ACK for a 2xx response must be send using this method.
1882
pjsip_tx_data *tdata;
1883
pjsip_dlg_create_request(dlg, &pjsip_ack_method, rdata->msg_info.cseq->cseq, &tdata);
1884
pjsip_dlg_send_request(dlg, tdata, -1, NULL);
1890
1991
void onCallTransfered(pjsip_inv_session *inv, pjsip_rx_data *rdata)
1892
SIPCall *currentCall = reinterpret_cast<SIPCall *>(inv->mod_data[mod_ua_.id]);
1993
SIPCall *currentCall = static_cast<SIPCall *>(inv->mod_data[mod_ua_.id]);
1894
1995
if (currentCall == NULL)