]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix broken attended transfers
authorJeff Peeler <jpeeler@digium.com>
Wed, 27 May 2009 17:21:04 +0000 (17:21 +0000)
committerJeff Peeler <jpeeler@digium.com>
Wed, 27 May 2009 17:21:04 +0000 (17:21 +0000)
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.1@197145 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/channel.h
main/channel.c

index e71d897424b1587c5edb30a7f4ae3e15c3f48610..de3670f97c9b0394f1e25bcf792d6cf03c318381 100644 (file)
@@ -583,6 +583,7 @@ struct ast_bridge_config {
        struct ast_flags features_callee;
        struct timeval start_time;
        struct timeval nexteventts;
+       struct timeval partialfeature_timer;
        long feature_timer;
        long timelimit;
        long play_warning;
index 106bd2ae5ec405b562201e73d7e09244a56f0b6a..33c8a4ca73e0765268d928aa73e5aba02280e716 100644 (file)
@@ -4471,10 +4471,11 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct
        ast_poll_channel_add(c0, c1);
 
        if (config->feature_timer > 0 && ast_tvzero(config->nexteventts)) {
-               /* nexteventts is not set when the bridge is not scheduled to
-                * break, so calculate when the bridge should possibly break
+               /* calculate when the bridge should possibly break
                 * 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 (;;) {
@@ -4504,8 +4505,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
                         * time has elapsed so the DTMF will be sent to the other side. 
                         */
-                       if (!ast_tvzero(config->nexteventts)) {
-                               int diff = ast_tvdiff_ms(config->nexteventts, ast_tvnow());
+                       if (!ast_tvzero(config->partialfeature_timer)) {
+                               int diff = ast_tvdiff_ms(config->partialfeature_timer, ast_tvnow());
                                if (diff <= 0) {
                                        res = AST_BRIDGE_RETRY;
                                        break;