Merge "app_queue: add RINGCANCELED log event on caller hang up"

This commit is contained in:
zuul
2017-01-25 19:14:12 -06:00
committed by Gerrit Code Review
2 changed files with 19 additions and 10 deletions

View File

@@ -33,6 +33,10 @@ Queue:
their ringinuse value updated to the value of the queue. Previously, the their ringinuse value updated to the value of the queue. Previously, the
ringinuse value for dynamic members was not updated on reload. ringinuse value for dynamic members was not updated on reload.
Queue log:
- New RINGCANCELED event is logged when the caller hangs up while ringing.
The data1 field contains number of miliseconds since start of ringing.
Channel Drivers: Channel Drivers:
chan_dahdi: chan_dahdi:

View File

@@ -4791,6 +4791,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
#endif #endif
char *inchan_name; char *inchan_name;
struct timeval start_time_tv = ast_tvnow(); struct timeval start_time_tv = ast_tvnow();
int canceled_by_caller = 0; /* 1 when caller hangs up or press digit or press * */
ast_channel_lock(qe->chan); ast_channel_lock(qe->chan);
inchan_name = ast_strdupa(ast_channel_name(qe->chan)); inchan_name = ast_strdupa(ast_channel_name(qe->chan));
@@ -5229,29 +5230,33 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass.integer == AST_CONTROL_HANGUP))) { if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass.integer == AST_CONTROL_HANGUP))) {
/* Got hung up */ /* Got hung up */
*to = -1; *to = -1;
publish_dial_end_event(in, outgoing, NULL, "CANCEL");
if (f) { if (f) {
if (f->data.uint32) { if (f->data.uint32) {
ast_channel_hangupcause_set(in, f->data.uint32); ast_channel_hangupcause_set(in, f->data.uint32);
} }
ast_frfree(f); ast_frfree(f);
} }
return NULL; canceled_by_caller = 1;
} } else if ((f->frametype == AST_FRAME_DTMF) && caller_disconnect && (f->subclass.integer == '*')) {
if ((f->frametype == AST_FRAME_DTMF) && caller_disconnect && (f->subclass.integer == '*')) {
ast_verb(3, "User hit %c to disconnect call.\n", f->subclass.integer); ast_verb(3, "User hit %c to disconnect call.\n", f->subclass.integer);
*to = 0; *to = 0;
publish_dial_end_event(in, outgoing, NULL, "CANCEL");
ast_frfree(f); ast_frfree(f);
return NULL; canceled_by_caller = 1;
} } else if ((f->frametype == AST_FRAME_DTMF) && valid_exit(qe, f->subclass.integer)) {
if ((f->frametype == AST_FRAME_DTMF) && valid_exit(qe, f->subclass.integer)) {
ast_verb(3, "User pressed digit: %c\n", f->subclass.integer); ast_verb(3, "User pressed digit: %c\n", f->subclass.integer);
*to = 0; *to = 0;
publish_dial_end_event(in, outgoing, NULL, "CANCEL");
*digit = f->subclass.integer; *digit = f->subclass.integer;
ast_frfree(f); ast_frfree(f);
canceled_by_caller = 1;
}
/* When caller hung up or pressed * or digit. */
if (canceled_by_caller) {
publish_dial_end_event(in, outgoing, NULL, "CANCEL");
for (o = start; o; o = o->call_next) {
if (o->chan) {
ast_queue_log(qe->parent->name, ast_channel_uniqueid(qe->chan), o->member->membername, "RINGCANCELED", "%d", (int) ast_tvdiff_ms(ast_tvnow(), start_time_tv));
}
}
return NULL; return NULL;
} }