summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2016-05-10 04:48:35 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2016-05-10 04:48:35 -0500
commitb4e10e7c901997ae2ee95fc819552cb557ecdbf1 (patch)
treef2fecf31608c8764970d1230bd7cb2569fc4c689
parentf60b1f35a02f07cc1e2f152d593dbc880942c287 (diff)
parent8923c9ac965a156bd2c0839e95d30023cd4088d4 (diff)
Merge "app_confbridge: Add a regcontext option for confbridge bridge profiles."
-rw-r--r--CHANGES8
-rw-r--r--apps/app_confbridge.c15
-rw-r--r--apps/confbridge/conf_config_parser.c19
-rw-r--r--apps/confbridge/include/confbridge.h1
-rw-r--r--configs/samples/confbridge.conf.sample2
5 files changed, 45 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES
index 255ccd24a..ec44e30fc 100644
--- a/CHANGES
+++ b/CHANGES
@@ -289,6 +289,14 @@ res_pjsip
into the "reg_server" field in the ps_contacts table to facilitate
multi-server setups.
+app_confbridge
+------------------
+ * Added a bridge profile option called regcontext that allows you to
+ dynamically register the conference bridge name as an extension into
+ the specified context. This allows tracking down conferences on multi-
+ server installations via alternate means (DUNDI for example). By default
+ this feature is not used.
+
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 13.8.0 to Asterisk 13.9.0 ------------
------------------------------------------------------------------------------
diff --git a/apps/app_confbridge.c b/apps/app_confbridge.c
index b3609b673..82204c48f 100644
--- a/apps/app_confbridge.c
+++ b/apps/app_confbridge.c
@@ -1256,9 +1256,17 @@ void conf_handle_second_active(struct confbridge_conference *conference)
void conf_ended(struct confbridge_conference *conference)
{
+ struct pbx_find_info q = { .stacklen = 0 };
+
/* Called with a reference to conference */
ao2_unlink(conference_bridges, conference);
send_conf_end_event(conference);
+ if (!ast_strlen_zero(conference->b_profile.regcontext) &&
+ pbx_find_extension(NULL, NULL, &q, conference->b_profile.regcontext,
+ conference->name, 1, NULL, "", E_MATCH)) {
+ ast_context_remove_extension(conference->b_profile.regcontext,
+ conference->name, 1, NULL);
+ }
ao2_lock(conference);
conf_stop_record(conference);
ao2_unlock(conference);
@@ -1363,6 +1371,13 @@ static struct confbridge_conference *join_conference_bridge(const char *conferen
}
send_conf_start_event(conference);
+
+ if (!ast_strlen_zero(conference->b_profile.regcontext)) {
+ if (!ast_exists_extension(NULL, conference->b_profile.regcontext, conference->name, 1, NULL)) {
+ ast_add_extension(conference->b_profile.regcontext, 1, conference->name, 1, NULL, NULL, "Noop", NULL, NULL, "ConfBridge");
+ }
+ }
+
ast_debug(1, "Created conference '%s' and linked to container.\n", conference_name);
}
diff --git a/apps/confbridge/conf_config_parser.c b/apps/confbridge/conf_config_parser.c
index a33c6a12a..69d6f69ea 100644
--- a/apps/confbridge/conf_config_parser.c
+++ b/apps/confbridge/conf_config_parser.c
@@ -339,6 +339,22 @@ ASTERISK_REGISTER_FILE()
unescaped to <variable>X</variable>. All variables will be evaluated at the time ConfBridge is called.
</para></description>
</configOption>
+ <configOption name="regcontext">
+ <synopsis>The name of the context into which to register the name of the conference bridge as NoOP() at priority 1</synopsis>
+ <description><para>
+ When set this will cause the name of the created conference to be registered
+ into the named context at priority 1 with an operation of NoOP(). This can
+ then be used in other parts of the dialplan to test for the existence of a
+ specific conference bridge.
+ You should be aware that there are potential races between testing for the
+ existence of a bridge, and taking action upon that information, consider
+ for example two callers executing the check simultaniously, and then taking
+ special action as "first caller" into the bridge. The same for exiting,
+ directly after the check the bridge can be destroyed before the new caller
+ enters (creating a new bridge), for example, and the "first member" actions
+ could thus be missed.
+ </para></description>
+ </configOption>
<configOption name="video_mode">
<synopsis>Sets how confbridge handles video distribution to the conference participants</synopsis>
<description><para>
@@ -1595,6 +1611,8 @@ static char *handle_cli_confbridge_show_bridge_profile(struct ast_cli_entry *e,
ast_cli(a->fd,"Max Members: No Limit\n");
}
+ ast_cli(a->fd,"Registration context: %s\n", b_profile.regcontext);
+
switch (b_profile.flags
& (BRIDGE_OPT_VIDEO_SRC_LAST_MARKED | BRIDGE_OPT_VIDEO_SRC_FIRST_MARKED
| BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER)) {
@@ -2163,6 +2181,7 @@ int conf_load_config(void)
aco_option_register(&cfg_info, "record_file", ACO_EXACT, bridge_types, NULL, OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, rec_file));
aco_option_register(&cfg_info, "record_options", ACO_EXACT, bridge_types, NULL, OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, rec_options));
aco_option_register(&cfg_info, "record_command", ACO_EXACT, bridge_types, NULL, OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, rec_command));
+ aco_option_register(&cfg_info, "regcontext", ACO_EXACT, bridge_types, NULL, OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, regcontext));
aco_option_register(&cfg_info, "language", ACO_EXACT, bridge_types, "en", OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, language));
aco_option_register_custom(&cfg_info, "^sound_", ACO_REGEX, bridge_types, NULL, sound_option_handler, 0);
/* This option should only be used with the CONFBRIDGE dialplan function */
diff --git a/apps/confbridge/include/confbridge.h b/apps/confbridge/include/confbridge.h
index 539b9961b..5ae042113 100644
--- a/apps/confbridge/include/confbridge.h
+++ b/apps/confbridge/include/confbridge.h
@@ -210,6 +210,7 @@ struct bridge_profile {
unsigned int internal_sample_rate; /*!< The internal sample rate of the bridge. 0 when set to auto adjust mode. */
unsigned int mix_interval; /*!< The internal mixing interval used by the bridge. When set to 0 the bridgewill use a default interval. */
struct bridge_profile_sounds *sounds;
+ char regcontext[AST_MAX_CONTEXT];
};
/*! \brief The structure that represents a conference bridge */
diff --git a/configs/samples/confbridge.conf.sample b/configs/samples/confbridge.conf.sample
index e73868596..5b9f52d4f 100644
--- a/configs/samples/confbridge.conf.sample
+++ b/configs/samples/confbridge.conf.sample
@@ -217,6 +217,8 @@ type=bridge
;language=en ; Set the language used for announcements to the conference.
; Default is en (English).
+;regcontext=conferences ; The name of the context into which to register conference names as extensions.
+
; All sounds in the conference are customizable using the bridge profile options below.
; Simply state the option followed by the filename or full path of the filename after
; the option. Example: sound_had_joined=conf-hasjoin This will play the conf-hasjoin