[Freeswitch-users] Hangup after bridge

Mody, Darshan (Darshan) darshanmody at avaya.com
Tue Nov 13 21:27:18 UTC 2018


Hi

I find below documentation for hangup after bridge

hangup_after_bridge
BOOLEAN Controls what happens to a calling (A) party when in a bridge state and the called (B) party hangs up. If true the dialplan will stop processing and the A leg will be terminated when the B leg terminates. If false (default) the dialplan continues to be processed after the B leg terminates. This is checked after park_after_bridge<https://freeswitch.org/confluence/display/FREESWITCH/Variables+Master+List#VariablesMasterList-park_after_bridge> and transfer_after_bridge<https://freeswitch.org/confluence/display/FREESWITCH/Variables+Master+List#VariablesMasterList-transfer_after_bridge>.

In the below code within switch_ivr_bridge.c we are checking park_after_bridge transfer after bridge (highlighted). However we are not checking for hangup_after_bridge setting and hanging up the channel. Is there any reason for missing the check of hangup_after_bridge flag before hanging up the channel?

static switch_status_t audio_bridge_on_exchange_media(switch_core_session_t *session)
{
       switch_channel_t *channel = switch_core_session_get_channel(session);
       switch_ivr_bridge_data_t *bd = switch_channel_get_private(channel, "_bridge_");
       switch_channel_state_t state;
       const char *var;

       if (bd) {
              switch_channel_set_private(channel, "_bridge_", NULL);
              if (bd->session == session && *bd->b_uuid) {
                     audio_bridge_thread(NULL, (void *) bd);
                     switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
              } else {
                     switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
              }
       } else {
              switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
       }
       switch_channel_clear_state_handler(channel, &audio_bridge_peer_state_handlers);

       state = switch_channel_get_state(channel);

       if (!switch_channel_test_flag(channel, CF_TRANSFER) && !switch_channel_test_flag(channel, CF_REDIRECT) &&
              !switch_channel_test_flag(channel, CF_XFER_ZOMBIE) && bd && !bd->clean_exit && state != CS_PARK && state != CS_ROUTING &&
              state == CS_EXCHANGE_MEDIA && !switch_channel_test_flag(channel, CF_INNER_BRIDGE)) {

              if (state < CS_HANGUP && switch_true(switch_channel_get_variable(channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) {
                     switch_ivr_park_session(session);
                     return SWITCH_STATUS_FALSE;
              } else if (state < CS_HANGUP && (var = switch_channel_get_variable(channel, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE))) {
                     transfer_after_bridge(session, var);
                     return SWITCH_STATUS_FALSE;
              }

              if (switch_channel_test_flag(channel, CF_INTERCEPTED)) {
                     switch_channel_clear_flag(channel, CF_INTERCEPT);
                     switch_channel_clear_flag(channel, CF_INTERCEPTED);
                     return SWITCH_STATUS_FALSE;
              } else {
                     if (switch_channel_test_flag(channel, CF_INTERCEPT)) {
                           switch_channel_hangup(channel, SWITCH_CAUSE_PICKED_OFF);
                     } else {
                           if (!switch_channel_test_flag(channel, CF_ANSWERED)) {
                                  int x = 0;

                                  if (switch_channel_execute_on(channel, "execute_on_orphaned_bleg") == SWITCH_STATUS_SUCCESS) {
                                         x++;
                                  }

                                  if (switch_channel_api_on(channel, "api_on_orphaned_bleg") == SWITCH_STATUS_SUCCESS) {
                                         x++;
                                  }

                                  if (!x) {
                                         switch_channel_hangup(channel, SWITCH_CAUSE_ORIGINATOR_CANCEL);
                                  }

                           } else {
                                  switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
                           }
                     }
              }
       }

       if (switch_channel_get_state(channel) == CS_EXCHANGE_MEDIA) {
              switch_channel_set_variable(channel, "park_timeout", "3");
              switch_channel_set_state(channel, CS_PARK);
       }

       return SWITCH_STATUS_FALSE;
}

Thanks
Darshan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freeswitch.org/pipermail/freeswitch-users/attachments/20181113/2b07ac57/attachment-0001.html>


More information about the FreeSWITCH-users mailing list