From 6a064a953c8b7f58023b5d7388348341017d5e4d Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 19 Sep 2016 16:35:16 -0500 Subject: [PATCH] FS-9543 #resolve [Add pre-exec state change hooks to core] --- src/include/switch_types.h | 3 +- src/switch_core_state_machine.c | 49 ++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 5 deletions(-) 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 \ )) { \