]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
more work on callstate events
authorAnthony Minessale <anthm@freeswitch.org>
Mon, 7 Jun 2010 23:01:02 +0000 (18:01 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Mon, 7 Jun 2010 23:01:02 +0000 (18:01 -0500)
libs/esl/src/esl_event.c
libs/esl/src/include/esl_event.h
src/include/switch_channel.h
src/include/switch_types.h
src/switch_channel.c
src/switch_core_state_machine.c
src/switch_event.c

index 5401e91f5cb3c3f9f5c79f844aff6941fdb4d17d..bb977592f8f564e3db0b1c285d136aa03c8777da 100644 (file)
@@ -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",
index 61673bff4ba8a6ec694b9e968449151d3c61612b..da5862a60a3ad7fa6af7183a59a24ad1dc64d21e 100644 (file)
@@ -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,
index 58b38312f203b1baf4510a9753eb99b4aef1ed22..7afc6edf6349624fdb6f760fe6b5fbf4bdef200b 100644 (file)
@@ -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);
index d4f328802c261a907438e2f414907cfd5f6cbca8..eadbdac97e7565e813c1831c0570d5755c1e86f4 100644 (file)
@@ -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,
index 49dd06d054c491906e18728ea8501694700f361a..6218a7a5c866366d6a26e337f3d193a09edfb879 100644 (file)
@@ -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) {
index 43315705ce1219ae6b8da0fc7c741fe3c14d0ae2..7c6cc7f306d989f69d4b11126237720048760c3d 100644 (file)
@@ -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);
index 0f9f60a1d10db59bfd224878fdee693b09a55b48..28bae571838932fd9d01ccf6b9d8af8bec96d8b4 100644 (file)
@@ -119,6 +119,7 @@ static char *EVENT_NAMES[] = {
        "CHANNEL_CREATE",
        "CHANNEL_DESTROY",
        "CHANNEL_STATE",
+       "CHANNEL_CALLSTATE",
        "CHANNEL_ANSWER",
        "CHANNEL_HANGUP",
        "CHANNEL_HANGUP_COMPLETE",