mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-07 10:28:32 +00:00
Fix broken attended transfers
The bridge was terminating immediately after the attended transfer was completed. The problem was because upon reentering ast_channel_bridge nexteventts was checked to see if it was set and if so could possibly return AST_BRIDGE_COMPLETE. (closes issue #15183) Reported by: andrebarbosa Tested by: andrebarbosa, tootai, loloski git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.0@197126 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -613,6 +613,7 @@ struct ast_bridge_config {
|
|||||||
struct ast_flags features_callee;
|
struct ast_flags features_callee;
|
||||||
struct timeval start_time;
|
struct timeval start_time;
|
||||||
struct timeval nexteventts;
|
struct timeval nexteventts;
|
||||||
|
struct timeval partialfeature_timer;
|
||||||
long feature_timer;
|
long feature_timer;
|
||||||
long timelimit;
|
long timelimit;
|
||||||
long play_warning;
|
long play_warning;
|
||||||
|
|||||||
@@ -4472,10 +4472,11 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct
|
|||||||
ast_poll_channel_add(c0, c1);
|
ast_poll_channel_add(c0, c1);
|
||||||
|
|
||||||
if (config->feature_timer > 0 && ast_tvzero(config->nexteventts)) {
|
if (config->feature_timer > 0 && ast_tvzero(config->nexteventts)) {
|
||||||
/* nexteventts is not set when the bridge is not scheduled to
|
/* calculate when the bridge should possibly break
|
||||||
* break, so calculate when the bridge should possibly break
|
|
||||||
* if a partial feature match timed out */
|
* if a partial feature match timed out */
|
||||||
config->nexteventts = ast_tvadd(ast_tvnow(), ast_samp2tv(config->feature_timer, 1000));
|
config->partialfeature_timer = ast_tvadd(ast_tvnow(), ast_samp2tv(config->feature_timer, 1000));
|
||||||
|
} else {
|
||||||
|
memset(&config->partialfeature_timer, 0, sizeof(config->partialfeature_timer));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@@ -4505,8 +4506,8 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct
|
|||||||
* to not break, leave the channel bridge when the feature timer
|
* to not break, leave the channel bridge when the feature timer
|
||||||
* time has elapsed so the DTMF will be sent to the other side.
|
* time has elapsed so the DTMF will be sent to the other side.
|
||||||
*/
|
*/
|
||||||
if (!ast_tvzero(config->nexteventts)) {
|
if (!ast_tvzero(config->partialfeature_timer)) {
|
||||||
int diff = ast_tvdiff_ms(config->nexteventts, ast_tvnow());
|
int diff = ast_tvdiff_ms(config->partialfeature_timer, ast_tvnow());
|
||||||
if (diff <= 0) {
|
if (diff <= 0) {
|
||||||
res = AST_BRIDGE_RETRY;
|
res = AST_BRIDGE_RETRY;
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user