if ((session = switch_core_session_locate(uuid))) {
channel = switch_core_session_get_channel(session);
- if (switch_channel_test_flag(channel, CF_MEDIA_TRANS)) {
+ if (switch_channel_test_flag(channel, CF_MEDIA_TRANS) || !switch_channel_test_flag(channel, CF_PROXY_MODE)) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Operation is invalid\n");
switch_core_session_rwunlock(session);
return SWITCH_STATUS_INUSE;
}
swap = 1;
}
- if (switch_channel_test_flag(channel, CF_PROXY_MODE)) {
- status = SWITCH_STATUS_SUCCESS;
- /* If we had early media in bypass mode before, it is no longer relevant */
- if (switch_channel_test_flag(channel, CF_EARLY_MEDIA)) {
- switch_core_session_message_t msg2 = { 0 };
+ status = SWITCH_STATUS_SUCCESS;
+
+ /* If we had early media in bypass mode before, it is no longer relevant */
+ if (switch_channel_test_flag(channel, CF_EARLY_MEDIA)) {
+ switch_core_session_message_t msg2 = { 0 };
- msg2.message_id = SWITCH_MESSAGE_INDICATE_CLEAR_PROGRESS;
- msg2.from = __FILE__;
- switch_core_session_receive_message(session, &msg2);
- }
+ msg2.message_id = SWITCH_MESSAGE_INDICATE_CLEAR_PROGRESS;
+ msg2.from = __FILE__;
+ switch_core_session_receive_message(session, &msg2);
+ }
- if ((flags & SMF_REPLYONLY_A)) {
- msg.numeric_arg = 1;
- }
+ if ((flags & SMF_REPLYONLY_A)) {
+ msg.numeric_arg = 1;
+ }
- switch_channel_set_flag(channel, CF_3P_MEDIA_REQUESTED);
+ switch_channel_set_flag(channel, CF_3P_MEDIA_REQUESTED);
- if (switch_core_session_receive_message(session, &msg) != SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Can't re-establsh media on %s\n", switch_channel_get_name(channel));
- switch_channel_clear_flag(channel, CF_3P_MEDIA_REQUESTED);
- switch_core_session_rwunlock(session);
- return SWITCH_STATUS_GENERR;
- }
+ if (switch_core_session_receive_message(session, &msg) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Can't re-establsh media on %s\n", switch_channel_get_name(channel));
+ switch_channel_clear_flag(channel, CF_3P_MEDIA_REQUESTED);
+ switch_core_session_rwunlock(session);
+ return SWITCH_STATUS_GENERR;
+ }
- if ((flags & SMF_REPLYONLY_B)) {
- msg.numeric_arg = 1;
- } else {
- msg.numeric_arg = 0;
- }
+ if ((flags & SMF_REPLYONLY_B)) {
+ msg.numeric_arg = 1;
+ } else {
+ msg.numeric_arg = 0;
+ }
- if ((flags & SMF_IMMEDIATE)) {
- switch_channel_wait_for_flag(channel, CF_REQ_MEDIA, SWITCH_FALSE, 250, NULL);
- switch_yield(250000);
- } else {
- switch_channel_wait_for_flag(channel, CF_REQ_MEDIA, SWITCH_FALSE, 10000, NULL);
- switch_channel_wait_for_flag(channel, CF_MEDIA_ACK, SWITCH_TRUE, 10000, NULL);
- switch_channel_wait_for_flag(channel, CF_MEDIA_SET, SWITCH_TRUE, 10000, NULL);
- //switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
- }
+ if ((flags & SMF_IMMEDIATE)) {
+ switch_channel_wait_for_flag(channel, CF_REQ_MEDIA, SWITCH_FALSE, 250, NULL);
+ switch_yield(250000);
+ } else {
+ switch_channel_wait_for_flag(channel, CF_REQ_MEDIA, SWITCH_FALSE, 10000, NULL);
+ switch_channel_wait_for_flag(channel, CF_MEDIA_ACK, SWITCH_TRUE, 10000, NULL);
+ switch_channel_wait_for_flag(channel, CF_MEDIA_SET, SWITCH_TRUE, 10000, NULL);
+ //switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
+ }
- if ((flags & SMF_REBRIDGE)
- && (other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE))
- && (other_session = switch_core_session_locate(other_uuid))) {
+ if ((flags & SMF_REBRIDGE)
+ && (other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE))
+ && (other_session = switch_core_session_locate(other_uuid))) {
- other_channel = switch_core_session_get_channel(other_session);
- switch_assert(other_channel != NULL);
+ other_channel = switch_core_session_get_channel(other_session);
+ switch_assert(other_channel != NULL);
- switch_channel_set_flag(other_channel, CF_3P_MEDIA_REQUESTED);
- switch_channel_set_variable(other_channel, "rtp_secure_media", "optional");
+ switch_channel_set_flag(other_channel, CF_3P_MEDIA_REQUESTED);
+ switch_channel_set_variable(other_channel, "rtp_secure_media", "optional");
- switch_core_session_receive_message(other_session, &msg);
- switch_channel_wait_for_flag(other_channel, CF_REQ_MEDIA, SWITCH_FALSE, 10000, NULL);
- switch_channel_wait_for_flag(other_channel, CF_MEDIA_ACK, SWITCH_TRUE, 10000, NULL);
- switch_channel_wait_for_flag(other_channel, CF_MEDIA_SET, SWITCH_TRUE, 10000, NULL);
- //switch_core_session_read_frame(other_session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
- switch_channel_clear_state_handler(other_channel, NULL);
- switch_core_session_rwunlock(other_session);
- }
- if (other_channel) {
- switch_channel_clear_state_handler(channel, NULL);
- }
+ switch_core_session_receive_message(other_session, &msg);
+ switch_channel_wait_for_flag(other_channel, CF_REQ_MEDIA, SWITCH_FALSE, 10000, NULL);
+ switch_channel_wait_for_flag(other_channel, CF_MEDIA_ACK, SWITCH_TRUE, 10000, NULL);
+ switch_channel_wait_for_flag(other_channel, CF_MEDIA_SET, SWITCH_TRUE, 10000, NULL);
+ //switch_core_session_read_frame(other_session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
+ switch_channel_clear_state_handler(other_channel, NULL);
+ switch_core_session_rwunlock(other_session);
}
-
+ if (other_channel) {
+ switch_channel_clear_state_handler(channel, NULL);
+ }
+
switch_channel_clear_flag(channel, CF_MEDIA_TRANS);
switch_core_session_rwunlock(session);
status = SWITCH_STATUS_SUCCESS;
channel = switch_core_session_get_channel(session);
- if (switch_channel_test_flag(channel, CF_MEDIA_TRANS)) {
+ if (switch_channel_test_flag(channel, CF_MEDIA_TRANS) || (!(flags & SMF_FORCE) && switch_channel_test_flag(channel, CF_PROXY_MODE))) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Operation is invalid\n");
switch_core_session_rwunlock(session);
return SWITCH_STATUS_INUSE;
}