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
This commit is contained in:
Richard Mudgett
2014-07-09 16:34:51 +00:00
parent 5a3023a114
commit f962448eee
6 changed files with 409 additions and 62 deletions

View File

@@ -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;