From 221b82f1e9f8d738977d5ba9e092fa544e21ee07 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 29 Mar 2012 11:35:57 -0500 Subject: [PATCH] FS-4053 try this --- src/mod/endpoints/mod_sofia/mod_sofia.c | 14 +++++++++----- src/mod/endpoints/mod_sofia/sofia.c | 22 +++++++++++++++++++++- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 1928e0f462..21172b5f90 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -495,12 +495,16 @@ switch_status_t sofia_on_hangup(switch_core_session_t *session) val = switch_channel_get_variable(tech_pvt->channel, "disable_q850_reason"); 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) { - switch_snprintf(reason, sizeof(reason), "Q.850;cause=%d;text=\"%s\"", cause, switch_channel_cause2str(cause)); + if ((val = switch_channel_get_variable(tech_pvt->channel, "sip_reason_str"))) { + switch_snprintf(reason, sizeof(reason), "%s", val); } else { - switch_snprintf(reason, sizeof(reason), "%s;cause=%d;text=\"%s\"", tech_pvt->profile->username, cause, switch_channel_cause2str(cause)); + 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) { + switch_snprintf(reason, sizeof(reason), "Q.850;cause=%d;text=\"%s\"", cause, switch_channel_cause2str(cause)); + } else { + switch_snprintf(reason, sizeof(reason), "%s;cause=%d;text=\"%s\"", tech_pvt->profile->username, cause, switch_channel_cause2str(cause)); + } } } diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index a8196a2d31..b443a36fb7 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -581,6 +581,14 @@ void sofia_handle_sip_i_bye(switch_core_session_t *session, int status, sofia_set_flag_locked(tech_pvt, TFLAG_BYE); call_info = switch_channel_get_variable(channel, "presence_call_info_full"); + if (sip->sip_reason) { + char *reason_header = sip_header_as_string(nh->nh_home, (void *) sip->sip_reason); + + if (!zstr(reason_header)) { + switch_channel_set_variable_partner(channel, "sip_reason", reason_header); + } + } + if (sip->sip_reason && sip->sip_reason->re_protocol && (!strcasecmp(sip->sip_reason->re_protocol, "Q.850") || !strcasecmp(sip->sip_reason->re_protocol, "FreeSWITCH") || !strcasecmp(sip->sip_reason->re_protocol, profile->username)) && sip->sip_reason->re_cause) { @@ -981,7 +989,6 @@ static void our_sofia_event_callback(nua_event_t event, case nua_r_unregister: case nua_r_unsubscribe: case nua_r_publish: - case nua_i_cancel: case nua_i_error: case nua_i_active: case nua_i_terminated: @@ -989,6 +996,19 @@ static void our_sofia_event_callback(nua_event_t event, case nua_i_prack: case nua_r_prack: break; + + case nua_i_cancel: + + if (sip && channel && sip->sip_reason) { + char *reason_header = sip_header_as_string(nh->nh_home, (void *) sip->sip_reason); + + if (!zstr(reason_header)) { + switch_channel_set_variable_partner(channel, "sip_reason", reason_header); + } + } + + break; + case nua_r_cancel: { if (status > 299 && nh) {