diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 707ede43ac..cc8539085e 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -2149,7 +2149,8 @@ typedef enum { } switch_session_ctl_t; typedef enum { - SSH_FLAG_STICKY = (1 << 0) + SSH_FLAG_STICKY = (1 << 0), + SSH_FLAG_PRE_EXEC = (1 << 1) } switch_state_handler_flag_t; #ifdef WIN32 diff --git a/src/switch_core_state_machine.c b/src/switch_core_state_machine.c index 9bbf6e6714..a9c3e23216 100644 --- a/src/switch_core_state_machine.c +++ b/src/switch_core_state_machine.c @@ -433,10 +433,48 @@ void switch_core_state_machine_init(switch_memory_pool_t *pool) } \ switch_core_session_request_video_refresh(session); \ switch_core_media_gen_key_frame(session); \ - if (!driver_state_handler->on_##__STATE || (driver_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS \ - )) { \ + proceed = 1; \ + while (do_extra_handlers && (application_state_handler = switch_channel_get_state_handler(session->channel, index++)) != 0) { \ + if (!switch_test_flag(application_state_handler, SSH_FLAG_PRE_EXEC)) {\ + continue; \ + } \ + if (!application_state_handler->on_##__STATE \ + || (application_state_handler->on_##__STATE \ + && application_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS \ + )) { \ + proceed++; \ + continue; \ + } else { \ + proceed = 0; \ + break; \ + } \ + } \ + index = 0; \ + if (!proceed) global_proceed = 0; \ + proceed = 1; \ + while (do_extra_handlers && proceed && (application_state_handler = switch_core_get_state_handler(index++)) != 0) { \ + if (!switch_test_flag(application_state_handler, SSH_FLAG_PRE_EXEC)) { \ + continue; \ + } \ + if (!application_state_handler->on_##__STATE || \ + (application_state_handler->on_##__STATE && \ + application_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS \ + )) { \ + proceed++; \ + continue; \ + } else { \ + proceed = 0; \ + break; \ + } \ + } \ + index = 0; \ + if (!proceed) global_proceed = 0; \ + if (!driver_state_handler->on_##__STATE || (driver_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS )) { \ while (do_extra_handlers && (application_state_handler = switch_channel_get_state_handler(session->channel, index++)) != 0) { \ - if (!application_state_handler || !application_state_handler->on_##__STATE \ + if (switch_test_flag(application_state_handler, SSH_FLAG_PRE_EXEC)) { \ + continue; \ + } \ + if (!application_state_handler->on_##__STATE \ || (application_state_handler->on_##__STATE \ && application_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS \ )) { \ @@ -451,7 +489,10 @@ void switch_core_state_machine_init(switch_memory_pool_t *pool) if (!proceed) global_proceed = 0; \ proceed = 1; \ while (do_extra_handlers && proceed && (application_state_handler = switch_core_get_state_handler(index++)) != 0) { \ - if (!application_state_handler || !application_state_handler->on_##__STATE || \ + if (switch_test_flag(application_state_handler, SSH_FLAG_PRE_EXEC)) { \ + continue; \ + } \ + if (!application_state_handler->on_##__STATE || \ (application_state_handler->on_##__STATE && \ application_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS \ )) { \