提交 2e20feaa authored 作者: Anthony Minessale's avatar Anthony Minessale

skip some callbacks when session is not present

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10463 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 1d398bab
...@@ -2334,6 +2334,18 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status, ...@@ -2334,6 +2334,18 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
state_process: state_process:
switch ((enum nua_callstate) ss_state) {
case nua_callstate_terminated:
case nua_callstate_terminating:
case nua_callstate_ready:
case nua_callstate_completed:
case nua_callstate_received:
if (!(session && channel && tech_pvt)) goto done;
break;
default:
break;
}
switch ((enum nua_callstate) ss_state) { switch ((enum nua_callstate) ss_state) {
case nua_callstate_init: case nua_callstate_init:
break; break;
...@@ -2342,61 +2354,59 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status, ...@@ -2342,61 +2354,59 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
case nua_callstate_calling: case nua_callstate_calling:
break; break;
case nua_callstate_proceeding: case nua_callstate_proceeding:
if (channel) { if (status == 180) {
if (status == 180) { switch_channel_mark_ring_ready(channel);
switch_channel_mark_ring_ready(channel); if (!switch_channel_test_flag(channel, CF_GEN_RINGBACK)) {
if (!switch_channel_test_flag(channel, CF_GEN_RINGBACK)) { if (switch_channel_test_flag(channel, CF_PROXY_MODE)) {
if (switch_channel_test_flag(channel, CF_PROXY_MODE)) { if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))
if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (other_session = switch_core_session_locate(uuid))) {
&& (other_session = switch_core_session_locate(uuid))) { switch_core_session_message_t msg;
switch_core_session_message_t msg; msg.message_id = SWITCH_MESSAGE_INDICATE_RINGING;
msg.message_id = SWITCH_MESSAGE_INDICATE_RINGING; msg.from = __FILE__;
msg.from = __FILE__; switch_core_session_receive_message(other_session, &msg);
switch_core_session_receive_message(other_session, &msg); switch_core_session_rwunlock(other_session);
switch_core_session_rwunlock(other_session);
}
} else {
switch_core_session_queue_indication(session, SWITCH_MESSAGE_INDICATE_RINGING);
} }
} else {
switch_core_session_queue_indication(session, SWITCH_MESSAGE_INDICATE_RINGING);
} }
} }
}
if (r_sdp) { if (r_sdp) {
if (switch_channel_test_flag(channel, CF_PROXY_MODE) || switch_channel_test_flag(channel, CF_PROXY_MEDIA)) { if (switch_channel_test_flag(channel, CF_PROXY_MODE) || switch_channel_test_flag(channel, CF_PROXY_MEDIA)) {
switch_set_flag_locked(tech_pvt, TFLAG_EARLY_MEDIA); switch_set_flag_locked(tech_pvt, TFLAG_EARLY_MEDIA);
switch_channel_mark_pre_answered(channel); switch_channel_mark_pre_answered(channel);
switch_set_flag(tech_pvt, TFLAG_SDP); switch_set_flag(tech_pvt, TFLAG_SDP);
if (switch_channel_test_flag(channel, CF_PROXY_MEDIA)) { if (switch_channel_test_flag(channel, CF_PROXY_MEDIA)) {
if (sofia_glue_activate_rtp(tech_pvt, 0) != SWITCH_STATUS_SUCCESS) { if (sofia_glue_activate_rtp(tech_pvt, 0) != SWITCH_STATUS_SUCCESS) {
goto done; goto done;
}
} }
if (!switch_channel_test_flag(channel, CF_GEN_RINGBACK) && (uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) }
&& (other_session = switch_core_session_locate(uuid))) { if (!switch_channel_test_flag(channel, CF_GEN_RINGBACK) && (uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))
other_channel = switch_core_session_get_channel(other_session); && (other_session = switch_core_session_locate(uuid))) {
if (!switch_channel_get_variable(other_channel, SWITCH_B_SDP_VARIABLE)) { other_channel = switch_core_session_get_channel(other_session);
switch_channel_set_variable(other_channel, SWITCH_B_SDP_VARIABLE, r_sdp); if (!switch_channel_get_variable(other_channel, SWITCH_B_SDP_VARIABLE)) {
} switch_channel_set_variable(other_channel, SWITCH_B_SDP_VARIABLE, r_sdp);
switch_channel_pre_answer(other_channel);
switch_core_session_rwunlock(other_session);
} }
goto done;
switch_channel_pre_answer(other_channel);
switch_core_session_rwunlock(other_session);
}
goto done;
} else {
if (switch_channel_test_flag(channel, CF_PROXY_MEDIA) && !switch_channel_test_flag(tech_pvt->channel, CF_OUTBOUND)) {
switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "PROXY MEDIA");
} else if (switch_test_flag(tech_pvt, TFLAG_LATE_NEGOTIATION) && !switch_channel_test_flag(tech_pvt->channel, CF_OUTBOUND)) {
switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "DELAYED NEGOTIATION");
} else { } else {
if (switch_channel_test_flag(channel, CF_PROXY_MEDIA) && !switch_channel_test_flag(tech_pvt->channel, CF_OUTBOUND)) { if (sofia_glue_tech_media(tech_pvt, (char *) r_sdp) != SWITCH_STATUS_SUCCESS) {
switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "PROXY MEDIA"); switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "CODEC NEGOTIATION ERROR");
} else if (switch_test_flag(tech_pvt, TFLAG_LATE_NEGOTIATION) && !switch_channel_test_flag(tech_pvt->channel, CF_OUTBOUND)) { nua_respond(nh, SIP_488_NOT_ACCEPTABLE, TAG_END());
switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "DELAYED NEGOTIATION"); switch_channel_hangup(channel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION);
} else {
if (sofia_glue_tech_media(tech_pvt, (char *) r_sdp) != SWITCH_STATUS_SUCCESS) {
switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "CODEC NEGOTIATION ERROR");
nua_respond(nh, SIP_488_NOT_ACCEPTABLE, TAG_END());
switch_channel_hangup(channel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION);
}
} }
goto done;
} }
goto done;
} }
} }
break; break;
...@@ -2404,7 +2414,7 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status, ...@@ -2404,7 +2414,7 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
nua_ack(nh, TAG_END()); nua_ack(nh, TAG_END());
break; break;
case nua_callstate_received: case nua_callstate_received:
if (tech_pvt && !switch_test_flag(tech_pvt, TFLAG_SDP)) { if (!switch_test_flag(tech_pvt, TFLAG_SDP)) {
if (r_sdp && !switch_test_flag(tech_pvt, TFLAG_SDP)) { if (r_sdp && !switch_test_flag(tech_pvt, TFLAG_SDP)) {
if (switch_channel_test_flag(channel, CF_PROXY_MODE)) { if (switch_channel_test_flag(channel, CF_PROXY_MODE)) {
switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "RECEIVED_NOMEDIA"); switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "RECEIVED_NOMEDIA");
...@@ -2537,7 +2547,7 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status, ...@@ -2537,7 +2547,7 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
case nua_callstate_early: case nua_callstate_early:
break; break;
case nua_callstate_completed: case nua_callstate_completed:
if (tech_pvt && r_sdp) { if (r_sdp) {
sdp_parser_t *parser; sdp_parser_t *parser;
sdp_session_t *sdp; sdp_session_t *sdp;
uint8_t match = 0, is_ok = 1; uint8_t match = 0, is_ok = 1;
...@@ -2809,49 +2819,46 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status, ...@@ -2809,49 +2819,46 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
break; break;
case nua_callstate_terminating: case nua_callstate_terminating:
if (session) { if (status == 488 || switch_channel_get_state(channel) == CS_HIBERNATE) {
if (status == 488 || switch_channel_get_state(channel) == CS_HIBERNATE) { tech_pvt->q850_cause = SWITCH_CAUSE_MANDATORY_IE_MISSING;
tech_pvt->q850_cause = SWITCH_CAUSE_MANDATORY_IE_MISSING; } else if (!switch_test_flag(tech_pvt, TFLAG_BYE)) {
} else if (!switch_test_flag(tech_pvt, TFLAG_BYE)) { switch_set_flag_locked(tech_pvt, TFLAG_BYE);
switch_set_flag_locked(tech_pvt, TFLAG_BYE);
}
} }
break; break;
case nua_callstate_terminated: case nua_callstate_terminated:
if (session) { if (!switch_test_flag(tech_pvt, TFLAG_BYE)) {
if (!switch_test_flag(tech_pvt, TFLAG_BYE)) { switch_set_flag_locked(tech_pvt, TFLAG_BYE);
switch_set_flag_locked(tech_pvt, TFLAG_BYE); if (switch_test_flag(tech_pvt, TFLAG_NOHUP)) {
if (switch_test_flag(tech_pvt, TFLAG_NOHUP)) { switch_clear_flag_locked(tech_pvt, TFLAG_NOHUP);
switch_clear_flag_locked(tech_pvt, TFLAG_NOHUP); } else {
int cause;
if (tech_pvt->q850_cause) {
cause = tech_pvt->q850_cause;
} else { } else {
int cause; cause = sofia_glue_sip_cause_to_freeswitch(status);
if (tech_pvt->q850_cause) { }
cause = tech_pvt->q850_cause; if (status) {
} else { switch_snprintf(st, sizeof(st), "%d", status);
cause = sofia_glue_sip_cause_to_freeswitch(status); switch_channel_set_variable(channel, "sip_term_status", st);
} switch_snprintf(st, sizeof(st), "sip:%d", status);
if (status) { switch_channel_set_variable_partner(channel, SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE, st);
switch_snprintf(st, sizeof(st), "%d", status); if (phrase) {
switch_channel_set_variable(channel, "sip_term_status", st); switch_channel_set_variable_partner(channel, "sip_hangup_phrase", phrase);
switch_snprintf(st, sizeof(st), "sip:%d", status);
switch_channel_set_variable_partner(channel, SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE, st);
if (phrase) {
switch_channel_set_variable_partner(channel, "sip_hangup_phrase", phrase);
}
} }
switch_snprintf(st, sizeof(st), "%d", cause);
switch_channel_set_variable(channel, "sip_term_cause", st);
switch_channel_hangup(channel, cause);
} }
switch_snprintf(st, sizeof(st), "%d", cause);
switch_channel_set_variable(channel, "sip_term_cause", st);
switch_channel_hangup(channel, cause);
} }
}
if (tech_pvt->sofia_private) { if (tech_pvt->sofia_private) {
tech_pvt->sofia_private = NULL; tech_pvt->sofia_private = NULL;
}
tech_pvt->nh = NULL;
} }
tech_pvt->nh = NULL;
if (nh) { if (nh) {
nua_handle_bind(nh, NULL); nua_handle_bind(nh, NULL);
nua_handle_destroy(nh); nua_handle_destroy(nh);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论