aboutsummaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-02-01 18:38:37 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-02-01 18:38:37 +0000
commit9e6441417ca6ed244af0a455fa4593f2c180beac (patch)
treecc07129296ca0d2644ef867788163871dd07c228 /res
parentf3cd4a71e234db581106e8851ce95f8415ff9610 (diff)
When a transferer hangs up during an attended transfer BEFORE the transfer is answered, don't stop playing MOH.
(closes issue #16513) Reported by: litnimax Patches: atxfer_moh_16513.patch uploaded by gknispel proformatique (license 261) Tested by: litnimax git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@244151 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rw-r--r--res/res_features.c65
1 files changed, 49 insertions, 16 deletions
diff --git a/res/res_features.c b/res/res_features.c
index e8937d54c..f1430a2de 100644
--- a/res/res_features.c
+++ b/res/res_features.c
@@ -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)) {