]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
When a transferer hangs up during an attended transfer BEFORE the transfer is answere...
authorTilghman Lesher <tilghman@meg.abyt.es>
Mon, 1 Feb 2010 18:38:37 +0000 (18:38 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Mon, 1 Feb 2010 18:38:37 +0000 (18:38 +0000)
(closes issue #16513)
 Reported by: litnimax
 Patches:
       atxfer_moh_16513.patch uploaded by gknispel proformatique (license 261)
 Tested by: litnimax

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@244151 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_features.c

index e8937d54c3c36b04a6ce66f8c18ba3eac50efd0c..f1430a2de7e9f1662d4180a8e46d94d01ba1ea24 100644 (file)
@@ -967,22 +967,55 @@ static int builtin_atxfer(struct ast_channel *chan, struct ast_channel *peer, st
                return FEATURE_RETURN_SUCCESS;
        }
 
-       if (check_compat(transferer, newchan)) {
-               /* we do mean transferee here, NOT transferer */
-               finishup(transferee);
-               return -1;
-       }
-       memset(&bconfig,0,sizeof(struct ast_bridge_config));
-       ast_set_flag(&(bconfig.features_caller), AST_FEATURE_DISCONNECT);
-       ast_set_flag(&(bconfig.features_callee), AST_FEATURE_DISCONNECT);
-       res = ast_bridge_call(transferer, newchan, &bconfig);
-       if (newchan->_softhangup || !transferer->_softhangup) {
-               ast_hangup(newchan);
-               if (ast_stream_and_wait(transferer, xfersound, transferer->language, ""))
-                       ast_log(LOG_WARNING, "Failed to play transfer sound!\n");
-               finishup(transferee);
-               transferer->_softhangup = 0;
-               return FEATURE_RETURN_SUCCESS;
+       if (!ast_check_hangup(transferer)) {
+               if (check_compat(transferer, newchan)) {
+                       /* we do mean transferee here, NOT transferer */
+                       finishup(transferee);
+                       return -1;
+               }
+               memset(&bconfig,0,sizeof(struct ast_bridge_config));
+               ast_set_flag(&(bconfig.features_caller), AST_FEATURE_DISCONNECT);
+               ast_set_flag(&(bconfig.features_callee), AST_FEATURE_DISCONNECT);
+               res = ast_bridge_call(transferer, newchan, &bconfig);
+               if (newchan->_softhangup || !transferer->_softhangup) {
+                       ast_hangup(newchan);
+                       if (ast_stream_and_wait(transferer, xfersound, transferer->language, ""))
+                               ast_log(LOG_WARNING, "Failed to play transfer sound!\n");
+                       finishup(transferee);
+                       transferer->_softhangup = 0;
+                       return FEATURE_RETURN_SUCCESS;
+               }
+       } else {
+               ast_log(LOG_DEBUG, "transferer hangup; outstate = %d\n", outstate);
+               switch (outstate) {
+               case AST_CONTROL_RINGING:
+               {
+                       int connected = 0;
+                       while (!connected && (ast_waitfor(newchan, -1) >= 0)) {
+                               if ((f = ast_read(newchan)) == NULL) {
+                                       break;
+                               }
+                               if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_ANSWER) {
+                                       connected = 1;
+                               }
+                               ast_frfree(f);
+                       }
+                       if (!connected) {
+                               ast_hangup(newchan);
+                               finishup(transferee);
+                               return -1;
+                       }
+                       /* fall through */
+               }
+               case AST_CONTROL_ANSWER:
+                       ast_log(LOG_DEBUG, "transferer hangup; callee answered\n");
+                       break;
+
+               default:
+                       ast_hangup(newchan);
+                       finishup(transferee);
+                       return FEATURE_RETURN_SUCCESS;
+               }
        }
 
        if (check_compat(transferee, newchan)) {