//Static void PjsuaManager::OnIncomingCall(pjsua_acc_id acc_id, pjsua_call_id call_id, pjsip_rx_data *rdata) { std::string str = "OnIncomingCall called for PJSIP account id: " + boost::lexical_cast<std::string>(acc_id)+", PJSIP call id: " + boost::lexical_cast<std::string>(call_id); BlabbleLogging::blabbleLog(0, str.c_str(), 0); //BLABBLE_LOG_TRACE("OnIncomingCall called for PJSIP account id: " << acc_id << ", PJSIP call id: " << call_id); PjsuaManagerPtr manager = PjsuaManager::instance_.lock(); if (!manager) { //How is this even possible? pjsua_call_hangup(call_id, 0, NULL, NULL); return; } // REITEK: Prefer local codec ordering (!!! CHECK: Make it configurable ?) pjsua_call *call; pjsip_dialog *dlg; pj_status_t status; status = acquire_call("PjsuaManager::OnIncomingCall", call_id, &call, &dlg); if (status == PJ_SUCCESS) { if (call->inv->neg != NULL) { status = pjmedia_sdp_neg_set_prefer_remote_codec_order(call->inv->neg, PJ_FALSE); if (status != PJ_SUCCESS) { std::string str = "Could not set codec negotiation preference on local side for PJSIP account id: " + boost::lexical_cast<std::string>(acc_id)+", PJSIP call id: " + boost::lexical_cast<std::string>(call_id); BlabbleLogging::blabbleLog(0, str.c_str(), 0); //BLABBLE_LOG_ERROR("Could not set codec negotiation preference on local side for PJSIP account id: " << acc_id << ", PJSIP call id: " << call_id); } } else { std::string str = "WARNING: NULL SDP negotiator: cannot set codec negotiation preference on local side for PJSIP account id: " + boost::lexical_cast<std::string>(acc_id)+", PJSIP call id: " + boost::lexical_cast<std::string>(call_id); BlabbleLogging::blabbleLog(0, str.c_str(), 0); //BLABBLE_LOG_DEBUG("WARNING: NULL SDP negotiator: cannot set codec negotiation preference on local side for PJSIP account id: " << acc_id << ", PJSIP call id: " << call_id); } pjsip_dlg_dec_lock(dlg); } else { std::string str = "Could not acquire lock to set codec negotiation preference on local side for PJSIP account id: " + boost::lexical_cast<std::string>(acc_id)+", PJSIP call id: " + boost::lexical_cast<std::string>(call_id); BlabbleLogging::blabbleLog(0, str.c_str(), 0); //BLABBLE_LOG_ERROR("Could not acquire lock to set codec negotiation preference on local side for PJSIP account id: " << acc_id << ", PJSIP call id: " << call_id); } BlabbleAccountPtr acc = manager->FindAcc(acc_id); if (acc && acc->OnIncomingCall(call_id, rdata)) { return; } //Otherwise we respond busy if no one wants the call pjsua_call_hangup(call_id, 486, NULL, NULL); }
/** * Is call using a secure RTP method (SRTP/ZRTP -- TODO) */ PJ_DECL(pj_bool_t) is_call_secure(pjsua_call_id call_id){ pjsua_call *call; pjsip_dialog *dlg; pj_status_t status; pjmedia_transport_info tp_info; pj_bool_t result = PJ_FALSE; PJ_ASSERT_RETURN(call_id>=0 && call_id<(int)pjsua_var.ua_cfg.max_calls, PJ_EINVAL); status = acquire_call("is_call_secure()", call_id, &call, &dlg); if (status != PJ_SUCCESS) { return result; } /* Get and ICE SRTP status */ pjmedia_transport_info_init(&tp_info); pjmedia_transport_get_info(call->med_tp, &tp_info); if (tp_info.specific_info_cnt > 0) { unsigned i; for (i = 0; i < tp_info.specific_info_cnt; ++i) { if (tp_info.spc_info[i].type == PJMEDIA_TRANSPORT_TYPE_SRTP) { pjmedia_srtp_info *srtp_info = (pjmedia_srtp_info*) tp_info.spc_info[i].buffer; if(srtp_info->active){ result = PJ_TRUE; } } } } pjsip_dlg_dec_lock(dlg); return result; }