diff options
author | Joshua Colp <jcolp@digium.com> | 2014-03-19 12:54:25 +0000 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2014-03-19 12:54:25 +0000 |
commit | 1cf74b87764fd1d0fa7d81d25d16121e1ce43f4f (patch) | |
tree | a468de791e4e8fbc927c3cc61c1acd6cf13ac0b8 /res/res_stasis.c | |
parent | e33e003f78a7118751c5a5555ff2878f6988e4d1 (diff) |
res_stasis: Extend bridge type to be a comma separated list of bridge attributes.
This change turns the bridge type field into a comma separated list of attributes.
These attributes include: mixing, holding, dtmf_events, and proxy_media. By setting
the various attributes a user can control the type of bridge created with the
behavior they need for their application.
(closes issue ASTERISK-23437)
Reported by: Matt Jordan
Review: https://reviewboard.asterisk.org/r/3359/
........
Merged revisions 410904 from http://svn.asterisk.org/svn/asterisk/branches/12
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@410905 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res/res_stasis.c')
-rw-r--r-- | res/res_stasis.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/res/res_stasis.c b/res/res_stasis.c index e7a8d983a..cfb1a7af1 100644 --- a/res/res_stasis.c +++ b/res/res_stasis.c @@ -588,19 +588,29 @@ static void control_unlink(struct stasis_app_control *control) struct ast_bridge *stasis_app_bridge_create(const char *type, const char *name, const char *id) { struct ast_bridge *bridge; - int capabilities; + char *requested_type, *requested_types = ast_strdupa(type); + int capabilities = 0; int flags = AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM | AST_BRIDGE_FLAG_MERGE_INHIBIT_TO | AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM | AST_BRIDGE_FLAG_SWAP_INHIBIT_TO | AST_BRIDGE_FLAG_TRANSFER_BRIDGE_ONLY; - if (ast_strlen_zero(type) || !strcmp(type, "mixing")) { - capabilities = AST_BRIDGE_CAPABILITY_1TO1MIX | - AST_BRIDGE_CAPABILITY_MULTIMIX | - AST_BRIDGE_CAPABILITY_NATIVE; - flags |= AST_BRIDGE_FLAG_SMART; - } else if (!strcmp(type, "holding")) { - capabilities = AST_BRIDGE_CAPABILITY_HOLDING; - } else { + while ((requested_type = strsep(&requested_types, ","))) { + requested_type = ast_strip(requested_type); + + if (!strcmp(requested_type, "mixing")) { + capabilities |= AST_BRIDGE_CAPABILITY_1TO1MIX | + AST_BRIDGE_CAPABILITY_MULTIMIX | + AST_BRIDGE_CAPABILITY_NATIVE; + flags |= AST_BRIDGE_FLAG_SMART; + } else if (!strcmp(requested_type, "holding")) { + capabilities |= AST_BRIDGE_CAPABILITY_HOLDING; + } else if (!strcmp(requested_type, "dtmf_events") || + !strcmp(requested_type, "proxy_media")) { + capabilities &= ~AST_BRIDGE_CAPABILITY_NATIVE; + } + } + + if (!capabilities) { return NULL; } |