summaryrefslogtreecommitdiff
path: root/main/bridge_basic.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2014-07-09 16:34:51 +0000
committerRichard Mudgett <rmudgett@digium.com>2014-07-09 16:34:51 +0000
commitf962448eee1a2dee763e90441edd79cd99842ef6 (patch)
tree3c8b026758db2317294d301a3eb58975a32d7fc6 /main/bridge_basic.c
parent5a3023a114af06a41bcea9cf4cf883939270e997 (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.c19
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;