diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 80a8e5ef3c..c64b0b681b 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -582,8 +582,8 @@ static switch_status_t conference_add_member(conference_obj_t * conference, conf switch_event_add_header(event, SWITCH_STACK_BOTTOM, "event_count", "%d", EC++); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "unique-id", "%s", conference->name); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "channel-state", "%s", "CS_RING"); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "answer-state", "%s", "confirmed"); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-direction", "%s", "inbound"); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "answer-state", "%s", conference->count == 1 ? "early" : "confirmed"); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-direction", "%s", conference->count == 1 ? "outbound" : "inbound"); switch_event_fire(&event); } @@ -630,7 +630,7 @@ static switch_status_t conference_add_member(conference_obj_t * conference, conf } if (test_eflag(conference, EFLAG_ADD_MEMBER) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "add-member"); switch_event_fire(&event); @@ -724,8 +724,8 @@ static switch_status_t conference_del_member(conference_obj_t * conference, conf switch_event_add_header(event, SWITCH_STACK_BOTTOM, "event_count", "%d", EC++); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "unique-id", "%s", conference->name); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "channel-state", "%s", "CS_RING"); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "answer-state", "%s", "confirmed"); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-direction", "%s", "inbound"); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "answer-state", "%s", conference->count == 1 ? "early" : "confirmed"); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-direction", "%s", conference->count == 1 ? "outbound" : "inbound"); switch_event_fire(&event); } @@ -746,7 +746,7 @@ static switch_status_t conference_del_member(conference_obj_t * conference, conf } if (test_eflag(conference, EFLAG_DEL_MEMBER) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); conference_add_event_data(conference, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "del-member"); @@ -1251,7 +1251,7 @@ static void conference_loop_fn_energy_up(conference_member_t * member, caller_co } if (test_eflag(member->conference, EFLAG_ENERGY_LEVEL) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "energy-level"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-Level", "%d", member->energy_level); @@ -1274,7 +1274,7 @@ static void conference_loop_fn_energy_equ_conf(conference_member_t * member, cal member->energy_level = member->conference->energy_level; if (test_eflag(member->conference, EFLAG_ENERGY_LEVEL) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "energy-level"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-Level", "%d", member->energy_level); @@ -1300,7 +1300,7 @@ static void conference_loop_fn_energy_dn(conference_member_t * member, caller_co } if (test_eflag(member->conference, EFLAG_ENERGY_LEVEL) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "energy-level"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-Level", "%d", member->energy_level); @@ -1324,7 +1324,7 @@ static void conference_loop_fn_volume_talk_up(conference_member_t * member, call switch_normalize_volume(member->volume_out_level); if (test_eflag(member->conference, EFLAG_VOLUME_LEVEL) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "volume-level"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-Level", "%d", member->volume_out_level); @@ -1347,7 +1347,7 @@ static void conference_loop_fn_volume_talk_zero(conference_member_t * member, ca member->volume_out_level = 0; if (test_eflag(member->conference, EFLAG_VOLUME_LEVEL) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "volume-level"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-Level", "%d", member->volume_out_level); @@ -1371,7 +1371,7 @@ static void conference_loop_fn_volume_talk_dn(conference_member_t * member, call switch_normalize_volume(member->volume_out_level); if (test_eflag(member->conference, EFLAG_VOLUME_LEVEL) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "volume-level"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-Level", "%d", member->volume_out_level); @@ -1395,7 +1395,7 @@ static void conference_loop_fn_volume_listen_up(conference_member_t * member, ca switch_normalize_volume(member->volume_in_level); if (test_eflag(member->conference, EFLAG_GAIN_LEVEL) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "gain-level"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-Level", "%d", member->volume_in_level); @@ -1418,7 +1418,7 @@ static void conference_loop_fn_volume_listen_zero(conference_member_t * member, member->volume_in_level = 0; if (test_eflag(member->conference, EFLAG_GAIN_LEVEL) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "gain-level"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-Level", "%d", member->volume_in_level); @@ -1442,7 +1442,7 @@ static void conference_loop_fn_volume_listen_dn(conference_member_t * member, ca switch_normalize_volume(member->volume_in_level); if (test_eflag(member->conference, EFLAG_GAIN_LEVEL) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "gain-level"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-Level", "%d", member->volume_in_level); @@ -1458,7 +1458,7 @@ static void conference_loop_fn_event(conference_member_t * member, caller_contro { switch_event_t *event; if (test_eflag(member->conference, EFLAG_DTMF) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "dtmf"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "DTMF-Key", "%s", action->binded_dtmf); @@ -1515,7 +1515,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t * thread, switch_clear_flag_locked(member, MFLAG_TALKING); if (test_eflag(member->conference, EFLAG_STOP_TALKING) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "stop-talking"); switch_event_fire(&event); @@ -1567,7 +1567,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t * thread, !switch_test_flag(member->conference->floor_holder, MFLAG_TALKING) || member->score > member->conference->floor_holder->score + 200) { if (test_eflag(member->conference, EFLAG_FLOOR_CHANGE) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "floor-change"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Old-ID", "%d", @@ -1581,7 +1581,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t * thread, switch_mutex_unlock(member->conference->member_mutex); if (test_eflag(member->conference, EFLAG_START_TALKING) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "start-talking"); switch_event_fire(&event); @@ -1599,7 +1599,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t * thread, switch_clear_flag_locked(member, MFLAG_TALKING); if (test_eflag(member->conference, EFLAG_STOP_TALKING) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "stop-talking"); switch_event_fire(&event); @@ -2681,7 +2681,7 @@ static switch_status_t conf_api_sub_mute(conference_member_t * member, switch_st stream->write_function(stream, "OK mute %u\n", member->id); } if (test_eflag(member->conference, EFLAG_MUTE_MEMBER) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "mute-member"); switch_event_fire(&event); @@ -2709,7 +2709,7 @@ static switch_status_t conf_api_sub_unmute(conference_member_t * member, switch_ conference_member_say(member, msg, 0); } if (test_eflag(member->conference, EFLAG_UNMUTE_MEMBER) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "unmute-member"); switch_event_fire(&event); @@ -2771,7 +2771,7 @@ static switch_status_t conf_api_sub_kick(conference_member_t * member, switch_st stream->write_function(stream, "OK kicked %u\n", member->id); } if (test_eflag(member->conference, EFLAG_KICK_MEMBER) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "kick-member"); switch_event_fire(&event); @@ -2805,7 +2805,7 @@ static switch_status_t conf_api_sub_dtmf(conference_member_t * member, switch_st } if (test_eflag(member->conference, EFLAG_DTMF_MEMBER) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "dtmf-member"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Digits", "%s", dtmf); @@ -2830,7 +2830,7 @@ static switch_status_t conf_api_sub_energy(conference_member_t * member, switch_ stream->write_function(stream, "Energy %u = %d\n", member->id, member->energy_level); } if (test_eflag(member->conference, EFLAG_ENERGY_LEVEL_MEMBER) && - data && switch_event_create_subclass(& event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + data && switch_event_create_subclass(& event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "energy-level-member"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Energy-Level", "%d", member->energy_level); @@ -2856,7 +2856,7 @@ static switch_status_t conf_api_sub_volume_in(conference_member_t * member, swit stream->write_function(stream, "Volume IN %u = %d\n", member->id, member->volume_in_level); } if (test_eflag(member->conference, EFLAG_VOLUME_IN_MEMBER) && - data && switch_event_create_subclass(& event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + data && switch_event_create_subclass(& event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "volume-in-member"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Volume-Level", "%u", member->volume_in_level); @@ -2882,7 +2882,7 @@ static switch_status_t conf_api_sub_volume_out(conference_member_t * member, swi stream->write_function(stream, "Volume OUT %u = %d\n", member->id, member->volume_out_level); } if (test_eflag(member->conference, EFLAG_VOLUME_OUT_MEMBER) && data && - switch_event_create_subclass(& event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(& event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "volume-out-member"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Volume-Level", "%u", member->volume_out_level); @@ -2972,7 +2972,7 @@ static switch_status_t conf_api_sub_play(conference_obj_t * conference, switch_s if (conference_play_file(conference, argv[2], 0, NULL, async) == SWITCH_STATUS_SUCCESS) { stream->write_function(stream, "(play) Playing file %s\n", argv[2]); if (test_eflag(conference, EFLAG_PLAY_FILE) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(conference, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "play-file"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "File", "%s", argv[2]); @@ -2990,7 +2990,7 @@ static switch_status_t conf_api_sub_play(conference_obj_t * conference, switch_s if (conference_member_play_file(member, argv[2], 0) == SWITCH_STATUS_SUCCESS) { stream->write_function(stream, "(play) Playing file %s to member %u\n", argv[2], id); if (test_eflag(conference, EFLAG_PLAY_FILE_MEMBER) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "play-file-member"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "File", "%s", argv[2]); @@ -3024,7 +3024,7 @@ static switch_status_t conf_api_sub_say(conference_obj_t * conference, switch_st stream->write_function(stream, "(say) OK\n"); if (test_eflag(conference, EFLAG_SPEAK_TEXT) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(conference, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "speak-text"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Text", "%s", text); @@ -3083,7 +3083,7 @@ static switch_status_t conf_api_sub_saymember(conference_obj_t * conference, swi stream->write_function(stream, "(saymember) OK\n"); if (test_eflag(member->conference, EFLAG_SPEAK_TEXT_MEMBER) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "speak-text-member"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Text", "%s", text); @@ -3212,7 +3212,7 @@ static switch_status_t conf_api_sub_lock(conference_obj_t * conference, switch_s switch_set_flag_locked(conference, CFLAG_LOCKED); stream->write_function(stream, "OK %s locked\n", argv[0]); if (test_eflag(conference, EFLAG_LOCK) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(conference, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "lock"); switch_event_fire(&event); @@ -3235,7 +3235,7 @@ static switch_status_t conf_api_sub_unlock(conference_obj_t * conference, switch switch_clear_flag_locked(conference, CFLAG_LOCKED); stream->write_function(stream, "OK %s unlocked\n", argv[0]); if (test_eflag(conference, EFLAG_UNLOCK) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(conference, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "unlock"); switch_event_fire(&event); @@ -3395,7 +3395,7 @@ static switch_status_t conf_api_sub_transfer(conference_obj_t * conference, swit /* tell them what happened */ if (test_eflag(conference, EFLAG_TRANSFER) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Old-Conference-Name", "%s", conference->name); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-Conference-Name", "%s", argv[3]); @@ -3891,7 +3891,7 @@ static void *SWITCH_THREAD_FUNC conference_outcall_run(switch_thread_t * thread, call->session, call->bridgeto, call->timeout, call->flags, call->cid_name, call->cid_num, &cause); if (test_eflag(call->conference, EFLAG_BGDIAL_RESULT) && - switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(call->conference, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "bgdial-result"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Result", "%s", switch_channel_cause2str(cause)); @@ -5125,8 +5125,8 @@ static void pres_event_handler(switch_event_t *event) switch_event_add_header(event, SWITCH_STACK_BOTTOM, "event_count", "%d", EC++); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "unique-id", "%s", conf_name); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "channel-state", "%s", "CS_RING"); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "answer-state", "%s", "confirmed"); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-direction", "%s", "inbound"); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "answer-state", "%s", conference->count == 1 ? "early" : "confirmed"); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-direction", "%s", conference->count == 1 ? "outbound" : "inbound"); switch_event_fire(&event); } } else if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_IN) == SWITCH_STATUS_SUCCESS) { diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index 75a347da38..216421ff9f 100644 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -121,13 +121,89 @@ SWITCH_STANDARD_APP(intercept_function) switch_ivr_intercept_session(session, data); } +#define MAX_SPY 3000 +struct e_data { + char *uuid_list[MAX_SPY]; + int total; +}; + +static int e_callback(void *pArg, int argc, char **argv, char **columnNames) +{ + char *uuid = argv[0]; + struct e_data *e_data = (struct e_data *) pArg; + + if (uuid && e_data) { + e_data->uuid_list[e_data->total++] = strdup(uuid); + return 0; + } + + return 1; +} + #define eavesdrop_SYNTAX "" SWITCH_STANDARD_APP(eavesdrop_function) { if (switch_strlen_zero(data)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage: %s\n", eavesdrop_SYNTAX); } else { - switch_ivr_eavesdrop_session(session, data, ED_DTMF); + if (!strcasecmp((char *)data, "all")) { + switch_core_db_t *db = switch_core_db_handle(); + char *errmsg = NULL; + struct e_data e_data = {{ 0 }}; + char *sql = switch_mprintf("select uuid from channels where uuid != '%q'", switch_core_session_get_uuid(session)); + switch_channel_t *channel = switch_core_session_get_channel(session); + const char *file = NULL; + int x = 0; + char buf[2] = ""; + switch_size_t buflen = sizeof(buf); + char terminator; + + while(switch_channel_ready(channel)) { + for(x = 0; x < MAX_SPY; x++) { + switch_safe_free(e_data.uuid_list[x]); + } + e_data.total = 0; + switch_core_db_exec(db, sql, e_callback, &e_data, &errmsg); + if (errmsg) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Error: %s\n", errmsg); + switch_core_db_free(errmsg); + if ((file = switch_channel_get_variable(channel, "eavesdrop_indicate_failed"))) { + switch_ivr_play_file(session, NULL, file, NULL); + } + switch_ivr_collect_digits_count(session, buf, buflen, 1, "*", &terminator, 5000, 0, 0); + continue; + } + if (e_data.total) { + for (x = 0; x < e_data.total && switch_channel_ready(channel); x++) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Spy: %s\n", e_data.uuid_list[x]); + if ((file = switch_channel_get_variable(channel, "eavesdrop_indicate_new"))) { + switch_ivr_play_file(session, NULL, file, NULL); + } + if (switch_ivr_eavesdrop_session(session, e_data.uuid_list[x], ED_DTMF) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Spy: %s Failed\n", e_data.uuid_list[x]); + if ((file = switch_channel_get_variable(channel, "eavesdrop_indicate_failed"))) { + switch_ivr_play_file(session, NULL, file, NULL); + } + switch_ivr_collect_digits_count(session, buf, buflen, 1, "*", &terminator, 5000, 0, 0); + } + } + } else { + if ((file = switch_channel_get_variable(channel, "eavesdrop_indicate_idle"))) { + switch_ivr_play_file(session, NULL, file, NULL); + } + switch_ivr_collect_digits_count(session, buf, buflen, 1, "*", &terminator, 2000, 0, 0); + } + } + + for(x = 0; x < MAX_SPY; x++) { + switch_safe_free(e_data.uuid_list[x]); + } + + switch_core_db_close(db); + + } else { + switch_ivr_eavesdrop_session(session, data, ED_DTMF); + } } } diff --git a/src/mod/applications/mod_fifo/mod_fifo.c b/src/mod/applications/mod_fifo/mod_fifo.c index a3185af1f9..461a1dcaea 100644 --- a/src/mod/applications/mod_fifo/mod_fifo.c +++ b/src/mod/applications/mod_fifo/mod_fifo.c @@ -81,10 +81,8 @@ static switch_status_t on_dtmf(switch_core_session_t *session, void *input, swit moh_a = switch_channel_get_variable(channel, "hold_music"); } } - + switch_ivr_soft_hold(session, "0", moh_a, moh_b); - - return SWITCH_STATUS_IGNORE; } } diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index 14744b7045..fe022bbc2a 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -482,7 +482,7 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) *next++ = '\0'; } } - + if (!switch_strlen_zero(this) && (!last || strcmp(last, this))) { sofia_glue_execute_sql(profile, &this, SWITCH_FALSE); last = this; diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index 8f7d31b8f8..8524fb98ad 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -497,17 +497,23 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_session(switch_core_session switch_codec_t *read_codec = switch_core_session_get_read_codec(session); if ((tsession = switch_core_session_locate(uuid))) { - struct eavesdrop_pvt *ep; + struct eavesdrop_pvt *ep = NULL; switch_media_bug_t *bug = NULL; switch_channel_t *tchannel = switch_core_session_get_channel(tsession); switch_frame_t *read_frame, write_frame = { 0 }; switch_codec_t codec = {0}; int16_t buf[SWITCH_RECOMMENDED_BUFFER_SIZE/2]; switch_codec_t *tread_codec = switch_core_session_get_read_codec(tsession); - uint32_t tlen = tread_codec->implementation->bytes_per_frame; + uint32_t tlen; + + if (!switch_channel_media_ready(channel)) { + goto end; + } ep = switch_core_session_alloc(session, sizeof(*ep)); + tlen = tread_codec->implementation->bytes_per_frame; + switch_channel_pre_answer(channel); if (switch_core_codec_init(&codec, @@ -520,7 +526,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_session(switch_core_session NULL, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot init codec\n"); switch_core_session_rwunlock(tsession); - return status; + goto end; } switch_core_session_set_read_codec(session, &codec); @@ -599,6 +605,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_session(switch_core_session switch_clear_flag(ep, ED_MUX_READ); switch_clear_flag(ep, ED_MUX_WRITE); break; + case '*': + goto end; default: z = 0; break; @@ -657,17 +665,19 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_session(switch_core_session switch_core_media_bug_remove(tsession, &bug); } - if (ep->buffer) { - switch_buffer_destroy(&ep->buffer); - } - - if (ep->r_buffer) { - switch_buffer_destroy(&ep->r_buffer); - } - - if (ep->w_buffer) { - switch_buffer_destroy(&ep->w_buffer); - } + if (ep) { + if (ep->buffer) { + switch_buffer_destroy(&ep->buffer); + } + + if (ep->r_buffer) { + switch_buffer_destroy(&ep->r_buffer); + } + + if (ep->w_buffer) { + switch_buffer_destroy(&ep->w_buffer); + } + } switch_core_session_rwunlock(tsession); status = SWITCH_STATUS_SUCCESS;