From 8862fbc3a159014d8af3cb73760920a43d3ec13d Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Sat, 1 Mar 2014 00:27:23 +0500 Subject: [PATCH] FS-5461 --resolve you tricked me I said make 1 patch with all of it --- .../conf/autoload_configs/conference.conf.xml | 2 + .../mod_conference/mod_conference.c | 41 ++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/mod/applications/mod_conference/conf/autoload_configs/conference.conf.xml b/src/mod/applications/mod_conference/conf/autoload_configs/conference.conf.xml index eb78814bbf..fad7820edd 100644 --- a/src/mod/applications/mod_conference/conf/autoload_configs/conference.conf.xml +++ b/src/mod/applications/mod_conference/conf/autoload_configs/conference.conf.xml @@ -90,6 +90,8 @@ + + diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index c5fde3c7ac..25a482e41e 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -188,7 +188,8 @@ typedef enum { MFLAG_PAUSE_RECORDING = (1 << 22), MFLAG_ACK_VIDEO = (1 << 23), MFLAG_TOOL = (1 << 24), - MFLAG_GHOST = (1 << 25) + MFLAG_GHOST = (1 << 25), + MFLAG_JOIN_ONLY = (1 << 26) } member_flag_t; typedef enum { @@ -332,6 +333,7 @@ typedef struct conference_obj { char *is_locked_sound; char *is_unlocked_sound; char *kicked_sound; + char *join_only_sound; char *caller_id_name; char *caller_id_number; char *sound_prefix; @@ -7888,6 +7890,8 @@ static void set_mflags(const char *flags, member_flag_t *f) *f |= MFLAG_VIDEO_BRIDGE; } else if (!strcasecmp(argv[i], "ghost")) { *f |= MFLAG_GHOST; + } else if (!strcasecmp(argv[i], "join-only")) { + *f |= MFLAG_JOIN_ONLY; } } @@ -8360,6 +8364,34 @@ SWITCH_STANDARD_APP(conference_function) const char *endconf_grace_time_str; const char *auto_record_str; + /* no conference yet, so check for join-only flag */ + if (flags_str) { + set_mflags(flags_str,&mflags); + if (mflags & MFLAG_JOIN_ONLY) { + switch_event_t *event; + switch_xml_t jos_xml; + char *val; + /* send event */ + switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT); + switch_channel_event_set_basic_data(channel, event); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Conference-Name", conf_name); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Conference-Profile-Name", profile_name); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "rejected-join-only"); + switch_event_fire(&event); + /* check what sound file to play */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Cannot create a conference since join-only flag is set\n"); + jos_xml = switch_xml_find_child(xml_cfg.profile, "param", "name", "join-only-sound"); + if (jos_xml && (val = (char *) switch_xml_attr_soft(jos_xml, "value"))) { + switch_channel_answer(channel); + switch_ivr_play_file(session, NULL, val, NULL); + } + if (!switch_false(switch_channel_get_variable(channel, "hangup_after_conference"))) { + switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); + } + goto done; + } + } + /* couldn't find the conference, create one */ conference = conference_new(conf_name, xml_cfg, session, NULL); @@ -8967,6 +8999,7 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c char *is_locked_sound = NULL; char *is_unlocked_sound = NULL; char *kicked_sound = NULL; + char *join_only_sound = NULL; char *pin = NULL; char *mpin = NULL; char *pin_sound = NULL; @@ -9139,6 +9172,8 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c cdr_event_mode = val; } else if (!strcasecmp(var, "kicked-sound") && !zstr(val)) { kicked_sound = val; + } else if (!strcasecmp(var, "join-only-sound") && !zstr(val)) { + join_only_sound = val; } else if (!strcasecmp(var, "pin") && !zstr(val)) { pin = val; } else if (!strcasecmp(var, "moderator-pin") && !zstr(val)) { @@ -9386,6 +9421,10 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c conference->kicked_sound = switch_core_strdup(conference->pool, kicked_sound); } + if (!zstr(join_only_sound)) { + conference->join_only_sound = switch_core_strdup(conference->pool, join_only_sound); + } + if (!zstr(pin_sound)) { conference->pin_sound = switch_core_strdup(conference->pool, pin_sound); }