diff options
author | Richard Mudgett <rmudgett@digium.com> | 2014-07-09 16:34:51 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2014-07-09 16:34:51 +0000 |
commit | f962448eee1a2dee763e90441edd79cd99842ef6 (patch) | |
tree | 3c8b026758db2317294d301a3eb58975a32d7fc6 /main/bridge_basic.c | |
parent | 5a3023a114af06a41bcea9cf4cf883939270e997 (diff) |
ARI: Make mixing bridges propagate linkedids and accountcodes.
* Create a Stasis bridge sub-class to propagate linkedids and
accountcodes.
* Fixed the basic bridge sub-class to update peeraccount codes when the
number of channels in the bridge drops back down to two parties.
* Refactored ast_bridge_channel_update_accountcodes() to handle channels
joining/leaving the bridge.
* Fixed the basic bridge sub-class to not call the base bridge class pull
method twice.
AFS-105 #close
ASTERISK-23852 #close
Reported by: Richard Mudgett
Review: https://reviewboard.asterisk.org/r/3720/
........
Merged revisions 418225 from http://svn.asterisk.org/svn/asterisk/branches/12
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@418226 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/bridge_basic.c')
-rw-r--r-- | main/bridge_basic.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/main/bridge_basic.c b/main/bridge_basic.c index cee56b1b5..eb44867f1 100644 --- a/main/bridge_basic.c +++ b/main/bridge_basic.c @@ -665,8 +665,6 @@ static int bridge_personality_normal_push(struct ast_bridge *self, struct ast_br return -1; } - ast_bridge_channel_update_accountcodes(bridge_channel, swap); - ast_bridge_channel_update_linkedids(bridge_channel, swap); return 0; } @@ -676,10 +674,14 @@ static int bridge_basic_push(struct ast_bridge *self, struct ast_bridge_channel ast_assert(personality != NULL); - if (personality->details[personality->current].v_table->push(self, bridge_channel, swap)) { + if (personality->details[personality->current].v_table->push + && personality->details[personality->current].v_table->push(self, bridge_channel, swap)) { return -1; } + ast_bridge_channel_update_linkedids(bridge_channel, swap); + ast_bridge_channel_update_accountcodes(bridge_channel, swap); + return ast_bridge_base_v_table.push(self, bridge_channel, swap); } @@ -693,6 +695,8 @@ static void bridge_basic_pull(struct ast_bridge *self, struct ast_bridge_channel personality->details[personality->current].v_table->pull(self, bridge_channel); } + ast_bridge_channel_update_accountcodes(NULL, bridge_channel); + ast_bridge_base_v_table.pull(self, bridge_channel); } @@ -3315,11 +3319,16 @@ void ast_bridging_init_basic(void) ast_bridge_basic_v_table.pull = bridge_basic_pull; ast_bridge_basic_v_table.destroy = bridge_basic_destroy; - personality_normal_v_table = ast_bridge_base_v_table; + /* + * Personality vtables don't have the same rules as + * normal bridge vtables. These vtable functions are + * used as alterations to the ast_bridge_basic_v_table + * method functionality and are checked for NULL before + * calling. + */ personality_normal_v_table.name = "normal"; personality_normal_v_table.push = bridge_personality_normal_push; - personality_atxfer_v_table = ast_bridge_base_v_table; personality_atxfer_v_table.name = "attended transfer"; personality_atxfer_v_table.push = bridge_personality_atxfer_push; personality_atxfer_v_table.pull = bridge_personality_atxfer_pull; |