From c752e71afeb65fb25c18c41ab8d244d70cf4dceb Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 7 Jun 2010 18:01:02 -0500 Subject: [PATCH] more work on callstate events --- libs/esl/src/esl_event.c | 5 +++-- libs/esl/src/include/esl_event.h | 3 +++ src/include/switch_channel.h | 4 +++- src/include/switch_types.h | 1 + src/switch_channel.c | 32 +++++++++++++++++++++++++------- src/switch_core_state_machine.c | 2 ++ src/switch_event.c | 1 + 7 files changed, 38 insertions(+), 10 deletions(-) diff --git a/libs/esl/src/esl_event.c b/libs/esl/src/esl_event.c index 5401e91f5c..bb977592f8 100644 --- a/libs/esl/src/esl_event.c +++ b/libs/esl/src/esl_event.c @@ -63,11 +63,14 @@ static const char *EVENT_NAMES[] = { "CHANNEL_CREATE", "CHANNEL_DESTROY", "CHANNEL_STATE", + "CHANNEL_CALLSTATE", "CHANNEL_ANSWER", "CHANNEL_HANGUP", "CHANNEL_HANGUP_COMPLETE", "CHANNEL_EXECUTE", "CHANNEL_EXECUTE_COMPLETE", + "CHANNEL_HOLD", + "CHANNEL_UNHOLD", "CHANNEL_BRIDGE", "CHANNEL_UNBRIDGE", "CHANNEL_PROGRESS", @@ -76,8 +79,6 @@ static const char *EVENT_NAMES[] = { "CHANNEL_PARK", "CHANNEL_UNPARK", "CHANNEL_APPLICATION", - "CHANNEL_HOLD", - "CHANNEL_UNHOLD", "CHANNEL_ORIGINATE", "CHANNEL_UUID", "API", diff --git a/libs/esl/src/include/esl_event.h b/libs/esl/src/include/esl_event.h index 61673bff4b..da5862a60a 100644 --- a/libs/esl/src/include/esl_event.h +++ b/libs/esl/src/include/esl_event.h @@ -51,11 +51,14 @@ typedef enum { ESL_EVENT_CHANNEL_CREATE, ESL_EVENT_CHANNEL_DESTROY, ESL_EVENT_CHANNEL_STATE, + ESL_EVENT_CHANNEL_CALLSTATE, ESL_EVENT_CHANNEL_ANSWER, ESL_EVENT_CHANNEL_HANGUP, ESL_EVENT_CHANNEL_HANGUP_COMPLETE, ESL_EVENT_CHANNEL_EXECUTE, ESL_EVENT_CHANNEL_EXECUTE_COMPLETE, + ESL_EVENT_CHANNEL_HOLD, + ESL_EVENT_CHANNEL_UNHOLD, ESL_EVENT_CHANNEL_BRIDGE, ESL_EVENT_CHANNEL_UNBRIDGE, ESL_EVENT_CHANNEL_PROGRESS, diff --git a/src/include/switch_channel.h b/src/include/switch_channel.h index 58b38312f2..7afc6edf63 100644 --- a/src/include/switch_channel.h +++ b/src/include/switch_channel.h @@ -560,7 +560,9 @@ SWITCH_DECLARE(char *) switch_channel_get_flag_string(switch_channel_t *channel) SWITCH_DECLARE(char *) switch_channel_get_cap_string(switch_channel_t *channel); SWITCH_DECLARE(int) switch_channel_state_change_pending(switch_channel_t *channel); -SWITCH_DECLARE(void) switch_channel_set_callstate(switch_channel_t *channel, switch_channel_callstate_t callstate); +SWITCH_DECLARE(void) switch_channel_perform_set_callstate(switch_channel_t *channel, switch_channel_callstate_t callstate, + const char *file, const char *func, int line); +#define switch_channel_set_callstate(channel, state) switch_channel_perform_set_callstate(channel, state, __FILE__, __SWITCH_FUNC__, __LINE__) SWITCH_DECLARE(switch_channel_callstate_t) switch_channel_get_callstate(switch_channel_t *channel); SWITCH_DECLARE(const char *) switch_channel_callstate2str(switch_channel_callstate_t callstate); SWITCH_DECLARE(switch_call_cause_t) switch_channel_str2callstate(const char *str); diff --git a/src/include/switch_types.h b/src/include/switch_types.h index d4f328802c..eadbdac97e 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -1355,6 +1355,7 @@ typedef enum { SWITCH_EVENT_CHANNEL_CREATE, SWITCH_EVENT_CHANNEL_DESTROY, SWITCH_EVENT_CHANNEL_STATE, + SWITCH_EVENT_CHANNEL_CALLSTATE, SWITCH_EVENT_CHANNEL_ANSWER, SWITCH_EVENT_CHANNEL_HANGUP, SWITCH_EVENT_CHANNEL_HANGUP_COMPLETE, diff --git a/src/switch_channel.c b/src/switch_channel.c index 49dd06d054..6218a7a5c8 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -196,9 +196,25 @@ static struct switch_callstate_table STATE_CHART[] = { }; -SWITCH_DECLARE(void) switch_channel_set_callstate(switch_channel_t *channel, switch_channel_callstate_t callstate) +SWITCH_DECLARE(void) switch_channel_perform_set_callstate(switch_channel_t *channel, switch_channel_callstate_t callstate, + const char *file, const char *func, int line) { + switch_event_t *event; + switch_channel_callstate_t o_callstate = channel->callstate; + + if (o_callstate == callstate) return; + channel->callstate = callstate; + + switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, switch_channel_get_uuid(channel), SWITCH_LOG_DEBUG, + "(%s) Callstate Change %s -> %s\n", channel->name, + switch_channel_callstate2str(o_callstate), switch_channel_callstate2str(callstate)); + + if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_CALLSTATE) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Original-Channel-Call-State", switch_channel_callstate2str(o_callstate)); + switch_channel_event_set_data(channel, event); + switch_event_fire(&event); + } } SWITCH_DECLARE(switch_channel_callstate_t) switch_channel_get_callstate(switch_channel_t *channel) @@ -1449,12 +1465,14 @@ SWITCH_DECLARE(switch_channel_state_t) switch_channel_perform_set_running_state( if (state <= CS_DESTROY) { switch_event_t *event; - if (state == CS_ROUTING) { - switch_channel_set_callstate(channel, CCS_RINGING); - } else if (switch_channel_test_flag(channel, CF_ANSWERED)) { - switch_channel_set_callstate(channel, CCS_ACTIVE); - } else if (switch_channel_test_flag(channel, CF_EARLY_MEDIA)) { - switch_channel_set_callstate(channel, CCS_EARLY); + if (state < CS_HANGUP) { + if (state == CS_ROUTING) { + switch_channel_set_callstate(channel, CCS_RINGING); + } else if (switch_channel_test_flag(channel, CF_ANSWERED)) { + switch_channel_set_callstate(channel, CCS_ACTIVE); + } else if (switch_channel_test_flag(channel, CF_EARLY_MEDIA)) { + switch_channel_set_callstate(channel, CCS_EARLY); + } } if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_STATE) == SWITCH_STATUS_SUCCESS) { diff --git a/src/switch_core_state_machine.c b/src/switch_core_state_machine.c index 43315705ce..7c6cc7f306 100644 --- a/src/switch_core_state_machine.c +++ b/src/switch_core_state_machine.c @@ -424,6 +424,8 @@ SWITCH_DECLARE(void) switch_core_session_destroy_state(switch_core_session_t *se int silly = 0; int index = 0; + switch_channel_set_callstate(session->channel, CCS_DOWN); + switch_assert(session != NULL); switch_channel_set_running_state(session->channel, CS_DESTROY); switch_channel_clear_flag(session->channel, CF_TRANSFER); diff --git a/src/switch_event.c b/src/switch_event.c index 0f9f60a1d1..28bae57183 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -119,6 +119,7 @@ static char *EVENT_NAMES[] = { "CHANNEL_CREATE", "CHANNEL_DESTROY", "CHANNEL_STATE", + "CHANNEL_CALLSTATE", "CHANNEL_ANSWER", "CHANNEL_HANGUP", "CHANNEL_HANGUP_COMPLETE",