char privcid[256];
char privintro[1024];
char status[256];
+ int canceled;
};
static void publish_dial_end_event(struct ast_channel *in, struct dial_head *out_chans, struct ast_channel *exception, const char *status)
/* Got hung up */
*to = -1;
strcpy(pa->status, "CANCEL");
+ pa->canceled = 1;
publish_dial_end_event(in, out_chans, NULL, pa->status);
if (f) {
if (f->data.uint32) {
*to = 0;
*result = f->subclass.integer;
strcpy(pa->status, "CANCEL");
+ pa->canceled = 1;
publish_dial_end_event(in, out_chans, NULL, pa->status);
ast_frfree(f);
ast_channel_unlock(in);
ast_verb(3, "User requested call disconnect.\n");
*to = 0;
strcpy(pa->status, "CANCEL");
+ pa->canceled = 1;
publish_dial_end_event(in, out_chans, NULL, pa->status);
ast_frfree(f);
if (is_cc_recall) {
struct ast_channel *peer;
int to; /* timeout */
struct cause_args num = { chan, 0, 0, 0 };
- int cause;
+ int cause, hanguptreecause = -1;
struct ast_bridge_config config = { { 0, } };
struct timeval calldurationlimit = { 0, };
.sentringing = 0,
.privdb_val = 0,
.status = "INVALIDARGS",
+ .canceled = 0,
};
int sentringing = 0, moh = 0;
const char *outbound_group = NULL;
}
ast_channel_early_bridge(chan, NULL);
- /* forward 'answered elsewhere' if we received it */
- hanguptree(&out_chans, NULL,
- ast_channel_hangupcause(chan) == AST_CAUSE_ANSWERED_ELSEWHERE
- || ast_test_flag64(&opts, OPT_CANCEL_ELSEWHERE)
- ? AST_CAUSE_ANSWERED_ELSEWHERE : -1);
+ /* forward 'answered elsewhere' if we received it */
+ if (ast_channel_hangupcause(chan) == AST_CAUSE_ANSWERED_ELSEWHERE || ast_test_flag64(&opts, OPT_CANCEL_ELSEWHERE)) {
+ hanguptreecause = AST_CAUSE_ANSWERED_ELSEWHERE;
+ } else if (pa.canceled) { /* Caller canceled */
+ if (ast_channel_hangupcause(chan))
+ hanguptreecause = ast_channel_hangupcause(chan);
+ else
+ hanguptreecause = AST_CAUSE_NORMAL_CLEARING;
+ }
+ hanguptree(&out_chans, NULL, hanguptreecause);
pbx_builtin_setvar_helper(chan, "DIALSTATUS", pa.status);
ast_debug(1, "Exiting with DIALSTATUS=%s.\n", pa.status);