mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-07-06 07:29:30 +00:00
MODENDP-310
This commit is contained in:
parent
bc2b4795c1
commit
3c688a95f8
@ -380,20 +380,26 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_answered(switch_chan
|
|||||||
*/
|
*/
|
||||||
#define switch_channel_mark_pre_answered(channel) switch_channel_perform_mark_pre_answered(channel, __FILE__, __SWITCH_FUNC__, __LINE__)
|
#define switch_channel_mark_pre_answered(channel) switch_channel_perform_mark_pre_answered(channel, __FILE__, __SWITCH_FUNC__, __LINE__)
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_status_t) switch_channel_perform_ring_ready(switch_channel_t *channel, const char *file, const char *func, int line);
|
SWITCH_DECLARE(switch_status_t) switch_channel_perform_ring_ready_value(switch_channel_t *channel,
|
||||||
|
switch_ring_ready_t rv,
|
||||||
|
const char *file, const char *func, int line);
|
||||||
/*!
|
/*!
|
||||||
\brief Send Ringing message to a channel
|
\brief Send Ringing message to a channel
|
||||||
\param channel channel to ring
|
\param channel channel to ring
|
||||||
\return SWITCH_STATUS_SUCCESS if successful
|
\return SWITCH_STATUS_SUCCESS if successful
|
||||||
*/
|
*/
|
||||||
#define switch_channel_ring_ready(channel) switch_channel_perform_ring_ready(channel, __FILE__, __SWITCH_FUNC__, __LINE__)
|
#define switch_channel_ring_ready(channel) switch_channel_perform_ring_ready_value(channel, SWITCH_RING_READY_RINGING, __FILE__, __SWITCH_FUNC__, __LINE__)
|
||||||
|
#define switch_channel_ring_ready_value(channel, _rv) \
|
||||||
|
switch_channel_perform_ring_ready_value(channel, _rv, __FILE__, __SWITCH_FUNC__, __LINE__)
|
||||||
|
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_status_t) switch_channel_perform_pre_answer(switch_channel_t *channel, const char *file, const char *func, int line);
|
SWITCH_DECLARE(switch_status_t) switch_channel_perform_pre_answer(switch_channel_t *channel, const char *file, const char *func, int line);
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_pre_answered(switch_channel_t *channel, const char *file, const char *func, int line);
|
SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_pre_answered(switch_channel_t *channel, const char *file, const char *func, int line);
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_ring_ready(switch_channel_t *channel, const char *file, const char *func, int line);
|
SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_ring_ready_value(switch_channel_t *channel,
|
||||||
|
switch_ring_ready_t rv,
|
||||||
|
const char *file, const char *func, int line);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Indicate progress on a channel to attempt early media
|
\brief Indicate progress on a channel to attempt early media
|
||||||
@ -407,7 +413,11 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_ring_ready(switch_ch
|
|||||||
\param channel channel
|
\param channel channel
|
||||||
\return SWITCH_STATUS_SUCCESS
|
\return SWITCH_STATUS_SUCCESS
|
||||||
*/
|
*/
|
||||||
#define switch_channel_mark_ring_ready(channel) switch_channel_perform_mark_ring_ready(channel, __FILE__, __SWITCH_FUNC__, __LINE__)
|
#define switch_channel_mark_ring_ready(channel) \
|
||||||
|
switch_channel_perform_mark_ring_ready_value(channel, SWITCH_RING_READY_RINGING, __FILE__, __SWITCH_FUNC__, __LINE__)
|
||||||
|
|
||||||
|
#define switch_channel_mark_ring_ready_value(channel, _rv) \
|
||||||
|
switch_channel_perform_mark_ring_ready_value(channel, _rv, __FILE__, __SWITCH_FUNC__, __LINE__)
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief add a state handler table to a given channel
|
\brief add a state handler table to a given channel
|
||||||
|
@ -934,6 +934,12 @@ typedef enum {
|
|||||||
CS_NONE
|
CS_NONE
|
||||||
} switch_channel_state_t;
|
} switch_channel_state_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SWITCH_RING_READY_NONE,
|
||||||
|
SWITCH_RING_READY_RINGING,
|
||||||
|
SWITCH_RING_READY_QUEUED
|
||||||
|
} switch_ring_ready_t;
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\enum switch_channel_flag_t
|
\enum switch_channel_flag_t
|
||||||
|
@ -2007,29 +2007,54 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SWITCH_MESSAGE_INDICATE_RINGING:
|
case SWITCH_MESSAGE_INDICATE_RINGING:
|
||||||
|
{
|
||||||
|
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)) {
|
if (sofia_test_pflag(tech_pvt->profile, PFLAG_3PCC_PROXY) && sofia_test_flag(tech_pvt, TFLAG_3PCC)) {
|
||||||
switch_channel_mark_ring_ready(channel);
|
switch_channel_mark_ring_ready(channel);
|
||||||
status = SWITCH_STATUS_SUCCESS;
|
status = SWITCH_STATUS_SUCCESS;
|
||||||
switch_log_printf(SWITCH_CHANNEL_ID_LOG, msg->_file, msg->_func, msg->_line, NULL, SWITCH_LOG_INFO,
|
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");
|
"Pretending to send ringing. Not available for 3pcc calls\n");
|
||||||
goto end_lock;
|
goto end_lock;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!switch_channel_test_flag(channel, CF_RING_READY) && !sofia_test_flag(tech_pvt, TFLAG_BYE) &&
|
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)) {
|
!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);
|
char *extra_header = sofia_glue_get_extra_headers(channel, SOFIA_SIP_PROGRESS_HEADER_PREFIX);
|
||||||
const char *call_info = switch_channel_get_variable(channel, "presence_call_info_full");
|
const char *call_info = switch_channel_get_variable(channel, "presence_call_info_full");
|
||||||
|
|
||||||
nua_respond(tech_pvt->nh, SIP_180_RINGING,
|
|
||||||
SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
|
switch (ring_ready_val) {
|
||||||
SIPTAG_HEADER_STR(generate_pai_str(session)),
|
|
||||||
TAG_IF(call_info, SIPTAG_CALL_INFO_STR(call_info)),
|
case SWITCH_RING_READY_QUEUED:
|
||||||
TAG_IF(!zstr(extra_header), SIPTAG_HEADER_STR(extra_header)),
|
|
||||||
TAG_IF(switch_stristr("update_display", tech_pvt->x_freeswitch_support_remote),
|
nua_respond(tech_pvt->nh, SIP_182_QUEUED,
|
||||||
SIPTAG_HEADER_STR("X-FS-Support: " FREESWITCH_SUPPORT)), TAG_END());
|
SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
|
||||||
switch_safe_free(extra_header);
|
SIPTAG_HEADER_STR(generate_pai_str(session)),
|
||||||
switch_channel_mark_ring_ready(channel);
|
TAG_IF(call_info, SIPTAG_CALL_INFO_STR(call_info)),
|
||||||
|
TAG_IF(!zstr(extra_header), SIPTAG_HEADER_STR(extra_header)),
|
||||||
|
TAG_IF(switch_stristr("update_display", tech_pvt->x_freeswitch_support_remote),
|
||||||
|
SIPTAG_HEADER_STR("X-FS-Support: " FREESWITCH_SUPPORT)), TAG_END());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SWITCH_RING_READY_RINGING:
|
||||||
|
default:
|
||||||
|
|
||||||
|
nua_respond(tech_pvt->nh, SIP_180_RINGING,
|
||||||
|
SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
|
||||||
|
SIPTAG_HEADER_STR(generate_pai_str(session)),
|
||||||
|
TAG_IF(call_info, SIPTAG_CALL_INFO_STR(call_info)),
|
||||||
|
TAG_IF(!zstr(extra_header), SIPTAG_HEADER_STR(extra_header)),
|
||||||
|
TAG_IF(switch_stristr("update_display", tech_pvt->x_freeswitch_support_remote),
|
||||||
|
SIPTAG_HEADER_STR("X-FS-Support: " FREESWITCH_SUPPORT)), TAG_END());
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
switch_safe_free(extra_header);
|
||||||
|
switch_channel_mark_ring_ready(channel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SWITCH_MESSAGE_INDICATE_ANSWER:
|
case SWITCH_MESSAGE_INDICATE_ANSWER:
|
||||||
|
@ -4350,8 +4350,16 @@ 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 (status == 180) {
|
|
||||||
|
switch (status) {
|
||||||
|
case 180:
|
||||||
switch_channel_mark_ring_ready(channel);
|
switch_channel_mark_ring_ready(channel);
|
||||||
|
break;
|
||||||
|
case 182:
|
||||||
|
switch_channel_mark_ring_ready_value(channel, SWITCH_RING_READY_QUEUED);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r_sdp) {
|
if (r_sdp) {
|
||||||
|
@ -2278,7 +2278,9 @@ SWITCH_DECLARE(switch_channel_state_t) switch_channel_perform_hangup(switch_chan
|
|||||||
return channel->state;
|
return channel->state;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_ring_ready(switch_channel_t *channel, const char *file, const char *func, int line)
|
SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_ring_ready_value(switch_channel_t *channel,
|
||||||
|
switch_ring_ready_t rv,
|
||||||
|
const char *file, const char *func, int line)
|
||||||
{
|
{
|
||||||
const char *var;
|
const char *var;
|
||||||
char *app;
|
char *app;
|
||||||
@ -2287,7 +2289,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_ring_ready(switch_ch
|
|||||||
if (!switch_channel_test_flag(channel, CF_RING_READY) && !switch_channel_test_flag(channel, CF_EARLY_MEDIA &&
|
if (!switch_channel_test_flag(channel, CF_RING_READY) && !switch_channel_test_flag(channel, CF_EARLY_MEDIA &&
|
||||||
!switch_channel_test_flag(channel, CF_ANSWERED))) {
|
!switch_channel_test_flag(channel, CF_ANSWERED))) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, switch_channel_get_uuid(channel), SWITCH_LOG_NOTICE, "Ring-Ready %s!\n", channel->name);
|
switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, switch_channel_get_uuid(channel), SWITCH_LOG_NOTICE, "Ring-Ready %s!\n", channel->name);
|
||||||
switch_channel_set_flag(channel, CF_RING_READY);
|
switch_channel_set_flag_value(channel, CF_RING_READY, rv);
|
||||||
if (channel->caller_profile && channel->caller_profile->times) {
|
if (channel->caller_profile && channel->caller_profile->times) {
|
||||||
switch_mutex_lock(channel->profile_mutex);
|
switch_mutex_lock(channel->profile_mutex);
|
||||||
channel->caller_profile->times->progress = switch_micro_time_now();
|
channel->caller_profile->times->progress = switch_micro_time_now();
|
||||||
@ -2423,7 +2425,8 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_pre_answer(switch_channel
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_status_t) switch_channel_perform_ring_ready(switch_channel_t *channel, const char *file, const char *func, int line)
|
SWITCH_DECLARE(switch_status_t) switch_channel_perform_ring_ready_value(switch_channel_t *channel, switch_ring_ready_t rv,
|
||||||
|
const char *file, const char *func, int line)
|
||||||
{
|
{
|
||||||
switch_core_session_message_t msg = { 0 };
|
switch_core_session_message_t msg = { 0 };
|
||||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||||
@ -2445,11 +2448,13 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_ring_ready(switch_channel
|
|||||||
if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
|
if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
|
||||||
msg.message_id = SWITCH_MESSAGE_INDICATE_RINGING;
|
msg.message_id = SWITCH_MESSAGE_INDICATE_RINGING;
|
||||||
msg.from = channel->name;
|
msg.from = channel->name;
|
||||||
|
msg.numeric_arg = rv;
|
||||||
status = switch_core_session_perform_receive_message(channel->session, &msg, file, func, line);
|
status = switch_core_session_perform_receive_message(channel->session, &msg, file, func, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status == SWITCH_STATUS_SUCCESS) {
|
if (status == SWITCH_STATUS_SUCCESS) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, switch_channel_get_uuid(channel), SWITCH_LOG_NOTICE, "Ring Ready %s!\n", channel->name);
|
switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, switch_channel_get_uuid(channel), SWITCH_LOG_NOTICE, "Ring Ready %s!\n", channel->name);
|
||||||
|
switch_channel_perform_mark_ring_ready_value(channel, rv, file, func, line);
|
||||||
} else {
|
} else {
|
||||||
switch_channel_hangup(channel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION);
|
switch_channel_hangup(channel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION);
|
||||||
}
|
}
|
||||||
|
@ -413,6 +413,7 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
|
|||||||
int pindex = -1;
|
int pindex = -1;
|
||||||
char bug_key[256] = "";
|
char bug_key[256] = "";
|
||||||
int send_ringback = 0;
|
int send_ringback = 0;
|
||||||
|
uint32_t ring_ready_val = 0;
|
||||||
|
|
||||||
oglobals->hups = 0;
|
oglobals->hups = 0;
|
||||||
oglobals->idx = IDX_NADA;
|
oglobals->idx = IDX_NADA;
|
||||||
@ -451,9 +452,9 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (switch_channel_test_flag(originate_status[i].peer_channel, CF_RING_READY)) {
|
if ((ring_ready_val = switch_channel_test_flag(originate_status[i].peer_channel, CF_RING_READY))) {
|
||||||
if (!originate_status[i].ring_ready) {
|
if (!originate_status[i].ring_ready) {
|
||||||
originate_status[i].ring_ready = 1;
|
originate_status[i].ring_ready = ring_ready_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oglobals->sending_ringback == 1) {
|
if (oglobals->sending_ringback == 1) {
|
||||||
@ -461,13 +462,13 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
|
|||||||
pindex = (uint32_t) i;
|
pindex = (uint32_t) i;
|
||||||
} else {
|
} else {
|
||||||
if (!oglobals->ring_ready) {
|
if (!oglobals->ring_ready) {
|
||||||
oglobals->ring_ready = 1;
|
oglobals->ring_ready = ring_ready_val;
|
||||||
if (caller_channel && !oglobals->ignore_ring_ready) {
|
if (caller_channel && !oglobals->ignore_ring_ready) {
|
||||||
if (len == 1) {
|
if (len == 1) {
|
||||||
switch_channel_pass_callee_id(originate_status[0].peer_channel, caller_channel);
|
switch_channel_pass_callee_id(originate_status[0].peer_channel, caller_channel);
|
||||||
}
|
}
|
||||||
switch_channel_ring_ready(caller_channel);
|
switch_channel_ring_ready_value(caller_channel, ring_ready_val);
|
||||||
oglobals->sent_ring = 1;
|
oglobals->sent_ring = ring_ready_val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -485,7 +486,7 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
|
|||||||
pindex = (uint32_t) i;
|
pindex = (uint32_t) i;
|
||||||
} else if (!oglobals->sent_ring && oglobals->ignore_early_media == 2 && len == 1 && caller_channel && !oglobals->ignore_ring_ready) {
|
} else if (!oglobals->sent_ring && oglobals->ignore_early_media == 2 && len == 1 && caller_channel && !oglobals->ignore_ring_ready) {
|
||||||
switch_channel_pass_callee_id(originate_status[0].peer_channel, caller_channel);
|
switch_channel_pass_callee_id(originate_status[0].peer_channel, caller_channel);
|
||||||
switch_channel_ring_ready(caller_channel);
|
//switch_channel_ring_ready(caller_channel);
|
||||||
oglobals->sent_ring = 1;
|
oglobals->sent_ring = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user