Pass the hangup cause all the way to the calling app/channel.

(closes issue #11328)
Reported by: rain
Patches:
      20071207__pass_cause_in_hangup_control_frame.diff.txt uploaded by Corydon76 (license 14)
brought up-to-date to trunk by me


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@114637 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Michiel van Baak
2008-04-24 22:16:48 +00:00
parent a50b48dacd
commit 08e674bce0
21 changed files with 67 additions and 43 deletions

View File

@@ -252,6 +252,9 @@ static int receive_dtmf_digits(struct ast_channel *chan, char *digit_string, int
/* If they hung up, leave */
if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP)) {
if (f->seqno) {
chan->hangupcause = f->seqno;
}
ast_frfree(f);
res = -1;
break;

View File

@@ -788,8 +788,11 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
*to = -1;
strcpy(pa->status, "CANCEL");
ast_cdr_noanswer(in->cdr);
if (f)
if (f) {
if (f->seqno)
in->hangupcause = f->seqno;
ast_frfree(f);
}
return NULL;
}

View File

@@ -195,6 +195,8 @@ static int disa_exec(struct ast_channel *chan, void *data)
}
if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP)) {
if (f->seqno)
chan->hangupcause = f->seqno;
ast_frfree(f);
ast_clear_flag(chan, AST_FLAG_END_DTMF_ONLY);
return -1;

View File

@@ -560,6 +560,9 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
} else if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP)) {
ast_chan_log(LOG_NOTICE, chan, "Got AST_CONTROL_HANGUP\n");
send_eivr_event(eivr_events, 'H', NULL, chan);
if (f->seqno) {
chan->hangupcause = f->seqno;
}
ast_frfree(f);
res = -1;
break;

View File

@@ -607,6 +607,9 @@ static struct ast_channel *wait_for_winner(struct findme_user_listptr *findme_us
switch(f->subclass) {
case AST_CONTROL_HANGUP:
ast_verb(3, "%s received a hangup frame.\n", winner->name);
if (f->seqno) {
winner->hangupcause = f->seqno;
}
if (dg == 0) {
ast_verb(3, "The calling channel hungup. Need to drop everyone else.\n");
clear_calling_tree(findme_user_list);

View File

@@ -2644,6 +2644,8 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
/* Got hung up */
*to = -1;
if (f) {
if (f->seqno)
in->hangupcause = f->seqno;
ast_frfree(f);
}
return NULL;