mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-07-23 12:42:02 +00:00
Merge remote-tracking branch 'fsorig/master'
This commit is contained in:
@@ -454,7 +454,7 @@ switch_status_t sofia_on_hangup(switch_core_session_t *session)
|
||||
}
|
||||
|
||||
if (!((use_my_cause = switch_channel_get_variable(channel, "sip_ignore_remote_cause")) && switch_true(use_my_cause))) {
|
||||
ps_cause = switch_channel_get_variable(channel, SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE);
|
||||
ps_cause = switch_channel_get_variable(channel, "last_bridge_" SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE);
|
||||
}
|
||||
|
||||
if (!zstr(ps_cause) && (!strncasecmp(ps_cause, "sip:", 4) || !strncasecmp(ps_cause, "sips:", 5))) {
|
||||
@@ -494,7 +494,7 @@ switch_status_t sofia_on_hangup(switch_core_session_t *session)
|
||||
|
||||
val = switch_channel_get_variable(tech_pvt->channel, "disable_q850_reason");
|
||||
|
||||
if (switch_false(val)) {
|
||||
if (!val || switch_false(val)) {
|
||||
if (switch_channel_test_flag(channel, CF_INTERCEPT) || cause == SWITCH_CAUSE_PICKED_OFF || cause == SWITCH_CAUSE_LOSE_RACE) {
|
||||
switch_snprintf(reason, sizeof(reason), "SIP;cause=200;text=\"Call completed elsewhere\"");
|
||||
} else if (cause > 0 && cause < 128) {
|
||||
@@ -811,7 +811,8 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session)
|
||||
SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
|
||||
SIPTAG_CALL_INFO_STR(switch_channel_get_variable(tech_pvt->channel, SOFIA_SIP_HEADER_PREFIX "call_info")),
|
||||
SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
|
||||
SOATAG_REUSE_REJECTED(1), SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), NUTAG_INCLUDE_EXTRA_SDP(1),
|
||||
SOATAG_REUSE_REJECTED(1), SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"),
|
||||
TAG_IF(sofia_test_pflag(tech_pvt->profile, PFLAG_DISABLE_100REL), NUTAG_INCLUDE_EXTRA_SDP(1)),
|
||||
TAG_IF(is_proxy, SOATAG_RTP_SELECT(1)),
|
||||
TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
|
||||
TAG_IF(switch_stristr("update_display", tech_pvt->x_freeswitch_support_remote),
|
||||
@@ -1984,7 +1985,8 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR,
|
||||
"Operation not permitted on an inbound non-answered call leg!\n");
|
||||
} else {
|
||||
nua_notify(tech_pvt->nh, NUTAG_NEWSUB(1), NUTAG_SUBSTATE(nua_substate_active), SIPTAG_EVENT_STR(event), TAG_END());
|
||||
nua_notify(tech_pvt->nh, NUTAG_NEWSUB(1), NUTAG_SUBSTATE(nua_substate_active), SIPTAG_SUBSCRIPTION_STATE_STR("active"),
|
||||
SIPTAG_EVENT_STR(event), TAG_END());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2100,10 +2102,12 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
||||
if (zstr(number)) {
|
||||
number = tech_pvt->caller_profile->destination_number;
|
||||
}
|
||||
|
||||
if (sofia_test_flag(tech_pvt, TFLAG_UPDATING_DISPLAY)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_ERROR,
|
||||
"Cannot send display update to %s Did not receive reply to last update\n", switch_channel_get_name(tech_pvt->channel));
|
||||
|
||||
if (sofia_test_flag(tech_pvt, TFLAG_UPDATING_DISPLAY) || !switch_channel_test_flag(channel, CF_ANSWERED)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_WARNING,
|
||||
"Cannot send display update to %s "
|
||||
"Did not receive reply to last update or channel has not been answered yet.\n",
|
||||
switch_channel_get_name(tech_pvt->channel));
|
||||
} else {
|
||||
if (zstr(tech_pvt->last_sent_callee_id_name) || strcmp(tech_pvt->last_sent_callee_id_name, name) ||
|
||||
zstr(tech_pvt->last_sent_callee_id_number) || strcmp(tech_pvt->last_sent_callee_id_number, number)) {
|
||||
@@ -2151,6 +2155,15 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
||||
} else if ((ua && (switch_stristr("cisco/spa50", ua) || switch_stristr("cisco/spa525", ua)))) {
|
||||
snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" <sip:%s@%s>", name, number, tech_pvt->profile->sipip);
|
||||
|
||||
sofia_set_flag_locked(tech_pvt, TFLAG_UPDATING_DISPLAY);
|
||||
nua_update(tech_pvt->nh,
|
||||
NUTAG_SESSION_TIMER(tech_pvt->session_timeout),
|
||||
NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher),
|
||||
TAG_IF(!zstr_buf(message), SIPTAG_HEADER_STR(message)),
|
||||
TAG_IF(!zstr(tech_pvt->user_via), SIPTAG_VIA_STR(tech_pvt->user_via)), TAG_END());
|
||||
} else if ((ua && (switch_stristr("Yealink", ua)))) {
|
||||
snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" <sip:%s@%s>", name, number, tech_pvt->profile->sipip);
|
||||
|
||||
sofia_set_flag_locked(tech_pvt, TFLAG_UPDATING_DISPLAY);
|
||||
nua_update(tech_pvt->nh,
|
||||
NUTAG_SESSION_TIMER(tech_pvt->session_timeout),
|
||||
@@ -2230,10 +2243,11 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
||||
if (!zstr(msg->string_arg)) {
|
||||
if (!switch_channel_test_flag(channel, CF_ANSWERED) && !sofia_test_flag(tech_pvt, TFLAG_BYE)) {
|
||||
char *extra_headers = sofia_glue_get_extra_headers(channel, SOFIA_SIP_RESPONSE_HEADER_PREFIX);
|
||||
char *added_headers = sofia_glue_get_extra_headers(channel, SOFIA_SIP_HEADER_PREFIX);
|
||||
char *dest = (char *) msg->string_arg;
|
||||
char *argv[128] = { 0 };
|
||||
char *mydata = NULL, *newdest = NULL;
|
||||
int argc = 0, i;
|
||||
int argc = 0, ok = 0, i;
|
||||
switch_size_t len = 0;
|
||||
|
||||
if (strchr(dest, ',')) {
|
||||
@@ -2268,13 +2282,17 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
||||
}
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Redirecting to %s\n", dest);
|
||||
|
||||
ok = sofia_test_pflag(tech_pvt->profile, PFLAG_MANUAL_REDIRECT);
|
||||
|
||||
if (argc > 1) {
|
||||
nua_respond(tech_pvt->nh, SIP_300_MULTIPLE_CHOICES, SIPTAG_CONTACT_STR(dest),
|
||||
TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)), TAG_END());
|
||||
TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
|
||||
TAG_IF((!zstr(added_headers) && !ok), SIPTAG_HEADER_STR(added_headers)), TAG_END());
|
||||
} else {
|
||||
nua_respond(tech_pvt->nh, SIP_302_MOVED_TEMPORARILY, SIPTAG_CONTACT_STR(dest),
|
||||
TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)), TAG_END());
|
||||
TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
|
||||
TAG_IF((!zstr(added_headers) && !ok), SIPTAG_HEADER_STR(added_headers)), TAG_END());
|
||||
}
|
||||
|
||||
|
||||
@@ -2460,14 +2478,6 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
||||
{
|
||||
switch_ring_ready_t ring_ready_val = msg->numeric_arg;
|
||||
|
||||
if (sofia_test_pflag(tech_pvt->profile, PFLAG_3PCC_PROXY) && sofia_test_flag(tech_pvt, TFLAG_3PCC)) {
|
||||
switch_channel_mark_ring_ready(channel);
|
||||
status = SWITCH_STATUS_SUCCESS;
|
||||
switch_log_printf(SWITCH_CHANNEL_ID_LOG, msg->_file, msg->_func, msg->_line, NULL, SWITCH_LOG_INFO,
|
||||
"Pretending to send ringing. Not available for 3pcc calls\n");
|
||||
goto end_lock;
|
||||
}
|
||||
|
||||
if (!switch_channel_test_flag(channel, CF_RING_READY) && !sofia_test_flag(tech_pvt, TFLAG_BYE) &&
|
||||
!switch_channel_test_flag(channel, CF_EARLY_MEDIA) && !switch_channel_test_flag(channel, CF_ANSWERED)) {
|
||||
char *extra_header = sofia_glue_get_extra_headers(channel, SOFIA_SIP_PROGRESS_HEADER_PREFIX);
|
||||
@@ -2516,14 +2526,6 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
||||
const char *val = NULL;
|
||||
const char *call_info = switch_channel_get_variable(channel, "presence_call_info_full");
|
||||
|
||||
if (sofia_test_pflag(tech_pvt->profile, PFLAG_3PCC_PROXY) && sofia_test_flag(tech_pvt, TFLAG_3PCC)) {
|
||||
sofia_set_flag_locked(tech_pvt, TFLAG_EARLY_MEDIA);
|
||||
switch_channel_mark_pre_answered(channel);
|
||||
status = SWITCH_STATUS_SUCCESS;
|
||||
switch_log_printf(SWITCH_CHANNEL_ID_LOG, msg->_file, msg->_func, msg->_line, NULL, SWITCH_LOG_INFO,
|
||||
"Pretending to send early media. Not available for 3pcc calls\n");
|
||||
goto end_lock;
|
||||
}
|
||||
|
||||
if (!sofia_test_flag(tech_pvt, TFLAG_ANS) && !sofia_test_flag(tech_pvt, TFLAG_EARLY_MEDIA)) {
|
||||
|
||||
@@ -2935,8 +2937,10 @@ static switch_status_t cmd_status(char **argv, int argc, switch_stream_handle_t
|
||||
if (profile->extsipip) {
|
||||
stream->write_function(stream, "Ext-SIP-IP \t%s\n", profile->extsipip);
|
||||
}
|
||||
stream->write_function(stream, "URL \t%s\n", switch_str_nil(profile->url));
|
||||
stream->write_function(stream, "BIND-URL \t%s\n", switch_str_nil(profile->bindurl));
|
||||
if (! sofia_test_pflag(profile, PFLAG_TLS) || ! profile->tls_only) {
|
||||
stream->write_function(stream, "URL \t%s\n", switch_str_nil(profile->url));
|
||||
stream->write_function(stream, "BIND-URL \t%s\n", switch_str_nil(profile->bindurl));
|
||||
}
|
||||
if (sofia_test_pflag(profile, PFLAG_TLS)) {
|
||||
stream->write_function(stream, "TLS-URL \t%s\n", switch_str_nil(profile->tls_url));
|
||||
stream->write_function(stream, "TLS-BIND-URL \t%s\n", switch_str_nil(profile->tls_bindurl));
|
||||
@@ -3061,8 +3065,10 @@ static switch_status_t cmd_status(char **argv, int argc, switch_stream_handle_t
|
||||
ac++;
|
||||
stream->write_function(stream, "%25s\t%s\t %40s\t%s\n", vvar, " alias", profile->name, "ALIASED");
|
||||
} else {
|
||||
stream->write_function(stream, "%25s\t%s\t %40s\t%s (%u)\n", profile->name, "profile", profile->url,
|
||||
if (! sofia_test_pflag(profile, PFLAG_TLS) || ! profile->tls_only) {
|
||||
stream->write_function(stream, "%25s\t%s\t %40s\t%s (%u)\n", profile->name, "profile", profile->url,
|
||||
sofia_test_pflag(profile, PFLAG_RUNNING) ? "RUNNING" : "DOWN", profile->inuse);
|
||||
}
|
||||
|
||||
if (sofia_test_pflag(profile, PFLAG_TLS)) {
|
||||
stream->write_function(stream, "%25s\t%s\t %40s\t%s (%u) (TLS)\n", profile->name, "profile", profile->tls_url,
|
||||
@@ -3336,9 +3342,11 @@ static switch_status_t cmd_xml_status(char **argv, int argc, switch_stream_handl
|
||||
stream->write_function(stream, "<alias>\n<name>%s</name>\n<type>%s</type>\n<data>%s</data>\n<state>%s</state>\n</alias>\n", vvar, "alias",
|
||||
profile->name, "ALIASED");
|
||||
} else {
|
||||
stream->write_function(stream, "<profile>\n<name>%s</name>\n<type>%s</type>\n<data>%s</data>\n<state>%s (%u)</state>\n</profile>\n",
|
||||
if (! sofia_test_pflag(profile, PFLAG_TLS) || ! profile->tls_only){
|
||||
stream->write_function(stream, "<profile>\n<name>%s</name>\n<type>%s</type>\n<data>%s</data>\n<state>%s (%u)</state>\n</profile>\n",
|
||||
profile->name, "profile", profile->url, sofia_test_pflag(profile, PFLAG_RUNNING) ? "RUNNING" : "DOWN",
|
||||
profile->inuse);
|
||||
}
|
||||
|
||||
if (sofia_test_pflag(profile, PFLAG_TLS)) {
|
||||
stream->write_function(stream,
|
||||
@@ -3509,6 +3517,22 @@ static switch_status_t cmd_profile(char **argv, int argc, switch_stream_handle_t
|
||||
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!strcasecmp(argv[1], "recover")) {
|
||||
if (argv[2] && !strcasecmp(argv[2], "flush")) {
|
||||
sofia_glue_profile_recover(profile, SWITCH_TRUE);
|
||||
stream->write_function(stream, "Flushing recovery database.\n");
|
||||
} else {
|
||||
int x = sofia_glue_profile_recover(profile, SWITCH_FALSE);
|
||||
if (x) {
|
||||
stream->write_function(stream, "Recovered %d call(s)\n", x);
|
||||
} else {
|
||||
stream->write_function(stream, "No calls to recover.\n");
|
||||
}
|
||||
}
|
||||
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!strcasecmp(argv[1], "register")) {
|
||||
char *gname = argv[2];
|
||||
@@ -4156,7 +4180,7 @@ SWITCH_STANDARD_API(sofia_function)
|
||||
}
|
||||
|
||||
if (strstr(argv[2], "sla")) {
|
||||
mod_sofia_globals.debug_sla = 1;
|
||||
mod_sofia_globals.debug_sla = 10;
|
||||
stream->write_function(stream, "+OK Debugging sla\n");
|
||||
}
|
||||
|
||||
@@ -4808,7 +4832,7 @@ static int notify_callback(void *pArg, int argc, char **argv, char **columnNames
|
||||
|
||||
nua_handle_bind(nh, &mod_sofia_globals.destroy_private);
|
||||
|
||||
nua_notify(nh, NUTAG_NEWSUB(1),
|
||||
nua_notify(nh, NUTAG_NEWSUB(1), SIPTAG_SUBSCRIPTION_STATE_STR("terminated;reason=noresource"),
|
||||
TAG_IF(dst->route_uri, NUTAG_PROXY(route_uri)), TAG_IF(dst->route, SIPTAG_ROUTE_STR(dst->route)),
|
||||
SIPTAG_EVENT_STR(es), SIPTAG_CONTENT_TYPE_STR(ct), TAG_IF(!zstr(body), SIPTAG_PAYLOAD_STR(body)), TAG_END());
|
||||
|
||||
@@ -4897,7 +4921,7 @@ static void general_event_handler(switch_event_t *event)
|
||||
nua_handle_bind(nh, &mod_sofia_globals.destroy_private);
|
||||
|
||||
nua_notify(nh,
|
||||
NUTAG_NEWSUB(1),
|
||||
NUTAG_NEWSUB(1), SIPTAG_SUBSCRIPTION_STATE_STR("terminated;reason=noresource"),
|
||||
TAG_IF(dst->route_uri, NUTAG_PROXY(dst->route_uri)), TAG_IF(dst->route, SIPTAG_ROUTE_STR(dst->route)),
|
||||
SIPTAG_EVENT_STR(es), TAG_IF(ct, SIPTAG_CONTENT_TYPE_STR(ct)), TAG_IF(!zstr(body), SIPTAG_PAYLOAD_STR(body)), TAG_END());
|
||||
|
||||
@@ -4918,7 +4942,7 @@ static void general_event_handler(switch_event_t *event)
|
||||
if ((session = switch_core_session_locate(uuid))) {
|
||||
if ((tech_pvt = switch_core_session_get_private(session))) {
|
||||
nua_notify(tech_pvt->nh,
|
||||
NUTAG_NEWSUB(1),
|
||||
NUTAG_NEWSUB(1), SIPTAG_SUBSCRIPTION_STATE_STR("terminated;reason=noresource"),
|
||||
SIPTAG_EVENT_STR(es), SIPTAG_CONTENT_TYPE_STR(ct), TAG_IF(!zstr(body), SIPTAG_PAYLOAD_STR(body)), TAG_END());
|
||||
}
|
||||
switch_core_session_rwunlock(session);
|
||||
|
||||
Reference in New Issue
Block a user