switch_channel_get_name(channel), msg->string_arg);
sofia_glue_tech_set_local_sdp(tech_pvt, msg->string_arg, SWITCH_TRUE);
- if(zstr(tech_pvt->local_sdp_str)) {
- sofia_set_flag(tech_pvt, TFLAG_3PCC_INVITE);
- }
-
- sofia_set_flag_locked(tech_pvt, TFLAG_SENT_UPDATE);
-
- if (!switch_channel_test_flag(channel, CF_PROXY_MEDIA)) {
- switch_channel_set_flag(channel, CF_REQ_MEDIA);
+ if (msg->numeric_arg) { // ACK
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "3PCC-PROXY nomedia - sending ack\n");
+ nua_ack(tech_pvt->nh,
+ TAG_IF(!zstr(tech_pvt->user_via), SIPTAG_VIA_STR(tech_pvt->user_via)),
+ SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+ SOATAG_USER_SDP_STR(msg->string_arg),
+ SOATAG_REUSE_REJECTED(1),
+ SOATAG_RTP_SELECT(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_END());
+ sofia_clear_flag(tech_pvt, TFLAG_3PCC_INVITE);
+
+ } else {
+ if(zstr(tech_pvt->local_sdp_str)) {
+ sofia_set_flag(tech_pvt, TFLAG_3PCC_INVITE);
+ }
+
+ sofia_set_flag_locked(tech_pvt, TFLAG_SENT_UPDATE);
+
+ if (!switch_channel_test_flag(channel, CF_PROXY_MEDIA)) {
+ switch_channel_set_flag(channel, CF_REQ_MEDIA);
+ }
+ sofia_glue_do_invite(session);
}
- sofia_glue_do_invite(session);
}
break;
switch_core_recovery_track(session);
sofia_set_flag(tech_pvt, TFLAG_GOT_ACK);
+
if (sofia_test_flag(tech_pvt, TFLAG_PASS_ACK)) {
switch_core_session_t *other_session;
if (r_sdp && sofia_test_flag(tech_pvt, TFLAG_3PCC_INVITE) && !sofia_test_flag(tech_pvt, TFLAG_SDP)) {
sofia_set_flag(tech_pvt, TFLAG_SDP);
if (switch_core_session_get_partner(session, &other_session) == SWITCH_STATUS_SUCCESS) {
+ switch_core_session_message_t *msg;
+
other_channel = switch_core_session_get_channel(other_session);
- //other_tech_pvt = switch_core_session_get_private(other_session);
if (!switch_channel_get_variable(other_channel, SWITCH_B_SDP_VARIABLE)) {
switch_channel_set_variable(other_channel, SWITCH_B_SDP_VARIABLE, r_sdp);
}
- switch_core_session_queue_indication(other_session, SWITCH_MESSAGE_INDICATE_ANSWER);
+
+ msg = switch_core_session_alloc(other_session, sizeof(*msg));
+ msg->message_id = SWITCH_MESSAGE_INDICATE_MEDIA_REDIRECT;
+ msg->from = __FILE__;
+ msg->string_arg = switch_core_session_strdup(other_session, r_sdp);
+ msg->numeric_arg = 1; // send ack
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Passing SDP ACK to other leg.\n%s\n", r_sdp);
+
+ switch_core_session_queue_message(other_session, msg);
+
switch_core_session_rwunlock(other_session);
}
goto done;