From 628e59a3ae30e53528579c3e2e60e172d4275a38 Mon Sep 17 00:00:00 2001 From: Brian West Date: Tue, 11 Apr 2006 14:55:14 +0000 Subject: [PATCH] add some events and more data to core DB git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@1115 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch_types.h | 8 +++- src/mod/endpoints/mod_exosip/mod_exosip.c | 20 ++++++-- src/switch_caller.c | 8 ++++ src/switch_core.c | 56 +++++++++++++++++++---- src/switch_event.c | 2 + src/switch_ivr.c | 15 ++++-- 6 files changed, 89 insertions(+), 20 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 373751af23..badfc5046e 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -431,7 +431,9 @@ typedef enum { SWITCH_EVENT_CHANNEL_STATE - A channel has changed state SWITCH_EVENT_CHANNEL_ANSWER - A channel has been answered SWITCH_EVENT_CHANNEL_HANGUP - A channel has been hungup - SWITCH_EVENT_CHANNEL_EXEC - A channel has executed a module's application + SWITCH_EVENT_CHANNEL_EXECUTE - A channel has executed a module's application + SWITCH_EVENT_CHANNEL_BRIDGE - A channel has bridged to another channel + SWITCH_EVENT_CHANNEL_UNBRIDGE - A channel has unbridged from another channel SWITCH_EVENT_API - An API call has been executed SWITCH_EVENT_LOG - A LOG event has been triggered SWITCH_EVENT_INBOUND_CHAN - A new inbound channel has been created @@ -450,7 +452,9 @@ typedef enum { SWITCH_EVENT_CHANNEL_STATE, SWITCH_EVENT_CHANNEL_ANSWER, SWITCH_EVENT_CHANNEL_HANGUP, - SWITCH_EVENT_CHANNEL_EXEC, + SWITCH_EVENT_CHANNEL_EXECUTE, + SWITCH_EVENT_CHANNEL_BRIDGE, + SWITCH_EVENT_CHANNEL_UNBRIDGE, SWITCH_EVENT_API, SWITCH_EVENT_LOG, SWITCH_EVENT_INBOUND_CHAN, diff --git a/src/mod/endpoints/mod_exosip/mod_exosip.c b/src/mod/endpoints/mod_exosip/mod_exosip.c index 972881dbec..88a6681337 100644 --- a/src/mod/endpoints/mod_exosip/mod_exosip.c +++ b/src/mod/endpoints/mod_exosip/mod_exosip.c @@ -1086,6 +1086,7 @@ static switch_status exosip_create_call(eXosip_event_t * event) osip_from_t *from; char *displayname, *username; osip_header_t *tedious; + char *val; switch_core_session_add_stream(session, NULL); if ((tech_pvt = (struct private_object *) switch_core_session_alloc(session, sizeof(struct private_object))) != 0) { @@ -1112,10 +1113,21 @@ static switch_status exosip_create_call(eXosip_event_t * event) switch_core_session_destroy(&session); return SWITCH_STATUS_MEMERR; } - if (!(displayname = osip_from_get_displayname(from))) { - displayname = event->request->from->url->username; - if (!displayname) { - displayname = "n/a"; + if (!(val = osip_from_get_displayname(from))) { + val = event->request->from->url->username; + if (!val) { + val = "n/a"; + } + } + + displayname = switch_core_session_strdup(session, val); + + if (*displayname == '"') { + char *p; + + displayname++; + if ((p = strchr(displayname, '"'))) { + *p = '\0'; } } diff --git a/src/switch_caller.c b/src/switch_caller.c index b28afedab6..2b81a06a33 100644 --- a/src/switch_caller.c +++ b/src/switch_caller.c @@ -108,6 +108,14 @@ SWITCH_DECLARE(void) switch_caller_profile_event_set_data(switch_caller_profile snprintf(header_name, sizeof(header_name), "%s-Destination-Number", prefix); switch_event_add_header(event, SWITCH_STACK_BOTTOM, header_name, caller_profile->destination_number); } + if (caller_profile->uuid) { + snprintf(header_name, sizeof(header_name), "%s-Unique-ID", prefix); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, header_name, caller_profile->uuid); + } + if (caller_profile->chan_name) { + snprintf(header_name, sizeof(header_name), "%s-Channel-Name", prefix); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, header_name, caller_profile->chan_name); + } } diff --git a/src/switch_core.c b/src/switch_core.c index 61da6cbc31..91c948f814 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1705,7 +1705,7 @@ static void switch_core_standard_on_execute(switch_core_session *session) return; } - if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_EXEC) == SWITCH_STATUS_SUCCESS) { + if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_EXECUTE) == SWITCH_STATUS_SUCCESS) { switch_channel_event_set_data(session->channel, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Application", extension->current_application->application_name); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Application-Data", extension->current_application->application_data); @@ -2279,7 +2279,7 @@ static void core_event_handler(switch_event *event) switch (event->event_id) { case SWITCH_EVENT_CHANNEL_CREATE: - snprintf(buf, sizeof(buf), "insert into calls (uuid,created,name,state) values('%s','%s','%s','%s')", + snprintf(buf, sizeof(buf), "insert into channels (uuid,created,name,state) values('%s','%s','%s','%s')", switch_event_get_header(event, "unique-id"), switch_event_get_header(event, "event-date-local"), switch_event_get_header(event, "channel-name"), @@ -2287,8 +2287,8 @@ static void core_event_handler(switch_event *event) ); sql = buf; break; - case SWITCH_EVENT_CHANNEL_EXEC: - snprintf(buf, sizeof(buf), "update calls set application='%s',application_data='%s' where uuid='%s'", + case SWITCH_EVENT_CHANNEL_EXECUTE: + snprintf(buf, sizeof(buf), "update channels set application='%s',application_data='%s' where uuid='%s'", switch_event_get_header(event, "application"), switch_event_get_header(event, "application-data"), switch_event_get_header(event, "unique-id") @@ -2302,11 +2302,11 @@ static void core_event_handler(switch_event *event) switch(state_i) { case CS_HANGUP: - snprintf(buf, sizeof(buf), "delete from calls where uuid='%s'", switch_event_get_header(event, "unique-id")); + snprintf(buf, sizeof(buf), "delete from channels where uuid='%s'", switch_event_get_header(event, "unique-id")); sql = buf; break; case CS_RING: - snprintf(buf, sizeof(buf), "update calls set state='%s',cid_name='%s',cid_num='%s',ip_addr='%s',dest='%s'" + snprintf(buf, sizeof(buf), "update channels set state='%s',cid_name='%s',cid_num='%s',ip_addr='%s',dest='%s'" "where uuid='%s'", switch_event_get_header(event, "channel-state"), switch_event_get_header(event, "caller-caller-id-name"), @@ -2318,7 +2318,7 @@ static void core_event_handler(switch_event *event) sql = buf; break; default: - snprintf(buf, sizeof(buf), "update calls set state='%s' where uuid='%s'", + snprintf(buf, sizeof(buf), "update channels set state='%s' where uuid='%s'", switch_event_get_header(event, "channel-state"), switch_event_get_header(event, "unique-id") ); @@ -2328,8 +2328,28 @@ static void core_event_handler(switch_event *event) } break; + case SWITCH_EVENT_CHANNEL_BRIDGE: + snprintf(buf, sizeof(buf), "insert into calls values ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')", + switch_event_get_header(event, "event-calling-function"), + switch_event_get_header(event, "caller-caller-id-name"), + switch_event_get_header(event, "caller-caller-id-number"), + switch_event_get_header(event, "caller-destination-number"), + switch_event_get_header(event, "caller-channel-name"), + switch_event_get_header(event, "caller-unique-id"), + switch_event_get_header(event, "originatee-caller-id-name"), + switch_event_get_header(event, "originatee-caller-id-number"), + switch_event_get_header(event, "originatee-destination-number"), + switch_event_get_header(event, "originatee-channel-name"), + switch_event_get_header(event, "originatee-unique-id") + ); + sql = buf; + break; + case SWITCH_EVENT_CHANNEL_UNBRIDGE: + snprintf(buf, sizeof(buf), "delete from calls where caller_uuid='%s'", switch_event_get_header(event, "caller-unique-id")); + sql = buf; + break; case SWITCH_EVENT_SHUTDOWN: - snprintf(buf, sizeof(buf), "delete from calls"); + snprintf(buf, sizeof(buf), "delete from channels"); sql = buf; break; case SWITCH_EVENT_LOG: @@ -2430,8 +2450,8 @@ SWITCH_DECLARE(switch_status) switch_core_init(char *console) if ((runtime.db = switch_core_db_handle()) == 0 ) { switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Error Opening DB!\n"); } else { - char create_calls_sql[] = - "CREATE TABLE calls (\n" + char create_channels_sql[] = + "CREATE TABLE channels (\n" " uuid VARCHAR(255),\n" " created VARCHAR(255),\n" " name VARCHAR(255),\n" @@ -2443,9 +2463,25 @@ SWITCH_DECLARE(switch_status) switch_core_init(char *console) " application VARCHAR(255),\n" " application_data VARCHAR(255)\n" ");\n"; + char create_calls_sql[] = + "CREATE TABLE calls (\n" + " function VARCHAR(255),\n" + " caller_cid_name VARCHAR(255),\n" + " caller_cid_num VARCHAR(255),\n" + " caller_dest_num VARCHAR(255),\n" + " caller_chan_name VARCHAR(255),\n" + " caller_uuid VARCHAR(255),\n" + " callee_cid_name VARCHAR(255),\n" + " callee_cid_num VARCHAR(255),\n" + " callee_dest_num VARCHAR(255),\n" + " callee_chan_name VARCHAR(255),\n" + " callee_uuid VARCHAR(255)\n" + ");\n"; switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Opening DB\n"); + switch_core_db_exec(runtime.db, "drop table channels", NULL, NULL, NULL); switch_core_db_exec(runtime.db, "drop table calls", NULL, NULL, NULL); + switch_core_db_exec(runtime.db, create_channels_sql, NULL, NULL, NULL); switch_core_db_exec(runtime.db, create_calls_sql, NULL, NULL, NULL); if (switch_event_bind("core_db", SWITCH_EVENT_ALL, SWITCH_EVENT_SUBCLASS_ANY, core_event_handler, NULL) != diff --git a/src/switch_event.c b/src/switch_event.c index 2ed779d0d2..f31ae99bd8 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -89,6 +89,8 @@ static char *EVENT_NAMES[] = { "CHANNEL_ANSWER", "CHANNEL_HANGUP", "CHANNEL_EXECUTE", + "CHANNEL_BRIDGE", + "CHANNEL_UNBRIDGE", "API", "LOG", "INBOUND_CHAN", diff --git a/src/switch_ivr.c b/src/switch_ivr.c index f8eebcf348..eadc005124 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -33,8 +33,6 @@ #include -/* TBD (Lots! there are not very many functions in here lol) */ - SWITCH_DECLARE(switch_status) switch_ivr_collect_digits_callback(switch_core_session *session, switch_dtmf_callback_function dtmf_callback, void *buf, @@ -927,12 +925,21 @@ SWITCH_DECLARE(switch_status) switch_ivr_multi_threaded_bridge(switch_core_sessi switch_channel_answer(caller_channel); } - if (switch_channel_test_flag(peer_channel, CF_ANSWERED) || - switch_channel_test_flag(peer_channel, CF_EARLY_MEDIA)) { + if (switch_channel_test_flag(peer_channel, CF_ANSWERED) || switch_channel_test_flag(peer_channel, CF_EARLY_MEDIA)) { + switch_event *event; + + if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_BRIDGE) == SWITCH_STATUS_SUCCESS) { + switch_channel_event_set_data(caller_channel, event); + switch_event_fire(&event); + } switch_core_session_launch_thread(session, audio_bridge_thread, (void *) &other_audio_thread); audio_bridge_thread(NULL, (void *) &this_audio_thread); + if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_UNBRIDGE) == SWITCH_STATUS_SUCCESS) { + switch_channel_event_set_data(caller_channel, event); + switch_event_fire(&event); + } } return SWITCH_STATUS_SUCCESS; }